uC/OS的任务要么是一个无限的循环,也可以在执行一次后被删除掉。要注意的是,这里所说的任务删除,并不是任务的代码被删除了,而是uC/OS不再去理它了,所以该任务代码不会再运行了。在uC/OS中,有一个代表任务优先级的值,这个值在每个任务中是不相同的。值越低,它代表任务的优先级越高,它在就绪表中排得越靠前。
1、 建立任务:任务的建立可以在多任务调度之前建立,也可以在运行其它任务的时候 建立,但是,在多任务调度之前,必须要至少有已经建立了一个任务,否则系统被崩溃。还 要注意的是任务不能在中断服务程序中建立。建立任务时,系统会首先检测用户指定的优先级是否合理(是不是超过最大值,是否与已创建任务重复等),如果合理,放置一个标记,说明这个优先级我已经占用了,其它任务不能抢我这个优先级了。再给这个任务建立一个任务堆栈,(堆栈可以由上往下减,也可以由下往上增,具体见参数如何设置),如果堆栈成功建立的话,就从空闲的任务控制块缓冲池中获得一块任务控制块OS_PCB,然后任务就成功了,这个时候,相关函数会返回信息,任务建立函数会检查返回信息,如果任务建立成功的话,会将任务计数器加一。如果失败,则返回失败信息,放弃此优先级,表明,别人任务可以来抢这个优先级了。
2、 堆栈检验:有时候,比如内存有限的情况下,确定任务实际需要的堆栈空间大小是比较有必要的,这样可以避免为任务分配过多的栈空间。注意:如果需要堆栈检验,那么在任务建立的时候,堆栈中存储必须是0。而且要检验堆栈的任务必须要存在,还要允许检验堆栈!这些长期保持都满足时,就可以检验了:当堆栈是从高内存地址向低地址存储的时候,我们就从低地址开始检验,直到发现存储值不为0的堆栈入口为止(因为堆栈是连续存储的)。而已用的堆栈就是堆栈大小减去空闲的堆栈。然后将所得到的信息保存。
应该要使自己的应用程序运行足够长的时间,并经历最坏的堆栈使用情况,这样才能得到正确的数目。一旦堆栈检测提供最坏情况的堆栈需求,就可以重新设置堆栈最终的大小了。为了系统升级和扩展,应该多分配10%到100%的堆栈空间。
3、 删除任务:首先要明白的是,任务删除了,并不是把代码给删了,而是使任务进入了休眠状态,不再理会它了。而且不允许在中断服务程序中删除任务,也不允许删除空闲任务,但可以删除统计任务和任务自己。在删除任务的时候,要首先保证要删除的任务存在,否则没有办法删除。再分几种情况讨论,如果要删除的任务在就绪表中,就要从就绪表中删除,如果在等待列表中,就要从等待列表中删除。如果在事件标志等待表中,也要从此表中删除。这个时候删除任务要保证其它任务或者ISR不会让该任务重新开始执行,这个时候,任务要释放或者删除自定义的TCB,还要将任务计数器减一,再把被删除任务的TCB的指针指向NULL,再把OS_TCB双向链表中的被删任务的TCB去除。退回到空闲TCB中,供其它任务使用。最后还要进行任务调度。
4、 请求删除任务:如果一任务正在占有一些内存缓冲区或者信号量一类资源,就时,另一任务想删除该任务,那么这么占有的资源就会因为没有释放而丢失了,导致了存储器有了漏洞,这样会导致系统崩溃。这些情况下,我们应该让这个任务用完资源释放后,再删除自己。
5、 任务删除自己:当被删除的任务释放完它所有的资源时,就在删除任务中将优先级设置为自己,这样就会删除自己了。要保证任务不能是空闲任务,且要保证请求删除任务的优先级是有效的。且此任务存在。
6、 改变任务的优先级:在改变前要检验,不能改变空闲任务的优先级,且要保证新旧优先级都要合法且不能已经被别的任务占有。如果要指定的新优先级空闲,则要保留这个优先级,防止过程中有别的任务来抢。这样,再释放旧的优先级,可以被其它任务用。再检查要改变优先级的任务是不是在就绪表中或者在等待信号量等,如果是,要将它从就绪表或者等待列表中移除,将任务的TCB保存,新的优先级也保存。完成这些步骤后,如果新优先级高于旧优先级,或者新优先级高于调用本函数的任务的优先级,任务调度将调用。
7、 任务挂起:不能挂起空闲任务,但可以挂起当前任务。要保证要挂起的任务是存在的。挂起的方法是操作任务控制块,置位它的挂起位。如果任务在就绪表中,就要从表中去除,如果等待或者延时,就将延时清零,再置位挂起位。挂起后,只有在被挂起任务是调用本函数的任务本身,才需要任务调度。
8、 恢复任务:首先要检验不是空闲任务,再清除挂起位,延时清零,只有保证这两点,任务才处于就绪状态。再调用任务调度程序。
9、 获得任务信息:应用程序可以调用此函数来获得自身或者其它应用程序的信息,注意,包括空闲任务!获得指定任务的任务控制块的拷贝。要十分小心地处理OS_TCB指向其它任务控制块的指针,不要试图改变这些指针!总是来说,它是一个有用的调试工具。
文章评论(0条评论)
登录后参与讨论