FreeRTOS是如何工作的--Tick Code
FreeRTOS Tick Code
FreeRTOS的AVR移植版本的实际源代码 与 前一节的例子有些轻微的不同。VPortYieldFromTick()是作为一个naked函数的 它自己的实现,上下文在vPortYieldFromTick().里被保存和恢复。这样做的目的是为了实现一个non-preemptive的上下文切换(这里,一个任务自己阻塞自己).这里暂时不讲这种non-preemptive切换。
RTOS tick是这样在FreeRTOS中实现的(看代码中注释片断获取更多细节):
void SIG_OUTPUT_COMPARE1A( void ) __attribute__ ( ( signal, naked ) );
void vPortYieldFromTick( void ) __attribute__ ( ( naked ) );
/*--------------------------------------------------*/
/* RTOS tick中断服务程序. */
void SIG_OUTPUT_COMPARE1A( void )
{
/*调用tick函数. */
vPortYieldFromTick();
/*从中断返回. 如果出现上下文切换,将返回到一个不同的任务中 */
asm volatile ( "reti" );
}
/*--------------------------------------------------*/
void vPortYieldFromTick( void )
{
/* 这是一个naked 函数,所以需要保存上下文 */
portSAVE_CONTEXT();
/* 增加tick count,检查新的tick count值是否引起一个延迟周期过期,这个函数调用可导致一个任务变成准备运行. */
vTaskIncrementTick();
/*检查是否要求上限文切换。如果 由vTaskIncrementTick()准备好的任务比已经中断的任务有更高优先级,就切换过去 */
vTaskSwitchContext();
/*恢复上下文.如果发生了上下文切换,这将恢复要继续运行的任务的上下文 */
portRESTORE_CONTEXT();
/*从这naked 函数返回. */
asm volatile ( "ret" );
}
/*--------------------------------------------------*/
===下一节:AVR 上下文切换===
作者:Gavin Lee 更新日期:2006-04-24
来源:upsdn.net
浏览次数:
相关文章
相关评论 发表评论
- No Comments