UART0串口编程之在UC/OS—II中遭遇的危机
一.潜在的危机

1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂。尤其是接收状态为被动状态时,只能靠串行口中断来接收数据。
2.在进行串行通信时,双方遵循相同的通信协议。由于波特率不变,因此相邻两次串口中断的间隔时间基本固定。
3.在以下两种情况时会使接收过程出现错误:
(1)第一种情况是系统关中断的最长时间大于相邻两次串行接收中断的间隔时间,这时将可能导致遗漏一次中断,造成数据丢失。
(2)实时操作系统内核的关中断的最长时间是已知的,通常很短,它不是问题关键。
(3)系统关中断的最长时间往往是由用户软件造成的,例如:我们编写的中断服务函数过于复杂,导致系统为了处理中断服务函数而导致关中断时间过长。
(4)第二种情况是在串口程序正在运行期间有一个比它优先级更高的中断程序中断了串口程序。从而造成数据丢失。
(5)在这里提一个概念:把不能响应串口接收中断的这段时间称为“死区”。因此解决问题的关键是:死区时间不能比相邻两次串口中断的间隔时间长。
二.如何解决危机
l  任务在访问比较耗时的共享资源时不要采用关中断的方式(改成互斥信号量)。
l  ISR要尽可能简短,将可以剥离的工作转交关联任务去完成。
(此处的设计方式和Linux中把中断分为上半部分,和下半部分的原理有着同工异曲的含义)
采用上面的方法来缩短死区时间。
另一中方法是:
加长相邻两次串口接收中断的间隔时间。
l  方法一:降低波特率,这个方法简单,但因此也导致通信效率的下将。其次,一般在进行串口编程时,波特率一般是固定的。因此此方法一般不太适用。
l  方法二:在波特率不变的情况下减少中断次数,达到加长相邻两次串口接收中断间隔时间的效果。
ARM芯片的串口具有16字节的缓冲区,可以设置每接收1,4,8,14字节产生一次中断。如果设置每接收8字节中断一次,则比1字节中断一次要延长8倍的中断间隔时间。
Tiger-John说明:
l  在使用有数据缓冲功能的串口编程后,比较容易满足相邻两次串口接收中断的间隔时间大于死区时间的条件,但仍然存在潜在的危险。
想要可靠的避免这场危机:必须要满足以下条件
(1)相邻两次串口接收中断的间隔时间必须大于系统死区时间
(2)接收缓冲区的空闲时间必须足够存放在“死区”时间内接收到的新数据。
 若设置每接收8字节中断一次,则空闲空间也为8字节。由于死区时间比中断间隔时间短,故接收的新数据必然少于8字节,才不会出现数据丢失现象。
即在满足中断间隔时间大于“死区”时间的前提下,将中断条件设置为接收缓冲区的1/2,则死区时间接近中断间隔时间,接收过程是可靠的。

UART0串口编程(四):UART0串口编程之在UC/OS—II中遭遇的危机相关推荐

  1. linux串口互斥,UART0串口编程之在UC/OS—II中遭遇的危机

    一.潜在的危机 1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂.尤其是接收状态为被动状态时,只能靠串行口中断来接收数据. 2.在进行串行通信时,双方遵循相同的通信 ...

  2. Linux 串口编程四 串口设备程序开发

    Linux 串口编程和程序相对来说是很简单的,之所以用博客连载来展示,主要是想在学会使用的基础上掌握相关背景,原理以及注意事项.相信在遇到问题的时候,我们就不会对于技术的概念和 API 的使用浅尝辄止 ...

  3. Linux——Linux系统编程之串口编程总结(串口的初始化、读写操作实践)

    目录 0 引言 1 串口编程的流程 1.1 打开串口 1.2 初始化串口 1.2.1 termios结构体 1.2.2 关键函数 1.2.3 初始化串口代码 2 串口的读写测试例程 0 引言 串口大家 ...

  4. Linux系统编程四:串口编程,控制LED和蜂鸣器

    目录 一.概述 二.串口初始化 2.1 读取当前串口的参数 参数结构体 2.2 波特率相关的函数 2.3 清空串口缓存 2.4 设置串口参数 三.串口通信 四.控制LED和蜂鸣器 五.总结 一.概述 ...

  5. 【C#串口编程计划】串口编程简介

    介绍C#串口编程的基本知识.

  6. pythonasyncio并发编程实战_python异步编程之asyncio(百万并发)

    [python异步编程之asyncio(百万并发)] 前言:python由于GIL(全局锁)的存在,不能发挥多核的优势,其性能一直饱受诟病.然而在IO密集型的网络编程里,异步处理比同步处理能提升成百上 ...

  7. 串口编程--C语言串口读取数据

    串口编程 1.通讯流程 2.demo 1.通讯流程 ①.打开串口 ②.设置波特率 ③.设置奇偶校验位.停止位.数据位等 ④.读写数据 ⑤.关闭串口 2.demo 本示例串口文件根据自己实际情况打开,方 ...

  8. 【LabVIEW串口编程】03 串口接收

    上一篇说到,串口发送一次数据的步骤为:打开串口-->发送数据-->关闭串口. 参照串口发送的思路,串口接收一次数据的步骤为:打开串口-->接收数据-->关闭串口.但是这里有一个 ...

  9. 深入浅出Visual C++串口编程--深入浅出VC++串口编程之DOS的串口编程

    在DOS平台下,操作串口主要有下列方式:通过BIOS调用.通过串口的硬件中断或通过对串口硬件进行轮询,本章将对以上三种方式进行具体的介绍并给出例子. 1.BIOS中断 在DOS操作系统下,IBM PC ...

最新文章

  1. ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务解决
  2. 200528更新arduino开发ESP8266配置方法,入门必看,esp8266开发板库离线安装包package2.7.1...
  3. 实现一个反向传播人工神经网络
  4. CS这么难申,小哥哥你怎么拿到全美最高额度奖学金的?
  5. 记6分的交通违法行为
  6. as3位图绘制器(矢量器):as3potrace
  7. 三、 复杂对象类型的WebService
  8. 静态页面 调用php数据,静态html页面如何更新点击数
  9. risc-v 编译 linux,linux - 如何为RISC-V编译Linux Kernel 4.20 - 堆栈内存溢出
  10. Car Net全文翻译
  11. androidstudio图片居中_android studio textView 垂直居中
  12. 富龙飞联手文创产业研究所,推出国内首个AR+文创建设应用系统
  13. 教大家一个可以用迅雷全速下载百度网盘文件的方法
  14. 外牌年检车辆在上海办理年检
  15. [2018.11.05 T1] 喝牛奶
  16. 程序员路在何方的辛苦工作
  17. 环形电流计算公式_环形电流的磁场分布 怎么计算
  18. 知云文献翻译打不开_一款好用的文献英中翻译软件
  19. “东数西算”背后隐秘的玩家们
  20. 如何改进项目的经验教训总结会

热门文章

  1. Informatica ETL workflow 定时运行功能介绍 scheduler
  2. 构建之法第三章软件工程师的成长
  3. 前端基本功—javascript 第三天
  4. Android LayoutInflater详解(转)
  5. jquery 源码分析九 - Sizzle
  6. SharePoint 2013 Word 转换PDF服务介绍及示例
  7. practical rendering and computation with dx11 ebook
  8. C/C++中的指针变量可以相互赋值,使得它们指向同一块地址空间
  9. 蛋花花谈Web开发到底要不要加入人工智能
  10. 基于nginx和uWSGI在Ubuntu系统上部署Django项目