下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

内核
最新资讯
FreeRTOS-Plus-TCP 现具有统一的 IPv4 和 IPv6 功能,支持多接口。
为基于 FreeRTOS 的固件实现防砖化 MCU FOTA:
宣布停止支持 FreeRTOS 202012 LTS。
FreeRTOS 网站现已提供简体中文版本
新的 FreeRTOS Long Term Support 版本现已发布。

RTOS 上下文切换 - 步骤 3
[详细示例]

RTOS 滴答中断执行

ISR 源代码如下。为方便阅读,已删除注释(可在之前的页面查看)。

/* Interrupt service routine for the RTOS tick. */ void SIG_OUTPUT_COMPARE1A( void ) { vPortYieldFromTick(); asm volatile ( "reti" ); } /*--------------------------------------------------*/

void vPortYieldFromTick( void ) { portSAVE_CONTEXT();

vTaskIncrementTick(); vTaskSwitchContext(); portRESTORE_CONTEXT();

asm volatile ( "ret" ); } /*--------------------------------------------------*/
SIG_OUTPUT_COMPARE1A() 是一个裸函数,因此第一个指令是调用 vPortYieldFromTick()。vPortYieldFromTick() 也是一个裸函数,因此 AVR 执行上下文是通过调用 portSAVE_CONTEXT() 显式保存的。

portSAVE_CONTEXT() 将整个 AVR 执行上下文推送到 TaskA 的堆栈上,从而产生下图所示的堆栈。TaskA 的堆栈指针目前指向其自身上下文的顶部。在存储堆栈指针的副本后, portSAVE_CONTEXT() 执行完成。实时内核已有 TaskB 堆栈指针的副本,该指针是在上次暂停 TaskB 时获取的。

AtoB3.gif


下一步: RTOS 实现 - 详细示例步骤 4


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