OSTaskCreate和OSTaskCreateExt函数的区别

OSTaskCreate和OSTaskCreateExt函数的区别uC/OS创建任务有⼏个硬性要求
1. 任务必须被创建在多任务开始之前或者是运⾏的任务中。
2. 任务不能由ISR创建。
3. 任务必须在死循环中,并且不能有返回
01.
02. //建⽴⼀个新任务
03. #if OS_TASK_CREATE_EN > 0                //允许⽣成OSTaskCreate()函数
04. INT8U  OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)
05. {
细分驱动器06. #if OS_CRITICAL_METHOD == 3                  //中断函数被设定为模式3
07.    OS_CPU_SR  cpu_sr;
08. #endif
09.    OS_STK    *psp;                        //初始化任务堆栈指针变量,返回新的栈顶指针
10.    INT8U      err;                        //定义(获得并定义初始化任务控制块)是否成功
11.
12.
13. #if OS_ARG_CHK_EN > 0                        //所有参数必须在指定的参数内
14. if (prio > OS_LOWEST_PRIO) {            //检查任务优先级是否合法
15. return (OS_PRIO_INVALID);          //参数指定的优先级⼤于OS_LOWEST_PRIO
16.    }
17. #endif
18.    OS_ENTER_CRITICAL();            //关闭中断
19. if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { //确认优先级未被使⽤,即就绪态为0
20.        OSTCBPrioTbl[prio] = (OS_TCB *)1;    //保留这个优先级,将就绪态设为1
21.
更衣凳22.        OS_EXIT_CRITICAL();            //打开中断
23.        psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, 0);    //初始化任务堆栈
24.        err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0);      //获得并初始化任务控制块
25. if (err == OS_NO_ERR) {    //任务控制初始化成功
26.            OS_ENTER_CRITICAL();    //关闭中断
27.            OSTaskCtr++;            //任务计数器加1
28.            OS_EXIT_CRITICAL();    //打开中断
鼓膜式板框压滤机
29. if (OSRunning == TRUE) {        //检查是否有(某个)任务在运⾏蜜春堂
30.                OS_Sched();                  //任务调度,最⾼任务优先级运⾏
31.            }
32.        } else {        //否则,任务初始化失败
33.            OS_ENTER_CRITICAL();        //关闭中断
34.            OSTCBPrioTbl[prio] = (OS_TCB *)0;      //放弃任务,设此任务就绪态为0
35.            OS_EXIT_CRITICAL();                    //打开中断
36.        }
37. return (err);          //返回(获得并定义初始化任务控制块是否成功)
38.    }
39.    OS_EXIT_CRITICAL();        //打开中断
40. return (OS_PRIO_EXIST);    //返回(具有该优先级的任务已经存在)
41. }
42. #endif
43.
44.
45.
ranth46. //建⽴⼀个新任务。与OSTaskCreate()不同的是,OSTaskCreateExt()允许⽤户设置更多的细节
47. //内容。任务的建⽴可以在多任务环境启动之前,也可以在正在运⾏的任务中建⽴,但中断处理
48. //程序中不能建⽴新任务。⼀个任务必须为⽆限循环结构,且不能有返回点。
49. #if OS_TASK_CREATE_EXT_EN > 0                //允许⽣成OSTaskCreateExt()函数
50. INT8U  OSTaskCreateExt (void  (*task)(void *pd),  //建⽴扩展任务(任务代码指针)
51. void    *pdata,            //传递参数指针
52.                        OS_STK  *ptos,              //分配任务堆栈栈顶指针
53.                        INT8U    prio,              //分配任务优先级
54.                        INT16U  id,                //(未来的)优先级标识(与优先级相同)
55.                        OS_STK  *pbos,              //分配任务堆栈栈底指针
56.                        INT32U  stk_size,          //指定堆栈的容量(检验⽤)
57. void    *pext,              //指向⽤户附加的数据域的指针
58.                        INT16U  opt)              //建⽴任务设定选项
59. {
60. #if OS_CRITICAL_METHOD == 3                  //中断函数被设定为模式3
荧光寿命测试
61.    OS_CPU_SR  cpu_sr;
62. #endif
63.    OS_STK    *psp;                        //初始化任务堆栈指针变量,返回新的栈顶指针
64.    INT8U      err;                        //定义(获得定义初始化任务控制块)是否成功
65.
66.
67. #if OS_ARG_CHK_EN > 0        //所有参数必须在指定的参数内
68. if (prio > OS_LOWEST_PRIO) {            //检查任务优先级是否合法
69. return (OS_PRIO_INVALID);            //参数指定的优先级⼤于OS_LOWEST_PRIO
70.    }
71. #endif
72.    OS_ENTER_CRITICAL();        //关闭中断
73. if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { //确认优先级未被使⽤,即就绪态为0
74.        OSTCBPrioTbl[prio] = (OS_TCB *)1;    //保留这个优先级,将就绪态设为0
75.
76.        OS_EXIT_CRITICAL();    //打开中断
77.
78. //以下两为1堆栈才能清0
79. if (((opt & OS_TASK_OPT_STK_CHK) != 0x0000) ||  //检验任务堆栈,CHK=1
80.            ((opt & OS_TASK_OPT_STK_CLR) != 0x0000)) {  //任务建⽴时是否清0,CLR=1
81.            #if OS_STK_GROWTH == 1          //堆栈⽣长⽅向
82.            (void)memset(pbos, 0, stk_size * sizeof(OS_STK));      //从下向上递增
83.            #else
84.            (void)memset(ptos, 0, stk_size * sizeof(OS_STK));      //从下向下递减
85.            #endif
86.        }
87.
88.        psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, opt);      //初始化任务堆栈
89.        err = OS_TCBInit(prio, psp, pbos, id, stk_size, pext, opt);    //获得并初始化任务控制块
90. if (err == OS_NO_ERR) { //任务控制初始化成功
91.            OS_ENTER_CRITICAL();        //关闭中断
92.            OSTaskCtr++;                //任务计数器加1
93.            OS_EXIT_CRITICAL();        //打开中断
94. if (OSRunning == TRUE) {              //检查是否有(某个)任务在运⾏
95.                OS_Sched();                      //任务调度,最⾼任务优先级运⾏
96.            }
97.        } else {        //否则,任务初始化失败
98.            OS_ENTER_CRITICAL();        //关闭中断
99.            OSTCBPrioTbl[prio] = (OS_TCB *)0;                //放弃任务,设此任务就绪态为0 100.            OS_EXIT_CRITICAL();        //打开中断
101.        }
102. return (err);      //返回(获得并定义初始化任务控制块是否成功)
103.    }
104.    OS_EXIT_CRITICAL();    //打开中断
105. return (OS_PRIO_EXIST);    //具有该优先级的任务已经存在
106. }
107. #endif

本文发布于:2024-09-23 01:18:02,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/155680.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:任务   指针   中断   堆栈   返回
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议