对于初次接触嵌入式实时操作系统的朋友来说,UCOSII 构思巧妙,结构简洁精练,可读性强,同时又具备了实时操作系统的全部功能, 虽然它只是一个内核,但非常适合初次接触嵌入式实时操作系统的朋友,可以说是麻雀虽小, 五脏俱全,本章,笔者将从UCOSII任务调度的硬件软件方面着手,介绍UCOSII,让读者能够初步了解嵌入式实施操作系统。
UCOSII 是一个可以基于ROM 运行的、可裁减的、抢占式、实时多任务内核,具有高度可 移植性,特别适合于微处理器和控制器,是和很多商业操作系统性能相当的实时操作系统 (RTOS)
这里有几个UCOSII 相关的概念需要大家了解一下。任务优先级,任务堆栈,任务控制块, 任务就绪表和任务调度器。
任务优先级,这个概念比较好理解,ucos 中,每个任务都有唯一的一个优先级。优先级是任务的唯一标识。在UCOSII 中,使用CPU 的时候,优先级高(数值小)的任务比优先级低的任务具有优先使用权,即任务就绪表中总是优先级最高的任务获得CPU 使用权,只有高优先级的任务让出CPU 使用权(比如延时)时,低优先级的任务才能获得CPU 使用权。UCOSII 不支持多个任务优先级相同,也就是每个务的优先级必须不一样。
任务堆栈,就是存储器中的连续存储空间。为了满足任务切换和响应中断时保存CPU 寄存器中的内容以及任务调用其他函数时的需要,每个任务都有自己的堆栈。在创建任务的时候,任务堆栈是任务创建的一个重要入口参数。
任务控制块OS_TCB,用来记录任务堆栈指针,任务当前状态以及任务优先级等任务属性。UCOSII 的任何任务都是通过任务控制(TCB )的东西来控制的,一旦任务创建了,任务控制块OS_TCB 就会被赋值。每个任务管理块有3 个最重要的参数:1,任务函数指针;2 ,务堆栈指针;3,任务优先级;任务控制块就是任务在系统里面的身份证(UCOSII 通过优先级识别任务)
任务就绪表,简而言之就是用来记录系统中所有处于就绪状态的任务。它是一个位图,系 统中每个任务都在这个位图中占据一个进制位,该位置的状态(1 或者0 )就表示任务是否处于就绪状态。
任务调度的作用一是在任务就绪表中查找优先级最高的就绪任务,二是实现任务的切换。
UCOSII的每个任务都是一个死循环,如图可以说明UCOSII 的状态转换:
这里讲到UCOSII的一些基础知识,下面将会讲到与UCOSII的相关函数,
1)建立任务函数:
-
OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INTU prio)
2 )任务删除函数:
-
INT8U OSTaskDel(INT8U prio)
这里特别注意:任务不能随便删除,必须在确保被删除任务的资源被释放的前提下才能删除!
3)请求任务删除函数:
-
INT8U OSTaskDelReq(INT8U prio) ;
4 )改变任务的优先级函数 :
-
INT8U OSTaskChangePrio(INT8U oldprio,INT8U newprio) ;
5 )任务挂起函数:
-
INT8U OSTaskSuspend(INT8U prio) ;
6 )任务恢复函数:
-
INT8U OSTaskResume(INT8U prio) ;
7 )任务信息查询:
-
INT8U OSTaskQuery(INT8U prio,OS_TCB *pdata);
介绍UCOSII的平台是在STM32上,现在来介绍一下在stm32上运行UCOSII的步骤:
(1 )移植UCOSII
(2 )编写任务函数并设置其堆栈大小和优先级等参数。
(3 )初始化UCOSII,并在UCOSII 中创建任务
(4 )启动UCOSII
调用OSStart,启动UCOSII 。
通过以上 4 个步骤,UCOSII 就开始在 STM32 上面运行了,这里还需要注意我们必须对os_cfg.h 进行部分配置,以满足我们自己的需要。
阅读(2091) | 评论(0) | 转发(0) |