大家好,又见面了,我是你们的朋友全栈君。
OSTaskCreate()是学习ucos-Ⅱ操作系统的第一个函数,费了九牛二虎之力,现在感觉差不多可以过了。
代码语言:javascript复制#if OS_TASK_CREATE_EN > 0
INT8U OSTaskCreate (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT8U prio)/*1*/
{
OS_STK *psp; /*2*/
INT8U err;
#if OS_CRITICAL_METHOD == 3 /*3*/
OS_CPU_SR cpu_sr = 0;
#endif
#if OS_ARG_CHK_EN > 0
if (prio > OS_LOWEST_PRIO)
{
return (OS_ERR_PRIO_INVALID); /*4*/
}
#endif
OS_ENTER_CRITICAL();
if (OSIntNesting > 0) /*5*/
{
OS_EXIT_CRITICAL();
return (OS_ERR_TASK_CREATE_ISR);
}
if (OSTCBPrioTbl[prio] == (OS_TCB *)0) /*6*/
{
OSTCBPrioTbl[prio] = OS_TCB_RESERVED; /*7*/
OS_EXIT_CRITICAL();
psp = OSTaskStkInit(task, p_arg, ptos, 0); /*8*/
err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0); /*9*/
if (err == OS_ERR_NONE)
{
if (OSRunning == OS_TRUE) /*10*/
{
OS_Sched(); /*11*/
}
}
else
{
OS_ENTER_CRITICAL();
OSTCBPrioTbl[prio] = (OS_TCB *)0; /*12*/
OS_EXIT_CRITICAL();
}
return (err);
}
else
{
OS_EXIT_CRITICAL();
return (OS_ERR_PRIO_EXIST); /*13*/
}
}
#endif
/*1*/
void (*task)(void *p_arg):首先是个函数指针。在调用该函数时,将该任务的函数名(即该任务所占内存的首地址)作为指针传递过来;
void *p_arg:传递的任务参数,一般不用;
OS_STK *ptos,:该任务的堆栈的栈顶指针(堆栈增长的默认方向从上往下,从高地址往低地址);
INT8U prio:该任务的优先级。
/*2*/
OS_STK *psp:定义一个堆栈类型的指针(该指针一直指向这个任务堆栈的栈顶,也称栈顶指针)。
/*3*/
OS_CPU_SR cpu_sr = 0:定义一个OS_CPU_SR类型的cpu_sr的局部变量,
该变量描述cpu的状态寄存器的,每次屏蔽中断时,都将cpu状态寄存器的值存进cpu_sr这个变量中,每次打开中断时,再将cpu_sr的值赋值给cpu的状态寄存器。
/*4*/
prio > OS_LOWEST_PRIO:定义的优先级应在允许的范围内,否则不具备有效性。
/*5*/
OSIntNesting > 0:在中断处理程序中,不应进行任务创建,每次进入中断的时候,OSIntNesting ,若大于0,必然在处理中断程序。
/*6*/
OSTCBPrioTbl[prio]:任务优先级列表是一个数组指针,该数组元素指向该任务控制块的内存地址;
(OS_TCB *)0:表示一个OS_TCB类型的指针,指向0,是一个空指针;
OSTCBPrioTbl[prio] == (OS_TCB *)0:该数组元素指向的内存地址是一个空地址,还没有被使用。
/*7*/
OS_TCB_RESERVED:即(OS_TCB *)1:表示一个OS_TCB类型的指针,指向1,表示非空指针;
OSTCBPrioTbl[prio] == (OS_TCB *)1, 该数组元素指向的内存地址是一个非空地址了,已经被占用了,还没有赋予具体的内存地址,这是一个宣告。
/*8*/
任务堆栈的初始化,并返回当前任务堆栈的栈顶指针。这个函数让我正确认识了堆栈的规则 后进先出,详情见OSTaskStkInit()函数。
/*9*/
任务控制块的初始化,并返回初始化的结果状态。详情见OS_TCBInit()函数。
/*10*/
OSRunning == OS_TRUE:操作系统的状态必须在运行的状态下,才能进行任务调度。操作系统运行过程中,OSRunning 第一次置为OS_TRUE状态是在OSStart()函数中实现的。
/*11*/
OS_Sched():进行任务调度。 详情见 OS_Sched()函数。
/*12*/
OSTCBPrioTbl[prio] = (OS_TCB *)0:若任务控制块初始化不成功,则释放被宣告占有的任务控制块。
/*13*/
return (OS_ERR_PRIO_EXIST):说明该任务控制块的内存地址已经被占用了,或者说该优先级已经被占用了。
上面是我对OSTaskCreate()函数的一些细节的认识,若有理解不对的地方,恳请指正!
好了,第一次写博希望大家多多支持!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。