大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
INT8U OSTaskCreate (void (*task)(void *pd), void *p_arg, OS_STK *ptos, INT8U prio)
;函数返回一个8位的整型数,调用该函数需要四个参数。第一个参数一个指针,也就是用户代码的首地址,在平时使用中我们把自己创建的任务的名字作为这个参数就可以了;第三个参数是指向任务堆栈栈顶的指针,通常我们把创建的任务的堆栈数组的首地址给第三个参数就可以了;第四个参数是任务的优先级;第二个参数是什么意思?还不太理解。
OS_STK *psp;
INT8U err; ;创建一个指向数据类型为OS_STK的指针和一个8位的整型数
#if OS_ARG_CHK_EN > 0
if (prio > OS_LOWEST_PRIO) { /* Make sure priority is within allowable range */
return (OS_PRIO_INVALID);
}
#endif
;判断该任务的优先级是否有效
OS_ENTER_CRITICAL();
if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* Make sure task doesn’t already exist at this priority */
OSTCBPrioTbl[prio] = (OS_TCB *)1; /* Reserve the priority to prevent others from doing … */
/* … the same thing until task is created. */
OS_EXIT_CRITICAL(); ;判断该优先级是否被占用
;优先级未被占用,执行以下程序
psp = (OS_STK *)OSTaskStkInit(task, p_arg, ptos, 0); ;初始化堆栈
err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0); ;初始化任务控制块
if (err == OS_NO_ERR) {
OS_ENTER_CRITICAL();
OSTaskCtr++; /* Increment the #tasks counter */
OS_EXIT_CRITICAL();
if (OSRunning == TRUE) { /* Find highest priority task if multitasking has started */
OS_Sched(); ;此时OSRunning 等于假,也就是在创建任务的时候并不能引发任务调度仅 ;仅是创建任务而已。
}
} else { ;该优先级已经被占用,则只把该任务优先级释放掉
OS_ENTER_CRITICAL();
OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others */
OS_EXIT_CRITICAL();
}
return (err);
}
OS_EXIT_CRITICAL();
return (OS_PRIO_EXIST);
}
综上所述,创建任务时的主要工作是:第一,判断该优先级是否有效;第二判断该优先级是否被占用,若被占用则释放掉该优先级并返回OS_PRIO_EXIST;第三,若优先级未被占用,就初始化任务堆栈和任务控制块,初始化任务控制块返回正确信息时,将 OSTaskCtr加1;第四,判断OSRunning,为真就引发一次任务调度,为假则程序结束。
似乎在创建任务的时候OSRunning值为假,所以创建任务的时候,不会引发一次任务调度。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/196848.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...