通过 MBED OS 上的队列和线程复制 char* 值
Copying char* values through Queues and threads on MBED OS
我正在尝试通过 K64F 板在 Arm MBED OS 上实现一些 RTOS 线程。我正在离开 RTOS 示例,我已经成功 运行 并使用队列与不同的线程进行通信。将 char* 值从一个结构复制到另一个结构以将消息从一个队列获取到另一个时,我遇到了问题。我相信我误解了一些东西,我的问题与指针和内存处理有关,但我无法解决它。
我定义了不同的队列来将数据发送到不同的线程。我还创建了一个基本数据结构,其中包含我需要在这些线程之间移动的所有内容。在此结构中,我有一个 char* 变量 (rHostAddr),其中包含请求服务的远程主机地址。
MemoryPool<cMsg, 16> AMPool;
Queue<cMsg, 16> AMQueue;
MemoryPool<cMsg, 16> ioLedPool;
Queue<cMsg, 16> ioLedQueue;
typedef struct{
...
char* rHostAddr;
...
} cMsg;
在主线程中,我正在创建此数据结构并将其放入第一个队列 (AMQueue)。
--- Main Thread ---
cMsg *message = AMPool.alloc();
char* rcvaddrs = "111.111.111.111";
message->rHostAddr = "111.111.111.111";
rcvaddrs = (char*)addr.get_ip_address();
message->rHostAddr = rcvaddrs;
AMQueue.put(message);
在线程 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 "Host 1" 中看到值,但在 "Host 2"
中看不到
我相信(如果我没记错的话)问题出在用 = 操作数赋值,因为我复制的是地址,而不是值,当第一个池内存被释放时它就丢失了。我曾尝试使用 memcpy、strcpy 甚至我自己的 char by char 复制值,但系统在调用此方法时挂起。
如何通过此队列复制值?
看看这个来自 ARM mbed 的解决方案:
我将其移至此处,因为正确答案已写为评论。将值转换为字符数组是可行的方法,因此字符串数据是结构的一部分。
char rHostAddr[40];
现在可以使用 srtcpy 方法完成赋值,并正确地通过所有过程:
char* rcvaddrs = (char*)addr.get_ip_address();
strcpy(message->rHostAddr,rcvaddrs);
我正在尝试通过 K64F 板在 Arm MBED OS 上实现一些 RTOS 线程。我正在离开 RTOS 示例,我已经成功 运行 并使用队列与不同的线程进行通信。将 char* 值从一个结构复制到另一个结构以将消息从一个队列获取到另一个时,我遇到了问题。我相信我误解了一些东西,我的问题与指针和内存处理有关,但我无法解决它。
我定义了不同的队列来将数据发送到不同的线程。我还创建了一个基本数据结构,其中包含我需要在这些线程之间移动的所有内容。在此结构中,我有一个 char* 变量 (rHostAddr),其中包含请求服务的远程主机地址。
MemoryPool<cMsg, 16> AMPool;
Queue<cMsg, 16> AMQueue;
MemoryPool<cMsg, 16> ioLedPool;
Queue<cMsg, 16> ioLedQueue;
typedef struct{
...
char* rHostAddr;
...
} cMsg;
在主线程中,我正在创建此数据结构并将其放入第一个队列 (AMQueue)。
--- Main Thread ---
cMsg *message = AMPool.alloc();
char* rcvaddrs = "111.111.111.111";
message->rHostAddr = "111.111.111.111";
rcvaddrs = (char*)addr.get_ip_address();
message->rHostAddr = rcvaddrs;
AMQueue.put(message);
在线程 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 "Host 1" 中看到值,但在 "Host 2"
中看不到我相信(如果我没记错的话)问题出在用 = 操作数赋值,因为我复制的是地址,而不是值,当第一个池内存被释放时它就丢失了。我曾尝试使用 memcpy、strcpy 甚至我自己的 char by char 复制值,但系统在调用此方法时挂起。
如何通过此队列复制值?
看看这个来自 ARM mbed 的解决方案:
我将其移至此处,因为正确答案已写为评论。将值转换为字符数组是可行的方法,因此字符串数据是结构的一部分。
char rHostAddr[40];
现在可以使用 srtcpy 方法完成赋值,并正确地通过所有过程:
char* rcvaddrs = (char*)addr.get_ip_address();
strcpy(message->rHostAddr,rcvaddrs);