Cortex-M7进入异常中断分析

使用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_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值