找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3520|回复: 14
打印 上一主题 下一主题
收起左侧

stm32单片机怎样在运行时获取lr寄存器的值,开发环境使用keil5

[复制链接]
回帖奖励 100 黑币 回复本帖可获得 10 黑币奖励! 每人限 1 次
跳转到指定楼层
#
如题,我想在运行时获取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        {
               
                }

大佬们求助哇!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

14#
ID:1040924 发表于 2022-7-29 13:24 | 只看该作者
现在都已经这么高深了吗
回复

使用道具 举报

13#
ID:401564 发表于 2022-7-28 17:47 | 只看该作者
祖国的花朵 发表于 2022-7-28 11:27
也算是学习嘛,之前做公司的一个屎山项目,整个工程很大,动态内存用的非常多,不是这里泄露就是那里泄露 ...

STM32内存这方面我还没有真正的去做过,因为我涉及的项目对于STM32来说,资源简单不要太丰富,所以,也没有真正的去实践过
但我觉得不应该是去走回头路,STM那么庞大的硬件,我不认为就单单看个LR寄存器就能解决问题的
更应该是C代码的优化
回复

使用道具 举报

12#
ID:248705 发表于 2022-7-28 11:27 | 只看该作者
Y_G_G 发表于 2022-7-28 09:07
这都一个多月了,还在折腾这个?
我不太理解,为什么用STM32还相着嵌入汇编,连8051汇编用的人都不多了
STM32 ...

也算是学习嘛,之前做公司的一个屎山项目,整个工程很大,动态内存用的非常多,不是这里泄露就是那里泄露,有的时候知道是泄露了,但是又找不到在哪,所以想着弄一个可以追踪malloc调用的组件
回复

使用道具 举报

11#
ID:799053 发表于 2022-7-28 09:38 | 只看该作者
编译器侧重点不同,keil 有些设计很合理,设置很麻烦。
回复

使用道具 举报

10#
ID:401564 发表于 2022-7-28 09:07 | 只看该作者
这都一个多月了,还在折腾这个?
我不太理解,为什么用STM32还相着嵌入汇编,连8051汇编用的人都不多了
STM32不是这个库就是那个库的,只能说各有缺点,但做项目都是可以的
还走回头路去想着看哪个寄存器什么的,如果不是有着极致的要求,那就是没事找事
回复

使用道具 举报

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

确实如此,感觉gcc开源的缘故各种花样挺多,问题也挺多,现在用的libc库发现这东西malloc可以直接把内存干穿- -,不像keil那样可以设置堆栈尺寸
回复

使用道具 举报

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

你是用第二种方法,用gcc编译的吧?学到了,谢谢。 我觉得gcc的库内容多,没有针对单片机优化,反而支持这种方法了。
回复

使用道具 举报

7#
ID:532541 发表于 2022-6-24 08:38 | 只看该作者

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

使用道具 举报

6#
ID:248705 发表于 2022-6-23 12:18 | 只看该作者
兴安xa 发表于 2022-6-11 11:42
看起来好厉害的样子,C语言调用汇编语言

大部分链接器都支持的
回复

使用道具 举报

5#
ID:248705 发表于 2022-6-23 12:17 | 只看该作者
回复

使用道具 举报

地板
ID:248705 发表于 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下已经放弃了
回复

使用道具 举报

板凳
ID:844772 发表于 2022-6-16 09:01 | 只看该作者
没看懂你的意思,lr记录的是函数返回后,给pc用的下一条地址,不是函数地址啊。bx  lr 也不大对啊,是不是bx R0做强制跳转啊或者MOV PC LR做程序调用返回?
回复

使用道具 举报

沙发
ID:301191 发表于 2022-6-16 02:27 | 只看该作者
顶一下
回复

使用道具 举报

楼主
ID:979299 发表于 2022-6-11 11:42 | 只看该作者
看起来好厉害的样子,C语言调用汇编语言
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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