当前位置:   article > 正文

UCOSII任务管理与创建任务_ucosii在任务中开启任务

ucosii在任务中开启任务

这里不讲解代码,只讲如何使用。

目录

任务管理函数:

OSInit()

OSStart()

OSStatInit()

OSTaskChangePrio ()

OSTaskCreate()

OSTaskCreateExt ()

OSTaskDel ()

OSTaskDelReq()

OSTaskNameGet()

OSTaskNameSet()

OSTaskResume()

OSTaskSuspend()

OSTaskStkChk()

OSTaskQuery ()

示例代码

执行结果



任务管理函数:

OSInit()

原型:void OSInit(void);

作用: 初始化 UCOS-II 内核相关函数
注意:任务调度之前必须要有。

OSStart()

原型:void OSStart(void);

作用: 任务调度,OSStart后面的代码都不执行

OSStatInit()

原型:void OSStatInit (void);

作用: 统计任务初始化
注意:只能在第一个函数建立运行中使用, OS_TASK_STAT_EN标志位置1开启

OSTaskChangePrio ()

原型:INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio);

作用:改变一个任务的优先级

注意:任务执行过程中可以更改优先级,但是所更改的优先级不能存在使用,否则报错

OSTaskCreate()

原型:INT8U OSTaskCreate(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio);

作用 :创建一个新任务
注意: 中断中创建,可以在任务中创建或者任务调度之前。不能有返回点

OSTaskCreateExt ()

原型: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);

作用:创建一个新任务

注意:和OSTaskCreate()一样,但是返回值更多

OSTaskDel ()

原型:INT8U OSTaskDel(INT8U prio);

作用:删除任务,删除后优先级可以重新创建任务使用(删除后优先级退出队列)

OSTaskDelReq()

原型:INT8U OSTaskDelReq(INT8U prio);

作用:删除任务,可以删除自身或者其他任务,输入优先级即可

注意:删除自身用 OS_PRIO_SELF

OSTaskNameGet()

原型:INT8U OSTaskNameGet(INT8U prio, INT8U **pname, INT8U *perr);

作用:获取指定优先级任务名

OSTaskNameSet()

原型:void OSTaskNameSet(INT8U prio, INT8U *pname, INT8U *perr);

作用:设置任务名

OSTaskResume()

原型:INT8U OSTaskResume(INT8U prio);

作用: 无条件唤醒一个任务

OSTaskSuspend()

原型:INT8U OSTaskSuspend ( INT8U prio);

作用:无条件挂起一个任务(休眠不再参与任务调度)

注意:挂起任务还可以唤醒,还在任务队列之中,与删除不同。

OSTaskStkChk()

原型:INT8U OSTaskStkChk(INT8U prio, OS_STK_DATA *p_stk_data);

作用:检查任务堆栈状态

注意:任务栈很重要,如果设置小了,可能造成程跑飞。

OSTaskQuery ()

原型:INT8U OSTaskQuery(INT8U prio, OS_TCB *p_task_data);

作用:获取任务信息

创建任务一般来说我会先创建一个起始任务,然后在起始任务中创建其他任务,再把起始任务删除。

示例代码

  1. #include "stm32f4xx.h"
  2. #include "usart1.h"
  3. #include "delay.h"
  4. #include "includes.h"
  5. /*初始任务*/
  6. #define Start_TASK_PRO 10 /*任务优先级*/
  7. #define Start_STACK_SIZE 64 /*任务栈大小*/
  8. OS_STK Start_STask[Start_STACK_SIZE]; //设置一个数组用于存放缓冲数据(入栈时的数据)
  9. void Start_Task(void *parameter); //任务声明
  10. /*任务一*/
  11. #define Mission_One_PRO 12 /*任务优先级*/
  12. #define Mission_One_SIZE 64 /*任务栈大小*/
  13. OS_STK Mission_One[Mission_One_SIZE]; //设置一个数组用于存放缓冲数据(入栈时的数据)
  14. void Mission_One_Func(void *parameter); //任务声明
  15. /*任务二*/
  16. #define Mission_Two_PRO 14 /*任务优先级*/
  17. #define Mission_Two_SIZE 64 /*任务栈大小*/
  18. OS_STK Mission_Two[Mission_Two_SIZE]; //设置一个数组用于存放缓冲数据(入栈时的数据)
  19. void Mission_Two_Func(void *parameter); //任务声明
  20. /*任务三*/
  21. #define Mission_Three_PRO 16 /*任务优先级*/
  22. #define Mission_Three_SIZE 64 /*任务栈大小*/
  23. OS_STK Mission_Three[Mission_Three_SIZE];//设置一个数组用于存放缓冲数据(入栈时的数据)
  24. void Mission_Three_Func(void *parameter);//任务声明
  25. int main()//一个工程只能有一个main函数
  26. {
  27. //优先级分组,代码中只执行一次
  28. INT8U res;//返回标志
  29. NVIC_SetPriorityGrouping(5);//优先级分组,组2 101
  30. Systick_Inti(168);
  31. Usart1_Init(115200);
  32. OSInit(); // 初始化 uC/OS-II 必须要有
  33. res=OSTaskCreate(Start_Task,(void *)10,&Start_STask[Start_STACK_SIZE-1],Start_TASK_PRO);//创建初始任务
  34. if(res==OS_ERR_NONE)
  35. printf("Start_Task\r\n"); //判断任务创建成功
  36. OSStart(); //启动多任务内核 调度
  37. //后面的代码都不会执行
  38. while(1);
  39. }
  40. //初始任务,任务中可以创建任务,并且初始任务只执行一次
  41. void Start_Task(void *parameter)
  42. {
  43. INT8U res;//返回标志
  44. parameter = parameter;//防止编译器报警告
  45. printf("Perform the initial task\r\n");
  46. OSStatInit();
  47. res=OSTaskCreate(Mission_One_Func,0,&Mission_One[Mission_One_SIZE-1],Mission_One_PRO);//创建任务
  48. if(res==OS_ERR_NONE)
  49. printf("Mission_One_Func\r\n"); //任务创建成功
  50. res=OSTaskCreate(Mission_Two_Func,0,&Mission_Two[Mission_Two_SIZE-1],Mission_Two_PRO);//创建任务
  51. if(res==OS_ERR_NONE)
  52. printf("Mission_Two_Func\r\n"); //任务创建成功
  53. res=OSTaskCreate(Mission_Three_Func,0,&Mission_Three[Mission_Three_SIZE-1],Mission_Three_PRO);//创建任务
  54. if(res==OS_ERR_NONE)
  55. printf("Mission_Three_Func\r\n"); //任务创建成功
  56. OSTaskDel(OS_PRIO_SELF);//自杀 删除自己
  57. }
  58. //任务1
  59. void Mission_One_Func(void *parameter)
  60. {
  61. INT8U err;//错误码
  62. parameter = parameter;//防止编译器报警告
  63. u32 flag=0;
  64. while(1)
  65. {
  66. printf("Mission_One_Func execute\r\n");
  67. OSTimeDlyHMSM(0,0,0,500); //500ms 释放CPU
  68. if(++flag==2)
  69. {
  70. flag=0;
  71. OSTaskSuspend(OS_PRIO_SELF); /* 挂起当前任务 */
  72. }
  73. }
  74. }
  75. void Mission_Two_Func(void *parameter)
  76. {
  77. INT8U err;//错误码
  78. parameter = parameter;//防止编译器报警告
  79. u32 flag=0;
  80. while(1)
  81. {
  82. printf("Mission_Two_Func execute\r\n");
  83. OSTimeDlyHMSM(0,0,0,500); //500ms 释放CPU
  84. if(++flag==6)
  85. {
  86. flag=0;
  87. OSTaskSuspend(Mission_Three_PRO); /* 挂起任务三 */
  88. }
  89. }
  90. }
  91. void Mission_Three_Func(void *parameter)
  92. {
  93. INT8U err;//错误码
  94. parameter = parameter;//防止编译器报警告
  95. u32 flag=0;
  96. while(1)
  97. {
  98. printf("Mission_Three_Func execute\r\n");
  99. OSTimeDlyHMSM(0,0,0,500); //500ms 释放CPU
  100. if(++flag==4)
  101. {
  102. flag=0;
  103. OSTaskResume(Mission_One_PRO); /* 唤醒任务一 */
  104. }
  105. }
  106. }
  107. //任务执行后面只有任务二没有被挂起。主要是为了运用一些常用函数,没有啥意思。

执行结果

Start_Task
Perform the initial task
Mission_One_Func
Mission_Two_Func
Mission_Three_Func
Mission_One_Func execute
Mission_Two_Func execute
Mission_Three_Func execute
Mission_One_Func execute
Mission_Two_Func execute
Mission_Three_Func execute
Mission_Two_Func execute
Mission_Three_Func execute
Mission_Two_Func execute
Mission_Three_Func execute
Mission_Two_Func execute
Mission_One_Func execute
Mission_Three_Func execute
Mission_Two_Func execute
Mission_One_Func execute
Mission_Three_Func execute
Mission_Two_Func execute
Mission_Two_Func execute
Mission_Two_Func execute
Mission_Two_Func execute

.......

使用系统时要注意,此时系统根据的是任务优先级去获取CPU的使用权。不能用裸机的逻辑去推代码的运。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/406404
推荐阅读
相关标签
  

闽ICP备14008679号