完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
最近在将一个协议栈移植到FreeRTOS系统上。之前的协议栈是基于前后台系统开发的,在串口接收中断将接收到的数据写入一个环形缓存区,再根据协议从这个缓存区中读出一帧数据,将数据转义和解析,将最后解析出的消息写入一个接收消息环形缓存区;发送数据时,将数据打包成一条消息并写入消息发送缓存区,从消息发送缓存区读出一条消息后,封包,转义,写入串口发送队列,通过轮询或者中断形式将数据发送出去。这里面的环形缓存区全部都是用全局数组做的,在前后台系统中使用没有什么问题。那么移植到RTOS环境下时,有诸多疑问如下:
1.串口接收缓存区和发送缓存区使用全局数组问题应该不大,因为不管什么时候只会有一个任务对这块内存进行读写。一个任务或者ISR读,一个任务或者ISR写。这样理解是否正确? 2.如果将上述前后台编程思想写出的协议栈移植到RTOS下,为了移植方便,是不是紧紧需要消息发送buf的操作做临界区护就行?因为在RTOS下会有多个任务需要往消息发送缓存中填写数据。这块消息发送缓存实质上就变成了若干任务的共享内存。当访问该内存时虽然可以进行临界区保护(原子操作),但是貌似还是会出问题!比如A任务在访问这块共享内存的时候,B任务也需要访问,但是此时操作被保护了,那就只能等到A任务访问结束后才能访问。这是不是就意味着A在写入数据的整个过程中都不能被打断(整个写入数据的函数都需要被临界保护),一但写入的数据过多,过于频繁是不是就会严重影响系统的实时性?这样是不是意味着使用RTOS的情况下,共享内存的形式不是很适用? 3.按RTOS的思维的话是不是应该发送消息缓存设计成消息队列?需要写入数据的任务通过消息队列将数据发送给发送任务? 总的来说,全局数组和全局变量之类的数据结构会对RTOS带来什么样的影响? |
|
相关推荐
2个回答
|
|
发送缓冲区和接收缓冲区共享一块内存吗?
如果不是。 如果换成是我来做。 我会将所有发送数据到发送缓冲区的合并为一个任务。既然操作发送缓冲区的只有一个任务,那么久没必要对发送缓冲区进行保护了。 操作接收缓冲区的,也是同一个道理。 |
|
|
|
发送缓存和接收缓存是不同的两块内存。是有多个任务需要往发送缓存中写入数据。比如A任务是AD采集任务,B任务是温度采集任务,C任务是IC读卡任务,现在需要将这三组数据传送到另外一个MCU上去。那A任务需要将采集到的数据写入消息发送缓存进行发送,B、C任务也一样。所以称这三个任务共用消息发送缓存内存。在前后台系统中,我们可以不必考虑太多,因为后台只能被前台打断,但是前台也不会去操作这块内存,所以我可以把写共享内存的操作写成一个统一的接口;RTOS环境下如果使用全局数组这种共享内存的形式貌似会破坏系统的稳定性和实时性。我是这么理解的,不知道对不对。另外想问下小伙伴们,对于RTOS中串口啊、Can啊之类的你们有没有实现过类似的协议栈,然后呢是规划成一个大任务形式还是说分解成好几个任务?谢谢。
|
|
|
|
只有小组成员才能发言,加入小组>>
709 浏览 0 评论
1116 浏览 1 评论
2494 浏览 5 评论
2833 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2675 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
662浏览 9评论
673浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
791浏览 6评论
637浏览 5评论
681浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 22:56 , Processed in 1.148307 second(s), Total 80, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号