使用cmbacktrace库,其支持M3,4,7。
1、串口输出异常信息
#define cmb_println(...) Debug_Printf(__VA_ARGS__)
//cmb_println处理可变参数和格式化字符串
int Debug_Printf(const char *fmt, ...) {
char buffer[DEBUG_TxBUFLEN];
INT16U n;
va_list args;
va_start(args, fmt);
int len = vsnprintf(buffer, sizeof(buffer), fmt, args);
va_end(args);
for ( n = 0; n < len; n++ ) WriteDebugTxBuffer( buffer[n] );
return len;
}
//串口查询方式发送,被cm_backtrace_fault调用
void UartDbg_CheckSend(void)
{
#if 1
INT32U status;
if ( DebugBuf.PtrTxHead == DebugBuf.PtrTxTail ) return;
status = LPUART_GetStatusFlags( DEBUG_SIO_BASE );
if ( status & kLPUART_TxDataRegEmptyFlag )
{
LPUART_WriteByte( DEBUG_SIO_BASE, DebugBuf.TxBuffer[ DebugBuf.PtrTxTail ] );
++DebugBuf.PtrTxTail;
if ( DebugBuf.PtrTxTail >= DEBUG_TxBUFLEN ) DebugBuf.PtrTxTail = 0;
}
#endif
}
/**
* backtrace for fault
* @note only call once
*
* @param fault_handler_lr the LR register value on fault handler
* @param fault_handler_sp the stack pointer on fault handler
*/
void cm_backtrace_fault(uint32_t fault_handler_lr, uint32_t fault_handler_sp) {
uint32_t stack_pointer = fault_handler_sp, saved_regs_addr = stack_pointer, tcb_stack_pointer = 0;
const char *regs_name[] = { "R0 ", "R1 ", "R2 ", "R3 ", "R12", "LR ", "PC ", "PSR" };
#ifdef CMB_USING_DUMP_STACK_INFO
uint32_t stack_start_addr = main_stack_start_addr;
size_t stack_size = main_stack_size;
#endif
CMB_

最低0.47元/天 解锁文章
3665

被折叠的 条评论
为什么被折叠?



