硬汉嵌入式论坛

 找回密码
 立即注册
查看: 390|回复: 2
收起左侧

[技术讨论] 移除定时器列表项发生硬件异常

[复制链接]

39

主题

127

回帖

244

积分

高级会员

积分
244
发表于 2025-4-21 16:57:07 | 显示全部楼层 |阅读模式
环境:STM32F407 + FreeRTOS

在硬件异常中断里面,打印出“LR”和“PC”,其中“PC”指向 uxListRemove 函数中的 pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;
                                                            其中“LR”指向 prvProcessExpiredTimer 函数中的 if( pxTimer->uxAutoReload == ( UBaseType_t ) pdTRUE )
单独查看“PC”是移除列表中的某个列表项,因为移除某个列表项被太多的函数调用了,所以根据“LR”定位至定时器守护任务移除定时器列表中到期的定时器。

定时器的守护任务prvTimerTask ----> prvProcessTimerOrBlockTask ----> 操作到期的定时器prvProcessExpiredTimer ----> 从pxCurrentTimerList列表中获取头部的定时器 ----> 移除到期的定时器uxListRemove 中 pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious 发生硬件异常
并且触发的是“用法faults
微信截图_20250421154315.png

分析了以下几点原因:
1.pxCurrentTimerList 为全局变量,存储在data或bss段。data和bss分配的空间足够大;排除选项
微信截图_20250421165328.png

1.栈和堆分配的空间过大,导致data或bss段的空间国小。而pxCurrentTimerList 为全局变量,存储在data或bss段,所以可能破坏了pxCurrentTimerList 变量

2.在定时器的回调函数中,不是使用带有阻塞的函数;但是一般定时器的操作都在守护任务中进行,就算阻塞了,也是其它的定时器无法执行也不会出错啊

3.其它高优先级的任务或中断不合理的调用定时器的函数。这个情况在程序中也没有找到。

请问还有更好的调式和定位的方法吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2025-4-22 12:38:34 | 显示全部楼层
分享代码看下

相比后期定位,有时候看代码更直接
回复

使用道具 举报

39

主题

127

回帖

244

积分

高级会员

积分
244
 楼主| 发表于 2025-4-22 13:56:12 | 显示全部楼层
eric2013 发表于 2025-4-22 12:38
分享代码看下

相比后期定位,有时候看代码更直接

项目程序太负载了(不粘贴了),不想耽误各位的精力了。可以作为一个本人的记录贴,自己慢慢学习并查找问题。谢谢你的回复!
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-10 00:29 , Processed in 0.228254 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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