标题: stm32单片机怎样在运行时获取lr寄存器的值,开发环境使用keil5 [打印本页]

作者: 的花朵    时间: 2022-6-10 22:29
标题: stm32单片机怎样在运行时获取lr寄存器的值,开发环境使用keil5
如题,我想在运行时获取lr寄存器,用来记录函数调用栈,但是用了很多方法都不可以,我尝试了如下方法:
方法1如下,此种方法keil可以编译通过,但是无法正确获取lr寄存器(或许是因为发生了跳转,lr被覆盖):
static inline __asm uint32_t readlr(void)
{
        MOV     R0, lr
        bx lr
}


方法2如下(gcc的内联汇编),此种方法gcc下可以编译通过,但keil下不行,lr寄存器未定义:
__asm volatile ("mov %0,lr":"=r"(return_addr));

方法3如下,keil下编译会提示找不到lr寄存器未定义:
__asm        {
               
                }

大佬们求助哇!

作者: 兴安xa    时间: 2022-6-11 11:42
看起来好厉害的样子,C语言调用汇编语言
作者: 人工置顶员    时间: 2022-6-16 02:27
顶一下
作者: glinfei    时间: 2022-6-16 09:01
没看懂你的意思,lr记录的是函数返回后,给pc用的下一条地址,不是函数地址啊。bx  lr 也不大对啊,是不是bx R0做强制跳转啊或者MOV PC LR做程序调用返回?
作者: 的花朵    时间: 2022-6-23 12:16
glinfei 发表于 2022-6-16 09:01
没看懂你的意思,lr记录的是函数返回后,给pc用的下一条地址,不是函数地址啊。bx  lr 也不大对啊,是不是b ...

我理解你的意思,上面那段代码无论是bx r0 还是bx lr其实不重要,lr的值已经修改了,我是想写一个内存管理的debug,每次malloc都能够记录从哪里发生的调用,现在gcc下面能正常记录,keil下已经放弃了
作者: 的花朵    时间: 2022-6-23 12:17
人工置顶员 发表于 2022-6-16 02:27
顶一下


作者: 的花朵    时间: 2022-6-23 12:18
兴安xa 发表于 2022-6-11 11:42
看起来好厉害的样子,C语言调用汇编语言

大部分链接器都支持的
作者: linzhiqi1    时间: 2022-6-24 08:38

LR就是R14可以keil在寄存器中看到,调试时,单步或断的停下后观察R14的值就可以。

作者: glinfei    时间: 2022-6-24 15:19
祖国的花朵 发表于 2022-6-23 12:16
我理解你的意思,上面那段代码无论是bx r0 还是bx lr其实不重要,lr的值已经修改了,我是想写一个内存管 ...

你是用第二种方法,用gcc编译的吧?学到了,谢谢。 我觉得gcc的库内容多,没有针对单片机优化,反而支持这种方法了。
作者: 的花朵    时间: 2022-7-27 10:57
glinfei 发表于 2022-6-24 15:19
你是用第二种方法,用gcc编译的吧?学到了,谢谢。 我觉得gcc的库内容多,没有针对单片机优化,反而支持 ...

确实如此,感觉gcc开源的缘故各种花样挺多,问题也挺多,现在用的libc库发现这东西malloc可以直接把内存干穿- -,不像keil那样可以设置堆栈尺寸
作者: Y_G_G    时间: 2022-7-28 09:07
这都一个多月了,还在折腾这个?
我不太理解,为什么用STM32还相着嵌入汇编,连8051汇编用的人都不多了
STM32不是这个库就是那个库的,只能说各有缺点,但做项目都是可以的
还走回头路去想着看哪个寄存器什么的,如果不是有着极致的要求,那就是没事找事
作者: zilihangjian    时间: 2022-7-28 09:38
编译器侧重点不同,keil 有些设计很合理,设置很麻烦。
作者: 的花朵    时间: 2022-7-28 11:27
Y_G_G 发表于 2022-7-28 09:07
这都一个多月了,还在折腾这个?
我不太理解,为什么用STM32还相着嵌入汇编,连8051汇编用的人都不多了
STM32 ...

也算是学习嘛,之前做公司的一个屎山项目,整个工程很大,动态内存用的非常多,不是这里泄露就是那里泄露,有的时候知道是泄露了,但是又找不到在哪,所以想着弄一个可以追踪malloc调用的组件
作者: Y_G_G    时间: 2022-7-28 17:47
祖国的花朵 发表于 2022-7-28 11:27
也算是学习嘛,之前做公司的一个屎山项目,整个工程很大,动态内存用的非常多,不是这里泄露就是那里泄露 ...

STM32内存这方面我还没有真正的去做过,因为我涉及的项目对于STM32来说,资源简单不要太丰富,所以,也没有真正的去实践过
但我觉得不应该是去走回头路,STM那么庞大的硬件,我不认为就单单看个LR寄存器就能解决问题的
更应该是C代码的优化
作者: 李颖哲    时间: 2022-7-29 13:24
现在都已经这么高深了吗





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1