freertos时间管理.doc

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
freertos时间管理

FreeRTOS时间管理分析转载请注明出处:/bluehacker时间管理包括两个方面:系统节拍的维护,产生;以及任务延时管理。下面分别讨论下。 !--[if !supportLists]--一.? ?? ?? ?? ? !--[endif]--时钟节拍操作系统总是需要个时钟节拍的,这个需要硬件支持。freertos同样需要一个time tick产生器,通常是用处理器的硬件定时器来实现这个功能。它周期性的产生定时中断,所谓的时钟节拍管理的核心就是这个定时中断的服务程序。freertos的时钟节拍isr中除去保存现场,灰度现场这些事情外,核心的工作就是调用vTaskIncrementTick()函数。比如freescale的MCF5235系列coldfire处理器的移植代码中,对应的时钟节拍isr如下: static void prvPortPreemptiveTick( void ) { ? ? asm volatile ( move.w??#0x2700, %sr\n\t ); #if _GCC_USES_FP == 1 ? ? asm volatile ( unlk %fp\n\t ); #endif ? ? portSAVE_CONTEXT(??); ? ? MCF_PIT_PCSR0 |= MCF_PIT_PCSR_PIF; ? ? vTaskIncrementTick(??);←-------这里调用 ? ? vTaskSwitchContext(??); ? ? portRESTORE_CONTEXT(??); } vTaskIncrementTick()函数主要做两件事情:维护系统时间(以tick为单位,多少个节拍);处理那些延时的任务,如果延时到期,则唤醒任务。 inline void vTaskIncrementTick( void ) { ? ?? ? /*检查调度器是否被禁止,如果没有被禁止. */ ? ?? ? if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) ? ?? ?? ???{/*xTickCount是一个系统全局变量,它维护系统当前时间(从启动到现在过去了多少个节拍),这里把这个变量加一*/ ? ?? ?? ?? ???++xTickCount; //如果加完后等于0,则说明溢出了 ? ?? ?? ?? ???if( xTickCount == ( portTickType ) 0 ) ? ?? ?? ?? ???{ ? ?? ?? ?? ?? ?? ?? ?xList *pxTemp; ? ?? ?? ?? ?? ?? ?? ?/* 因为xTickCount溢出,所以我们需要交换任务延时链表,系统定义了两个链表指针pxDelayedTaskList和pxOverflowDelayedTaskList,其中pxDelayedTaskList始终指向当前正在使用的那个任务延时链表,而pxOverflowDelayedTaskList指向的则总是备用的那个任务链表 *在这里我们让pxDelayedTaskList指向原先由pxOverflowDelayedTaskList指向的那个链表,做个交换*/ ? ?? ?? ?? ?? ?? ?? ?pxTemp = pxDelayedTaskList; ? ?? ?? ?? ?? ?? ?? ?pxDelayedTaskList = pxOverflowDelayedTaskList; ? ?? ?? ?? ?? ?? ?? ?pxOverflowDelayedTaskList = pxTemp; ? ?? ?? ?? ?xNumOfOverflows++; ? ?? ?? ?? ???} ? ?? ?? ?? ???/* 检查有没有任务的延时已经到期,如果有,则唤醒 */ ? ?? ?? ?? ???prvCheckDelayedTasks(); ? ?? ? } ? ?? ? else ? ?? ? {//如果调度器被禁止,则我们把丢失的时钟节拍记录在全局变量uxMissedTicks中 ? ?? ?? ?? ???++uxMissedTicks; ? ?? ?? ?? ???/* 调用用户定义的tick hook,即使调度器被禁止也要调用. */ ? ?? ?? ?? ???#if ( configUSE_TICK_HOOK == 1 ) ? ?? ?? ?? ???{ ? ?? ?? ?? ?? ?? ?? ?extern void vApplicationTickHook( void ); ? ?? ?? ?? ?? ?? ?? ?vApplicationT

文档评论(0)

shenlan118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档