通过MBED OS上的队列和线程复制char*值
我试图在K64F板上的Arm MBED操作系统上实现一些RTOS线程。我正在脱离RTOS示例,我已经成功地使用队列运行和通信了不同的线程。我在将char*值从一个结构复制到另一个结构以从一个队列获取消息时遇到问题。我相信我误解了一些事情,我的问题与指针和内存处理有关,但我无法解决它 我已经定义了不同的队列来向不同的线程发送数据。我还创建了一个基本的数据结构,其中包含了我在这些线程之间所需的所有内容。在这个结构中,我有一个char*变量rHostAddr,其中包含请求服务的远程主机地址通过MBED OS上的队列和线程复制char*值,c,multithreading,arm,rtos,mbed,C,Multithreading,Arm,Rtos,Mbed,我试图在K64F板上的Arm MBED操作系统上实现一些RTOS线程。我正在脱离RTOS示例,我已经成功地使用队列运行和通信了不同的线程。我在将char*值从一个结构复制到另一个结构以从一个队列获取消息时遇到问题。我相信我误解了一些事情,我的问题与指针和内存处理有关,但我无法解决它 我已经定义了不同的队列来向不同的线程发送数据。我还创建了一个基本的数据结构,其中包含了我在这些线程之间所需的所有内容。在这个结构中,我有一个char*变量rHostAddr,其中包含请求服务的远程主机地址 Memor
MemoryPool<cMsg, 16> AMPool;
Queue<cMsg, 16> AMQueue;
MemoryPool<cMsg, 16> ioLedPool;
Queue<cMsg, 16> ioLedQueue;
typedef struct{
...
char* rHostAddr;
...
} cMsg;
在线程1上,我等待消息到达,在某些条件下,我将整个结构复制到从相应池创建的新结构上,并将其插入到新队列ioLedQueue中
--- Thread 1 ---
cMsg *msg;
cMsg *ledm = ioLedPool.alloc();
osEvent evt = AMQueue.get();
msg = (cMsg*)evt.value.p;
msg.rHostAddr = ledm.rHostAddr;
printf("\t -- Host 1 -- %s\n\r", ledm->rHostAddr);
ioLedQueue.put(ledm);
在线程2上,我得到消息结构和数据
--- Thread 2 ---
cMsg *msg;
osEvent evt = ioLedQueue.get();
msg = (cMsg*)evt.value.p;
printf("\t -- Host 2 -- %s\n\r", msg->rHostAddr);
在此阶段,rHostAddr为空。我可以在printf主机1上看到该值,但在主机2中看不到
如果我没有错的话,我相信问题来自于使用=操作数赋值,因为我复制的是地址,而不是值,当第一个池内存被释放时,它将丢失。我尝试过用memcpy、strcpy甚至我自己的char-by-char复制值,但调用此方法时系统挂起
如何通过此队列复制值?查看ARM mbed中的此解决方案:
我把它移到这里,因为正确的答案是作为评论写的。将值转换为字符数组是一种方法,因此字符串数据是结构的一部分
char rHostAddr[40];
现在可以使用srtcpy方法完成分配,并正确地通过所有过程:
char* rcvaddrs = (char*)addr.get_ip_address();
strcpy(message->rHostAddr,rcvaddrs);
请注意,对于char*,值是指针,因此将复制指针。现在两个结构指向同一个字符串。也许你也应该复制字符串。您可以通过将char*x定义为例如char x[123]来实现这一点。现在字符串数据是结构的一部分。此外,如果线程在不同的计算机上运行或拥有自己的内存,那么从一个线程传递到另一个线程的指针将无效。
char* rcvaddrs = (char*)addr.get_ip_address();
strcpy(message->rHostAddr,rcvaddrs);