1引言 以前在我们一般所使用的系统中,任务没有优先级之分。应用程序是一个无限的循环,任务函数按在代码中的顺序运行,处理相应的事务。时间相关性强的任务处理使用中断机制,但是当系统比较复杂、中断资源有限时,中断程序只能将处理该任务的信息条件准备好后返回。当程序按顺序没有执行到该任务时,该任务的执行必须等待,所以将会造成任务每次的执行时间间隔不定,不能及时处理紧急事务,影响系统的运行。这种情况在要求限定时间内周期性处理事务的系统中是不允许发生的,而且只由应用者编写的复杂程序很可能会出现Bug。 嵌入式操作系统是实时操作系统,运行于特定的硬件平台上,一般包括处理器、存储器及外设器件和I/O端口,包括操作系统软件,要求实时和多任务操作,用户可以在其基础上添加应用程序。使用嵌入式操作系统的用户只需添加所需的任务到操作系统中即可,既节省开发时间,又提高程序的可靠性。 2UC/OSII及其任务介绍 UC/OSII(Micro Control Operation System Two)是一种源代码公开的嵌入式操作系统,程序绝大部分是用C语言写的,带有少量的汇编程序,并且有详细的说明和示例,可移植性好、易调试,稳定性与可靠性高,功能也比较完善。UC/OSII和其他大部分的嵌入式操作系统的内核都是占先式内核,被分为最高优先级的任务一旦准备就绪,立刻就能得到CPU的控制权,可以剥夺低优先级任务的CPU使用权,处理系统最紧急的事务。 UC/OSII的任务实际是一段程序,执行特定的功能,拥有自己的代码和堆栈空间(保存该任务的寄存器、返回地址和临时参数),一般都是空函数,不会返回任何值。任务执行一次后,设置延时参数OSTCBDly,表明在经过OSTCBDly个时钟周期后再次运行,然后任务进行切换,使其他任务运行。 例如: void Task(void) { 参数定义 for(;;) { 任务执行代码 OSTimeDly( ) 延时函数 ;清除任务就绪标志,设置延时的时钟周期参数,调用OSSched( )进行任务调度 } } 3UC/OSII的内核数据结构 (1) 任务控制块OS_TCB (2) 任务就绪表OSRdyTbl[]和OSRdyGrp 4UC/OSII内核的运行机制 任务的切换发生在2个时候,第1个是当某一任务运行完毕时就调用延时函数,使自身延时一个或几个时钟周期,进行任务切换,运行就绪的最高优先级最高任务;第2个是每一次时钟周期中断后,中断程序处理事务时,可能使一些任务运行准备就绪,然后重新整理和搜索任务就绪表,进行任务切换(如图3所示),选出其中的高优先级任务运行。 嵌入式操作系统是多任务的,任务切换是其核心技术,由汇编语言编写。任务切换函数OS_TASK_SW( )被设置成中断函数,调用时使用的是软件中断指令,这样在进入中断程序之前,当前任务的代码地址和状态字就自动保存在当前任务的堆栈顶部。下面用8086的程序举例切换函数: 6结语
|