本文作者:Miler Shao
    某日某工程师跟我交流,他在使用STM32F031的芯片开发一款电子产品. MCU跟外界有个UART串口通讯,外界经常会不定期地传送一串固定数量的数据包过来。令他郁闷的是,在从外界接受数据时偶尔会出现数据丢失一个两个的,尤其波特率高的时候容易发生。

经过跟他深入沟通,了解到STM32F031跟外界有UART数据通信并开启了RXNE接收中断,还有对外的AD采样动作,通过定时器定时触发AD转换,并开启了ADC1的转换完成中断。AD触发间隔为2秒。再就是些其它对外的GPIO操作的东西。他陈述当波特率低于9600,甚至更低时就很难遇到丢包的现象,只要当波特率达到115200甚至更高时,就比较容易丢包,经常丢一个两个不等,波特率越高越容易丢。

客户给USART1的时钟源配置的是48M系统时钟。按理说,STM32F0芯片的UART的波特率跑个200K是很轻松的事。让他用示波器在芯片RX脚监测外界传输过来的信号,当外界发送方的波特率即使在200K左右时波形还是很干净漂亮,看来不存在信号畸变的问题。

因为他谈到开启了UART RX中断和ADC的EOC中断,我怀疑他的中断优先级配置可能有问题。察看其代码后,发现关于UARTTX/RX中断与ADC的EOC中断优先级一样的 。

看到这里,基本算是找到原因了,只待进一步验证。

外界不定期通过UART发送数据给MCU,当它收到一个数据本该通过RX中断请求去读取数据时,如果此刻碰上ADC的EOC中断服务程序刚刚开始或正在执行途中,由于二者优先级一样,那UART的RX 中断就得至少等待ADC中断服务程序继续执行到弹栈前的时间。若在这个等待期间内UART又收到了第二个数据甚至更多,那就会发生溢出导致数据丢失。

那为什么会只是偶尔发生而且波特率高更容易发生呢?这也不难理解。

波特率高意味着传送速度快,相应的每个字符的传送时间就短,即收到一个字符后,下一个字符来得也快。而每次的ADC的中断程序执行时间是相对固定的,最糟糕的情形就是产生UART RX中断请求时碰到EOC中断服务程序刚刚开始,这样等待时间最长。在UART接收到数据等待ADC中断释放CPU期间,新的数据来得越快,丢数据的几率就越高。当然了,不是每次都是碰到那个最糟糕的情形,最好的情形就是碰上ADC中断服务程序刚好执行完毕。

反过来讲,如果UART传输波特率比较低,意味着单个字符传输时间相对比较长。碰到ADC中断服务程序先得到响应情况下,或许等人家执行完了再来取“待取走”的数据还来得及,尤其不在最糟糕的情形下。

当该工程师将UART RX中断优先级配置为高于ADC的中断优先级后就再没那个麻烦了。

顺便说说上面那红色语句“等待ADC中断继续执行直到弹栈前”。

这句红色的话意思是说,在上面情况下,UART中断请求等待EOC中断运行到执行POP之前的时刻就可得到响应而去执行UART RX中断服务程序,并不急着执行EOC中断的POP弹栈动作,随之的UART中断服务程序也无需压栈操作,UART中断程序执行完毕后再回来做弹栈动作,然后回到主循环的中断处接着运行。这就是平常所说的咬尾中断。不难看出,这样可以大大提升中断响应速度。具体到本案,这个咬尾操作一定程度上减少了丢码机会。


    既然提到了咬尾中断,可能很多人听说过晚到中断。所谓晚到中断,简单点说就是低优先级中断服务程序正在压栈或刚压栈完毕时发生更高优先级的中断请求,高优先级中断不再做PUSH压栈操作,等到低优先级中断压栈完毕即直接运行高优先级中断服务程序,随后再返回来接着执行低优先级中断服务程序,之后再做POP弹栈操作。

前面提到的STM32F0 的两个中断优先级相同情况下,都是假定中断请求在时间上错开了的情况。如果二者同时到达,那CPU先响应哪一个呢?就看二者在中断矢量表的序号,谁的序号小就先响应谁。

另外,玩过CORTEX M3/M4内核MCU的人,比方STM32F1,STM32F2,STM32F3,STM32F4等芯片的人可能会发现,CORTEX M0 内核的MCU的中断管理跟其它CORTEX M3/M4内核的在中断优先级管理上是有差异的。

M3/M4的MCU在中断优先级做分组管理,分抢占优先级和响应优先级。只有强占优先级高的中断请求才可以打断低抢占优先级的中断服务程序;抢占优先级相同的情况下,高响应优先级的中断请求顶多可以优先获得响应权。而M0内核芯片的中断优先级不再做分组管理,谁的优先级高就优先响应并可打断低优先级的中断服务程序。

当在系统里开启多个中断事件时,要合理安排各中断源的优先级,有些时候可能还需精心安排。对于初学者,因为中断优先级问题处理不当而导致麻烦的情况时有发生。再就是对于中断服务程序,如果不是必需,代码尽量精简,不要累赘,能放到中断外部处理的就尽量放到外部去。

一个跟STM32F0中断优先级有关的话题相关推荐

  1. 深度学习+知识图谱,一个不小心就顶流的话题

    知识图谱是个很热的话题,是学术界研究的热点,也是工业界主推的重点.我自己接触到的就不下十个项目,都自称使用了知识图谱技术.不过,到底什么是知识图谱,却发现各家的理解差异很大--有人大唱赞歌,说知识图谱 ...

  2. Gmapping从开始到放弃—写一个TF 广播

    这是一个关于实现把机器人的位姿广播到TF中,这是对ROS 有一定的熟悉之后教程 (1)cd catkin_ws/src 进入我们的ROS 的工作空间 (2)catkin_create_pkg my_t ...

  3. 怎么主动发起话题_约会的时候,多聊这4个话题,女人才会失去抵抗力

    约会就意味着跟女人在足够短的距离配合足够短的时间进行短兵相接,唯有用你的三寸不烂之舌才能够做到不战,照样能够旗开得胜,说服女人就是从内部攻破女人的防线. 一.女人想要的未来在哪里,你就需要跟女人聊到哪 ...

  4. SysTick定时器的一个简单应用

    SysTick即为系统定时器,又称嘀嗒定时器,是Cortex-M3内核的一个外设,集成在NVIC中.SysTick是一个24bit的向下递减的计数器,每计数一次的时间为1/SYSCLK(SYSCLK一 ...

  5. 理解ROS话题---ROS学习第5篇

    文章目录 1. 通过键盘控制turtle 2. ROS话题 2.1 使用rqt_graph 2.2 介绍rostopic 2.3 使用功能rostopic echo 2.4 使用rostopic li ...

  6. 一个高效的定时任务系统

    "今天想跟大家一起探讨一个听起来很简单的话题:定时任务机制. 无非就是一个计时器,到了指定时间就开始跑呗.too young,要是这么简单我还说啥呢,干不就完了. 那如果是几千上万个定时任务 ...

  7. 我不是在吓你,但是区块链,可能真的是普通人弯道超车的最后一个机会了。

    机会就像一个标低价格的商品.一段打折促销的黄金期,转瞬即逝,手慢则无.       区块链,是一个极具争议性的话题. 有人说,它是天使,通过区块链实现透明.去中介化.提高效率,实现资源共享等,给社会带 ...

  8. 专注是最好的修行,一个80后IT从业者14年的成长与感悟

    作者 | 耿立超 责编 | Aholiab 封图 | CSDN 付费下载自视觉中国 出品 | CSDN(ID:CSDNnews) 南方的路边普遍生长着一种三片叶子的植物,学名车轴草,这种草有时会长出四 ...

  9. ROS 搞懂多话题回调机制以及消息队列

    ROS 消息队列的运行机制 下面只是自己的理解,如果有误望大家指正! 大部分内容参考于 https://blog.csdn.net/qq_42700518/article/details/104453 ...

最新文章

  1. JAVA《第一次作业》
  2. python程序保存_初识python 文件读取 保存
  3. 【Spark篇】---Spark解决数据倾斜问题
  4. 手写html基础格式,手写服务器_HTML 简单入门知识
  5. 我的世界linux服务器怎么加种子,我的世界怎么获得服务器种子?服务器种子获得方法介绍...
  6. html 编辑器 es6,小技巧:一行代码让浏览器瞬间变成临时编辑器
  7. 轨迹相似性度量方法总结
  8. faster-rcnn for tensorflow 测试过程
  9. [leetcode]36. Valid Sudoku c语言
  10. 简书python_python实现简书点赞
  11. python坐标轴刻度设置为一个函数_Python坐标轴操作及设置代码实例
  12. html所有标签大全wps文件,html所有标签及其作用说明.wps
  13. openlayers6踩坑系列(七)坐标经纬度转换公式
  14. GEE:LandTrendr时间序列曲线拟合
  15. TensorFlow学习笔记(二)把数字标签转化成onehot标签
  16. anaconda3更新后,菜单栏中没有Anaconda Promt
  17. 遗传算法GA算法思路及其C++实现
  18. 程序员一定要打造一个专业的家庭开发工作站
  19. cnn生成图像显著图_基本原理 | 图片中的绝对位置信息,CNN能搞定吗?
  20. linux下运行htk,Linux下HTk工具箱的安装

热门文章

  1. python requests请求方式_Python Requests库使用2:请求方法
  2. SpringCloud学习笔记 - 消息驱动 - Spring Cloud Stream
  3. 迈锐宝1.5t噪音测试软件,迈锐宝1.5T动力够用不?车友作测贡献新车极速案例
  4. php json引号转义字符,PHP json字符串对特殊字符处理(单引号,双引号)
  5. R语言使用原生包(基础导入包、graphics)中的hist函数可视化直方图(histogram plot)
  6. Mendeley 一款不错的整理论文的软件
  7. 偏最小二乘回归(PLSR)- 1 概览
  8. python绘制繁花曲线代码_使用python和pygame绘制繁花曲线
  9. Python选择结构练习题
  10. iOS个人整理33-GCD----多线程优化