Part Number:TMS320C6748Other Parts Discussed in Thread:SYSBIOS
DSP为C6748,C6748作为服务器,电脑作为客户端;
程序的功能很简单,电脑向C6748发送数据,C6748将接收到的数据回传;
使用NDK实现TCP传输,在TCP.c中,定义了一个全局的套接字TcpSocket和全局变量如下:
volatile UINT8 RecDataFlag=0; // 数据接收标志位,接收到上位机的数据时:置1;数据处理完:清0。
volatile UINT32 RecDataNum=0; // 接收到的数据的长度
char *RecDataBuf; // 接收到的数据的指针
HANDLE hBuffer;
SOCKET TcpSocket;// 全局套接字
在TCP.c的回调函数TcpTest(SOCKET s, UINT32 unused)中使用send(g_TcpSocket, RecDataBuf, RecDataNum, 0)函数,可以正常的向PC回传数据;我想知道如何将TcpTest(SOCKET s, UINT32 unused)回调函数的套接字s传给全局的套接字TcpSocket;我试过直接赋值如下
TcpTest(SOCKET s, UINT32 unused)
{
………….
TcpSocket=s;
…………
}
//tcp_test_hhr_fun这个是另外一个线程,tcp_test_hhr这个是线程句柄
void tcp_test_hhr_fun(UArg arg)
{
char Title[] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07};
fdOpenSession((HANDLE)tcp_test_hhr);
send(tcp_socket, &Title, 4, 0);
fdCloseSession((HANDLE)tcp_test_hhr);
}
我并不能在另外一个线程发送数据给客服端,我想请问套接字不能直接赋值吗?
啦啦啦:
如果不能这样直接赋值,那应该如何将套接字s给全局的套接字TcpSocket;如果可以这样赋值,我上面错的在哪里,怎么修改呢?
,
Gary Lu:
您好,
根据您提供的代码,您在`TcpTest`函数中尝试将回调函数的套接字`s`赋值给全局套接字`TcpSocket`。但是,这种赋值可能不会生效,因为在回调函数中,套接字`s`的生命周期可能会比全局套接字`TcpSocket`的生命周期短。
要在另一个线程中发送数据给客户端,您可以尝试以下方法:
1. 将全局套接字`TcpSocket`声明为`volatile`类型,以确保其在多个线程中的可见性。
2. 在另一个线程中,使用`TcpSocket`全局套接字发送数据给客户端。确保在发送数据之前,`TcpSocket`已经被正确初始化。
3. 在回调函数`TcpTest`中,将接收到的数据保存到全局变量`RecDataBuf`中,并设置`RecDataFlag`为1,以表示已接收到数据。
请注意,在多线程环境中使用全局变量和套接字时要小心,确保正确地同步和保护共享资源,以避免竞争条件和数据不一致的问题。
,
Gary Lu:
您好,
在多线程环境中,将套接字`s`赋值给全局套接字`TcpSocket`可能会导致竞争条件和数据不一致的问题。为了正确地将套接字`s`传递给全局套接字`TcpSocket`,您可以使用同步机制来保护共享资源。
以下是一种可能的解决方案:
1. 在全局套接字`TcpSocket`之前,声明一个互斥锁,用于保护对`TcpSocket`的访问。例如:
#include <ti/sysbios/gates/GateMutexPri.h>GateMutexPri_Handle tcpSocketMutex;2. 在程序初始化时,创建互斥锁并初始化全局套接字`TcpSocket`。例如:
tcpSocketMutex = GateMutexPri_create(NULL, NULL); TcpSocket = INVALID_SOCKET; // 初始化全局套接字3. 在回调函数`TcpTest`中,使用互斥锁保护对全局套接字`TcpSocket`的访问。例如:
TcpTest(SOCKET s, UINT32 unused) { // ...GateMutexPri_enter(tcpSocketMutex); TcpSocket = s; // 将套接字s赋值给全局套接字TcpSocket GateMutexPri_leave(tcpSocketMutex);// ... } ```4. 在另一个线程中,使用互斥锁保护对全局套接字`TcpSocket`的访问,并发送数据给客户端。例如:
void tcp_test_hhr_fun(UArg arg) { char Title[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};fdOpenSession((HANDLE)tcp_test_hhr);GateMutexPri_enter(tcpSocketMutex); SOCKET s = TcpSocket; // 从全局套接字TcpSocket获取套接字s的副本 GateMutexPri_leave(tcpSocketMutex);if (s != INVALID_SOCKET) { send(s, Title, 4, 0); // 使用套接字s发送数据给客户端 }fdCloseSession((HANDLE)tcp_test_hhr); }通过使用互斥锁,您可以确保在访问全局套接字`TcpSocket`时只有一个线程可以进行操作,避免了竞争条件和数据不一致的问题。
,
啦啦啦:
感谢大佬指点
,
Gary Lu:
您好,不客气,有问题随时交流,谢谢!
,
啦啦啦:
大佬,我在添加互斥锁的时候,这一段代码GateMutexPri_leave(tcpSocketMutex);报错这个too few arguments in function call ,但是我查找些资料,没明白错在什么地方
,
Gary Lu:
您好,
GateMutexPri_leave() 函数是 TI-RTOS 中用于离开互斥锁的函数。根据您提供的错误信息 "too few arguments in function call",这个错误通常表示函数调用时提供的参数数量不正确。
GateMutexPri_leave() 函数的原型如下:
void GateMutexPri_leave(GateMutexPri_Handle handle);该函数只需要一个参数,即互斥锁的句柄(handle)。因此,如果您在调用 GateMutexPri_leave() 函数时遇到 "too few arguments in function call" 错误,可能是因为您没有提供正确的参数。
请确保您在调用 GateMutexPri_leave() 函数时提供了正确的互斥锁句柄参数。例如,如果您的互斥锁句柄为 `tcpSocketMutex`,则应该这样调用函数:
GateMutexPri_leave(tcpSocketMutex);如果问题仍然存在,请检查您的代码,确保在调用 GateMutexPri_leave() 函数时没有其他错误,例如语法错误或其他参数问题。
,
啦啦啦:
#define GateMutexPri_leave ti_sysbios_gates_GateMutexPri_leave
xdc__CODESECT(ti_sysbios_gates_GateMutexPri_leave__E, "ti_sysbios_gates_GateMutexPri_leave")__extern xdc_Void ti_sysbios_gates_GateMutexPri_leave__E( ti_sysbios_gates_GateMutexPri_Handle __inst, xdc_IArg key );
我查看了GateMutexPri_leave 的定义,定义里面确实是定义了两个参数,请问第二个参数(xdc_IArg key)应该填什么?
,
Gary Lu:
GateMutexPri_leave函数的第二个参数应该填写一个类型为xdc_IArg的参数key。这个参数是一个无符号整数,用于保存先前获取的关键值,以便在离开临界区时将其恢复。