FreeRTOS是如何工作的--GCC信号属性

GCC信号属性(Signal Attribute)

GCC development tools允许用C来写中断程序。一个在AVR 定时器1外设的比较匹配事件  可以用下面的 语法(syntax)实现:

void SIG_OUTPUT_COMPARE1A( void ) __attribute__ ( ( signal ) );
void SIG_OUTPUT_COMPARE1A( void )
{
    /* ISR C code for RTOS tick. */
    vPortYieldFromTick();
}

在函数原型前的 '__attribute__ ( ( signal ) )' 指示符 告知 编译器,这个函数是一个ISR,会引起编译器输出的两个重要改变:

  1. signal属性保证,每个在ISR 期间 被修改的 处理器的寄存器,在从ISR中退出时恢复到它原来的值。这就要求,当中断将要执行时,编译器不能做任何假定。所以,不能优化
哪个处理器寄存器要求保护或者不保护。
  2.'signal'也强制使用 一个 从中断返回('return from interrupt')指令(RETI),而不是
返回(return)指令RET.  AVR微控制器 在进入ISR前禁止中断,RETI指令要求在 退出时
重新打开中断。

下面是由编译器输出的代码:
;void SIG_OUTPUT_COMPARE1A( void )
;{
    ; ---------------------------------------
    ; CODE GENERATED BY THE COMPILER TO SAVE
    ; THE REGISTERS THAT GET ALTERED BY THE
    ; APPLICATION CODE DURING THE ISR.
    PUSH    R1      
    PUSH    R0      
    IN      R0,0x3F         
    PUSH    R0              
    CLR     R1              
    PUSH    R18             
    PUSH    R19             
    PUSH    R20             
    PUSH    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 属性===

作者:Gavin Lee   更新日期:2006-04-24
来源:upsdn.net   浏览次数:

相关文章

相关评论   发表评论