还是想做核间的数据传递,Semaphore 不能核间传递,Notify应该可以,但是写的程序就是传递不起来,现在在看MessageQ,IPC自带的例子C:\ti\ipc_3_50_04_08\examples\C6678_bios_elf\ex11_ping里文件太多,看着头大,看了2天也没理出到底传递的是啥信息。
通读software-dl.ti.com/processor-sdk-rtos/esd/docs/06_03_00_106/AM437X/rtos/index_Foundational_Components.html#messageq-module里的4.4.6.3 MessageQ Module 后有一个 疑问,这章讲了如何创建,打开,分配内存,存放信息,读取信息,释放内存,可是我翻来翻去也没找到到底信息在哪里?
整理一下
1.接收方 创建:
MessageQ_HandlemessageQ; MessageQ_ParamsmessageQParams; SyncSem_HandlesyncSemHandle; syncSemHandle = SyncSem_create(NULL, NULL); MessageQ_Params_init(&messageQParams); messageQParams.synchronizer = SyncSem_Handle_upCast(syncSemHandle); messageQ = MessageQ_create(CORE0_MESSAGEQNAME, &messageQParams);
2.发送方 打开:
do {status = MessageQ_open(CORE0_MESSAGEQNAME, &remoteQueueId); } while (status < 0);
3.发送方 注册一个Heap:
status = MessageQ_registerHeap( HeapBufMP_Handle_upCast(heapHandle), HEAPID);
4.发送方 分配内存:
msg = MessageQ_alloc(HEAPID, sizeof(MessageQ_MsgHeader)); if (msg == NULL) { System_abort("MessageQ_alloc failed\n"); }
5.发送方写入信息:
status = MessageQ_put(remoteQueueId, msg);
6.接收方 读取信息:
status = MessageQ_get(messageQ, &msg, MessageQ_FOREVER); if (status < 0) {System_abort("Should not happen; timeout is forever\n"); }
7.后续操作,至少到这里没有看到哪里表示 信息 在哪里,比如我要传递一个 123456给 接收方,我这信息往哪里装啊?
只看到一个结构体:
typedef struct MyMsg {MessageQ_MsgHeader header;// RequiredSomeEnumTypetype// Can be any field...// ... } MyMsg;
这个结构体 在讲解中也没有使用啊?那么到底传递的什么啊?这个结构体怎么用呢?我传递了半天传递了个寂寞?
这是一个小白的问题,但是确实不理解信息到底放在哪里了。
Lucius Green:
回复 Nancy Wang:
Nancy, Thanks.虽然例子没看懂,但是至少知道了信息是存放在结构体里的,你给的代码里用App_Msg * msg 定义了msg,然后给msg里存入信息0x00000000(App_CMD_NOP) ,然后将该信息put,至于put里的Module.slaveQue是啥暂时还不明白,先自己写个代码在板上跑跑试试了,再次感谢。