【发布时间】:2012-12-14 08:27:32
【问题描述】:
我遇到了一个硬故障问题,它出现在看似随机的时间,其中一个指针指向地址 A5 或 FF(我允许的内存空间远低于 80000000 及以上的内存空间)。这两个值似乎总是同一个指针。
我正在使用一个运行 STM32F205RE 处理器的嵌入式系统,该处理器与一个名为 cg2900 的 fm/蓝牙/gps 芯片进行通信,并在该芯片上发生此错误。
使用调试器,我可以看到在几次测试运行期间指针分别指向地址 A5 和 FF。然而,它似乎是随机发生的,有时我可以运行测试一个小时而不会失败,而其他时候它会崩溃 20 秒。
我正在运行 freeRTOS 作为调度程序,以在可能会以某种方式干扰的不同任务(一个用于无线电,一个用于蓝牙,一个用于其他定期维护)之间切换。
这可能是什么原因?由于它正在运行自定义硬件,因此不能排除这是硬件问题(可能)。关于如何解决问题的任何指示(不是双关语)?
编辑:
经过进一步调查,似乎它崩溃的地方非常随机,而不仅仅是那个特定的指针。我使用了一个硬故障处理程序来获取这些寄存器的以下值(所有值都是十六进制):
崩溃前的半长跑(分钟):
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 或返回的本地数组吗?
-
@H2CO3 是的,它们确实看起来像魔术字节。指针指向数组的基础(全局范围),并且我已经有一个条件来检查以确保我不会在它之外写入。指针本身一旦被初始化为数组的基数,就永远不会被分配。
-
如果您可以添加一些实际代码,那会有所帮助。
-
如果数组是全局的,并且指针只指向数组并且不改变它在任何情况下都不是多余的吗?也就是说,出于各种原因here,任何全球性的事情几乎总是一个坏主意。
-
@Clifford 有问题的代码是一些遗留的遗留代码,因此它是全球性的。它使用指针的原因是特定设备可以包含其他设备中不包含的一组功能,因此使用不同的缓冲区(请注意,这不是一个非常优雅的解决方案,但这超出了这里的范围)。
标签: pointers operating-system embedded hardware stm32