FreeeRtos : xTaskIncrementTick

xTaskIncrementTick
操作系统的运行是由系统节拍时钟驱动的。
系统每次节拍中断服务程序中主要任务由函数 xTaskIncrementTick 完成。
在任务调度器没有挂起的情况下( xTaskIncrementTick != pdFALSE ),该函数主要完成 :
* 判断节拍计数器xTickCount 是否溢出, 溢出轮换延时函数队列
* 判断是否有阻塞任务超时,取出插入就绪链表
* 同优先级任务时间片轮
而当任务调度器被挂起时, 该函数累加挂起时间计数器 uxPendedTicks, 调用用户钩子函数, 此时,正在运行的任务不会被切换, 一直运行。
当恢复调度时, 系统会先重复调用 xTaskIncrementTick 补偿 (uxPendedTicks次)。
不管, 系统调度器是否挂起, 每次节拍中断都会调用用户的钩子函数 vApplicationTickHook 。 由于函数是中断中调用,不要在里面处理太复杂的事情!!
在FreeRTOS中,我们知道系统延时和阻塞时间都是以系统节拍时钟周期为单位。在配置文件FreeRTOSConfig.h,改变宏configCPU_CLOCK_HZ的值,可以改变系统节拍时钟的中断频率,也间接的改变了系统节拍时钟周期(T=1/f)。
设置宏configCPU_CLOCK_HZ为100,则系统节拍时钟周期为10ms,设置宏configCPU_CLOCK_HZ为1000,则系统节拍时钟周期为1ms。
系统节拍中断服务程序会调用函数xTaskIncrementTick()来完成主要工作,如果该函数返回值为真(不等于pdFALSE),说明处于就绪态任务的优先级比当前运行的任务优先级高。这会触发一次PendSV中断,进行上下文切换。
BaseType_t xTaskIncrementTick( void )
{
TCB_t * pxTCB;
TickType_t xItemValue;
BaseType_t xSwitchRequired = pdFALSE;
       /* Called by the portable layer each time a tick interrupt occurs.
       Increments the tick then checks to see if the new tick value will cause  any
       tasks to be unblocked. */
/*在每个时钟到的时候检查,是否会有任务需要解锁(是否有就绪态的任务需要执行)*/
       traceTASK_INCREMENT_TICK( xTickCount );//空的定义
       //系统维护一个计数uxSchedulerSuspended,当它大于0时候表示禁止调度,等于0则打开调度(允许调度)。
       if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )//允许调度
       {
             /* Minor optimisation.  The tick count cannot change in this
             block. */
             const TickType_t xConstTickCount = xTickCount + 1;/* 系统节拍计数器xTickCount 加1*/
             /* Increment the RTOS tick, switching the delayed and overflowed
             delayed lists if it wraps to 0. */
             xTickCount = xConstTickCount;
             if( xConstTickCount == ( TickType_t ) 0U )/* 系统节拍计数器xTickCount 是否溢出*/
             {
                    taskSWITCH_DELAYED_LISTS();
             }
             else
  • 19
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Moster7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值