【文章內容簡介】
SH R21 PUSH R22 PUSH R23 PUSH R24 PUSH R25 PUSH R26 PUSH R27 PUSH R30 PUSH R31 。 。 CODE GENERATED BY THE COMPILER FROM THE 。 APPLICATION C CODE. 。vTaskIncrementTick()。 CALL 0x0000029B 。Call subroutine。} 。 。 CODE GENERATED BY THE COMPILER TO 。 RESTORE THE REGISTERS PREVIOUSLY 。 SAVED. POP R31 POP R30 POP R27 POP R26 POP R25 POP R24 POP R23 POP R22 POP R21 POP R20 POP R19 POP R18 POP R0 OUT 0x3F,R0 POP R0 POP R1 RETI 。 GCC Naked 屬性前一節(jié)講述了如何在C中用 signal屬性來寫一個ISR.,以及它是如何使 執(zhí)行上下文自動保存的(只有那些被ISR修改過的處理器寄存器才會得到保存)。然而,執(zhí)行一個上下文切換需要保存完整的上下文。應用程序代碼能夠 在進入ISR時,明確(explicitly)地 保存所有寄存器,但是這樣會使 某些處理器寄存器 保存兩次一次是由編譯器生成的代碼,另一次是由應用程序自己。這不是我們所需要的,可以在39。signal39。屬性后 添加 39。naked39。屬性來避免:void SIG_OUTPUT_COMPARE1A( void ) __attribute__ ( ( signal, naked ) )。void SIG_OUTPUT_COMPARE1A( void ){ /* ISR C code for RTOS tick. */ vPortYieldFromTick()。}39。naked39。屬性阻止編譯器生成任何函數(shù)入口或退出代碼?,F(xiàn)在變異這段代碼,會得到更少的編譯器輸出:。void SIG_OUTPUT_COMPARE1A( void )。{ 。 。 NO COMPILER GENERATED CODE HERE TO SAVE 。 THE REGISTERS THAT GET ALTERED BY THE 。 ISR. 。 。 CODE GENERATED BY THE COMPILER FROM THE 。 APPLICATION C CODE. 。vTaskIncrementTick()。 CALL 0x0000029B 。Call subroutine 。 。 NO COMPILER GENERATED CODE HERE TO RESTORE 。 THE REGISTERS OR RETURN FROM THE ISR. 。 。}看看,入口 和 出口代碼都沒有了吧使用 naked 屬性,編譯器不會生成任何入口和出口代碼,所以必須明確(explicitly)加入。portSAVE_CONTEXT()和portRESTORE_CONTEXT()這兩個宏 是用來保存和恢復完整的執(zhí)行上下文的:void SIG_OUTPUT_COMPARE1A( void ) __a