通过MBED OS上的队列和线程复制char *值

时间:2017-03-27 08:28:11

标签: c multithreading arm rtos mbed

我正在尝试通过K64F板在Arm MBED OS上实现一些RTOS线程。我正在退出RTOS示例,我已成功运行并使用队列传递不同的线程。将char *值从一个结构体复制到另一个结构体以从一个队列获取消息时,我遇到了问题。我相信我误解了一些事情,而且我的问题与指针和内存处理有关,但我无法解决它。

我已经定义了不同的队列来将数据发送到各种线程。我还创建了一个基本数据结构,其中包含了我需要在这些线程中进行的所有操作。在这个结构中,我有一个char *变量(rHostAddr),其中包含请求服务的远程主机地址。

Intent intent = new Intent(getActivity(), ActivityTwo.class);
getActivity().startActivity(intent)

在主线程中,我正在创建此数据结构并将其放在第一个队列中(AMQueue)。

MemoryPool<cMsg, 16> AMPool;
Queue<cMsg, 16> AMQueue;
MemoryPool<cMsg, 16> ioLedPool;
Queue<cMsg, 16> ioLedQueue;

typedef struct{
    ...

    char* rHostAddr;
    ...
} cMsg;

在线程1上我等待消息到达,在某些条件下,我将整个结构复制到从相应池创建的新结构并将其插入新队列(ioLedQueue)。

--- 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);

在线程2上,我得到了消息结构和数据。

--- 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);

在此阶段,rHostAddr为空。我可以看到printf&#34; Host 1&#34;但不在&#34;主机2&#34;

我相信(如果我没有错),问题来自于使用=操作数进行分配,因为我正在复制地址而不是值,并且当第一个池内存被释放时它会丢失。我试过用memcpy,strcpy甚至我自己的char复制值,但是在调用这个方法时系统会挂起。

如何通过此队列复制值?

2 个答案:

答案 0 :(得分:1)

我把它移到这里,因为正确的答案是作为评论写的。将值转换为字符数组是可行的方法,因此字符串数据是结构的一部分。

char rHostAddr[40];

现在可以使用srtcpy方法完成分配,并且它会正确地传递给所有进程:

char* rcvaddrs = (char*)addr.get_ip_address();

strcpy(message->rHostAddr,rcvaddrs);

答案 1 :(得分:0)

从ARM mbed看一下这个解决方案:

https://github.com/ARMmbed/mbed-events

相关问题