查看: 1990|回复: 0
打印 上一主题 下一主题

嵌入式实时操作系统μC/OS-||原理及应用学习2---任务

[复制链接]
跳转到指定楼层
沙发
发表于 2015-4-5 18:50:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

1.任务的基本概念:从设计上看,任务就是应用程序中小任务对应的程序实体;从代码上看,就是一个函数;从存储结构上看,由任务程序代码、任务堆栈和任务控制块组成。由任务控制块、任务堆栈、任务代码三部分组成。

2.μC/OS-||没有给任务定义私有空间,因此μC/OS-||中的所有任务都属于线程。

3.μC/OS-||的任务有两种:用户任务和系统任务。μC/OS-||中最多包含64个任务。

4.μC/OS-||任务的五种状态:睡眠状态、就绪状态、运行状态、等待状态、中断服务状态

5.用户任务代码的一般结构:通常是一个无限循环结构。

6.系统任务:操作系统自己需要的任务。

7.μC/OS-||预定义两个系统任务:空闲任务和统计任务。

8.空闲任务:OSTaskIdle()。系统处于空闲状态时必须调用的不可删除的任务。

9.统计任务:OSTaskStat()。每秒计算一次CPU在单位时间内被使用的时间,并把计算结果以百分比的形式存放在变量OSCPUsage中,以便其他应用程序来了解CPU的利用率。

10.任务堆栈:为了满足任务切换和响应中断时保存CPU寄存器中的内容及任务调用其他函数时的需要。

11.任务堆栈的创建:

[cpp] view plaincopy


  • #define TASK_STK_SIZE    512  
  • OS_STK TaskStk[TASK_STK_SIZE];  

12.任务堆栈初始化:OSTaskStkInit();

13.任务控制块:μC/OS-||用来记录任务的堆栈指针、任务的当前状态、任务的优先级别等一些与任务管理有关的属性的表。
14.μC/OS-||任务控制块链表:空任务快链表和任务快链表。

15.任务控制块初始化:OSTCBInit()。

      为被创建任务从空任务控制块链表获取一个任务控制块;

      用任务的属性对任务控制块的各个成员复制;

      把这个任务控制块连入到任务控制块链表。

16.任务就绪表:登记了系统中所有处于就绪状态的任务。OSRdyTbl[],任务组表:OSRdyGrop。

17.任务就绪表的操作:登记、注销、从就绪表的就绪任务中得知具有最高优先级任务的标识(优先级prio)。

18.登记:当某个任务处于就绪状态时,系统将该任务登记在任务就绪表中,即在就绪表中将该任务的对应位置1.

[cpp] view plaincopy


  • OSRdyGrp | =OSMapTbl[prio >> 3];  
  • ODRdyTbl[prio >> 3]|= OSMapTbl[prio&0]  


19.注销:当某个任务需要脱离就绪状态时,系统在就绪表中将该任务的相应位置0。

20.μC/OS-||任务调度:通过一个算法在就绪任务中确定马上运行的任务。

21.μC/OS-||任务调度思想:近似的每时每刻让优先级最高的就绪任务处于运行状态。

22.任务调度器的主要工作:OSSched(),在任务表中查找具有最高优先级别的就绪任务;实现任务的切换:中止当前任务,运行另一个任务。

23.任务的切换的步骤:获得待运行任务的TCB指针(任务控制块);进行断点数据的切换。

24.任务切换中断指针从PC寄存器(程序计数器)中压入堆栈或从堆栈推入PC寄存器的方法:

      想办法引发一次中断(或者一次调用),并让中断向量指向OSCtxSw()【中断服务程序】,利用系统在跳转到中断服务程序时会自动把断点指针压入堆栈的功能,把断点指针存入堆栈;而利用中断返回指令IRET(或相同功能的指令)能把断点指针推入CPU的PC寄存器的功能,恢复待运行任务的断点,这样就可以实现断点的保存和恢复了。


25.创建任务:创建一个任务控制块,并通过任务控制块把任务代码和任务堆栈关联起来形成一个完整的任务。OSTaskCreateExt(),OSTaskCreate()。

26.任务创建的一般方法:人们习惯在调用函数OSStart()启动任务调度之前先创建一个任务,并赋予它最高的优先级别,从而使它成为起始任务;然后在这个起始任务中再创建他各任务。

27.任务的挂起:OSTaskSuspend()。原型:INT8U    OSTaskSuspend(INT8U prio);prio为待挂起任务的优先级别。

28.任务的恢复:OSTaskResume()。原型:INT8U   OSTaskResume(INT8U prio);prio为待挂起任务的优先级别。

29.任务的优先级修改:OStaskChangePrio();

[cpp] view plaincopy


  • 原型: INT8U    OStaskChangePrio(  
  •                                   INT8U oldprio  
  •                                   INT8U newprio                     
  •                                );  

30.任务的删除:(置于睡眠状态),把被删除任务的任务控制块从任务控制块链表中删除,并归还于空任务控制块链表,然后在任务就绪表中把该任务的就绪状态置0;

                                OSTaskDel();

[cpp] view plaincopy


  • 原型:     #if OS_TASK_DEL_EN  
  •           INT8U OSTaskDel(  
  •                             INT8U prio  
  •                           ); //删除自己:prio=OS_PRIO_SELF  


如果被删除的任务占用一些动态分配的内存或者信号量一类的资源:提出删除任务请求的任务只负责提出删除任务请求,而删除工作则由被删除任务自己来完成。

μC/OS-||利用被删除任务的任务控制块成员OSTCBDelReq作为请求删除方与被删除方的联络信号。   并提供请求删除函数----OSTaskDelReq()            
31.查询任务的信息:
程序运行中需要了解一个任务的指针堆栈等信息,调用:OSTaskQuery()

[cpp] view plaincopy


  • 原型:  
  •        INT8U OSTaskQuery(  
  •                              INT8U prio,  
  •                              OS_TCB  *pdata  
  •                        );  


32. μC/OS-||的初始化:OSInit()。完成对 μC/OS-||的所有全局变量和数据结构进行初始化,同时创建空闲任务OSTaskIdle,并赋之以最低的优先级别和永远的就绪状态。需要的时候,以OS_LOWEST_PRO-1的优先级来创建统计任务OS_TASK_STAT_EN=1。

        OSInit()对数据结构的初始化:创建包括空任务控制块链表在内的5个数据缓冲区。及数组OSTCBPrioTbl[]。

33.μC/OS-||的启动:调用启动函数OSStart()。前提条件:在调用启动函数前至少创建了一个用户任务。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表