CmbackTrace 移植手册与异常定位
移植过程
1、建议在项目中创建一个名为 SERVp_cmBackTrace 的组,用于组织和管理与cmBackTrace相关的所有文件。这有助于保持项目的结构清晰,便于管理和维护。将 对应文件夹的内容增加到项目工程中

2、添加文件至项目工程
将cmBackTrace相关文件夹的内容添加到项目工程中,并将其放置在 SERVp_cmBackTrace 组内。确保所有必要的源文件和头文件都已正确添加到项目中。

3、配置cmBackTrace

当前调试服务使用RTT打印,但在RTT缓冲区较小的情况下,可能会导致数据被覆盖或打印不完整。
为了解决这一问题,建议采用IAR的Semihosting方式来输出HardFault异常信息。
经过初步测试,使用Semihosting方式进行异常信息打印表现良好。鉴于异常信息打印的频率不高,且对实时性的要求不高,Semihosting是一个合理的选择。经过测试,该方案能够成功定位到引发异常的函数。
开启Semihosting

4、对 freeRTOS 继续修改
1、注释掉原有的HardFault处理函数
在FreeRTOS中,需要注释掉原有的HardFault_Handler处理函数,以便新的异常处理逻辑能够生效。

1、修改 task.ctask.c文件配置修改。
(1)在FreeRTOS/tasks.c文件中新增uxSizeOfStack字段。
(2)同时添加了vTaskStackAddr()、vTaskStackSize()和vTaskName()三个辅助函数,用于获取当前任务的堆栈地址、大小以及名称。

点击查看代码
/*------------------------------------------------------------------------*/
/*< Support For CmBacktrace >*/
#else
UBaseType_t uxSizeOfStack; /*< Support For CmBacktrace >*/
/*------------------------------------------------------------------------*/

点击查看代码
/*-----------------------------------------------------------*/
/*< Support For CmBacktrace >*/
uint32_t * vTaskStackAddr()
{
return pxCurrentTCB->pxStack;
}
uint32_t vTaskStackSize()
{
#if ( portSTACK_GROWTH > 0 )
return (pxNewTCB->pxEndOfStack - pxNewTCB->pxStack + 1);
#else /* ( portSTACK_GROWTH > 0 )*/
return pxCurrentTCB->uxSizeOfStack;
#endif /* ( portSTACK_GROWTH > 0 )*/
}
char * vTaskName()
{
return pxCurrentTCB->pcTaskName;
}
/*-----------------------------------------------------------*/
2、修改prvInitialiseNewTask函数
在static void prvInitialiseNewTask函数中,
新增初始化uxSizeOfStack字段的代码,确保每个新创建的任务都能正确记录其堆栈大小。
pxNewTCB->uxSizeOfStack = ulStackDepth; /< Support For CmBacktrace >/

3、修改 FreeRTOS.h 文件配置
最后,在FreeRTOS.h文件中的typedef struct xSTATIC_TCB定义里,根据堆栈增长方向的不同,有条件地添加uxSizeOfStack字段。
点击查看代码
#if(portSTACK_GROWTH <= 0)
UBaseType_t uxSizeOfStack; /*< Support For CmBacktrace >*/
#endif /* ( portSTACK_GROWTH > 0 )*/
测试Cmbacktrace效果
测试环境设置
为了验证cmBacktrace的有效性,在一个特定的线程 BLLm_RTOS_legalSysThread 中调用了一个故意构造的 mcmcpy 异常错误函数。该函数将触发HardFault异常,以便测试cmBacktrace的异常定位能力。


配置调试环境:
进入仿真环境
打开调试器的 Terminal IO 窗口,以便查看异常信息的输出。

触发异常:
运行项目,使 BLLm_RTOS_legalSysThread 线程执行并调用 mcmcpy 异常错误函数。
观察异常信息:
在 Terminal IO 窗口中,可以看到HardFault异常发生时的详细信息。这些信息包括异常发生的上下文、堆栈跟踪等。

使用异常定位工具:

打开异常定位工具(如cmBacktrace提供的工具)。
输入从 Terminal IO 窗口中获取的异常信息。
验证定位结果:
通过异常定位工具,成功定位到了引发异常的具体位置。
此时,程序计数器(PC)的值为 0x0000a43c。
实际上,通过cmBacktrace工具,我们可以更精确地定位到异常信息的值为 0x00028040。

由此可见成功定位

测试结论
通过上述测试步骤,验证了cmBacktrace工具的有效性。
即使在PC指针值为 0x0000a43c 的情况下,cmBacktrace仍然能够成功定位到具体的异常位置 0x00028040。
这表明cmBacktrace工具在HardFault异常定位方面能够提高调试效率和准确性。
浙公网安备 33010602011771号