搜索
bottom↓
回复: 4

【我是大名鼎鼎罗菜鸟】讨论一下,OS下,UART怎么写?

[复制链接]

出0入0汤圆

发表于 2012-12-21 18:06:58 | 显示全部楼层 |阅读模式
本帖最后由 luoyiming1984 于 2012-12-21 18:08 编辑

在裸奔的时候,我们经常用环形缓冲的方式,通过中断来收发数据。
具体做法是:接收数据时,数据放到环形缓冲内,串口数据始终是在缓冲的尾部,而读取数据则是从缓冲的头部开始,头尾不能相碰,这样保证了读取的字节序列。
发送的时候,也是按顺序把字节写入缓冲,缓冲的尾部写入数据,头部的数据发到串口,并且都是在一个字节发完后,产生中断时再送入下一个字节,直到缓冲空了为止。

但是在OS上,又该怎么用?这里的OS是一个笼统的概念,支持信号量触发,事件触发,消息邮箱触发,消息队列触发。

第一种方法,是将要收发的数据放入消息队列,接收时中断的时候放,任务里面取;发送时任务里面放,中断里面取。这种方法要求OS支持单字节的消息队列,所以UCOS-II不适合。

第二种方法是用信号量+环形缓冲,在裸奔的基础上,对每个信号量都标记。接收时,收到一个字节,信号量记一个,任务里面取数据时先取信号量,有信号量时才读取字节。发送的时候,刚好相反,信号量是来标记发送缓冲空的,任务里取一个信号量,就往缓冲里面写一个字节,中断的时候,每发完一个字节就计数一个信号量。这种方法好处是,当串口读写时,任务可以被阻塞,直到有字节收到或者发完。同样,这也是一个缺点,比如需要多个串口的通信,就必须开多个任务,占用资源就越多。

第三种方法,还是跟裸奔一样,直接使用环形缓存。但是串口的几个关键事件,通过函数指针来处理,环形缓存加一个函数指针。接收时,当缓存收满,或者超时(STM32和LPC2XXX都支持,没有的可以用定时器来实现),就会执行函数指针里面的函数,指向的函数向应用任务发送一个触发事件,触发事件可以并行。在应用任务里,等待需要的事件,假如是多个串口接收数据,应用任务平时是阻塞的,一旦任何一个串口收到数据,就可以触发任务运行,然后任务里面读取环形缓冲。



给一个STM32在UCOS-II上的文件,可以直接添加到工程。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-12-21 21:20:54 来自手机 | 显示全部楼层
沙发啊,支持一下

出0入0汤圆

发表于 2012-12-21 22:30:48 | 显示全部楼层
本帖最后由 1ongquan 于 2012-12-21 22:32 编辑

我用第二种方法,不想对一个OS平台有太深的依赖

出0入17汤圆

发表于 2012-12-21 22:40:32 | 显示全部楼层
我用第3种

出0入0汤圆

 楼主| 发表于 2012-12-22 02:50:27 | 显示全部楼层
1ongquan 发表于 2012-12-21 22:30
我用第二种方法,不想对一个OS平台有太深的依赖

第二个方法还是很依赖OS的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 21:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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