FreeRTOS ARM cortex 硬故障从 systick 升级
FreeRTOS ARM cortex hardfault escalation from systick
在特殊情况下,我遇到了硬故障异常。 ICSR 表明它是来自 systick 的升级(未决异常 = 15)。
- 知道这将如何发生吗?
我的猜测是,这是某种死锁。
- 有什么关于如何跟踪这个(没有 Atmel Studio)的建议吗?
我正在使用 FreeRTOS 7.5.2。
更新:
我在输出转储中添加了更多故障寄存器。所以这确实是一个系统中断挂起的总线故障:
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);
应用程序有 2 个任务:
- 优先级为 2 的任务(xTaskCreate 的参数)
- 优先级为 1 的任务
任务 1 进入一个用信号量锁定的区域并点击上面提到的线。 Task 2 应该醒来 运行 直到它也想进入锁定区域。
我认为你误解了 ICSR。这并不是说异常已经从 SYSTICK 升级并且与硬故障没有任何关系。
首先你需要查看HFSR(硬故障状态寄存器)。如果设置了 forced 则意味着它是从总线故障、mem man 故障或使用故障升级的(我怀疑它会被强制)。如果是,则查看 CFSR 以查看您遇到的错误类型。
然后您可以从这里进一步调试。如果它是一种总线错误(同样很有可能),那么您需要查看 CFSR 中的 BFARVALID 位。如果已设置,那么您很幸运,因为 BFAR 寄存器将包含故障地址。如果没有设置,那么事情会变得有点困难!请记住,然后 CFSR 实际上是几个寄存器合二为一,因此需要正确解码,一些位是总线错误类型,另一些是内存故障等。
我不确定为什么您会认为 [软件?] 死锁会导致硬件硬故障,但可以在此处找到有关调试硬故障的一些信息:http://www.freertos.org/Debugging-Hard-Faults-On-Cortex-M-Microcontrollers.html
我还建议更新到更新版本的 FreeRTOS,因为版本越新,包含的 assert() 语句越多,以捕获中断优先级和其他与中断相关的误用和配置错误。
在特殊情况下,我遇到了硬故障异常。 ICSR 表明它是来自 systick 的升级(未决异常 = 15)。
- 知道这将如何发生吗?
我的猜测是,这是某种死锁。
- 有什么关于如何跟踪这个(没有 Atmel Studio)的建议吗?
我正在使用 FreeRTOS 7.5.2。
更新:
我在输出转储中添加了更多故障寄存器。所以这确实是一个系统中断挂起的总线故障:
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);
应用程序有 2 个任务:
- 优先级为 2 的任务(xTaskCreate 的参数)
- 优先级为 1 的任务
任务 1 进入一个用信号量锁定的区域并点击上面提到的线。 Task 2 应该醒来 运行 直到它也想进入锁定区域。
我认为你误解了 ICSR。这并不是说异常已经从 SYSTICK 升级并且与硬故障没有任何关系。
首先你需要查看HFSR(硬故障状态寄存器)。如果设置了 forced 则意味着它是从总线故障、mem man 故障或使用故障升级的(我怀疑它会被强制)。如果是,则查看 CFSR 以查看您遇到的错误类型。
然后您可以从这里进一步调试。如果它是一种总线错误(同样很有可能),那么您需要查看 CFSR 中的 BFARVALID 位。如果已设置,那么您很幸运,因为 BFAR 寄存器将包含故障地址。如果没有设置,那么事情会变得有点困难!请记住,然后 CFSR 实际上是几个寄存器合二为一,因此需要正确解码,一些位是总线错误类型,另一些是内存故障等。
我不确定为什么您会认为 [软件?] 死锁会导致硬件硬故障,但可以在此处找到有关调试硬故障的一些信息:http://www.freertos.org/Debugging-Hard-Faults-On-Cortex-M-Microcontrollers.html
我还建议更新到更新版本的 FreeRTOS,因为版本越新,包含的 assert() 语句越多,以捕获中断优先级和其他与中断相关的误用和配置错误。