ucos源码阅读1——任务2

ucos源码阅读1——任务

  • os_task.c
    • OsTaskCreate()
    • OsTaskChangePrio()
    • OsTaskDel()
    • OsTaskDelReq()
    • OsTaskSuspend()
    • OsTaskResume()
    • OsTaskResume()
  • 总结

os_task.c

用户级任务管理函数

OsTaskCreate()

任务不能在中断服务子程序创建
程序逻辑流程:
首先要把优先级是否合理
其次看tcb指针数组对应值是否为零
为零的话首先置一个随便的指针
然后任务栈初始化,确保栈中存储的是程序一运行时寄存器的内容,这里的初始化和任务调度前的入用户任务栈的原理应该是相同的。返回新的栈顶指针。
ucos源码阅读1——任务2_第1张图片
要初始化TCB,这个函数在之前的c文件里,因为这个文件开头

#ifndef  OS_MASTER_FILE
#include "includes.h"
#endif

就是在一个空闲链表头摘下一个挂在另一个双向链表头,然后更新就绪值,就绪表,指针数组。可以看看。。。最后引发一次调度。创建高优先级的话一下子就去高优先级的任务了。
ucos源码阅读1——任务2_第2张图片
ucos源码阅读1——任务2_第3张图片

OsTaskChangePrio()

调用者只能是任务
程序逻辑流程:
先把新的优先级对应任务控制块指针数组位置一个任意值,和上个函数一样,先删除指针数组对应的指针索引,然后如果原来的任务是就绪态,就要修改就绪值和表,然后新的优先级处于就绪态,所以再次修改。最后修改tcb中涉及prio的相关内容,最后把tcb指针赋给指针数组新优先级对应的地方。
ucos源码阅读1——任务2_第4张图片
ucos源码阅读1——任务2_第5张图片

OsTaskDel()

中断子程序不能删除任务,不能删除空闲任务,删除占有资源的任务最好用另一个删除函数
如果删除的是就绪态就要把就绪值和表相应的清零。其他态呢:

		ptcb->OSTCBDly  = 0;               //延时数清零,防止OSTimeTick更新该变量                 
        ptcb->OSTCBStat = OS_STAT_RDY;  //阻止其他任务或中断服务调用ostaskresume激活任务                 
		if (OSLockNesting < 255) {       //锁上调度器
            OSLockNesting++;
		}
        OS_EXIT_CRITICAL();    //中断关的太久开一下,dummy是个空函数                                  
        OS_Dummy();                                          
        OS_ENTER_CRITICAL();                                   
		if (OSLockNesting > 0) {   //解开调度器
            OSLockNesting--;
		}
        OSTaskDelHook(ptcb); 

任务删除只是清除指针数组对应的位,tcb再从双向链表转到空的单向链表(不清空),任务调度的时候也是当前的指针和优先级还保留着呢,只是就绪表和值不再显示他了。
ucos源码阅读1——任务2_第6张图片
ucos源码阅读1——任务2_第7张图片
少个#endif

OsTaskDelReq()

只是简单的返回自身的OSTCBDelReq或者设置别的任务的OSTCBDelReq为OS_TASK_DEL_REQ,删除者可以根据OS_TASK_NOT_EXIST的返回值一直挂起自己让被删除的任务执行,被删除的任务根OS_TASK_DEL_REQ先释放资源,再调用OsTaskDel()
ucos源码阅读1——任务2_第8张图片

OsTaskSuspend()

就绪态的话就先要把就绪值和表相应的清零让OSTCBStat 或上OS_STAT_SUSPEND(这几个状态置不同的二进制位),如果挂起的是自己的话,就要调用一次任务调度,被挂起的任务只能通过其他任务调用OSTaskResume来恢复。
ucos源码阅读1——任务2_第9张图片

OsTaskResume()

挂起的任务,如果恢复了OSTCBStat为OS_STAT_RDY) 并且OSTCBDly等于0,置就绪值和表,以及产生任务调度。
ucos源码阅读1——任务2_第10张图片

OsTaskResume()

调试用的,所以调用了c库函数?
ucos源码阅读1——任务2_第11张图片

总结

任务创建,删除,挂起(自身的),释放(有条件的)会引起调度。
还有两个函数没看。
大量的宏判断既可以去掉错误信息也可以去掉各种函数。。。
采用不到得形参等于自身消除编译器错误???

你可能感兴趣的:(ucos源码阅读1——任务2)