linux串口互斥,UART0串口编程之在UC/OS—II中遭遇的危机
一.潜在的危机
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,则死区时间接近中断间隔时间,接收过程是可靠的。
linux串口互斥,UART0串口编程之在UC/OS—II中遭遇的危机相关推荐
- UART0串口编程(四):UART0串口编程之在UC/OS—II中遭遇的危机
UART0串口编程之在UC/OS-II中遭遇的危机 一.潜在的危机 1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂.尤其是接收状态为被动状态时,只能靠串行口中断来 ...
- linux send 失败_linux高性能网络编程之tcp连接的内存使用
当服务器的并发TCP连接数以十万计时,我们就会对一个TCP连接在操作系统内核上消耗的内存多少感兴趣.socket编程方法提供了SO_SNDBUF.SO_RCVBUF这样的接口来设置连接的读写缓存,li ...
- Linux C高级编程——网络编程之API(5)
Linux C网络编程--API 宗旨:技术的学习是有限的,分享的精神的无限的. 一.基本socket函数 Linux系统是通过提供套接字(socket)来进行网络编程的.网络的so ...
- Linux C高级编程——网络编程之UDP(4)
Linux网络编程--UDP 宗旨:技术的学习是有限的,分享的精神是无限的. 下面分析一帧基于UDP的TFTP协议帧. 以太网首部 0000: 00 05 5d 67 d0 b1 00 05 5d 6 ...
- Linux C高级编程——网络编程之TCP(3)
Linux网络编程(三)--TCP 宗旨:技术的学习是有限的,分享的精神是无限的. 1.TCP段格式 和UDP协议一样也有源端口号和目的端口号,通讯的双方由IP地址和端口号标识.32位序号.32位确认 ...
- (47)LINUX应用编程和网络编程之二Linux文件属性
Linux下的文件系统为树形结构,入口为/ 树形结构下的文件目录: 无论哪个版本的Linux系统,都有这些目录,这些目录应该是标准的.各个Linux发行版本会存在一些小小的差异,但总体来说,还是大体差 ...
- linux sockaddr结构体,网络编程之sockaddr_ll结构体 | 人人学技术
sockaddr_ll, 源文件为,结构如下: struct sockaddr_ll { unsigned short int sll_family; /* 一般为AF_PACKET */ unsig ...
- 编程之美3.7 队列中最大值问题
这道题目的意思是,有一个队列,它里面会存储一些数值,现在,要求你需要在 O(1) 的时间内返回这个队列中最大的那个值. 这道题目的和栈中最大值最小值问题是一样的解法,都是需要一 ...
- c语言找出递增子数组的长度,编程之美2.16 数组中最长递增子序列的长度
改进的方法看的头大了却还是不清楚,哎...搞算法的苦啊,纠结啊. 编程之美这本书里面就有关于这道题的一些解法,求一个一位数组中的最长序列的长度.例如,在序列1,3,2中,最长递增序列是1,3. 这道题 ...
最新文章
- java文件下载文件名乱码
- 当写了五百行代码忘记保存时…… | 每日趣闻
- 学python要基础吗-自学Python要有其他语言基础吗?
- 前端一HTML:二十五盒子模型
- linux之写C代码出现warning: format not a string literal and no format arguments [-Wformat-security]
- 京东秒杀倒计时(js)
- MapGIS入门教程——基础操作
- 百度AI-语音识别图片搜索(Java)
- java错误找不到符号怎么办_java错误找不到符号
- win10怎么修改计算机桌面存储路径,win10系统修改桌面文件存储路径的操作方法...
- android 朗读tts_如何设置Android以大声朗读您的文本
- Java Code Review 介绍
- CVPR 2022 部分行人重识别
- 微信小程序|做一个底部评论视图
- 网上商城SSH三者间的牵线
- android 动态定制模板,android studio 自定义模板
- flink的广播、累加、缓存
- 关于计算机基础知识的话题,计算机基础教案(完整版).doc
- SD敢达服务器源码,《SD敢达OL》服务器账号数据合并规则
- Android笔记-Linux Kernel Ftrace (Function Trace)解析