uCOS-II学习心得
最近在学习uCOS-II,也移植了几个简单的任务到LPC1114以及LPC1227上,任务也顺利跑起来了,但都是基于简单的任务级的任务调度,还没深入学习,现在就了解的知识做一些总结吧。
首 先我们必须知道为啥要跑操作系统,对程序处理有什么帮助?一般的场合我们不会涉及到很多需要实时处理的任务,但是在工业场合,比如交通信号灯的管理这些多 任务并行处理的场合,我们就必须要跑操作系统,假设代码中有很多任务需要处理,比如要时刻关注按键的状态,又要时刻关注LED的状态,如果不加操作系统, 那么就可能造成按键识别延迟,LED没有正常切换等等,这在交通方面是极为不利的。加上操作系统后,系统就会在等待按键处理的阶段去操作LED,这样便不 会出现上述不良效果,提高了CPU的利用率。
另外,uCOS-II支持最多64个任务,对应0-63优先级,系统保留最高4个和最低4个优先级,所以用户可以使用的有56个优先级,在系统初始化时, 系统会默认创建一个最低优先级(63)的任务,这个任务只做一件事,就是不停的累加,在没有任务执行的时候,系统就执行这个任务。
其次,当创建多个任务的时候,系统是如何在这几个任务之间切换,这是一个很重要的问题。每个任务在创建好之后,都处于就绪态(每个任务都有多种状态,等待 态,就绪态,运行态等等),系统开始跑了之后,系统会搜索处于就绪态的任务中优先级最高的任务,将其从他自己的堆栈中取出来执行,所以在创建任务的时候要 根据情况设定每个任务的优先级。每个任务都是一个无限循环的程序,在这个循环里,我们可能会加上延时,可能会等待中断,也可能会一直执行,不加延时也不等 中断。
第一种情况:延时的时候,我们会调用系统延时函数,这个函数会强制进行任务调度,即在这个任务进行延时时,其状态由运行态变为等待态,系统会搜索其他处于 就绪态的任务中优先级最高的任务。比如现在有A,B,C三个任务,A的优先级最高,B其次,C最低,假设A任务需要执行延时函数,那么在系统开始之 后,CPU会执行A任务,执行完后延时,这是系统会把A变为等待态,再去搜索B和C中优先级最高的任务,显然这时CPU会去执行B任务(这样的例子网上有 很多,大家可以自行找出来看。我说的也不一定都对,有些是我自己的理解,读者不必全信)。
第二种情况:等待中断期间,任务的状态由运行态变为等待态,后面就如上了,在退出中断之前,系统会判断是否要进行任务切换,如果没有高优先级的任务处于就 绪状态,那么执行完中断后回来继续执行本任务;假如在中断期间,有其他高优先级的任务处于就绪状态了,那么这时就会进行任务切换,退出中断后将会去执行高 优先级的任务,执行完再返回来执行先前的任务。
第三种情况:读者可能会疑问了,如果没有延时也没有中断,那么是不是其他任务就永远不会执行了,当然不是,系统里有个时钟节拍,可以定义为 10-100HZ,这就是系统的心脏,每个时钟节拍到来后触发时钟节拍中断,在这个中断里会执行任务调度,否则低优先级的任务将永远不会得到执行的机会。
最后再说说移植的情况,我个人理解的移植只是单纯的修改底层驱动,从1114->1227的移植我只是修改了底层的驱动,我们需要设置最大任务数,最低优先级,堆栈的大小等等,然后自己创建任务,创建任务的堆栈,设定优先级,然后就让任务自己跑去吧。
OK!我现在的水平只理解到这里,上面所说的肯定有很多漏洞,等我以后玩熟练了再慢慢回来修改!下一步就是把ucos-II移植到cortex-m3内核上,先移植到lpc1343上,然后再移植到lpc1788上。等移植好了再回来继续写。
浙公网安备 33010602011771号