你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

论STM的HAL库与外设死机

[复制链接]
manhuami2007 发布时间:2017-1-4 22:49
本帖最后由 manhuami2007 于 2017-1-4 22:49 编辑

前段时间的一个项目比较简单,就使用ST提供的CubeMx直接生成了工程,并在其基础上编写程序。不过串口用着用着就会出现死机而处理器没事。这是为什么?

通过调试和阅读代码,发现是因为串口出现了类似死锁的问题。

什么是死锁?
hal_uart_sisuo.jpg

死锁是指两个或两个以上进程在执行过程中,由于竞争资源或者由于彼此通讯而造成的阻塞状态。
因此死锁的重点是多个进程使用同一资源。

没有操作系统为何出现的多个进程呢?

没有操作系统的嵌入式系统中也存在两个进程:
  • 后台程序,即main()等主循环函数
  • 中断处理程序
hal_uart_isr.jpg
那么HAL库怎么造成了外设死锁的?

根据上面的分析,我们知道是由于主循环在使用外设的同时,中断也要使用这个外设。
先看看HAL库操作外设的简单流程图
hal_uart_liuchengtu.jpg
程序先检查外设是否上锁,如果上锁则直接退出,没有上锁则上锁之后接着进行相应的设置最后执行后续操作。
问题就出在这个上锁上。我的程序使用的外设是UART,使用中断接收数据,使用DMA发送数据。在中断中收到一个字节之后,再打开中断接收下一个字节。在主循环中使用DMA发送相关的数据。
那么当主程序中使用正在设置UART发送时,也就是UART还处于锁定的状态时,进入了UART接收中断,这时在中断用又要设置UART接收,此时UART处于锁定状态,所以UART的接收设置肯定会失败。从而造成UART不能再接收数据。

怎么处理呢?

这种情况下,我们不能在中断中等待外设释放锁定,因为此时主循环中的程序无法执行,因此不能释放资源。
所以我们应该在中断中通过函数的返回值判断操作是否成功,若没有成功则设置一个标志位,然后再在主循环中检查这个标志位,并在主循环中重新进行操作。

总结

避免死锁最根本的方法就是防止在主循环与中断中同时使用同一外设。
如果不能避免,那么尽量做到执行每个函数后,都判断返回值是否正确,并对执行失败的操作做相应的处理。

收藏 2 评论9 发布时间:2017-1-4 22:49

举报

9个回答
mark0668 回答时间:2017-1-4 23:18:58
涨知识了
霹雳之火 回答时间:2017-1-5 08:23:44
谢谢楼主分享
5265325 回答时间:2017-1-5 08:36:22
andypanfan 回答时间:2017-1-5 09:14:09
讲解非常的好    谢谢  !!!!!
wolfgang2015 回答时间:2017-1-6 23:15:16
防止死锁就是状态机控制
斜阳__ 回答时间:2017-1-7 09:19:44
谢谢分享,暂时没遇到串口死锁
scx111 回答时间:2017-1-7 09:33:03
帮楼主补充一下,这个机制叫作互斥访问
由LDREX,STREX,LDREXH,STREXH,LDREXB,STREXB和CLREX指令配合内部的全局监视器来完成
内存的某一地址处用于标志一个外设是否空闲,在内核请求外设前,先来一个ldrex看看外设是否空闲,如果busy(可能是之前的一个任务崩溃,需要特殊处理),继续尝试;如果空闲,再来一个strex(因为当前任务可能被OS切出,可能发生A任务ldr,B任务str同一个外设,就乱套了),如果成功,说明该外设已被改任务独占,该任务可以安全地使用该外设;如果失败,则发生了os切换的情况,需要继续重试。任务使用完后需要对外设进行释放。这样实现的互锁机制,保证一个外设在一段时间内只能被一个任务使用
yzvip7 回答时间:2017-11-28 08:42:46
中断里置位标志位,main里查询标志位。成立并执行。mark
sgsong 回答时间:2018-7-21 23:11:41
有点想不通,UART如按这种思路来工作,全双工通信怎样实现?

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版