<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM Cortex―M0/M0+單片機的指針變量替換方法

ARM Cortex―M0/M0+單片機的指針變量替換方法

作者: 時(shí)間:2016-09-12 來(lái)源:網(wǎng)絡(luò ) 收藏

實(shí)際上,應用程序中可通過(guò)MOV指令將R8~R11初始化成“寄存器常數”,而以后不再改變它們的值。例如可以令:

R8,=0 用于低寄存器的快速清零

R9,=基地址 用于拼接長(cháng)指針

R10,=I/O模塊基地址

R11,=庫函數基地址

當FLASH存儲器空間不大于64 KB時(shí),函數指針無(wú)需設定基地址,可以直接使用低16位作為16位指針。對于超過(guò)64 KB的FLASH,可以使用庫函數基地址,采用類(lèi)似分頁(yè)的方法實(shí)現16位。

最后一個(gè)高組寄存器R12可在響應中斷時(shí)和R0~R3,PC、SP一同自動(dòng)入棧,是用戶(hù)可以使用的寄存器變量。

2.1節中提出的宏定義方案形式上簡(jiǎn)單清楚,但展開(kāi)后需要多條指令才能完成。將Address_base作為寄存器變量,存放在R8~R12中的某個(gè)高組寄存器中,而不是使用宏定義常量或全局變量。由于C語(yǔ)言不能直接對通用寄存器進(jìn)行操作,需通過(guò)將匯編嵌入到C語(yǔ)言中實(shí)現長(cháng)指針的替換。在程序初始化時(shí),將R8~R12中的一個(gè)寄存器初始化為Address_base的值,例如下面給出的語(yǔ)句:

asm(“LDR r1,=0x1ffff000”);//R1=基地址

asm(“MOV R9,R1”);//R9=R1,即基地址

R9寄存器初始化后無(wú)需再修改,是一個(gè)“寄存器常數”。對于已經(jīng)存儲在R0中的長(cháng)指針,則使用如下匯編代碼,很容易將其轉化為16位地址:

asm(“MOV R1,R9”);//R1=基地址

asm(“SUB R0,R0,R1”);//R0=R0-R1,R0低16位即16位

//短指針值

代碼首先將R9寄存器存儲的基地址轉移到R1寄存器,隨后利用單條指令完成從R0寄存器所存長(cháng)指針值減去R1中存儲的基地址,并將所得結果保存在R0中。執行完成后,R0低16位便是轉化后的16位地址。16位地址轉化為長(cháng)指針是類(lèi)似的轉化形式(SUB指令換為ADD指令),在此不再贅述。這種方法充分利用了內核提供的高組寄存器,并且簡(jiǎn)化了指針轉化的算法,減少了所需指令的數目,提高了運行效率,縮短了轉換時(shí)間,降低MCU因而產(chǎn)生的時(shí)間損失。轉換所需指令數目也壓縮到兩條,減少轉換過(guò)程所帶來(lái)的額外指令代碼的存儲空間開(kāi)銷(xiāo)。

3 結果

μC/OS(含μC/OS-II、μC/OS—III)是適用于低成本MCU的多任務(wù)實(shí)時(shí)內核。以μC/OS為例,當最大任務(wù)數為10時(shí),整個(gè)內核需使用12個(gè)全局指針型變量,而非指針型變量?jì)H需占用8字節空間。若使用默認的長(cháng)指針模式,共需12×4+8=56字節;若改用短指針,則需使用12 ×2+8=32字節。任務(wù)數目、任務(wù)間通信機制增多時(shí),指針變量的使用將更頻繁,本文介紹的方法所節約的空間也更加顯著(zhù)。在Cortex-M0/M0+處理器替代8/16位MCU的應用中,非常有必要使用短指針。

最新版本的μC/OS—III針對帶有計算前導零硬件指令(CLZ)的Cortex—M3/M4處理器進(jìn)行了重大改進(jìn),提高了其優(yōu)先級任務(wù)搜索的效率。但Cortex—M0/M0+的ARMv6指令集簡(jiǎn)化掉了CLZ指令,故不適宜使用μC/OS—III。這里以運行μC/OS—II v2.92(最多256個(gè)任務(wù))為例,說(shuō)明指針替換效果。實(shí)際上對于內存緊張的MCU,μC/OS—II v2.82及以下的版本(最多64個(gè)任務(wù))就足夠用了。

μC/OS—II每個(gè)任務(wù)都需要使用任務(wù)控制塊TCB(Task Control Block)的數據結構,來(lái)維護任務(wù)相關(guān)的信息。在μC/OS—II v2.92中,每個(gè)任務(wù)的TCB數據結構包含9個(gè)指針變量,采用本文描述的16位指針替換方法后,每個(gè)任務(wù)控制塊均可以節省18字節的RAM空間。在μC/OS—II中還存在很多數據結構,均包含著(zhù)大量的指針變量。這些數據結構采用本文描述的方法所節約的RAM空間如表1所列。

ARM Cortex—M0/M0+單片機的指針變量替換方法

可以看出,以16位短指針替代ARM編譯器默認的32位長(cháng)指針,能使Cortex—M0/M0+MCU對RAM資源的占用接近8/16位MCU。這一點(diǎn)對“全面替代”是十分重要的。

結語(yǔ)

以ARM Cortex-M0/M0+為內核的32位MCU以其性能、功耗和價(jià)格的優(yōu)勢,“全面替代”以8051/52、68S08/12等為代表的8/16位MCU已是大勢所趨。而目前主流ARM IDE中的C編譯器僅支持長(cháng)指針變量。若將原有的8/16位MCU應用程序移植到內存資源相當的ARM MCU上,大量長(cháng)指針變量的使用可能會(huì )導致RAM資源不足,而改用更大內存的MCU無(wú)疑會(huì )增加產(chǎn)品成本。通過(guò)使用Cortex—M0/M0+內核的高組寄存器操作指令,可以實(shí)現長(cháng)短指針的轉換,極大地節約RAM占用量,為既有應用的順利移植提供幫助。

當然,長(cháng)短指針的轉換操作會(huì )帶來(lái)額外的運行時(shí)間的開(kāi)銷(xiāo),轉換指令也帶來(lái)代碼存儲量的增加。在一定程度上,這種方法是通過(guò)增加程序存儲量和運行周期的代價(jià)來(lái)?yè)Q取數據存儲量的減少。由于A(yíng)RM精簡(jiǎn)指令集的結構,其指令編碼長(cháng)度和執行速度上都有提升,可以部分抵銷(xiāo)程序存儲量和運行周期的開(kāi)銷(xiāo),而數據存儲量的矛盾則更加突出和棘手。本文介紹的方法對此作出了有益嘗試。

本文介紹的方法需要對已有代碼進(jìn)行一定的改造,筆者希望ARM編譯器能盡快提供面向Cortex—M0/M0+內核的短指針優(yōu)化編譯選項,為完成ARM對8/16位MCU內核的“全面替代”提供良好的支持。


上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>