来自systick的FreeRTOS ARM皮质硬故障升级

时间:2017-01-24 13:34:45

标签: cortex-m3 freertos

在特殊情况下,我遇到了一个严重的异常。 ICSR表示它是从systick升级(待定异常= 15)。

  • 任何想法会如何发生?

我的猜测是,这是某种死锁。

  • 有关如何追踪此问题的任何建议(没有Atmel Studio)?

我正在使用FreeRTOS 7.5.2。

更新:

我在输出转储中添加了一些故障寄存器。所以它确实是一个总线故障,其中有一个未完成的systick中断:

EXCEPTION HANDLER
- ICSR active exception: 3
- ICSR pending exception: 15
- ICSR pending interrupt: 0
- Hardfault status: 0x40000000
  - Memory fault status: 0x00
  - Bus fault status: 0x04
  - Usage fault status: 0x0000

我能够追踪FreeRTOS呼叫的异常:

vTaskDelay(10/portTICK_RATE_MS);

该应用程序有两个任务:

  1. 优先级为2的任务(参数为xTaskCreate)
  2. 优先级为1的任务
  3. 任务1进入一个用信号量锁定的区域并点击上面提到的那一行。任务2应该唤醒并运行,直到它还想进入锁定区域。

2 个答案:

答案 0 :(得分:0)

我认为你误解了ICSR。这并不是说异常已经从SYSTICK升级而且与硬故障无关。

首先,您需要查看HFSR(硬故障状态寄存器)。如果设置强制意味着它要么从总线故障,mem man故障或使用故障升级(我怀疑它将被强制)。如果是,那么请查看CFSR,看看你有什么样的错误。

然后您可以从此处进一步调试。如果它是一种总线错误(再次非常可能),那么您需要查看CFSR中的BFARVALID位。如果设置了这个,那么你很幸运,因为BFAR寄存器将包含故障的地址。如果没有设置,那么事情会变得更加困难!请记住,CFSR实际上是一个寄存器,因此需要正确解码,其中一些位是总线错误的类型,其他是mem man故障等。

答案 1 :(得分:0)

我不确定为什么你会认为[软件?]死锁会导致硬件故障,但有关调试硬故障的一些信息可以在这里找到:http://www.freertos.org/Debugging-Hard-Faults-On-Cortex-M-Microcontrollers.html

我还建议更新到更新版本的FreeRTOS,因为较新版本的assert()语句包括更多,以捕获中断优先级和其他与中断相关的误用和错误配置。