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   浏览次数:

相关文章

相关评论   发表评论