μC/OS之OSTaskCreate()
来源:互联网 发布:阿里云cdn加速设置 编辑:程序博客网 时间:2024/05/15 07:38
转自 http://blog.csdn.net/xiaocaichonga/article/details/7449409
建立任务OSTaskCreate()
1.OSTaskCreate()函数的声明
INT8U OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK *ptos,INT8U prio)
1.1返回类型 INT8U
1.2参数:4个参数,分别是指向任务代码段的函数指针task,指向任务数据的指针pdata,指向任务所分配的堆栈的栈顶指针ptos,以及任务的优先级prio
2.OSTaskCreate()函数的定义
INT8U OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK *ptos,INT8U prio)
{
void *psp; /*用于指向任务堆栈初始化后栈顶的指针*/
INT8U err; /*用于存放任务TCB初始化后返回的值*/
if(prio>OS_LOWEST_PRIO) /*判断任务的优先级是否在允许的范围内,即如果该任务的优先级比系统的空闲优先级*/
{ /*都低的话,那么就出错了*/
return (OS_PRIO_INVALID) /*返回优先级不可得*/
}
OS_ENTER_CRITICAL();
if (OSTCBPrioTbl[prio]==(OS_TCB *)0) /*判断所分配的优先级是否已经被其他任务占用,(OS_TCB)*0 表示没有占用*/
{
OSTCBPrioTbl[prio]=(OS_TCB *)1; /*将新分配的优先级在OSTCBPrioTbl[]中更改为已占用状态即(OS_TCB)*1,注意:
OS_EXIT_CRITICAL(); /*在(OS_TCB)*1状态下表示仅仅被占用,但是并没有为任务分配资源等操作*/
psp=(void *)OSTaskStkInit(task,pdata,ptos,0);/*将任务堆栈进行初始化,并返回初始化后的栈顶指针给psp*/
/*注意任务堆栈的初始化函数的参数:①代码段指针②数据段指针③堆栈的栈顶*/
err=OSTCBInit(prio,psp,(void *)0,0,0,(void*0),0);/*TCB的初始化,注意传入的参数:①任务的优先级即任务的标识符②堆栈初始化后的栈顶指针*/
if(err==OS_NO_ERR) /*如果TCB初始化成功*/
{
OS_ENTER_CRITICAL();
OSTaskCtr++; /*则将系统中的进程数加1*/
OSTaskCreateHook(OSTCBPrioTbl[prio]); /*新建任务的扩展功能,可以由用户自行定义,但是代码不能太长,因为此时中断关闭*/
OS_EXIT_CRITICAL();
if(OSRunning) /*判断任务建立时,系统中是否有其他任务在运行,即系统是否已经OSStart()了*/
{
OSSched(); /*如果系统中已经有其他任务运行,则用任务调度函数OSSched()进行任务调度*/
}
}
else
{
OS_ENTER_CRITICAL();
OSTCBPrioTble[prio]=(OS_TCB *)0; /*如果TCB初始化失败,则将本来占用的OSTCBPrioTble[]中对应的位标识为此优先级未被使用*/
OS_EXIT_CRITICAL();
}
return (err); /*在判断优先级在于规定范围内的情况下,无论TCB初始化是成功还是失败,都将返回TCB初始化的值*/
}
else
{
OS_EXIT_CRITICAL();
return (OS_PRIO_EXIST); /*如果此优先级已经被占用,则返回OS_PRIO_EXIST,以告诉系统和用户优先级已被占用*/
}
}
3.小结
任务的建立函数OSTaskCreate()到底做了哪些事情呢?
①判断任务的优先级;
②系统的OSTCBPrioTbl[];
③任务堆栈的初始化;
④任务TCB的初始化。
执行过程:第一步,判断任务的优先级是否越界,如果越界则返回失败,如果没越界进行下一步;
第二步,判断任务的优先级是否已经被占用,如果被占用则返回失败,如果没有被占用进行下一步;
第三步,对OSTCBPrioTbl[]相应位置1,表明此优先级被使用了;
第四步,任务堆栈的初始化;
第五步,任务TCB的初始化,无论初始化失败还是成功,都将TCB初始化的返回值返回给OSTaskCreate();
第六步,如果TCB初始化失败了,则将OSTCBPrioTbl[]中的相应位再清0,以表明此优先级没被使用;如果TCB初始化成功了
则将系统中的任务数加1,并进行下一步;
第七步,盘对系统是否已经处于运行状态,如果处于运行状态则进行任务调度。
注意:1.OSTaskCreate()的四个参数分别做了什么:
①task,pdata和ptos用于了任务堆栈的初始化,即要对任务的代码指针,数据指针,根据当前分配的栈顶继续压栈
②prio用于了PCB的初始化。
2.对于OSTCBPrioTbl[]的理解,该表中的元素是指向TCB的指针,当该指针为(OS_TCB *)0时标明该位对应的优先级并未被使用,
该为不为(OS_TCB *)0时,标明该位对应的优先级被使用,至于使用的情况还要分为两种:
①(OS_TCB *)1时,标明该优先级被占用但是并没说明该优先级对应哪个TCB;
②指名该优先级被占用并且指向对应的TCB,这部分在TCB的初始化中完成了。
- μC/OS之OSTaskCreate()
- μC/OS之OSTaskCreate()
- uc/os--OSTaskCreate
- uC/OS II 函数说明 之–OSTaskCreate()与OSTaskCreateExt()
- OSTaskCreate()
- uc/os中OSTaskCreate()函数分析
- uc/os-iii学习笔记-OSTaskCreate
- uC/OS-III任务创建函数OSTaskCreate()
- 启动ucosii之四OSTaskCreate()
- μC/OS 之OSTCBInit()
- μC/OS之OSTaskStkChk()
- μC/OS之OSTaskDel()
- μC/OS之OSTaskDel()
- μC/OS之bulid stack
- μC/OS-Ⅱ之任务设计
- μC/OS-Ⅱ
- μC/OS-II
- μc/os笔记
- 使用sublime text打开notepad++当前打开的文件
- 串的模式匹配算法
- 黑马程序员-循环语句总结
- LeetCode Set Matrix Zeroes
- MATLAB基本操作(二):数组中操作
- μC/OS之OSTaskCreate()
- redhat5配置yum源
- Reverse Integer
- 黑马程序员--字符串总结
- Linux驱动2_总线设备(一)
- 门面模式——Head First Design Patterns
- 非法触摸的解决方案
- 黑马程序员-StringBuffer和集合
- JBPM基础知识