不知你在DEBUG程序,又或者閱讀操作系統(tǒng)源碼時(shí)候有沒細(xì)心觀察,從一個(gè)普通子函數(shù)返回與異常(中斷)返回的匯編指令都是BX LR,但是這兩者的意義是一樣的嗎?這篇文章就來揭開LR寄存器的神秘面紗。
當(dāng)單片機(jī)涉及函數(shù)跳轉(zhuǎn)或者任務(wù)調(diào)度的時(shí)候,理解MCU如何處理堆棧與改變各個(gè)通用寄存器的狀態(tài)尤為重要,下面就來比較一下在不同情況下LR寄存器的意義。

上圖是一個(gè)簡(jiǎn)單的例子,當(dāng)仿真點(diǎn)擊“下一步”的時(shí)候,MCU就會(huì)執(zhí)行BX LR指令,并且從aa子函數(shù)返回到main函數(shù)中,可以看到在普通子函數(shù)里執(zhí)行BX LR的意義是“跳轉(zhuǎn)到LR寄存器里的地址執(zhí)行”。

對(duì)比一下一段ucos的源碼,如果對(duì)M3內(nèi)核有所了解的小伙伴一定知道堆棧為什么是這樣定義的,那么這時(shí)候我們發(fā)現(xiàn)OS_TaskReturn是作為一個(gè)錯(cuò)誤返回函數(shù),并且賦值到堆棧中R14(LR)相應(yīng)的位置。

任務(wù)調(diào)度函數(shù)會(huì)將PSP堆棧指針指向我們定義自定義的堆棧,然后最后一句匯編是BX LR,那么按照普通子函數(shù)執(zhí)行BX LR的意義,這個(gè)時(shí)候MCU是會(huì)運(yùn)行OS_TaskReturn這個(gè)函數(shù)嗎?這樣不就進(jìn)入錯(cuò)誤函數(shù)了嗎?
其實(shí)不然,因?yàn)橛肕系列實(shí)現(xiàn)ucos的任務(wù)調(diào)度是在PendSV異常(中斷)里面實(shí)現(xiàn)的,而在異常(中斷)里的LR寄存器不再是普通函數(shù)里面“返回地址”的意義,而是一個(gè)定義為一個(gè)稱作exc-return的值,當(dāng)執(zhí)行BX LR時(shí)候,這個(gè)值決定了MCU退出異常(中斷)之后的運(yùn)行等級(jí)是在特權(quán)級(jí)還是用戶級(jí)以及用的堆棧是MSP還是PSP,而MCU即將要執(zhí)行的是從PSP堆棧中POP出來的p_task函數(shù),而不是OS_TaskReturn函數(shù)。
是不是覺得很有趣,蠢蠢欲動(dòng),迫不及待想上手體驗(yàn)一下呢?考慮到廣大群眾的焦慮,我司提供 LPC824仿真套餐服務(wù),不用998,也不用99,只要49,你還在想什么呢?趕緊復(fù)制下面的淘口令打開淘寶上車吧
-
寄存器
+關(guān)注
關(guān)注
31文章
5608瀏覽量
129976 -
匯編指令
+關(guān)注
關(guān)注
0文章
38瀏覽量
11833 -
LPC824
+關(guān)注
關(guān)注
0文章
8瀏覽量
5449
發(fā)布評(píng)論請(qǐng)先 登錄
深入解析SPI通信:高速全雙工,如何連接微控制器與萬千外設(shè)?啟明云端樂鑫代理
【NCS隨筆】nRF54L15使用UICR寄存器保存數(shù)據(jù)
嵌入式系統(tǒng)必懂的 20 個(gè)寄存器
NVMe高速傳輸之?dāng)[脫XDMA設(shè)計(jì)32:寄存器功能驗(yàn)證與分析2
?SN74LVC595A 8位移位寄存器技術(shù)文檔總結(jié)
?SN74HCT595 8位移位寄存器技術(shù)解析與應(yīng)用指南
TPIC6595 8位功率移位寄存器技術(shù)文檔摘要
?TPIC6B595 8位功率移位寄存器技術(shù)文檔總結(jié)
電源里的“特種部隊(duì)”:揭秘115V/400Hz高頻電力的神秘面紗與應(yīng)用領(lǐng)域
?TLC6C5912 12通道移位寄存器LED驅(qū)動(dòng)器技術(shù)文檔總結(jié)
光模塊拉環(huán)顏色背后的神秘意義,你知道多少?
你知道船用變壓器有哪些嗎?
使用寄存器點(diǎn)亮LED燈
第四章 什么是寄存器
防水連接器:電源與工業(yè)領(lǐng)域的守護(hù)神
與你一起揭開LR寄存器的神秘面紗
評(píng)論