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 usefulgcc.gnu.org

  • 結合如下blog,中斷函數為C函數實現,分析與中斷髮生時CPU主動現場保護有何異同,編譯器和工程師應怎麼匹配處理?

GCC中」naked」的使用: 如何使中斷程序不保護現場m.baidu.com


推薦閱讀:

單片機系統架構之一 時間片輪詢法
教你如何學習單片機

TAG:嵌入式系統 | 嵌入式開發 | 單片機軟體開發 |