在gnu手臂皮质m4与freertos的异常处理程序

前端之家收集整理的这篇文章主要介绍了在gnu手臂皮质m4与freertos的异常处理程序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
更新2016-12
现在还有一个这个行为的最小例子: https://community.nxp.com/message/862676

我使用一个ARM Cortex M4与freertos使用freescales自由Kinetis IDE(gnu手臂工具链).问题是那个

try {
    throw 4; // old scenario also not working: throw std::runtime_error("wut");
} catch (...) {
}

导致停止的cpu代码在try或(当某些被添加后)在catch处理程序不执行.

并可以在这里找到:https://gist.github.com/Superlokkus/3c4201893b4c51e154e2a0afdf78fef0

我认为这导致一个SVC中断,对不起,我错了,Freertos欺骗我,因为当我抛出一些它停止在DefaultISR.

throw确实跳到__cxa_throw,然后从那里到___Unwind_RaiseException __gnu_Unwind_RaiseException __cxa_begin_catch>
< _ZSt9terminatev>
所以看起来像std :: terminate被调用,但是catch块不应该允许这个.或者我的假设是错误的,这种行为是因为gcc C运行时异常支持是一个总是调用终止的存根?

更新ji9:因为我看到rand()尝试使用malloc(),我还定义了一个工作的malloc()/ freeRTOS函数和etvoilà:__cxa_allocate_exception使用malloc(我不知道工具链如何期望我处理一个bad_alloc的情况).
所以现在,它仍然崩溃,但是除了分配(我认为):
卓越的路径是:

(throwing function after exception allocation)
__cxa_throw
   ...                        //(some intructions in __cxa_throw)
   __cxa_begin_catch  //I guess something went wrong here
    _ZSt9terminatev // Immediately after __cxa_begin_catch
        _ZN10__cxxabiv111__terminateEPFvvE:
         00016dfc: push {r3,lr}
         00016dfe: blx r0  //Goes directly to WDOG_EWM_IRQHandler or hard fault handler
         00016e00: bl 0x194ac <abort>

如果你想知道或可能有帮助:我的调试器说它的WDOG_EWM_IRQHandler我崩溃了,如果我没有定义hard_fault处理程序和一个自己的默认处理程序.

所以我猜这个堆栈解决了一些问题,因为我在_throw的名字中以“完成的堆栈解卷”去了一些符号,但是我没有捕捉到我在一个对象的析构函数中设置的断点,清理干净而这似乎是激励__cxa_begin_catch调用中止或某事.

(Kinetis Design Studio 3.2.0
GNU ARM C/C++交叉编译器
版本:1.12.1.201502281154
为我们
FRDM-KV31F)

解决方法

由于错误,大多数异常都将执行默认处理程序,因此您首先需要做的是确定哪个异常正在执行.您可以在以下页面看到“确定正在执行哪个异常处理程序”部分: http://www.freertos.org/Debugging-Hard-Faults-On-Cortex-M-Microcontrollers.html

我猜,因为你没有在你的代码中使用外设,所以这将是一个错误处理程序,可能是硬的错误.同一页面(参见上面的链接)也提供了有关调试的说明.

除此之外 – 确保您执行正常的FreeRTOS调试事情,例如确保已定义了configASSERT(),并且您有堆栈溢出检查.有关这些主题的信息请见此页面http://www.freertos.org/FAQHelp.html

猜你在找的C&C++相关文章