任务由任务控制块、任务堆栈、任务函数组成。
系统通过任务控制块来感知和控制任务;任务堆栈主要用来保护断点和恢复断点;任务代码是一个超循环结构,它描述了任务的执行过程。
函数OSTaskCreat()负责给入伍分为任务控制块和任务堆栈,并对它们进行初始化,然后把任务控制块,任务堆栈,任务代码三者关联起来形成一个完整任务。
在任务控制块的管理上需要两个链表,一条是空任务块链表(其中所有的任务控制块都没有分配给任务)和一条任务块链表(其中所有任务控制块都已分配给任务),具体做法是:
任务的切换:任务切换的核心工作是任务堆栈指针的切换。1、任务级调度器OS_Sched(),在OSTimeDlyHMSM中调用了该函数。2、中断级调度器OSInitExit(),在退出中断的时候,启动任务调度。
(1)把被中止任务的断点指针(PC的值)保存到任务堆栈中;
(2)把CPU通用寄存器的内容保存到任务堆栈中(压栈,寄存器中的值每压入栈中,SP的值就会增大或者减小,当全部压入后的SP的值即为要存在OSTCBStkPtr中的值);
(3)把被中止任务的任务堆栈指针(SP)当前值保存到该任务的任务控制块的OSTCBStkPtr中;
(4)获得待运行任务的任务控制块;
(5)使CPU通过任务控制块或者待运行任务的任务堆栈指针(SP);
(6)把待运行任务堆栈中通用寄存器的内容恢复到CPU的通用寄存器中(和第二步的过程恰好相反,获得SP的值之后依次将任务堆栈中的内容恢复到通用寄存器中);
(7)使CPU获得待运行任务的断点指针(PC值)(该指针是待运行任务在上一次被调度器中止运行时保存在任务堆栈中的)
这样就可以保证任务从上次的断点继续的执行下去,完成任务调度。
任务删除:
有时,任务会占用一些动态分配的内存或信号量之类的资源。这时,如果有其他任务把这个任务删除了,那么被删除的任务所占用的一些资源就会因为没有被释放而丢失,这是任何系统都无法接受的。因此,在删除一个占用资源的任务时,具体的方法是:提出删除请求的任务只负责提出删除任务请求,而删除工作则由被删除任务自己来完成(即当别人提出要干掉你的时候,你要自己把自己干掉。),这样被删除任务就可以根据自身的具体情况来决定何时删除自身,同时也有机会在删除自身之前把占用的资源释放掉。
1、什么是可剥夺型内核?
如果当前进程只是在进程执行结束,或者因某种原因自愿放弃处理器使用权,而使待运行进程获得处理器使用权,那么以这种方式实现处理器使用权发生转移的内核属于不可剥夺型的。反之,如果当前进程比并没有执行完毕,又不是自愿放弃处理器使用权,而被强制中止执行,被迫将处理器使用权转移给其他进程,那么这种内核就属于可剥夺型的。其实,真正实施处理器使用权转移工作的是调度器,所以也可以这样说,调度器以强硬的方式获得处理器使用权并分配给另外进程的内核就是可剥夺型内核,否则就是不可剥夺型内核。
2、一个应用程序为什么一定要使用空闲任务?
因为计算机是不能够停下来的,最起码要有一个没有用户任务可执行时需要做的事情。ucosii有两个系统任务:空闲任务和统计任务。其中空闲任务是每个应用程序都必须使用的,而统计任务则是应用程序可以根据世纪需要来选择使用的。
3、什么叫做任务的优先权?ucosii是用什么来描述任务的优先权的?
4、在ucosii中任务有哪5种状态?
就绪态,运行态,等待态,睡眠状态(任务在没有被分配任务控制块或被剥夺了任务控制块时的状态叫做任务的睡眠状态),中断服务状态(一个正在运行的任务一旦响应中断申请就会中止运行而去执行中断服务程序,这时任务的状态叫做中断服务状态)
5、任务控制块记录了任务的哪些信息?