开篇:润墨网以专业的文秘视角,为您筛选了一篇在μC/OS—II中限制任务的优先次数范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!
1.引言
实时系统中,任务的优先级有时并不是绝对的。对高优先级任务和低优先级任务同时进行调度,每次都是高优先级任务胜出的话,并不总是合适的。就如一个单位评先进,如果每次都评领导,就是一种不明智的做法。这种不合适可以从两个方面来认识:第一,如果高优先级任务需要长时间运行,占据CPU,低优先级者将难以得到运行机会;第二,如果高优先级任务出现故障或误动因素,导致运行过于频繁,也可能会严重妨碍其它任务的运行。例如,有些市售防盗报警器,采用热释电红外传感器,出现误报就屡见不鲜。如果这样的传感器所对应的任务在系统中具有较高的优先级,误报时不但提供了假信息,而且会浪费甚至严重占据系统资源。因此,适当限制高优先级任务的胜出次数是有实际意义的。
本文以大量实际应用的实时操作系统μC/os-ii为例,通过改动其调度程序,对高优先级任务的胜出次数进行限制。文中基于Win32平台,给出了仿真方法,并示出了仿真结果。
2.调度程序的修改
在μC/OS-II的OS_CORE.C中,有一个查找最高优先级的函数OS_SchedNew[1]。我们引入高优先级任务胜出次数限制机制,对该函数修改后,源代码示例如图1所示。
图1 OS_SchedNew函数的修改。
图1中的①②③行是系统中原有的代码,④到⑨行是新添的。这里只讨论两个任务:优先级为1的任务1和优先级为2的任务2。显然任务1的优先级较高。P1count和P2count分别代表任务1和任务2允许连续获得系统调度的次数,num1和num2分别代表P1count和P2count的初始值。例如,若num1=2,num2=3,表示任务1和任务2竞争调度时,前2次任务1将获得调度,第3次、第4次和第5次则是任务2胜出,第6次开始又是任务1胜出,…。注意只有当任务1和任务2同时就绪时,④到⑨行才会被执行。这表明只有相对于任务2,任务1的优先次数才被加以限制。
当多于两个任务需要引入图1所示的优先次数限制机制时,可针对④到⑨行的程序扩充即可。
3.运行仿真
针对图1的调度程序,如何演示任务1和任务2的调度结果呢?这里引入一个任务0,优先级为0。用任务0来监督任务1和任务2的运行。任务0、任务1和任务2的代码分别如图2、图3和图4所示。
图2 任务0的代码
图3 任务1的代码
图4 任务2的代码
任务0中,除了循环延时外,主要设置了OSTaskSuspend(0),用于挂起自己。什么时候恢复呢?在任务1和任务2中都设置了一句OSTaskResume(0),用于恢复任务0。实际上,无论是任务1还是任务2,都是一个一直就绪的死循环,除了OS_Printf语句外,就只有OSTaskResume(0)。因为任务0的优先级高于任务1和任务2,所以,只有任务0挂起自己后,任务1和任务2才可能运行。又因为任务1的优先级高于任务2,故首先任务1得以运行,打印出“this is task 1”字样。根据上述优先次数限制机制,当任务1连续打印出num1次“this is task 1”字样后,下一次任务2将胜出。任务2连续打印出num2次“this is task 2”字样后,下一次任务1又将胜出。…。
取num1=2,num2=3,仿真结果如图5所示。
图5 num1=2和num2=3的仿真结果
4.结束语
关于μC/OS-II,尽管近年又出现了新版本μC/OS-III,其中增加了对轮转调度的支持,但这种支持是基于时间片的[2],而本文的方法是基于调度次数的。也就是说,不管在μC/OS-II还是μC/OS-III中,本文的研究都是有意义的。当然,关于仿真方法,我们还可以利用系统中设置的事件机制、信号灯或其它办法,但本文提供的方法应该是比较简单的。
参考文献
[1]杨宗德,张兵著.μC/OS-II标准教程[M].北京:人民邮电出版社,2009.
[2]李承创,陈跃斌,房晓丽,王兵.μC/OS-III在Cortex-M3处理器上的移植[J].单片机与嵌入式系统应用,2012, 20(11):42-48.
作者简介:
钱光明,男,湖南师范大学数学与计算机科学学院教授,主要研究方向:嵌入式和实时系统。
刘弢,男,硕士研究生,现就读于湖南师范大学数学与计算机科学学院。