uC/OS创建任务有几个硬性要求

1. 任务必须被创建在多任务开始之前或者是运行的任务中。

2. 任务不能由ISR创建。

3. 任务必须在死循环中,并且不能有返回。

  1. //建立一个新任务
  2. #if OS_TASK_CREATE_EN > 0                //允许生成OSTaskCreate()函数
  3. INT8U  OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)
  4. {
  5. #if OS_CRITICAL_METHOD == 3                  //中断函数被设定为模式3
  6. OS_CPU_SR  cpu_sr;
  7. #endif
  8. OS_STK    *psp;                         //初始化任务堆栈指针变量,返回新的栈顶指针
  9. INT8U      err;                         //定义(获得并定义初始化任务控制块)是否成功
  10. #if OS_ARG_CHK_EN > 0                        //所有参数必须在指定的参数内
  11. if (prio > OS_LOWEST_PRIO) {            //检查任务优先级是否合法
  12. return (OS_PRIO_INVALID);           //参数指定的优先级大于OS_LOWEST_PRIO
  13. }
  14. #endif
  15. OS_ENTER_CRITICAL();            //关闭中断
  16. if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { //确认优先级未被使用,即就绪态为0
  17. OSTCBPrioTbl[prio] = (OS_TCB *)1;    //保留这个优先级,将就绪态设为1
  18. OS_EXIT_CRITICAL();             //打开中断
  19. psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, 0);    //初始化任务堆栈
  20. err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0);       //获得并初始化任务控制块
  21. if (err == OS_NO_ERR) {     //任务控制初始化成功
  22. OS_ENTER_CRITICAL();    //关闭中断
  23. OSTaskCtr++;            //任务计数器加1
  24. OS_EXIT_CRITICAL();     //打开中断
  25. if (OSRunning == TRUE) {         //检查是否有(某个)任务在运行
  26. OS_Sched();                  //任务调度,最高任务优先级运行
  27. }
  28. } else {        //否则,任务初始化失败
  29. OS_ENTER_CRITICAL();        //关闭中断
  30. OSTCBPrioTbl[prio] = (OS_TCB *)0;       //放弃任务,设此任务就绪态为0
  31. OS_EXIT_CRITICAL();                     //打开中断
  32. }
  33. return (err);           //返回(获得并定义初始化任务控制块是否成功)
  34. }
  35. OS_EXIT_CRITICAL();         //打开中断
  36. return (OS_PRIO_EXIST);     //返回(具有该优先级的任务已经存在)
  37. }
  38. #endif
  39. //建立一个新任务。与OSTaskCreate()不同的是,OSTaskCreateExt()允许用户设置更多的细节
  40. //内容。任务的建立可以在多任务环境启动之前,也可以在正在运行的任务中建立,但中断处理
  41. //程序中不能建立新任务。一个任务必须为无限循环结构,且不能有返回点。
  42. #if OS_TASK_CREATE_EXT_EN > 0                //允许生成OSTaskCreateExt()函数
  43. INT8U  OSTaskCreateExt (void   (*task)(void *pd),   //建立扩展任务(任务代码指针)
  44. void    *pdata,             //传递参数指针
  45. OS_STK  *ptos,              //分配任务堆栈栈顶指针
  46. INT8U    prio,              //分配任务优先级
  47. INT16U   id,                //(未来的)优先级标识(与优先级相同)
  48. OS_STK  *pbos,              //分配任务堆栈栈底指针
  49. INT32U   stk_size,          //指定堆栈的容量(检验用)
  50. void    *pext,              //指向用户附加的数据域的指针
  51. INT16U   opt)               //建立任务设定选项
  52. {
  53. #if OS_CRITICAL_METHOD == 3                  //中断函数被设定为模式3
  54. OS_CPU_SR  cpu_sr;
  55. #endif
  56. OS_STK    *psp;                         //初始化任务堆栈指针变量,返回新的栈顶指针
  57. INT8U      err;                         //定义(获得定义初始化任务控制块)是否成功
  58. #if OS_ARG_CHK_EN > 0        //所有参数必须在指定的参数内
  59. if (prio > OS_LOWEST_PRIO) {             //检查任务优先级是否合法
  60. return (OS_PRIO_INVALID);            //参数指定的优先级大于OS_LOWEST_PRIO
  61. }
  62. #endif
  63. OS_ENTER_CRITICAL();        //关闭中断
  64. if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { //确认优先级未被使用,即就绪态为0
  65. OSTCBPrioTbl[prio] = (OS_TCB *)1;    //保留这个优先级,将就绪态设为0
  66. OS_EXIT_CRITICAL();     //打开中断
  67. //以下两为1堆栈才能清0
  68. if (((opt & OS_TASK_OPT_STK_CHK) != 0x0000) ||   //检验任务堆栈,CHK=1
  69. ((opt & OS_TASK_OPT_STK_CLR) != 0x0000)) {   //任务建立时是否清0,CLR=1
  70. #if OS_STK_GROWTH == 1          //堆栈生长方向
  71. (void)memset(pbos, 0, stk_size * sizeof(OS_STK));       //从下向上递增
  72. #else
  73. (void)memset(ptos, 0, stk_size * sizeof(OS_STK));       //从下向下递减
  74. #endif
  75. }
  76. psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, opt);      //初始化任务堆栈
  77. err = OS_TCBInit(prio, psp, pbos, id, stk_size, pext, opt);     //获得并初始化任务控制块
  78. if (err == OS_NO_ERR) { //任务控制初始化成功
  79. OS_ENTER_CRITICAL();        //关闭中断
  80. OSTaskCtr++;                //任务计数器加1
  81. OS_EXIT_CRITICAL();         //打开中断
  82. if (OSRunning == TRUE) {              //检查是否有(某个)任务在运行
  83. OS_Sched();                       //任务调度,最高任务优先级运行
  84. }
  85. } else {        //否则,任务初始化失败
  86. OS_ENTER_CRITICAL();        //关闭中断
  87. OSTCBPrioTbl[prio] = (OS_TCB *)0;                 //放弃任务,设此任务就绪态为0
  88. OS_EXIT_CRITICAL();         //打开中断
  89. }
  90. return (err);       //返回(获得并定义初始化任务控制块是否成功)
  91. }
  92. OS_EXIT_CRITICAL();     //打开中断
  93. return (OS_PRIO_EXIST);     //具有该优先级的任务已经存在
  94. }
  95. #endif

具体函数的介绍好需要看官方的文档:http://sigpromu.org/brett/elec3730/quickref.html

OSTaskCreate 和 OSTaskCreateExt 函数的区别相关推荐

  1. OSTaskCreate 和 OSTaskCreateExt 函数

    //建立一个新任务 #if OS_TASK_CREATE_EN > 0 //允许生成OSTaskCreate()函数 INT8U OSTaskCreate (void (*task)(void ...

  2. render函数和redirect函数的区别+反向解析

    render函数和redirect函数的区别+反向解析 1.视图函数:一定是要包含两个对象的(render源码里面有HttpResponse对象)   request对象:----->所有的请求 ...

  3. 友元函数、类的非静态成员函数、静态成员函数的区别

    类中申明的函数相对于类来说有三层意思: 1.有this指针 2.函数在类的作用区域中 3.可以访问类中私有部分 4.可以被继承 非静态成员函数具有1234 静态成员函数具有234 友元函数具有3 静态 ...

  4. 第七周项目一-成员函数、友元函数和一般函数有区别(1)

     /**Copyright(c)2016,烟台大学计算机与控制工程学院*All rights reserved*文件名称:123.cpp*作 者:王蕊*完成日期:2016年4月12日*版 本 号: ...

  5. php怎么输出3个函数和,PHP利用var_dump,var_export,print_r三个函数的区别示例

    感兴趣的小伙伴,下面一起跟随512笔记的小玲来看看吧!下面的示例看看这三个函数的具体的区别,其中var_dump和var_export比较少用,但他们两者又很相似.所以可以看看: 代码如下: /* 5 ...

  6. python 类和函数的区别

    python中,在类中可以定义函数,类和函数都可作为一个模块保存. python的类和函数的区别主要在于类可以有变量和各种方法,而函数没有. 函数只能被运行,返回或者不返回值都可以. 模块如果没有把类 ...

  7. Python中str()与repr()函数的区别——repr() 的输出追求明确性,除了对象内容,还需要展示出对象的数据类型信息,适合开发和调试阶段使用...

    Python中str()与repr()函数的区别 from:https://www.jianshu.com/p/2a41315ca47e 在 Python 中要将某一类型的变量或者常量转换为字符串对象 ...

  8. python split(), os.path.split()和os.path.splitext()函数的区别

    python split(), os.path.split()和os.path.splitext()函数的区别 文章目录: 1. split() 2. os.path.split() 3. os.pa ...

  9. calloc、malloc、realloc函数的区别及用法

    calloc.malloc.realloc函数的区别及用法! 三者都是分配内存,都是stdlib.h库里的函数,但是也存在一些差异. (1)malloc函数.其原型void *malloc(unsig ...

最新文章

  1. 动态绘制圆环和扇形的源代码
  2. python字典默认输出键还是值_说说在 Python 字典中如何在读取不存在的键时得到一个默认值...
  3. JS基础:求一组数中的最大最小值,以及所在位置
  4. 前端学习(1320):同步和异步得区别
  5. 关于服务器性能的一些思考
  6. 泛化性的危机!LeCun发文质疑:测试集和训练集永远没关系...
  7. JDK 1.5 HashMap 源代码读解
  8. 严重: Servlet.service() for servlet [taotao-manager] in context with path [] threw exception [Request
  9. 【洛谷 P3299】 [SDOI2013]保护出题人 (凸包,三分,斜率优化)
  10. 推荐5款精挑细选的软件,大幅提升工作效率,用一次就会爱上
  11. 在标准宽带光纤上实现量子加密
  12. 单机MySQL性能_单机数据库性能测试总结
  13. FPGA纯逻辑资源解码CameraLink视频,附带工程源码并详解
  14. 《ABAQUS 6.14超级学习手册》——2.2 特性模块(Property)
  15. 3D建模除了日常工作,私下还可以赚外快哦,分分钟嗨赚
  16. python 打包exe(包含把资源文件打进包)
  17. K-均值聚类算法和二分K-均值算法
  18. 知识点滴 - 什么是YAML文件
  19. 亚马逊中东站好做吗?这或许是迄今为止最好的回答!
  20. 崩溃,我带的实习生把图片直接存到了服务器上

热门文章

  1. JavaWeb『HTMLCSS』
  2. 解决游戏画面撕裂问题谁家显示器更强?
  3. wps计算机课笔记,学霸笔记|2022一轮复习课本-WPS Office.doc
  4. 【RocketMQ】消息的拉取
  5. Python之Pandas学习
  6. 关于问题【无法启动 IIS Express Web 服务器。另一个程序正在使用此文件,进程无法访问。 (0x80070020)】
  7. 汇佳学校|肖紫兮:花滑冠军+学科全优,背后有何秘诀?
  8. C# 设置Excel条件格式(二)
  9. logback 转换符
  10. 虚拟化一、虚拟化技术基础原理