下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

内核
最新资讯
简化任何设备的身份验证云连接。
利用 CoAP 设计节能型云连接 IoT 解决方案。
11.0.0 版 FreeRTOS 内核简介:
FreeRTOS 路线图和代码贡献流程。
使用 FreeRTOS 实现 OPC-UA over TSN。

GCC 信号属性
[RTOS 实现构建基块]

GCC 开发工具可以使用 C 语言编写中断。 可以使用以下语法编写 AVR 定时器 1 外设上的比较匹配事件。
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”属性还强制使用“从中断返回”指令 (RETI) 代替“返回”指令 (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.

;vPortYieldFromTick(); 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 ; ---------------------------------------



下一节: RTOS 实现 - GCC 裸属性

Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.