OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7161|回复: 10

stm32H750使用FreeRTOS有时死机

[复制链接]

13

主题

91

帖子

0

精华

高级会员

Rank: 4

积分
749
金钱
749
注册时间
2020-6-24
在线时间
311 小时
发表于 2023-5-5 16:28:33 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 ColeSofCJ 于 2023-5-6 11:52 编辑

  如题,stm32H750使用FreeRTOS,偶尔会出现所有线程停止运行的状况(流水指示灯不闪,程序不跑),此时点击触摸屏触发一下串口中断,所有的线程又会恢复运行,程序中有极短时间的关中断开中断,但没有长时间的关线程开线程操作,不知道大家有没有遇到类似的状况,如何解决?                             附图为死机时的函数调用情况截图,但是单步执行追踪后不久就退出了死机状态!                       目前通过查找资料,认为是HAL_UART_Transmit()与HAL_UART_Receive_IT()混用引起的,已将HAL_UART_Transmit()改为HAL_UART_Transmit_IT(),继续测试。。。。
死机时的程序调用情况.png

最佳答案

查看完整内容[请看2#楼]

你是程序卡在哪边了吧 可以debug下
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6756

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12983
金钱
12983
注册时间
2012-11-26
在线时间
3787 小时
发表于 2023-5-5 16:28:34 | 显示全部楼层
你是程序卡在哪边了吧    可以debug下
回复

使用道具 举报

13

主题

91

帖子

0

精华

高级会员

Rank: 4

积分
749
金钱
749
注册时间
2020-6-24
在线时间
311 小时
 楼主| 发表于 2023-5-6 09:03:26 | 显示全部楼层
jermy_z 发表于 2023-5-6 08:28
你是程序卡在哪边了吧    可以debug下

几率不高,大概几天会出现一次的样子,而且现在还没有可测试的设备,看来只好有机会带仿真器运行试试看能不能捕捉到这种情况了。
回复

使用道具 举报

10

主题

216

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5857
金钱
5857
注册时间
2016-12-19
在线时间
749 小时
发表于 2023-5-7 06:22:39 | 显示全部楼层
我觉得更像低功耗状态,其他功能被关闭了,触摸恢复,就像手机唤醒一样
回复

使用道具 举报

13

主题

91

帖子

0

精华

高级会员

Rank: 4

积分
749
金钱
749
注册时间
2020-6-24
在线时间
311 小时
 楼主| 发表于 2023-5-8 16:53:53 | 显示全部楼层
你的蓝朋友 发表于 2023-5-7 06:22
我觉得更像低功耗状态,其他功能被关闭了,触摸恢复,就像手机唤醒一样

网上的说法是同一个串口设备的阻塞式函数与中断式函数不能混用,否则可能引起阻塞,因为HAL库的函数实现比较绕,看不明白具体是怎么引起阻塞的,先统一成中断式函数测试一段时间看看再说!
回复

使用道具 举报

13

主题

91

帖子

0

精华

高级会员

Rank: 4

积分
749
金钱
749
注册时间
2020-6-24
在线时间
311 小时
 楼主| 发表于 2023-5-11 10:01:35 | 显示全部楼层
ColeSofCJ 发表于 2023-5-8 16:53
网上的说法是同一个串口设备的阻塞式函数与中断式函数不能混用,否则可能引起阻塞,因为HAL库的函数实现 ...

  已经放弃使用所有串口的阻塞式函数了,但今天没带仿真器运行时仍然复制到了FreeRTOS死机的现象(中断仍然在运行),并且死机会一直保持,直到点击触摸屏触发串口接收中断后FreeRTOS恢复正常运行!
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2023-5-11
在线时间
0 小时
发表于 2023-5-11 15:56:20 | 显示全部楼层
123456789
回复

使用道具 举报

49

主题

341

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5259
金钱
5259
注册时间
2012-8-25
在线时间
1025 小时
发表于 2023-5-11 16:26:34 | 显示全部楼层
百分百memcpy的问题
回复

使用道具 举报

13

主题

91

帖子

0

精华

高级会员

Rank: 4

积分
749
金钱
749
注册时间
2020-6-24
在线时间
311 小时
 楼主| 发表于 2023-5-11 21:08:04 | 显示全部楼层
gotofly21 发表于 2023-5-11 16:26
百分百memcpy的问题

能否说详细一点,或者给个参考的错误例程或链接,谢谢!
回复

使用道具 举报

13

主题

91

帖子

0

精华

高级会员

Rank: 4

积分
749
金钱
749
注册时间
2020-6-24
在线时间
311 小时
 楼主| 发表于 2023-5-12 10:29:23 | 显示全部楼层
本帖最后由 ColeSofCJ 于 2023-5-12 10:52 编辑

   昨天晚上挂机一个通宵,再次复制到死机现象,如图,从堆栈调用情况看,有点像是串口发送时与串口接收冲突了,但是串口不应该是全双工的吗!不知道是不是Hal库搞得比较复杂带来的Bug,从图上可以看到,经过数次单步运行后程序自动退出了死机状态,同时RXNE标识被清零了(?单步调试触发的中断导致了串口发送状态退出)。                另外程序中使用到了Memcpy()函数,但主要是Wifi和MQTT、Json的部分,应该与触摸屏部分的串口关系不大。程序死机时是在往触摸屏发送字节时卡在等待发送状态完成,这时候该串口收到字节或有其它中断触发则可以退出等待状态,否则会一直等待!
死机时的程序调用情况A.png
死机后走单步后恢复时的程序调用情况A.png
回复

使用道具 举报

13

主题

91

帖子

0

精华

高级会员

Rank: 4

积分
749
金钱
749
注册时间
2020-6-24
在线时间
311 小时
 楼主| 发表于 2023-5-15 08:54:06 | 显示全部楼层
本帖最后由 ColeSofCJ 于 2023-5-17 15:36 编辑
ColeSofCJ 发表于 2023-5-12 10:29
昨天晚上挂机一个通宵,再次复制到死机现象,如图,从堆栈调用情况看,有点像是串口发送时与串口接收冲 ...

   目前对这个现象的原因,怀疑可能与两个因素有关:1)DS18B20函数中taskENTER_CRITICAL()与taskEXIT_CRITICAL()的使用,可能对中断部分产生了影响,目前已换成vTaskSuspendAll()与xTaskResumeAll();  2)不同的线程尤其是不同优先级的线程不能同时调用串口发送函数,否则会造成冲突,遗憾的是尽管复制到异常现象,但堆栈调用完全看不出来有这种现象,解决这个问题的办法比较简单,比如线程A、B、C都需要调用串口发送函数,设置一个全局时间变量TimeA,其单位是mS,让线程A在TimeA=0时发送、线程B在TimeA=300时发送、线程C在TimeA=600时发送即可,保证时间上没有冲突就好了!
  以上!   关于串口事物的处理,一般的程序是集中在一个线程中处理,因此就不存在多个线程冲突的问题,但FreeRTOS是多线程的,有时增加功能时为了简化,另开了一个线程用于处理串口事物,比如对于触摸屏,常规的图标状态更新应用了线程A,定时从触摸屏获取RTC时间用了线程B,此时线程A和线程B就需要保证不会同时进行串口发送,当然也可以只使用一个线程处理所有的串口事物,此时由于一般事物是顺序执行的,因此也就不存在时间上冲突的可能。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 14:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表