RTOS移植與naked選項的使用-1_必要性與用法
Make small ones into better one.
以一個基於非同步事件處理的RTOS小內核(eM4)原型實現為基礎介紹設計概念。
引
這個是在2014年~2015年期間在Cortex-M3 (stm32f103)移植uC/OS時引出,在最初eM4 OS移植時進行了規避。
無需編譯器管理函數調用時的"現場保護",Why?
--任務切換函數時附帶naked選項
- 編譯器編譯c函數時,總會將用於傳參等使用寄存器進行入棧(最常見的莫過於將R1~R4入棧了,其跟ABI有關),在函數退出時恢復保存的寄存器值至調用時的狀態;
- 基於1,在函數調用時一般並沒有保存所有的寄存器狀態或者運行時的上下文(contex),
- 任務切換函數在封裝成c函數形式時,有必要將編譯器的部分寄存器入棧保護和恢復(也包括返回指令)功能完全由任務切換函數獨自完成;
- 基於3,有必要告訴編譯器,失能寄存器的入棧「現場」保護功能;
即, 函數調用時,存在由編譯器主動產生的prologue(返回地址入棧、參數入棧等)以及epilogue(返回調用處下一條指令等)在特定的場景由移植工程師獨自管理,無需編輯器進行參與。
naked選項解釋
引用GCC中關於naked選項功能的描述:
Use this attribute on the ARM, AVR, MCORE, RX and SPU ports to indicate that the specified function does not need prologue/epilogue sequences generated by the compiler. It is up to the programmer to provide these sequences. The only statements that can be safely included in naked functions are asm statements that do not have operands. All other statements, including declarations of local variables, if statements, and so forth, should be avoided. Naked functions should be used to implement the body of an assembly function, while allowing the compiler to construct the requisite function declaration for the assembler.
Using the GNU Compiler Collection (GCC)
naked屬性的語法
GCC的聲明語法:__attribute__((naked))
__attribute__((naked)) void PendSV_Handler(void){ ......}
另,VC++也有類似的處理方式:
VC++的聲明語法:__declspec(naked)
總結
編譯選項: naked的功能如其名描述一樣,編譯器將不再為進出函數的前後序中添加函數調用的「現場」狀態以保證函數調用的正確性功能,這個在RTOS的任務切換實現(C函數實現)中由工程師進行管理是非常必要。
GCC對naked屬性的處理效果參見:
RTOS移植與naked選項的使用-2_實際效果與擴展閱讀
珍重手機對知乎的編輯,已無力吐槽。
2018.2.13於春節火車上
推薦閱讀: