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 时获取的。
下一步: RTOS 实现 - 详细示例步骤 4
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.
|