您好,登錄后才能下訂單哦!
RT-Thread中$Sub$main與$Super$main擴展main函數(shù)的示例分析,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
MDK5的__main函數(shù)是自動生成的,且無法修改源碼。同時,MDK5提供了一對符號$Sub$$和$Super$$來擴展函數(shù)。這一對符號作用在連接器,當連接器連接到func時,如果發(fā)現(xiàn)存在$Sub$$func函數(shù),會先連接$Sub$$func函數(shù),一直到出現(xiàn)$Super$$func為止,$Super$$func是func函數(shù)的新的入口。
Keil官網(wǎng)給的例子:
extern void ExtraFunc(void); extern void $Super$$foo(void): /* this function is called instead of the original foo() */ void $Sub$$foo(void) { ExtraFunc(); /* does some extra setup work */ $Super$$foo(); /* calls the original foo() function */ /* To avoid calling the original foo() function * omit the $Super$$foo(); function call. */ }
$Sub$$和$Super$$符號可以在不修改原程序的情況下添加新功能,rtt就使用了這對符號來擴展main函數(shù)。
做一個簡單的例子來測試一下這種擴展:
int i = 0; void $Super$$main(void); void $Sub$$main(void) { i++; $Super$$main(); } int main(void) { i++; while(1) { } }
看反匯編(assembly mode),原來跳轉到main函數(shù)變成了跳轉到$Sub$$main函數(shù):
__rt_entry_main: 0x08000172 F000F867 BL.W $Sub$$main (0x08000244) 0x08000176 F000F84F BL.W exit (0x08000218)
$Sub$$main函數(shù):
$Sub$$main: 0x08000244 B510 PUSH {r4,lr} 0x08000246 4804 LDR r0,[pc,#16] ; @0x08000258 0x08000248 6800 LDR r0,[r0,#0x00] 0x0800024A 1C40 ADDS r0,r0,#1 0x0800024C 4902 LDR r1,[pc,#8] ; @0x08000258 0x0800024E 6008 STR r0,[r1,#0x00] 0x08000250 F000F8A8 BL.W main (0x080003A4) 0x08000254 BD10 POP {r4,pc} 0x08000256 0000 DCW 0x0000 0x08000258 0000 DCW 0x0000 0x0800025A 2000 DCW 0x2000
這樣做,可以保持啟動代碼不變,而同時實現(xiàn)對main函數(shù)的擴展。rtt的調(diào)度器就是這樣做的。
看完上述內(nèi)容,你們掌握RT-Thread中$Sub$main與$Super$main擴展main函數(shù)的示例分析的方法了嗎?如果還想學到更多技能或想了解更多相關內(nèi)容,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。