2012-12-29 87 views
5

我遇到硬故障,出现在看似随机的时间,其中指针指向地址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 

似乎在同一点崩溃的大部分时间。我根据以前的建议调整了内存,但我似乎仍然有同样的问题。

谢谢你的时间!

亲切的问候

+1

这些看起来像故障安全魔术字节。你确定你没有一个悬空的指针,一个取消引用的NULL或返回的本地数组? – 2012-12-29 09:15:24

+0

@ H2CO3是的,他们确实看起来像魔术字节。指针指向数组的基数(全局作用域),并且我已经有了一个检查条件,以确保我不会在其外写入数据。指针本身一旦被初始化为数组的基础就决不会被赋值。 – ChewToy

+0

如果你可以添加一些实际的代码,这将有所帮助。 – 2012-12-29 10:25:21

回答

1

打开它,这个问题是由存储器引起的。当我以最高速度(120 Mhz)运行处理器并使用1.8伏电源(主要为3伏设计)时,我遇到了一些与内存有关的竞争情况。通过使用更高的等待状态来解决它。

4

在你的评论指出,这项指针明确分配一次,然后永远不会写入。在这种情况下,您至少应该声明它const并使用初始化而不是赋值,例如

arraytype* const ptr = array ; 

这将允许编译器检测到任何明确的写入。但是,指针被一些无关的编码错误破坏的可能性更大。

Coretx-M3片上调试支持数据访问断点;你应该在有问题的指针上设置这样一个断点,以便所有对它的写入访问都被捕获。您将在初始化过程中休息一下,然后在修改之后 - 有意或无意的。

可能的原因是相邻阵列或线程堆栈溢出。

+0

感谢您的反馈!它不是一个常量的原因是代码可以使用几个单独的缓冲区,具体取决于它正在运行的特定设备上的当前功能集。仅仅为了调试的目的,我现在试着把它设为const,编译器似乎仍然接受代码,所以这似乎不是问题。 – ChewToy

+0

就数据访问断点而言,我该如何去激活这些断点?我无法在Google或ST网站/文档上找到任何详细信息。我使用编辑器Ride7并通过Rlink Pro进行调试,但在IDE内部找不到此功能。任何人有任何建议或如何手动设置它的例子(通过asm代码或什么)? – ChewToy

+0

@ChewToy:我还没有使用过RIDE,但是谷歌搜索建议也许:*调试 - >高级命令 - >高级断点*。我建议你参考你的产品手册;该功能可能是目标和/或调试器硬件特定的。 – Clifford

3

如果你试图重新定位阵列和相同的问题仍然存在,

那么一些任务溢出。

至于你提到,你正在使用FreeRTOS操作系统,因为行为是随机的可能,什么是错的您的设置在电话STACK_SIZExTaskCreate

当分配的大小小于你这通常发生真的需要。

如果您阅读有关usStackDepth的文档,您注意到代表的是乘数而不是字节数。

我个人排除硬件问题在您的嵌入式板卡,我将专注于FreeRTOS操作系统的配置问题

+0

感谢您的回复!情况可能很好。我确实使用过xTaskCreate,好像它是字节数的大小!当我在新年前夕回到工作岗位时,我会进一步考虑进行一些测试 – ChewToy

+0

我确实有你提出的问题,但似乎没有帮助。我仍然遇到和以前一样的问题。虽然我仍然同意它看起来像溢出 – ChewToy

+0

看着你添加的数据,我注意到你的“链接寄存器”总是指一个RAM位置,并且一旦引用端口DMA1 ... 这使我认为DMA传输初始化被更高优先级的任务中断,所以你应该保护你的代码到一个序列xSemaphoreTake(...)〜xSemaphoreGive(...) 你可以阅读更多关于[互斥](http:// www.freertos.org/Real-time-embedded-RTOS-mutexes.html)。 – RTOSkit