找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4263|回復(fù): 14
收起左側(cè)

stm32單片機(jī)怎樣在運(yùn)行時獲取lr寄存器的值,開發(fā)環(huán)境使用keil5

[復(fù)制鏈接]
回帖獎勵 100 黑幣 回復(fù)本帖可獲得 10 黑幣獎勵! 每人限 1 次
ID:248705 發(fā)表于 2022-6-10 22:29 | 顯示全部樓層 |閱讀模式
如題,我想在運(yùn)行時獲取lr寄存器,用來記錄函數(shù)調(diào)用棧,但是用了很多方法都不可以,我嘗試了如下方法:
方法1如下,此種方法keil可以編譯通過,但是無法正確獲取lr寄存器(或許是因為發(fā)生了跳轉(zhuǎn),lr被覆蓋):
static inline __asm uint32_t readlr(void)
{
        MOV     R0, lr
        bx lr
}


方法2如下(gcc的內(nèi)聯(lián)匯編),此種方法gcc下可以編譯通過,但keil下不行,lr寄存器未定義:
__asm volatile ("mov %0,lr":"=r"(return_addr));

方法3如下,keil下編譯會提示找不到lr寄存器未定義:
__asm        {
               
                }

大佬們求助哇!
回復(fù)

使用道具 舉報

ID:979299 發(fā)表于 2022-6-11 11:42 | 顯示全部樓層
看起來好厲害的樣子,C語言調(diào)用匯編語言
回復(fù)

使用道具 舉報

ID:301191 發(fā)表于 2022-6-16 02:27 | 顯示全部樓層
頂一下
回復(fù)

使用道具 舉報

ID:844772 發(fā)表于 2022-6-16 09:01 | 顯示全部樓層
沒看懂你的意思,lr記錄的是函數(shù)返回后,給pc用的下一條地址,不是函數(shù)地址啊。bx  lr 也不大對啊,是不是bx R0做強(qiáng)制跳轉(zhuǎn)啊或者M(jìn)OV PC LR做程序調(diào)用返回?
回復(fù)

使用道具 舉報

ID:248705 發(fā)表于 2022-6-23 12:16 | 顯示全部樓層
glinfei 發(fā)表于 2022-6-16 09:01
沒看懂你的意思,lr記錄的是函數(shù)返回后,給pc用的下一條地址,不是函數(shù)地址啊。bx  lr 也不大對啊,是不是b ...

我理解你的意思,上面那段代碼無論是bx r0 還是bx lr其實不重要,lr的值已經(jīng)修改了,我是想寫一個內(nèi)存管理的debug,每次malloc都能夠記錄從哪里發(fā)生的調(diào)用,現(xiàn)在gcc下面能正常記錄,keil下已經(jīng)放棄了
回復(fù)

使用道具 舉報

ID:248705 發(fā)表于 2022-6-23 12:17 | 顯示全部樓層
回復(fù)

使用道具 舉報

ID:248705 發(fā)表于 2022-6-23 12:18 | 顯示全部樓層
興安xa 發(fā)表于 2022-6-11 11:42
看起來好厲害的樣子,C語言調(diào)用匯編語言

大部分鏈接器都支持的
回復(fù)

使用道具 舉報

ID:532541 發(fā)表于 2022-6-24 08:38 | 顯示全部樓層
lr.png
LR就是R14可以keil在寄存器中看到,調(diào)試時,單步或斷的停下后觀察R14的值就可以。
回復(fù)

使用道具 舉報

ID:844772 發(fā)表于 2022-6-24 15:19 | 顯示全部樓層
祖國的花朵 發(fā)表于 2022-6-23 12:16
我理解你的意思,上面那段代碼無論是bx r0 還是bx lr其實不重要,lr的值已經(jīng)修改了,我是想寫一個內(nèi)存管 ...

你是用第二種方法,用gcc編譯的吧?學(xué)到了,謝謝。 我覺得gcc的庫內(nèi)容多,沒有針對單片機(jī)優(yōu)化,反而支持這種方法了。
回復(fù)

使用道具 舉報

ID:248705 發(fā)表于 2022-7-27 10:57 | 顯示全部樓層
glinfei 發(fā)表于 2022-6-24 15:19
你是用第二種方法,用gcc編譯的吧?學(xué)到了,謝謝。 我覺得gcc的庫內(nèi)容多,沒有針對單片機(jī)優(yōu)化,反而支持 ...

確實如此,感覺gcc開源的緣故各種花樣挺多,問題也挺多,現(xiàn)在用的libc庫發(fā)現(xiàn)這東西malloc可以直接把內(nèi)存干穿- -,不像keil那樣可以設(shè)置堆棧尺寸
回復(fù)

使用道具 舉報

ID:401564 發(fā)表于 2022-7-28 09:07 | 顯示全部樓層
這都一個多月了,還在折騰這個?
我不太理解,為什么用STM32還相著嵌入?yún)R編,連8051匯編用的人都不多了
STM32不是這個庫就是那個庫的,只能說各有缺點,但做項目都是可以的
還走回頭路去想著看哪個寄存器什么的,如果不是有著極致的要求,那就是沒事找事
回復(fù)

使用道具 舉報

ID:799053 發(fā)表于 2022-7-28 09:38 | 顯示全部樓層
編譯器側(cè)重點不同,keil 有些設(shè)計很合理,設(shè)置很麻煩。
回復(fù)

使用道具 舉報

ID:248705 發(fā)表于 2022-7-28 11:27 | 顯示全部樓層
Y_G_G 發(fā)表于 2022-7-28 09:07
這都一個多月了,還在折騰這個?
我不太理解,為什么用STM32還相著嵌入?yún)R編,連8051匯編用的人都不多了
STM32 ...

也算是學(xué)習(xí)嘛,之前做公司的一個屎山項目,整個工程很大,動態(tài)內(nèi)存用的非常多,不是這里泄露就是那里泄露,有的時候知道是泄露了,但是又找不到在哪,所以想著弄一個可以追蹤malloc調(diào)用的組件
回復(fù)

使用道具 舉報

ID:401564 發(fā)表于 2022-7-28 17:47 | 顯示全部樓層
祖國的花朵 發(fā)表于 2022-7-28 11:27
也算是學(xué)習(xí)嘛,之前做公司的一個屎山項目,整個工程很大,動態(tài)內(nèi)存用的非常多,不是這里泄露就是那里泄露 ...

STM32內(nèi)存這方面我還沒有真正的去做過,因為我涉及的項目對于STM32來說,資源簡單不要太豐富,所以,也沒有真正的去實踐過
但我覺得不應(yīng)該是去走回頭路,STM那么龐大的硬件,我不認(rèn)為就單單看個LR寄存器就能解決問題的
更應(yīng)該是C代碼的優(yōu)化
回復(fù)

使用道具 舉報

ID:1040924 發(fā)表于 2022-7-29 13:24 | 顯示全部樓層
現(xiàn)在都已經(jīng)這么高深了嗎
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表