我遇到硬故障,出现在看似随机的时间,其中指针指向地址A5或FF(我允许的内存空间很远低于80000000及以上)。它似乎总是与这两个值相同的指针。使用freeRTOS在stm32上随机分配神秘值(A5A5A5A5和FFFFFFFF)的指针使用freeRTOS导致硬故障
我正在使用运行STM32F205RE处理器的嵌入式系统,该处理器与发生此错误的fm/bluetooth/gps芯片(称为cg2900)进行通信。
使用调试器我可以看到指针分别在几个testruns期间指向地址A5和FF。然而,它似乎随机发生,有时我可以运行测试一小时而不失败,而其他时间崩溃20秒。
我运行freeRTOS作为调度程序以在不同任务之间切换(一个用于无线电,一个用于蓝牙,一个用于其他定期维护),这可能会以某种方式干扰。
这可能是什么原因?当它运行定制硬件时,不能排除它是一个硬件问题(可能)。任何指针(没有双关语意)如何处理调试问题?
编辑:
经过进一步调查,它似乎是很随意的地方它崩溃,而不仅仅是特定的指针。我用了一个hardfault处理程序来获取这些寄存器的值选择(十六进制的值):飞机坠毁前
半长远来看(分钟):
R0 = 1
R1 = fffffffd
R2 = 20000400
R3 = 20007f7c
R12 = 7
LR [R14] = 200000c8 subroutine call return address
PC [R15] = 1010101 program counter
PSR = 8013d0f
BFAR = e000ed38
CFSR = 10000
HFSR = 40000000
DFSR = 0
AFSR = 0
SCB_SHCSR = 0
崩溃(秒)前极短的运行:
R0 = 40026088
R1 = fffffff1
R2 = cb3
R3 = 1
R12 = 34d
LR [R14] = 40026088 subroutine call return address
PC [R15] = a5a5a5a5 program counter
PSR = fffffffd
BFAR = e000ed38
CFSR = 100
HFSR = 40000000
DFSR = 0
AFSR = 0
SCB_SHCSR = 0
另一个短一(秒):
R0 = 0
R1 = fffffffd
R2 = 20000400
R3 = 20007f7c
R12 = 7
LR [R14] = 200000c8 subroutine call return address
PC [R15] = 1010101 program counter
PSR = 8013d0f
BFAR = e000ed38
CFSR = 1
HFSR = 40000000
DFSR = 0
AFSR = 0
SCB_SHCSR = 0
非常长的运行(1小时+)后:
R0 = e80000d0
R1 = fffffffd
R2 = 20000400
R3 = 2000877c
R12 = 7
LR [R14] = 200000c8 subroutine call return address
PC [R15] = 1010101 program counter
PSR = 8013d0f
BFAR = 200400d4
CFSR = 8200
HFSR = 40000000
DFSR = 0
AFSR = 0
SCB_SHCSR = 0
似乎在同一点崩溃的大部分时间。我根据以前的建议调整了内存,但我似乎仍然有同样的问题。
谢谢你的时间!
亲切的问候
这些看起来像故障安全魔术字节。你确定你没有一个悬空的指针,一个取消引用的NULL或返回的本地数组? – 2012-12-29 09:15:24
@ H2CO3是的,他们确实看起来像魔术字节。指针指向数组的基数(全局作用域),并且我已经有了一个检查条件,以确保我不会在其外写入数据。指针本身一旦被初始化为数组的基础就决不会被赋值。 – ChewToy
如果你可以添加一些实际的代码,这将有所帮助。 – 2012-12-29 10:25:21