打印
[其他ST产品]

(GCC)STM32进阶详解之栈回溯

[复制链接]
楼主: 大鹏2365
手机看帖
扫描二维码
随时随地手机跟帖
61
大鹏2365|  楼主 | 2023-1-15 23:22 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
最关键的函数留在了最后:

使用特权

评论回复
62
大鹏2365|  楼主 | 2023-1-15 23:24 | 只看该作者
我们最后打印的就是:

使用特权

评论回复
63
大鹏2365|  楼主 | 2023-1-15 23:26 | 只看该作者
所以关键在函数cm_backtrace_call_stack中:

使用特权

评论回复
64
大鹏2365|  楼主 | 2023-1-15 23:27 | 只看该作者
在没有堆栈溢出的情况下,buffer里面会先保存两个值,一个是执行错误代码时的PC,在这个demo中是0x08001da6,然后又保存了执行错误代码时的LR-1,在这里是:0x08001dfd-1=0x08001dfc。

使用特权

评论回复
65
大鹏2365|  楼主 | 2023-1-15 23:28 | 只看该作者

使用特权

评论回复
66
大鹏2365|  楼主 | 2023-1-15 23:29 | 只看该作者
最后就是循环检测栈区,然后把符合的保存下来。  

使用特权

评论回复
67
大鹏2365|  楼主 | 2023-1-15 23:30 | 只看该作者
GCC下使用该库

其实和MDK差不多,但是看过我置顶的那篇讲内存的文章会知道,CubeMX生成的工程中,栈空间大小并非是我们分配的大小。详细参考:

所以我们最后看下GCC下该库需要如何使用。这里只是简单讲一下,因为原理已经讲清楚了,具体的修改可自行解决。

使用特权

评论回复
68
大鹏2365|  楼主 | 2023-1-15 23:31 | 只看该作者
主要在初始化时,获取栈起始地址和栈大小,以及代码段起始地址和代码段大小:

使用特权

评论回复
69
大鹏2365|  楼主 | 2023-1-15 23:31 | 只看该作者

使用特权

评论回复
70
大鹏2365|  楼主 | 2023-1-15 23:32 | 只看该作者
它们的定义如下:

使用特权

评论回复
71
大鹏2365|  楼主 | 2023-1-15 23:33 | 只看该作者
但是我们随便使用CubeMX创建一个STM32F103ZET6的GCC工程,打开.ld文件会发现

使用特权

评论回复
72
大鹏2365|  楼主 | 2023-1-15 23:34 | 只看该作者
找不到_sstack和_stext,只能找到结尾:

使用特权

评论回复
73
大鹏2365|  楼主 | 2023-1-15 23:35 | 只看该作者

使用特权

评论回复
74
大鹏2365|  楼主 | 2023-1-15 23:40 | 只看该作者

使用特权

评论回复
75
大鹏2365|  楼主 | 2023-1-15 23:41 | 只看该作者
我们可以这样修改:

使用特权

评论回复
76
大鹏2365|  楼主 | 2023-1-15 23:45 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则