μC/OS-II的任务就是一个C语言函数,特别之处在于任务的结构是一种无限循环,并且任务不能被应用程序调用,因此,它的返回值必须为void,为了便于应用程序向任务传递任何类型的数据,形式参数变量的类型是一个指向void的指针,它可以是一个变量、结构或函数的地址。任务示意代码如下:
还有一种只执行一次就被删除的任务,它可以不是无限循环结构,示意代码如下:
需要注意的是,任务删除后,其代码依然驻留在RAM中,只是μC/OS-II将任务转入休眠状态,不再管理该段代码,而不是将代码真正地删除了,除非重新启动,否则该代码将不会再投入运行。
任务建立之后还必须要创建到μC/OS-II中,这通常是在main()函数中,通过调用μC/OS-II提供的系统函数OSTaskCreate()或OSTaskCreateExt()实现的,示意代码如下:
编写main()函数时需要注意,在使用μC/OS-II提供的任何功能之前,必须调用系统函数OSInit(),它完成μC/OS-II的初始化并建立空闲任务。在开始多任务之前,必须通过调用系统函数OSTaskCreate()或函数OSTaskCreateExt()创建至少一个用户任务,最后通过调用系统函数OSStart(),将控制权交给μC/OS-II内核,需要注意的是,在开始多任务之前,也就是调用OSStart之前,不允许打开时钟节拍中断,防止操作系统崩溃,时钟节拍中断的允许,是在TargetInit中完成的。
μC/OS-II任务的优先级数是任务的唯一标识,系统函数OSTaskCreate()或OSTaskCreate Ext()的最后一个参数就是规定任务的优先级。μC/OS-II可以管理多达64个任务,但是其中两个最低优先级的已经分配给系统任务——空闲任务和统计任务了。优先级的值越小,任务的优先级就越高,不同的任务优先级不能相同,在准备就绪的任务中,总是优先级最高的任务得到CPU的使用权。实际上,应用程序最多能使用的优先级可以从0到OS_LOWEST_PR1O-2,OS_LOWEST_PRIO(最低优先级)作为常数定义在OS_CFG.H文件中。(www.daowen.com)
在任一特定时刻,任务一定处于休眠、就绪、挂起、被中断和运行五种状态之一。μC/OS-II提供了若干系统函数,调用这些函数可以使任务从一种状态转变到另一种状态。
空闲任务OSTaskIdle()是μC/OS-II中必不可少的系统函数,当没有其他任务进入就绪态时,该任务立即转入运行态。空闲任务的优先级永远设为最低,即OS_LOWEST_PRIO永远不被挂起,也不能被删除。
统计任务OSTaskStat()也是μC/OS-II的系统函数之一,其功能是计算当前CPU的利用率,告诉用户应用程序使用了多少CPU时间。一旦将文件OS_CFG.H中的配置常数OS_TASK_STAT_EN置1,这个任务就自动建立。它每秒钟运行一次,计算结果放在一个有符号的8位整数OSCPUsage中,表示格式是百分数,精确到1%。
统计任务的使用方法是:用户在初始化时创建唯一一个任务,然后在这个唯一的任务中调用OSStatInit()函数,同时再创建其他任务。使用统计任务时任务的创建方法与不使用统计任务时任务的创建方法不同,不使用统计任务时,任务既可以在初始化时创建,也可以在多任务启动后的任务中创建;使用统计任务时,初始化时只能创建唯一的一个任务,其他任务的创建只能在多任务启动之后创建。
任务的调度机制是μC/OS-II内核的核心,μC/OS-II的调度器主要有两个功能:一是确定进入就绪态的任务中哪个优先级最高,二是进行任务切换。调度有两种方式:任务级的调度由系统函数OSSched()完成,中断级的调度是由系统函数OSIntExt()完成。μC/OS-II任务调度所花的时间为常数,与应用程序中所建的任务数无关。μC/OS-II一旦找到了准备就绪的最高优先级任务,就要进行任务切换。
μC/OS-II提供9个任务管理函数,如表6-3所列,任务管理函数定义在OS_TASK.C文件中。
表6-3 任务管理函数
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。