【文章內(nèi)容簡(jiǎn)介】
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屬性來(lái)寫一個(gè)ISR.,以及它是如何使 執(zhí)行上下文自動(dòng)保存的(只有那些被ISR修改過(guò)的處理器寄存器才會(huì)得到保存)。然而,執(zhí)行一個(gè)上下文切換需要保存完整的上下文。應(yīng)用程序代碼能夠 在進(jìn)入ISR時(shí),明確(explicitly)地 保存所有寄存器,但是這樣會(huì)使 某些處理器寄存器 保存兩次一次是由編譯器生成的代碼,另一次是由應(yīng)用程序自己。這不是我們所需要的,可以在39。signal39。屬性后 添加 39。naked39。屬性來(lái)避免: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)在變異這段代碼,會(huì)得到更少的編譯器輸出:。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. 。 。}看看,入口 和 出口代碼都沒(méi)有了吧使用 naked 屬性,編譯器不會(huì)生成任何入口和出口代碼,所以必須明確(explicitly)加入。portSAVE_CONTEXT()和portRESTORE_CONTEXT()這兩個(gè)宏 是用來(lái)保存和恢復(fù)完整的執(zhí)行上下文的:void SIG_OUTPUT_COMPARE1A( void ) __a