首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >FreeRTOS -硬件故障分析-故障

FreeRTOS -硬件故障分析-故障
EN

Stack Overflow用户
提问于 2019-07-09 20:47:03
回答 1查看 110关注 0票数 0

在完成本文的教程之后,我尝试查看哪个线程和堆栈中的哪个位置产生了硬故障,但没有成功。

与本教程不同的是,我的HardFault_Handler()函数不是直接的裸函数,而是转发给一个裸函数(prepareRegistersFromStack())。在调试器中,我可以看到跳转到函数prepareRegistersFromStack()。

这个函数prepareRegistersFromStack()应该跳转到getRegistersFromStack()函数,尽管这种情况从来没有发生过。

我也尝试了直接像示例一样声明,因此使HardFault_Handler()成为一个应该跳转到getRegistersFromStack()的裸函数,但不幸的是,同样的方法也适用,没有跳转。

有人能帮帮我吗?为什么不调用getRegistersFromStack()?

谢谢

代码语言:javascript
代码运行次数:0
运行
复制
extern "C" __attribute__((naked)) void HardFault_Handler()
{
  __disable_fault_irq();
  __disable_irq();
  prepareRegistersFromStack();
}

extern "C" void prepareRegistersFromStack()
{
  __asm volatile
  (
      " tst lr, #4                                                \n"
      " ite eq                                                    \n"
      " mrseq r0, msp                                             \n"
      " mrsne r0, psp                                             \n"
      " ldr r1, [r0, #24]                                         \n"
      " ldr r2, handler2_address_const                            \n"
      " bx r2                                                     \n"
      " handler2_address_const: .word getRegistersFromStack       \n"
  );
}

extern "C" void getRegistersFromStack( uint32_t *pulFaultStackAddress )
{
  uint32_t dummy;
  /* These are volatile to try and prevent the compiler/linker optimising them
     away as the variables never actually get used.  If the debugger won't show the
     values of the variables, make them global my moving their declaration outside
     of this function. */
  volatile uint32_t r0;
  volatile uint32_t r1;
  volatile uint32_t r2;
  volatile uint32_t r3;
  volatile uint32_t r12;
  volatile uint32_t lr; /* Link register. */
  volatile uint32_t pc; /* Program counter. */
  volatile uint32_t psr;/* Program status register. */

  r0 = pulFaultStackAddress[ 0 ];
  r1 = pulFaultStackAddress[ 1 ];
  r2 = pulFaultStackAddress[ 2 ];
  r3 = pulFaultStackAddress[ 3 ];

  r12 = pulFaultStackAddress[ 4 ];
  lr  = pulFaultStackAddress[ 5 ];
  pc  = pulFaultStackAddress[ 6 ];
  psr = pulFaultStackAddress[ 7 ];

  /* When the following line is hit, the variables contain the register values. */
  for(;;);

  /* remove warnings */
  dummy = r0;
  dummy = r1;
  dummy = r2;
  dummy = r3;
  dummy = r12;
  dummy = lr;
  dummy = pc;
  dummy = psr;
  dummy = dummy;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-11 06:11:36

在修改后的方法中,您更改了堆栈帧(当您调用prepareRegistersFromStack()时),因此它不能按编写的方式工作。恢复到原始样本。我以前使用过以下示例,我相信这就是您的代码片段所基于的:https://www.freertos.org/Debugging-Hard-Faults-On-Cortex-M-Microcontrollers.html

但是,我现在更喜欢使用集成开发环境中内置的功能,或者使用下面的"C“方法,它可以利用串口或集成开发环境:https://blog.feabhas.com/2013/02/developing-a-generic-hard-fault-handler-for-arm-cortex-m3cortex-m4/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56952959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档