文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

FreeRTOS实时操作系统支持时间片示例详解

2024-04-02 19:55

关注

什么是时间片

时间片就是同一个优先级下可以有多个任务,每个任务轮流地享有相同的 CPU 时间, 享有 CPU 的时间我们叫时间片。在 RTOS 中,最小的时间单位为一个 tick,即 SysTick 的中断周期,与其说 FreeRTOS 支持时间片,倒不如说它的时间片就是正常的任务调度。

时间片实现关键

时间片实现关键在这两个宏。

taskRESET_READY_PRIORITY()、

taskSELECT_HIGHEST_PRIORITY_TASK()

taskSELECT_HIGHEST_PRIORITY_TASK()

系统在任务切换的时候总会从就绪列表中寻找优先级最高的任务来执行,寻找优先级
最高的任务这个功能由 taskSELECT_HIGHEST_PRIORITY_TASK()函数来实现,该函数在
task.c 中定义,如下

#define taskSELECT_HIGHEST_PRIORITY_TASK()\
 {\
 UBaseType_t uxTopPriority;\
 \
 portGET_HIGHEST_PRIORITY( uxTopPriority, uxTopReadyPriority );\
 \
 listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB,\
 &( pxReadyTasksLists[ uxTopPriority ] ) );\
 }

先寻找就绪任务的最高优先级。即根据优先级位图表uxTopReadyPriority 找到就绪任务的最高优先级,然后将优先级暂存在uxTopPriority
获取优先级最高的就绪任务的 TCB,然后更新到 pxCurrentTCB。这里关键在更新到pxCurrentTCB的宏listGET_OWNER_OF_NEXT_ENTRY,如下

 #define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList )\
 {\
 List_t * const pxConstList = ( pxList );\
 \
 ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext;\
 \
 if( ( void * ) ( pxConstList )->pxIndex == ( void * ) &( ( pxConstList )->xListEnd ) )\
 {\
 ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext;\
 }\
 \
 ( pxTCB ) = ( pxConstList )->pxIndex->pvOwner;\
 }

关键在下面这句,下面看图比较好说明

( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext;

在这里插入图片描述

对于优先级2,当第一次执行listGET_OWNER_OF_NEXT_ENTRY后,pxIndex指向Task1TCB->xStateListItem,所以pvOwner取到的是Task1TCB赋值给pxCurrentTCB.

对于优先级2,当第二次执行listGET_OWNER_OF_NEXT_ENTRY前,注意此时pxIndex指向Task1TCB->xStateListItem,所以( pxConstList )->pxIndex->pxNext;是Task2TCB->xStateListItem,所以这次pvOwner取到的是Task2TCB赋值给pxCurrentTCB.

对于优先级2,当第三次执行listGET_OWNER_OF_NEXT_ENTRY前,注意此时pxIndex指向Task2TCB->xStateListItem,这时符合上面的if条件了,所以( pxConstList )->pxIndex->pxNext;是Task1TCB->xStateListItem,所以这次pvOwner取到的是Task1TCB赋值给pxCurrentTCB.

这样就实现了同一优先级下的任务时间片轮流执行。

taskRESET_READY_PRIORITY()

#define taskRESET_READY_PRIORITY( uxPriority )\
 {\
 if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ ( uxPriority ) ] ) )\
    == ( UBaseType_t ) 0 )\
 {\
 portRESET_READY_PRIORITY( ( uxPriority ),\
 ( uxTopReadyPriority ) );\
 }\
 }

taskRESET_READY_PRIORITY()函数的妙处在于清除优先级位图表uxTopReadyPriority中相应的位时候,会先判断当前优先级链表下是否还有其它任务,如果有则不清零。 假设任务1会调用 vTaskDelay(),会将自己挂起,只能是将任务1从就绪列表删除,不能将任务1在优先级位图表uxTopReadyPriority中对应的位清0,因为该优先级下还有任务2,否则任务2将得不到执行.

以上就是FreeRTOS支持时间片示例详解的详细内容,更多关于FreeRTOS支持时间片的资料请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-人工智能
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯