簡體   English   中英

通過MBED OS上的隊列和線程復制char *值

[英]Copying char* values through Queues and threads on MBED OS

我試圖通過K64F板在Arm MBED OS上實現一些RTOS線程。 我脫離了RTOS示例,並且已經成功使用Queue運行並傳達了不同的線程。 將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“主機1”上看到該值,但在“主機2”中看不到

我相信(如果我沒記錯的話)問題出在用=操作數賦值,因為我要復制地址而不是值,並且在釋放第一個池內存時會丟失它。 我嘗試用memcpy,strcpy甚至我自己的char通過char復制值,但是調用此方法時系統掛起。

如何通過此隊列復制值?

我將其移至此處,因為正確答案已寫為評論。 將值轉換為chars數組是必須的方法,因此字符串數據是struct的一部分。

char rHostAddr[40];

現在,可以使用srtcpy方法完成分配,並且可以正確地通過所有過程進行分配:

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

strcpy(message->rHostAddr,rcvaddrs);

從ARM mbed看一下這個解決方案:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM