硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5150|回复: 10
收起左侧

[FreeRTOS] 消息队列数据大小

[复制链接]

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2021-1-6 15:08:22 | 显示全部楼层 |阅读模式
消息的大小超过4字节,消息可能不会被立即接收处理,这样该如何处理好?
回复

使用道具 举报

8

主题

104

回帖

138

积分

初级会员

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

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2021-1-6 18:21:53 | 显示全部楼层
使用FREERTOS的消息队列好像没办法解决这个问题?不知道硬汉哥,有没有什么好的思路?
回复

使用道具 举报

8

主题

104

回帖

138

积分

初级会员

积分
138
发表于 2021-1-6 21:05:32 | 显示全部楼层
273794920 发表于 2021-1-6 18:21
使用FREERTOS的消息队列好像没办法解决这个问题?不知道硬汉哥,有没有什么好的思路?

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

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2021-1-7 09:45:19 | 显示全部楼层
李益达 发表于 2021-1-6 21:05
FreeRTOS有消息队列还不够吗,你应该没看懂我说的解决方案。
或者你干脆用数组实现一个环形缓冲队列。

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

使用道具 举报

8

主题

104

回帖

138

积分

初级会员

积分
138
发表于 2021-1-7 13:23:16 | 显示全部楼层
273794920 发表于 2021-1-7 09:45
每次传递的消息大于4个字节,用消息队列怎么实现?

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

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2021-1-8 10:18:39 | 显示全部楼层
李益达 发表于 2021-1-7 13:23
我上面的表述有个地方是错的,四个字节存放的是“节点指针的地址”。
四个字节不直接存放所谓的“消息” ...

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

使用道具 举报

8

主题

104

回帖

138

积分

初级会员

积分
138
发表于 2021-1-8 11:21:45 | 显示全部楼层
273794920 发表于 2021-1-8 10:18
明白你的意思,但是每一条消息都带一个消息内容的地址,这个地址所指向的数据如何管理

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

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2021-1-8 13:41:44 | 显示全部楼层
李益达 发表于 2021-1-7 13:23
我上面的表述有个地方是错的,四个字节存放的是“节点指针的地址”。
四个字节不直接存放所谓的“消息” ...

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

使用道具 举报

8

主题

104

回帖

138

积分

初级会员

积分
138
发表于 2021-1-8 14:00:34 | 显示全部楼层
273794920 发表于 2021-1-8 13:41
真正的消息放到一个结构体数组里面,每条消息有个占用标志,已经占用了就不能放新的消息,消息被读取时修 ...

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

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2021-1-8 15:12:16 | 显示全部楼层
李益达 发表于 2021-1-8 14:00
这样也是可以的。如果缓存空间有限,占用标志可以修改为当前buffer读、写索引,可以极大的利用每个缓存空 ...

Z之前裸机传递消息是这样做的,上了FREERTOS想着有没有简单的方法,之前用FREERTOS传递消息没有超过4字节的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-1 12:24 , Processed in 0.185753 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表