在特殊情况下,我遇到了一个严重的异常。 ICSR表示它是从systick升级(待定异常= 15)。
我的猜测是,这是某种死锁。
我正在使用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应该唤醒并运行,直到它还想进入锁定区域。
答案 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()语句包括更多,以捕获中断优先级和其他与中断相关的误用和错误配置。