273794920 发表于 2021-1-6 15:08:22

消息队列数据大小

消息的大小超过4字节,消息可能不会被立即接收处理,这样该如何处理好?

李益达 发表于 2021-1-6 17:57:11

使用单向循环链表,链表节点足够多,足够你进行消息处理。
每次把消息存储在链表节点中,然后把节点地址的指针put到队列中,然后切换到下一个节点,消息处理任务get这个节点地址,通过地址去查找这个节点中的数据。
如果对消息处理任务没有信心,节点中添加一个使用状态标志,写入/空闲,确保节点数据有效或者不被覆盖。
如果数据到来是分散到来,可以使用二级缓存,道理是一样的。以及缓存进行存储,二级缓存队列进行搜帧解帧使用。

273794920 发表于 2021-1-6 18:21:53

使用FREERTOS的消息队列好像没办法解决这个问题?不知道硬汉哥,有没有什么好的思路?

李益达 发表于 2021-1-6 21:05:32

273794920 发表于 2021-1-6 18:21
使用FREERTOS的消息队列好像没办法解决这个问题?不知道硬汉哥,有没有什么好的思路?

FreeRTOS有消息队列还不够吗,你应该没看懂我说的解决方案。
或者你干脆用数组实现一个环形缓冲队列。

273794920 发表于 2021-1-7 09:45:19

李益达 发表于 2021-1-6 21:05
FreeRTOS有消息队列还不够吗,你应该没看懂我说的解决方案。
或者你干脆用数组实现一个环形缓冲队列。

每次传递的消息大于4个字节,用消息队列怎么实现?

李益达 发表于 2021-1-7 13:23:16

273794920 发表于 2021-1-7 09:45
每次传递的消息大于4个字节,用消息队列怎么实现?

我上面的表述有个地方是错的,四个字节存放的是“节点指针的地址”。
四个字节不直接存放所谓的“消息”,可以存放消息所在的地址。然后通过这个地址去找到这个消息就可以了。

273794920 发表于 2021-1-8 10:18:39

李益达 发表于 2021-1-7 13:23
我上面的表述有个地方是错的,四个字节存放的是“节点指针的地址”。
四个字节不直接存放所谓的“消息” ...

明白你的意思,但是每一条消息都带一个消息内容的地址,这个地址所指向的数据如何管理

李益达 发表于 2021-1-8 11:21:45

273794920 发表于 2021-1-8 10:18
明白你的意思,但是每一条消息都带一个消息内容的地址,这个地址所指向的数据如何管理

第一次回答已经说了一部分,链表管理,结构体存储数据。多看看别人写的例子和freertos.org中的kernel中的队列例子。还不明白我就我就无能为力了。

273794920 发表于 2021-1-8 13:41:44

李益达 发表于 2021-1-7 13:23
我上面的表述有个地方是错的,四个字节存放的是“节点指针的地址”。
四个字节不直接存放所谓的“消息” ...

真正的消息放到一个结构体数组里面,每条消息有个占用标志,已经占用了就不能放新的消息,消息被读取时修改占用标志

李益达 发表于 2021-1-8 14:00:34

273794920 发表于 2021-1-8 13:41
真正的消息放到一个结构体数组里面,每条消息有个占用标志,已经占用了就不能放新的消息,消息被读取时修 ...

这样也是可以的。如果缓存空间有限,占用标志可以修改为当前buffer读、写索引,可以极大的利用每个缓存空间,不过这么做就麻烦了一点。

273794920 发表于 2021-1-8 15:12:16

李益达 发表于 2021-1-8 14:00
这样也是可以的。如果缓存空间有限,占用标志可以修改为当前buffer读、写索引,可以极大的利用每个缓存空 ...

Z之前裸机传递消息是这样做的,上了FREERTOS想着有没有简单的方法,之前用FREERTOS传递消息没有超过4字节的
页: [1]
查看完整版本: 消息队列数据大小