RTOS移植與naked選項的使用-2_實際效果與擴展閱讀
Make small ones into better one.
以一個基於非同步事件處理的RTOS小內核(eM4)原型實現為基礎介紹設計概念。
參見前篇GCC naked屬性的用法:
RTOS移植與naked選項的使用-1_必要性與用法
本文以實例解析GCC 在添加naked編譯屬性前後的不同,同時提供兩篇討論作為擴展閱讀。
實際效果
如下代碼基於gcc V4.6.3(CooCox Version: 1.7.7)編譯生成。
- 具備naked選項
<1 源代碼
__attribute__((naked)) void PendSV_Handler(void){#if EM4_PLATFORM == EM4_NCU __asm__ volatile( "cpsid i
"......}
<2 彙編效果
0000433e: movs r0, r000004340: stc 0, cr14, [r4]129 __asm__ volatile( PendSV_Handler:00004344: cpsid i00004346: mrs SP.....
- 無naked選項
<3 源代碼
void PendSV_Handler(void){#if EM4_PLATFORM == EM4_NCU __asm__ volatile(......
<4 彙編效果
0000433e: movs r0, r000004340: stc 0, cr14, [r4]127 { PendSV_Handler:00004344: push {r7}00004346: add r7, sp, #0129 __asm__ volatile(00004348: cpsid i0000434a: mrs r1, PSP......
通過對比<2 和<4 明顯發現,在默認參數條件(無naked選項)編譯時,編譯器自動添加prologue:
00004344: push {r7}00004346: add r7, sp, #0
擴展閱讀
- 關於下面這個maillist上問題也非常有趣
__attribute__((naked) on x86 would be useful
- 結合如下blog,中斷函數為C函數實現,分析與中斷髮生時CPU主動現場保護有何異同,編譯器和工程師應怎麼匹配處理?
GCC中」naked」的使用: 如何使中斷程序不保護現場
推薦閱讀: