硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2297|回复: 12
收起左侧

[技术讨论] SEGGER_RTT +CmBacktrace裸机环境中数据没有完全打印

[复制链接]

5

主题

13

回帖

28

积分

新手上路

积分
28
发表于 2023-7-28 09:27:23 | 显示全部楼层 |阅读模式
stm32f4裸机环境下   CmBacktrace的打印输出重写改成SEGGER_RTT_printf输出,在出现HardFault_Handler情况下,SEGGER_RTT_printf输出的寄存器信息没有全部完整输出,只输出一部分,但是进入debug模式单步执行这些错误信息可以全部输出,SEGGER_RTT的config配置是按照硬汉哥的文档来的,单独使用SEGGER_RTT_printf一切正常求解惑
单步执行.PNG
回复

使用道具 举报

5

主题

13

回帖

28

积分

新手上路

积分
28
 楼主| 发表于 2023-7-28 09:32:24 | 显示全部楼层
直接下载到mcu运行  rtt打印室没有红框这部分的
回复

使用道具 举报

5

主题

13

回帖

28

积分

新手上路

积分
28
 楼主| 发表于 2023-7-28 10:26:28 | 显示全部楼层
求大佬们解惑
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2023-7-28 10:43:26 | 显示全部楼层
是不是这个问题导致的。

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

使用道具 举报

5

主题

13

回帖

28

积分

新手上路

积分
28
 楼主| 发表于 2023-7-28 11:27:17 | 显示全部楼层
eric2013 发表于 2023-7-28 10:43
是不是这个问题导致的。

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

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

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2024-4-3 15:26:12 | 显示全部楼层
呜呜呜呜晗 发表于 2023-7-28 11:27
按照硬汉哥的方式修改了还是不能打印完整,是代码里面无故意让他出hardfault,然后通过cmbaktrace提示出 ...

RTT的原因,修改一下cmb_en_us.h和cmbacktrace.c
```
//[PRINT_CALL_STACK_INFO]       = "Show more call stack info by run: addr2line -e %s%s -afpiC %.*s",
[PRINT_CALL_STACK_INFO]       = "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[CMB_CALL_STACK_MAX_DEPTH] = {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[i * (8 + 1) + 8] = ' ';
    }

    if (cur_depth) {        
//        cmb_println(print_info[PRINT_CALL_STACK_INFO], fw_name, CMB_ELF_FILE_EXTENSION_NAME, cur_depth * (8 + 1),
//                call_stack_info);
        cmb_println(print_info[PRINT_CALL_STACK_INFO], fw_name, CMB_ELF_FILE_EXTENSION_NAME,call_stack_info);
    } else {
        cmb_println(print_info[PRINT_CALL_STACK_ERR]);
    }
}
```
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2024-8-28 21:24:21 | 显示全部楼层
Xor_Li 发表于 2024-4-3 15:26
RTT的原因,修改一下cmb_en_us.h和cmbacktrace.c
```
//       = "Show more call stack info by run:  ...

再加上,可以把BUFFER_SIZE_UP和SEGGER_RTT_PRINTF_BUFFER_SIZE都加大,但是SEGGER_RTT_PRINTF_BUFFER_SIZE要小于BUFFER_SIZE_UP。
#define BUFFER_SIZE_UP                            (1280)  // Size of the buffer for terminal output of target, up to host (Default: 1k)

#define SEGGER_RTT_PRINTF_BUFFER_SIZE             (128u)    // Size of buffer for RTT printf to bulk-send chars via RTT     (Default: 64)
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-10-6 16:22:29 | 显示全部楼层
设置RTT打印为阻塞打印;初始化这样设置
static  uint8_t buff[256];
SEGGER_RTT_ConfigUpBuffer(0, NULL, buff, 512, SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL);
回复

使用道具 举报

95

主题

528

回帖

828

积分

金牌会员

积分
828
发表于 2024-11-28 09:59:58 | 显示全部楼层
因为segger的rrt不是全功能打印。不支持%*.s类似的用法。
而cmbacktrace打印用了该语法,导致无法打印。

你可以修改rtt的代码,将它补充成支持该语法的打印函数。或者修改cmbacktrace,把该语法去掉即可。
共产主义一定胜利!
回复

使用道具 举报

95

主题

528

回帖

828

积分

金牌会员

积分
828
发表于 2024-11-28 10:03:42 | 显示全部楼层
cm_backtrace-main.zip (718.25 KB, 下载次数: 27)

提供一个修改过的,用法可以参考readme.md和原项目的说明
共产主义一定胜利!
回复

使用道具 举报

1

主题

24

回帖

27

积分

新手上路

积分
27
发表于 2025-2-14 15:12:11 | 显示全部楼层
谢谢,遇到同样问题。在这等到答案
回复

使用道具 举报

5

主题

13

回帖

28

积分

新手上路

积分
28
 楼主| 发表于 6 天前 | 显示全部楼层
会飞的猪_2020 发表于 2024-11-28 10:03
提供一个修改过的,用法可以参考readme.md和原项目的说明

感谢时隔这么久,彻底解决
回复

使用道具 举报

5

主题

13

回帖

28

积分

新手上路

积分
28
 楼主| 发表于 6 天前 | 显示全部楼层
会飞的猪_2020 发表于 2024-11-28 09:59
因为segger的rrt不是全功能打印。不支持%*.s类似的用法。
而cmbacktrace打印用了该语法,导致无法打印。
...

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-25 20:57 , Processed in 0.317688 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表