永发信息网

在μ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
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯