[讨论] 写串口通信程序,第一反应是采用中断+队列方式。

fan27   2008-5-15 15:34 楼主
然后再考虑能不能裁减、替换、简化。

学会了这些基本原理,做ARM、PC什么的驱动程序都简单了。
要牢记:这是基本设计原理。

回复评论 (11)

回复 楼主 的帖子

以前也写过串口,总想用简单的printf或查询等待的方式,总无法想明白指针和数组的用法,有机会一定补补
点赞  2008-5-15 15:37

回复 沙发 的帖子

不懂计算时间啥事都干不成,首先得会计算时间
得先保证接收的数据不发生溢出掉失。
点赞  2008-5-15 15:39

4楼 fsa 

回复 板凳 的帖子

在陈明计的书上有介绍,是刚开始的几页书的一个例子<嵌入式实时操作系统SMALL RTOS 原理及应用>
点赞  2008-5-15 15:44

回复 4楼 的帖子

我的串口就是这种方式,不过速率低,4800,数据多,120个字节,所以分成了几组,保证每组数据不要超过通讯量,在增加一个协议。
点赞  2008-5-15 15:47

回复 5楼 的帖子

采用fifo方式,有效地设计接收缓冲区的长度,一般来说,可以解决接收数据溢出的问题,

除非主处理程序对缓冲区的数据处理太慢。
点赞  2008-5-15 15:51

回复 6楼 的帖子

俺对一下
“写延时函数,第一反应是采用定时器,用结构体管理”,采用定时器延时,优点只有用的人才知道,利用Nop循环来延时,太浪费了,而且有多个定时器任务要求同时启动,分时到达时,不用定时器几乎无法实现。
点赞  2008-5-15 15:55

回复 7楼 的帖子

请教所长个问题
加入我的发送缓存是 20个字节
然后刚开始的程序不断的 printf向UART送数据
用FIFO将数据压入这20个字节的缓冲区
如果连续执行大量的 printf 函数的话(加入我需要送200个字节的数据)
这个缓冲一下子就满了。那么这个时候应该怎么做呢?
显然将数据压进去队列的时间比UART发送的时间短很多。
是不是应该停下来等待队列有空位的时候再插入数据?
如果是操作系统的话应该切换任务吗?
加大缓冲区是个解决办法,但是用的不多,浪费RAM(动态分配?)

请指教指教。
点赞  2008-5-15 15:58

回复 8楼 的帖子

单任务(或只多任务中只一个任务)发送数据,可以先检查队列状况,用状态任务号进行状态之间的延时处理,分解发送。

多任务发送的时候,必定加大缓冲区。都多任务了,怎么可能一个任务中死占着串口不放?


switch( task )
{
   case....
}
就能办得到,而且支持多任务运行。
点赞  2008-5-15 15:59

回复 9楼 的帖子

常见BOOTLOADER,原DOS下也这样,使用环境条件是一个最典型的单任务,这时候爱用查询就用查询。

采用中断+队列,可以支持多任务,几乎所有驱动都是这样做的。产品中更应该这样做。
点赞  2008-5-15 15:59


以为自己上路了,原来是岔路了
点赞  2009-8-31 20:04

回复 7楼 kandy2059 的帖子

关键还是精准。
特别是使用C语言,到底中间额外的时间跑了多少,软件定时,你根本不清楚,除非去看反汇编的代码。
用汇编的话(我是说单纯定时这一项的话)。
还是用定时器精准,方便。虽然我经常一行一行数着它到底具体跑了多少个机器周期。
但估计真正做活没人会那么干。
强者为尊,弱者,死无葬身之地
点赞  2010-6-7 09:19
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复