搜索
bottom↓
回复: 7

请教一下串口printf的实现方案?

[复制链接]

出0入0汤圆

发表于 2012-2-14 15:26:52 | 显示全部楼层 |阅读模式
这个问题已经想了很久了,一直没有一个好的方法,即使是在有RTOS的情况下。
这里说的串口printf,就是把printf retarget到串口上,但是不能用while(usart->tc!=1){}这样的代码来让CPU空转等待它完成。

到最后感觉应该靠DMA来完成,有两套方案,但是都有问题:

方案1、这个方案的时间不依赖实时系统的存在。建立一个buffer数组,在printf中寻找空的可用buffer,先用sprintf把printf的内容传入这个可用buffer,然后开启DMA,在DMA的TC中断中再次检查buffer,如果有已经填充好的buffer,再次开启DMA,然后形成这样一个循环。

问题:DMA传输虽然不占用CPU时间,但串口的DR寄存器是一直被占用了的,而且这个占用时间和直接用轮询等待的方式是一样的;如果在短时间内连续大量的调用printf让缓冲区填满了,但DMA那边还在慢慢的传,串口DR寄存器还是被占用着,buffer又不能写了,丢失数据的问题就开始出现了。

方案2:实现创建一个信号量。在printf函数中,先调用sprintf把内容传入字符串,开启DMA传送,然后无限时的等待获取信号量。这个时候调用printf的这个任务事实上就被suspend了,系统可以切到其他任务执行。等DMA的TC中断发生了,释放这个信号量,printf那里的阻塞被解除,调用printf函数的任务得以继续进行。

问题:很明显,单任务时没问题,多任务时直接完蛋。TC中断给出的信号量可能有好几个任务里的printf在等待,你到底要解除哪个printf的阻塞呢?更严重的是,其他任务中的printf完全可能在第一个任务的printf对DMA的占用没有释放时就请求调用DMA,这个时候数据丢失也会发生。

在有实时系统的情况下,到底要如何解决这种问题呢?目的很简单,printf本身的执行时间很短(不依靠轮询),执行后的等待由借助RTOS调度完成。

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2012-2-14 15:32:37 | 显示全部楼层
新的书就有相关内容的探讨 ^-^

出0入0汤圆

发表于 2012-2-14 15:34:07 | 显示全部楼层
当赚钱速度小于花钱速度时,想什么着都是白搭。

出0入0汤圆

发表于 2012-2-14 15:37:53 | 显示全部楼层
回复【2楼】aozima
当赚钱速度小于花钱速度时,想什么着都是白搭。
-----------------------------------------------------------------------

顶这句

出0入0汤圆

 楼主| 发表于 2012-2-14 16:00:14 | 显示全部楼层
回复【1楼】ffxz  
-----------------------------------------------------------------------

上市了没,书名是啥?

出0入0汤圆

 楼主| 发表于 2012-2-14 16:02:55 | 显示全部楼层
回复【2楼】aozima  
当赚钱速度小于花钱速度时,想什么着都是白搭。
-----------------------------------------------------------------------

我知道你这句话的意思,一个任务中有太多的printf肯定会导致最终执行时间的增加,但是可以把CPU从这个耗时中解救出来啊。

出0入0汤圆

发表于 2012-2-14 18:36:40 | 显示全部楼层
回复【1楼】ffxz
新的书就有相关内容的探讨 ^-^
-----------------------------------------------------------------------

我也想知道,这本书上市了没有?题目叫什么呢?

出870入263汤圆

发表于 2012-2-22 11:38:09 | 显示全部楼层
这个问题其实没那么复杂。我的实现虽然没用到DMA,但是串口发送仍然不需要等待,利用发送中断来实现。建立一个环形缓冲区结构,发送驱动程序从中取出数据进行发送,应用程序把数据放进环形缓冲区即可。应用程序与驱动程序之间由缓冲区结构隔离,当应用程序发现缓冲区满时,只要使自身延时几个OS Tick即可,不一定要用OS线程同步对象。如果缓冲区足够大,很少会出现缓冲区满的情况。
下面是在NXP1766上的实现代码,仅供参考:
仅供参考ourdev_721067Y5VKHQ.zip(文件大小:3K) (原文件名:fdbg.zip)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-29 14:28

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

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