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
浏览次数:
相关文章
相关评论 发表评论
- No Comments