串口编程高级篇

发布 2021-05-16 21:08:28 阅读 1006

uart0串口编程系列。

uart0串口编程之在uc/os—ii中遭遇的危机。

日期:2011-02-10] **: 作者:tiger-john [字体:大中小]

一.潜在的危机。

1.在uc/os操作系统中设计串口编程时,由于isr和多个任务并发执行,情况比较复杂。尤其是接收状态为被动状态时,只能靠串行口中断来接收数据。

2.在进行串行通信时,双方遵循相同的通信协议。由于波特率不变,因此相邻两次串口中断的间隔时间基本固定。

3.在以下两种情况时会使接收过程出现错误:

第一种情况是系统关中断的最长时间大于相邻两次串行接收中断的间隔时间,这时将可能导致遗漏一次中断,造成数据丢失。

2 实时操作系统内核的关中断的最长时间是已知的,通常很短,它不是问题关键。

2 系统关中断的最长时间往往是由用户软件造成的,例如:我们编写的中断服务函数过于复杂,导致系统为了处理中断服务函数而导致关中断时间过长。

第二种情况是在串口程序正在运行期间有一个比它优先级更高的中断程序中断了串口程序。从而造成数据丢失。

2 在这里提一个概念:把不能响应串口接收中断的这段时间称为“死区”。

2 因此解决问题的关键是:死区时间不能比相邻两次串口中断的间隔时间长。

二.如何解决危机。

l 任务在访问比较耗时的共享资源时不要采用关中断的方式(改成互斥信号量)。

l isr要尽可能简短,将可以剥离的工作转交关联任务去完成。

此处的设计方式和linux中把中断分为上半部分,和下半部分的原理有着同工异曲的含义)

采用上面的方法来缩短死区时间。

另一中方法是:

加长相邻两次串口接收中断的间隔时间。

l 方法一:降低波特率,这个方法简单,但因此也导致通信效率的下将。其次,一般在进行串口编程时,波特率一般是固定的。因此此方法一般不太适用。

l 方法二:在波特率不变的情况下减少中断次数,达到加长相邻两次串口接收中断间隔时间的效果。

arm芯片的串口具有16字节的缓冲区,可以设置每接收1,4,8,14字节产生一次中断。如果设置每接收8字节中断一次,则比1字节中断一次要延长8倍的中断间隔时间。

tiger-john说明:

l 在使用有数据缓冲功能的串口编程后,比较容易满足相邻两次串口接收中断的间隔时间大于死区时间的条件,但仍然存在潜在的危险。

想要可靠的避免这场危机:必须要满足以下条件。

2 相邻两次串口接收中断的间隔时间必须大于系统死区时间。

2 接收缓冲区的空闲时间必须足够存放在“死区”时间内接收到的新数据。

若设置每接收8字节。

中断一次,则空闲空间也为8字节。由于死区时间比中断间隔时间短,故接收的新数据必然少于8字节,才不会出现数据丢失现象。

即在满足中断间隔时间大于“死区”时间的前提下,将中断条件设置为接收缓冲区的1/2,则死区时间接近中断间隔时间,接收过程是可靠的。

GDI 高级编程

本章介绍gdi 的路径 区域 变换 图像处理和图元文件等高级编程内容。路径由许多不同类型的点所构成,用于表示复杂的不规则图形。区域是由矩形 椭圆 多边形等几何形状组合构成的一种封闭图形,可用于复杂图形的绘制 剪裁和击中测试等。graphics类可对绘制的图形进行平移 旋转和伸缩变换。矩阵类matri...

C 高级编程

第六章熟悉类与对象。6.1 电子 示例介绍。6.2 编写类。6.2.1 类定义。1.方法与成员。2.访问控制。3.声明的顺序。6.2.2 定义方法。1.访问数据成员。2.调用其他方法。指针。6.2.3 使用对象。1.堆栈中的对象。2.堆中的对象 6.3 对象的生命周期。6.3.1 创建对象。1.编写...

数控高级编程讲义

第一篇铣工篇 1 专题一行切和环切 1 1.1环切 1 1.1.1环切刀具半径补偿值的计算 1 1.1.2环切刀补程序工步起点 下刀点 的确定 1 1.1.3在程序中修改刀具半径补偿值 2 1.1.4 环切宏程序 4 1.2 行切 5 1.2.1 矩形区域的行切计算 5 1.2.2行切的子程序实现 ...