在μC/OS中,OSTaskCreateExt();这个函数的每一个参数都应该填什么?
答案:1 悬赏:80 手机版
解决时间 2021-11-24 05:08
- 提问者网友:龅牙恐龙妹
- 2021-11-23 12:48
在μC/OS中,OSTaskCreateExt();这个函数的每一个参数都应该填什么?
最佳答案
- 五星知识达人网友:一叶十三刺
- 2021-11-23 13:43
INT8U OSTaskCreateExt (void (*task)(void *pd), //建立扩展任务(任务代码指针)
void *pdata, //传递参数指针
OS_STK *ptos, //分配任务堆栈栈顶指针
INT8U prio, //分配任务优先级
INT16U id, //(未来的)优先级标识(与优先级相同)
OS_STK *pbos, //分配任务堆栈栈底指针
INT32U stk_size, //指定堆栈的容量(检验用)
void *pext, //指向用户附加的数据域的指针
INT16U opt) //建立任务设定选项
{
#if OS_CRITICAL_METHOD == 3 //中断函数被设定为模式3
OS_CPU_SR cpu_sr;
#endif
OS_STK *psp; //初始化任务堆栈指针变量,返回新的栈顶指针
INT8U err; //定义(获得定义初始化任务控制块)是否成功
#if OS_ARG_CHK_EN > 0 //所有参数必须在指定的参数内
if (prio > OS_LOWEST_PRIO) { //检查任务优先级是否合法
return (OS_PRIO_INVALID); //参数指定的优先级大于OS_LOWEST_PRIO
}
#endif
OS_ENTER_CRITICAL(); //关闭中断
if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { //确认优先级未被使用,即就绪态为0
OSTCBPrioTbl[prio] = (OS_TCB *)1; //保留这个优先级,将就绪态设为0
OS_EXIT_CRITICAL(); //打开中断
//以下两为1堆栈才能清0
if (((opt & OS_TASK_OPT_STK_CHK) != 0x0000) || //检验任务堆栈,CHK=1
((opt & OS_TASK_OPT_STK_CLR) != 0x0000)) { //任务建立时是否清0,CLR=1
#if OS_STK_GROWTH == 1 //堆栈生长方向
(void)memset(pbos, 0, stk_size * sizeof(OS_STK)); //从下向上递增
#else
(void)memset(ptos, 0, stk_size * sizeof(OS_STK)); //从下向下递减
#endif
}
psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, opt); //初始化任务堆栈
err = OS_TCBInit(prio, psp, pbos, id, stk_size, pext, opt); //获得并初始化任务控制块
if (err == OS_NO_ERR) { //任务控制初始化成功
OS_ENTER_CRITICAL(); //关闭中断
OSTaskCtr++; //任务计数器加1
OS_EXIT_CRITICAL(); //打开中断
if (OSRunning == TRUE) { //检查是否有(某个)任务在运行
OS_Sched(); //任务调度,最高任务优先级运行
}
} else { //否则,任务初始化失败
OS_ENTER_CRITICAL(); //关闭中断
OSTCBPrioTbl[prio] = (OS_TCB *)0; //放弃任务,设此任务就绪态为0
OS_EXIT_CRITICAL(); //打开中断
}
return (err); //返回(获得并定义初始化任务控制块是否成功)
}
OS_EXIT_CRITICAL(); //打开中断
return (OS_PRIO_EXIST); //具有该优先级的任务已经存在
}
#endif
void *pdata, //传递参数指针
OS_STK *ptos, //分配任务堆栈栈顶指针
INT8U prio, //分配任务优先级
INT16U id, //(未来的)优先级标识(与优先级相同)
OS_STK *pbos, //分配任务堆栈栈底指针
INT32U stk_size, //指定堆栈的容量(检验用)
void *pext, //指向用户附加的数据域的指针
INT16U opt) //建立任务设定选项
{
#if OS_CRITICAL_METHOD == 3 //中断函数被设定为模式3
OS_CPU_SR cpu_sr;
#endif
OS_STK *psp; //初始化任务堆栈指针变量,返回新的栈顶指针
INT8U err; //定义(获得定义初始化任务控制块)是否成功
#if OS_ARG_CHK_EN > 0 //所有参数必须在指定的参数内
if (prio > OS_LOWEST_PRIO) { //检查任务优先级是否合法
return (OS_PRIO_INVALID); //参数指定的优先级大于OS_LOWEST_PRIO
}
#endif
OS_ENTER_CRITICAL(); //关闭中断
if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { //确认优先级未被使用,即就绪态为0
OSTCBPrioTbl[prio] = (OS_TCB *)1; //保留这个优先级,将就绪态设为0
OS_EXIT_CRITICAL(); //打开中断
//以下两为1堆栈才能清0
if (((opt & OS_TASK_OPT_STK_CHK) != 0x0000) || //检验任务堆栈,CHK=1
((opt & OS_TASK_OPT_STK_CLR) != 0x0000)) { //任务建立时是否清0,CLR=1
#if OS_STK_GROWTH == 1 //堆栈生长方向
(void)memset(pbos, 0, stk_size * sizeof(OS_STK)); //从下向上递增
#else
(void)memset(ptos, 0, stk_size * sizeof(OS_STK)); //从下向下递减
#endif
}
psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, opt); //初始化任务堆栈
err = OS_TCBInit(prio, psp, pbos, id, stk_size, pext, opt); //获得并初始化任务控制块
if (err == OS_NO_ERR) { //任务控制初始化成功
OS_ENTER_CRITICAL(); //关闭中断
OSTaskCtr++; //任务计数器加1
OS_EXIT_CRITICAL(); //打开中断
if (OSRunning == TRUE) { //检查是否有(某个)任务在运行
OS_Sched(); //任务调度,最高任务优先级运行
}
} else { //否则,任务初始化失败
OS_ENTER_CRITICAL(); //关闭中断
OSTCBPrioTbl[prio] = (OS_TCB *)0; //放弃任务,设此任务就绪态为0
OS_EXIT_CRITICAL(); //打开中断
}
return (err); //返回(获得并定义初始化任务控制块是否成功)
}
OS_EXIT_CRITICAL(); //打开中断
return (OS_PRIO_EXIST); //具有该优先级的任务已经存在
}
#endif
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯