呜呜呜呜晗 发表于 2023-7-28 09:27:23

SEGGER_RTT +CmBacktrace裸机环境中数据没有完全打印

stm32f4裸机环境下   CmBacktrace的打印输出重写改成SEGGER_RTT_printf输出,在出现HardFault_Handler情况下,SEGGER_RTT_printf输出的寄存器信息没有全部完整输出,只输出一部分,但是进入debug模式单步执行这些错误信息可以全部输出,SEGGER_RTT的config配置是按照硬汉哥的文档来的,单独使用SEGGER_RTT_printf一切正常求解惑

呜呜呜呜晗 发表于 2023-7-28 09:32:24

直接下载到mcu运行rtt打印室没有红框这部分的

呜呜呜呜晗 发表于 2023-7-28 10:26:28

求大佬们解惑

eric2013 发表于 2023-7-28 10:43:26

是不是这个问题导致的。

RTT的函数SEGGER_RTT_printf需要较大的栈空间,如果大家移植RTT开辟的空间不足会硬件异常
https://www.armbbs.cn/forum.php?mod=viewthread&tid=118809&fromuid=58
(出处: 硬汉嵌入式论坛)

呜呜呜呜晗 发表于 2023-7-28 11:27:17

eric2013 发表于 2023-7-28 10:43
是不是这个问题导致的。

RTT的函数SEGGER_RTT_printf需要较大的栈空间,如果大家移植RTT开辟的空间不足 ...

按照硬汉哥的方式修改了还是不能打印完整,是代码里面无故意让他出hardfault,然后通过cmbaktrace提示出现问题地址,再通过rtt打印出来,现在问题是最关键的寄存器:(地址信息没有打印完整:(:(

Xor_Li 发表于 2024-4-3 15:26:12

呜呜呜呜晗 发表于 2023-7-28 11:27
按照硬汉哥的方式修改了还是不能打印完整,是代码里面无故意让他出hardfault,然后通过cmbaktrace提示出 ...

RTT的原因,修改一下cmb_en_us.h和cmbacktrace.c
```
//       = "Show more call stack info by run: addr2line -e %s%s -afpiC %.*s",
       = "Show more call stack info by run: addr2line -e %s%s -a -f %s",
```
```
static void print_call_stack(uint32_t sp) {
    size_t i, cur_depth = 0;
    uint32_t call_stack_buf = {0};

    cur_depth = cm_backtrace_call_stack(call_stack_buf, CMB_CALL_STACK_MAX_DEPTH, sp);

    for (i = 0; i < cur_depth; i++) {
      sprintf(call_stack_info + i * (8 + 1), "%08lx", (unsigned long)call_stack_buf);
      call_stack_info = ' ';
    }

    if (cur_depth) {      
//      cmb_println(print_info, fw_name, CMB_ELF_FILE_EXTENSION_NAME, cur_depth * (8 + 1),
//                call_stack_info);
      cmb_println(print_info, fw_name, CMB_ELF_FILE_EXTENSION_NAME,call_stack_info);
    } else {
      cmb_println(print_info);
    }
}
```
页: [1]
查看完整版本: SEGGER_RTT +CmBacktrace裸机环境中数据没有完全打印