嵌入式学习笔记 - freeRTOS任务优先级抢占,时间片抢占的实现机制

article/2025/8/16 12:01:14

一 任务优先级、时间片抢占

已经知道freeRTOS的任务切换函数发生在systick中断中,如下图

由上图可见,任务切换有个先决条件TaskIncrementTick()函数返回为1,这个函数如下图,

函数返回值为xSwitchRequired,有两处赋值的地方

第① 处:总体有两个条件,一个是延时列表有任务到期,一个是到期任务优先级>=当前任务优先级,分别是划红线的语句526行以及568行,然后就使能切换任务,感觉这个自然是正常逻辑。

其中等于的情况也包含了:想象下系统只有一个优先级有两个任务的情况,如果任务中没有主动切换释放CPU的话,如果这里再不切换的话就会一直执行一个任务,配合任务切换函数用的是listGET_OWNER_OF_NEXT_ENTRY,总是指向下一个节点任务,既使不使能时间片抢占,同优先级的另一个任务到期也可以依次切换执行,这里其实不是时间片抢占,只是同优先级任务到期抢占。

如果是大于的情况:那么使用listGET_OWNER_OF_NEXT_ENTRY也是指向当前到期的任务,因为taskSELECT_HIGHEST_PRIORITY_TASK()函数实现里关于listGET_OWNER_OF_NEXT_ENTRY()的函数实现里( pxConstList )->pxIndex总是指向end节点之前,而时间到期插入就绪任务时使用的是insertEnd();总是插入最后一个节点,即便前面还有一个节点也不会错过这个节点,这就是高优先级抢占。

小于的情况:如果是小于的情况不切换,既使到期,一直要等到高优先级的任务释放CPU

第②处:第583行至第586行就是判断是否执行实现时间片抢占的部分,第580行是个宏定义在配置文件中,

第583行是判断条件,如果当先优先级链表里面有多于一个任务在运行,使能任务切换,实现时间片抢占,既使延时列表里面没有任务到期,这其实就是时间片抢占。

二 任务切换执行

下图是任务切换taskYIELD();的最终实现,依次调用:

最后一个函数第120行就实现了将想要切换的任务的任务控制块指针赋值给pxCurrentTCB.

pendSV 最终根据pxCurrentTCB 第一项指示的栈顶地址,将任务栈的内容更改到msp的指针以及PC的指针以及其他寄存器实现任务切换。

前面所有的准备,不管是任务从就绪列表删除加入延时列表,
或者是systick中断轮询到任务时间到期将任务从延时列表删除加入就绪列表,
都是为了在此处体现,此处是pendSV汇编代码切换上下文的最终执行之处,
只能有一个任务被切换到pxCurrentTCB,也只能在这被切换到pxCurrentTCB。

三 调试实例

通过以上理论分析,来调试一个调试freeRTOS系统中遇到的问题:

系统共有三个任务:

任务1优先级为1,任务2优先级为2,任务3为空闲任务优先级为0,

任务1中没有使用vTaskDelay(  )函数释放CPU的语句

任务2中使用了vTaskDelay(  )函数释放CPU,

按照道理任务1任务2应该可以有序的执行,但是通过单步运行以及仿真发现实际任务2一次也未得到执行,尽管任务2已经加入到就绪列表如下图,由本文第二节内容分析推断也就是从未进行过任务切换,不然pendSV中断中的vTaskSwitchContext()/taskSELECT_HIGHEST_PRIORITY_TASK();函数肯定会选择任务2至少执行一次,因为任务2优先级最高。

我们由第一节的内容分析知道:

切换任务的地方一个是任务通过vTaskDelay(  )主动切换,如下,而任务一没有使用这个函数,是我们的本意,

一个是systick中条件达到时进行任务的切换,如下

这个切换的执行条件如下,第二个条件不可能因为一个优先级只有一个任务,那么只有第一个条件是允许的,而xNextTaskUnblockTime赋值的地方只有任务二中有延时释放,所以这个条件才不能满足,这就是任务二不能执行的原因了,

为什么任务二没有对xNextTaskUnblockTime赋值呢,任务二的优先级最高,至少创建任务的时候汇之星一次对其赋值,然后我们单步调试发现,在创建空闲任务的时候,也就是在三个任务初始话的最后多了一个错误语句  pxCurrentTCB = &Task1TCB;   既使任务二创建的时候已将pxCurrentTCB 赋值为任务2,pxCurrentTCB = &Task2TCB;所以任务二一开始就没有得到执行,xNextTaskUnblockTime也从未得到赋值,任务二也从未有机会运行,注释掉此语句后一切正常。

从此次调试也可以得到一个结论:

系统必须从高优先进入,否则高优先级得不到赋值xNextTaskUnblockTime的机会,
有可能得不到运行(xNextTaskUnblockTime是systick激活切换任务的条件,
如果低优先级任务中又没有释放/切换任务的语句的话,高优先级任务就有可能得不到执行)

题外话,关于主动释放CPU使用权:

同样可得知如果高优先级的任务没有使用vTaskDelay(  )里的 taskYIELD();主动释放CPU(切换任务)的话,既使低优先级任务延时到期,systick中断里面的条件也不会满足,因为当前任务一直是高优先级,低优先级的任务也永远得不到执行。

如果高优先级使用了vTaskDelay(  )里的 taskYIELD();主动释放CPU(切换任务)的话,既使低优先级没有就绪,会切换到空闲任务,然后低优先级任务就绪后,systick的判断才会满足(当前优先级大于pxCurrentTCB->uxPriority的优先级)的条件,才会进行任务切换。

如下图就是释放CPU的代码:

第509行将相应的优先级位去除,编译pendSV查找到低优先级的任务,

第512行pendSV执行切换将找到的低优先级任务切换到pxCurrentTCB。


http://www.hkcw.cn/article/AZPiSPOFen.shtml

相关文章

西方国家对乌军援,再加码 张学峰:俄乌双方的较量还将持续一段时间:局势再添变数

德国新任总理默茨近日表示,德国等西方国家已全面解除对援乌远程武器的射程限制,允许乌克兰使用其提供的武器打击俄罗斯境内纵深军事目标。对此,俄罗斯总统新闻秘书佩斯科夫回应称,这一决定与俄方寻求和平解决冲突的努力背道而驰。默茨上任以来,在是否向乌克兰提供“金牛座…

钟南山谈新冠后肺结节患者增多 CT检查增加发现更多

钟南山谈新冠后肺结节患者增多 CT检查增加发现更多!我国约有1.5亿肺结节高危人群,每年新检出的肺结节病例达1000万至2000万。新冠疫情后肺结节检出率显著上升的原因之一是新冠后做CT的人数大幅增加,进而让更多的肺结节被发现。中国工程院院士钟南山表示,环境污染等也会导致…

油价或将上调 6月3日24时调整

油价或将上调 6月3日24时调整!成品油价将于6月3日24时进行调整。今日油价上涨,涨幅有所变动,国内油价整体呈上涨趋势,但接近搁浅。目前全国大部分地区的油价处于6元时代。下一次调价日期为6月3日晚24时。以下是今日油价概览:此外,可以参考历年油价走势以了解更多信息。责…

金靖张凌赫怨种姐弟又开始发力 两人互斗引热议

凌赫啊你小子又开始皮了,放弃吧牛牛你是斗不过金靖的允悲允悲允悲她那张嘴多会说,脑子还快,简直是血脉压制,你只能哞哞叫哈哈哈哈每周都等着看这俩姐弟的新乐子,太有意思了!责任编辑:zx0002

天降纸尿裤砸碎小车挡风玻璃 肇事者一直没有现身

5月23日,江门市蓬江区的周先生说他的爱车停放在小区楼下停车位,结果竟被一大袋用过的纸尿片砸中。这些浸湿的纸尿片重量惊人,周先生的车顶被砸凹,挡风玻璃也被砸碎了,车辆的维修费花了近6千元,事发已经过去多日,可肇事者一直没有现身。周先生说,报警已经多日,派出所一…

中国学生美国梦碎 签证政策引发留学困境

5月28日,特朗普政府威胁要吊销约27.7万名中国学生中的许多人的签证,并对来自中国内地和香港的未来申请者进行额外审查。这一消息让刚从美国驻北京大使馆走出来的18岁学生李昆泽感到焦虑。他刚刚成功申请到本科留学签证,但现在情况突变,时间紧迫,无法再申请其他国家的留学机…

《歌手2025》首轮袭榜赛制公布 投票截止前1小时隐藏票数

5月30日,湖南卫视歌手发布第二场揭榜赛制:微博网友可从7位在线歌手陈楚生、MickeyGuyton、GAI周延、白举纲、格瑞丝金斯勒、单依纯、马嘉祺中,为袭榜歌手查理普斯选择1位对决对象。截止至今天17:00,网友推荐次数最高的歌手将作为守榜歌手,在节目中与袭榜歌手进行1V1对决。…

余华回应刘楚昕获奖 感动与坚持的力量

人的一生会经历很多痛苦,但回首想起来都是传奇。近日,90后作家刘楚昕创作的小说《泥潭》获得了漓江文学奖虚构类奖。在发表获奖感言时,他哽咽着分享了和病故女友的故事,让不少网友潸然泪下。许多人表示,开头以为是“狗粮”,结局竟然是“刀子”。在现场听完刘楚昕的获奖感…

李兆杰教授因病逝世 法学界痛失领军人物

5月29日晚,清华大学法学院发布讣告,沉痛悼念李兆杰教授。李兆杰教授于2025年5月29日在北京因病逝世,享年70岁。李兆杰教授是汉族,籍贯山东省东明县,1955年出生于吉林省长春市。他曾在北京大学国际法研究所和清华大学法学院任教。作为改革开放以来我国新一代国际法学者中的…

端午假期京城有雨水搅扰,下周气温明显走高 阵风加大需防风

5月29日08时到5月30日08时,南郊观象台最高气温达到31.9℃(14:42),最低气温为18.7℃(04:05)。今天天空云量有所增多,午间依然较热,预计白天最高气温在32℃左右。午后阵风逐渐加大到六级左右,夜间减弱。今天下班时天气多云,偏南风3级、阵风5至6级,气温在31至27℃之间。…

阿韦洛亚成皇马B队新任主帅 传奇回归执教

5月28日,阿韦洛亚被任命为皇马卡斯蒂亚主帅,接替日前离任的劳尔。皇家马德里足球俱乐部宣布,阿尔瓦罗-阿韦洛亚将从2025-2026赛季起担任卡斯蒂亚主教练。阿韦洛亚是皇家马德里及西班牙足球的传奇人物,也是俱乐部青训体系中最具代表性的球员之一。他自2001年起在皇马青训营接…

东北三省一区有效发明专利近20万件 同比增长显著

国家知识产权局在今天的新闻发布会上透露,全国知识产权系统正积极助力新时代东北地区全面振兴,并已取得显著成效。截至今年4月底,东北三省一区的有效发明专利数量达到19.5万件,较去年同期增长了10.2%;有效注册商标数量增至216.1万件,同比增长7.7%。此外,该地区累计认定地…

阿曼将在公立学校开设中文课 促进文化交流与合作

阿曼教育部相关人士在出席中国驻阿曼大使馆与阿曼教育部联合举办的国际中文日活动上宣布,阿曼已决定将中文纳入公立学校课程。从今年9月开始的新学年,中文将成为四所公立高中11年级学生的选修课,并逐渐扩展至其他年级。在当天的活动上,阿曼教育部次大臣马吉德表示,阿曼政府…

2025年全国青少年信息素养大赛复赛C++集训(18):数列(题目及解析)

2025年全国青少年信息素养大赛复赛C++集训(18):数列(题目及解析) 题目描述 用以下方式构造数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。 给出一个正整数a,要求数列中第a个数对1000取模的结果是多少。 时间限制:1000 内存限制:65536 输入…

雨雨雨!今起中东部大范围降雨来袭 长江沿江成核心区域

从5月30日开始至6月2日,中东部地区将迎来新一轮较大范围的降雨,长江中下游一带将成为主要受影响区域,局地可能出现大暴雨并伴有强对流天气。公众出行需关注预警预报信息,端午假期避免前往山区等地质灾害易发地带游玩。此前,南方在5月27日至29日期间已经经历了一轮强降雨天…

58岁的“高考钉子户”梁实将参加第29次高考 追梦路上不言弃

梁实今年58岁,即将参加第29次高考。他告诉媒体,今年看书时间较少,感觉底气不足。尽管连续多年高考成绩均突破400分,但梁实认为这个分数非常基础,感觉自己没有进步,想再进一步感到困难。全国高考报名人数达到1335万人,梁实也将继续他的高考之路。他表示,上大学一直是他的…

首探济南永辉超市爆改胖东来 品质零售新体验

济南这座GDP超万亿的城市,正以“诗性与野性共生”的姿态,崛起为黄河流域的消费活力标杆。作为首批入选全国零售业创新提升的试点城市,济南商超零售业纷纷探索创新发展模式。5月30日,永辉超市济南首家“学习胖东来”自主调改店在历城区龙湖济南北宸天街焕新开业。该店交通便…

雷军说感谢大家15年的不离不弃 粉丝支持成最大动力

雷军说感谢大家15年的不离不弃 粉丝支持成最大动力。今日,有小米粉丝称带着小米手机1代和小米15S Pro提车SU7 Ultra。对此雷军转发微博,并表示“感谢15年的不离不弃,大家的支持是我们不断前行最大的动力!我们一定会不断进步,越来越好!”责任编辑:0882

银行员工完不成消费贷任务1周扣三百 考核压力山大

随着年中时点临近,社交平台上出现了不少“互换消费贷”的帖子。这些帖子多以“同城银行人,消费贷任务互换”为主题,寻找当地同业人员互相办理对方银行的消费贷,以达成双方的任务目标。面对考核任务的压力,一些银行员工采取了同行“互贷”的方式来冲量。从测额即算任务的“…

3岁女童长期遭生母及其男友虐待 医生警觉报警解救

5月28日,北京市西城区人民法院、北京市公安局西城分局和北京市西城区人民检察院联合成立了“西城守未联盟”,并发布了涉未成年人权益保护的十大典型案例。其中一个案例中,北京儿童医院的一名医生凭借职业警觉,从一名3岁昏迷女童的异常伤情中发现了虐待线索,并果断报警,揭…