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

stm32H750使用FreeRTOS有时死机

[复制链接]
ColeYao 提问时间:2023-5-12 11:01 / 已解决

stm32H750使用FreeRTOS,偶尔会出现所有线程停止运行的状况(流水指示灯不闪,程序不跑),此时点击触摸屏触发一下串口中断,所有的线程又会恢复运行,从堆栈调用情况看,有点像是串口发送时与串口接收冲突了,但是串口不应该是全双工的吗!不知道是不是Hal库搞得比较复杂带来的Bug,从图上可以看到,经过数次单步运行后程序自动退出了死机状态,同时RXNE标识被清零了(?单步调试触发的中断导致了串口发送状态退出)。死机时的程序调用情况A.png死机后走单步后恢复时的程序调用情况A.png

收藏 评论5 发布时间:2023-5-12 11:01

举报

5个回答
知足- 最优答案 回答时间:2023-5-16 08:56:57

ColeYao 发表于 2023-5-15 10:44</p>
<p>[md]你分析的是收和发的冲突,实际上我把程序中所有串口的收发全改成中断方式后仍然存在极小概率死机 ...

[md]不同任务使用同一个串口发送,当然要保证上一帧发送完成才发送下一帧。可以使用消息队列等方式,将同一个串口的发送函数放到同一个任务中。

知足- 回答时间:2023-5-12 13:45:35

HAL库串口使用中断方式接收时,如果发送用阻塞或者DMA方式,会有可能卡死。如果是485半双工通信,收发不同时发生,一般没问题。至于为什么,在HAL_UART_Receive_IT处理过程中会先LOCK串口,处理完再UNLOCK,实际上这段时间内串口变成半双工了。

可以收发都用IT方式,怕消耗CPU资源都用DMA也好。

ColeYao 回答时间:2023-5-15 10:44:48

知足- 发表于 2023-5-12 13:45
HAL库串口使用中断方式接收时,如果发送用阻塞或者DMA方式,会有可能卡死。如果是485半双工通信,收发 ...

[md]你分析的是收和发的冲突,实际上我把程序中所有串口的收发全改成中断方式后仍然存在极小概率死机(每秒一次发送,大概1小时到一天左右发生一次)的现象,死机位置是一直等待串口发送完成,因此我怀疑是两个不同优先级的线程同时使用串口发送引起的,目前的做法是不同线程如果需要使用同一个串口的发送函数,那么让不同线程分别在不同时间段发送(时间分段)。

知足- 回答时间:2023-5-15 15:54:07

ColeYao 发表于 2023-5-15 10:44</p>
<p>[md]你分析的是收和发的冲突,实际上我把程序中所有串口的收发全改成中断方式后仍然存在极小概率死机 ...

[md]如果多任务使用同一个串口的发送,肯定得保证上一帧发送完成才发送下一帧。可以使用消息队列等方式,让串口的发送函数保持在一个任务中处理。

ColeYao 回答时间:2023-5-19 10:29:02

知足- 发表于 2023-5-16 08:56
不同任务使用同一个串口发送,当然要保证上一帧发送完成才发送下一帧。可以使用消息队列等方式,将同 ...

[md]谢谢,习惯了以前前后台的编程方式,转FreeRTOS只会简单的拆分任务,像一些消息队列类的还做不到能灵活处理,慢慢适应吧!

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版