赞
踩
这里不讲解代码,只讲如何使用。
目录
原型:void OSInit(void);
原型:void OSStatInit (void);
原型:INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio);
作用:改变一个任务的优先级
注意:任务执行过程中可以更改优先级,但是所更改的优先级不能存在使用,否则报错
原型:INT8U OSTaskCreate(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio);
作用:创建一个新任务
注意:和OSTaskCreate()一样,但是返回值更多
原型:INT8U OSTaskDel(INT8U prio);
作用:删除任务,删除后优先级可以重新创建任务使用(删除后优先级退出队列)
原型:INT8U OSTaskDelReq(INT8U prio);
作用:删除任务,可以删除自身或者其他任务,输入优先级即可
注意:删除自身用 OS_PRIO_SELF
作用:获取指定优先级任务名
作用:设置任务名
原型:INT8U OSTaskResume(INT8U prio);
原型:INT8U OSTaskSuspend ( INT8U prio);
作用:无条件挂起一个任务(休眠不再参与任务调度)
注意:挂起任务还可以唤醒,还在任务队列之中,与删除不同。
原型:INT8U OSTaskStkChk(INT8U prio, OS_STK_DATA *p_stk_data);
作用:检查任务堆栈状态
注意:任务栈很重要,如果设置小了,可能造成程跑飞。
作用:获取任务信息
创建任务一般来说我会先创建一个起始任务,然后在起始任务中创建其他任务,再把起始任务删除。
- #include "stm32f4xx.h"
- #include "usart1.h"
- #include "delay.h"
- #include "includes.h"
-
- /*初始任务*/
- #define Start_TASK_PRO 10 /*任务优先级*/
- #define Start_STACK_SIZE 64 /*任务栈大小*/
- OS_STK Start_STask[Start_STACK_SIZE]; //设置一个数组用于存放缓冲数据(入栈时的数据)
- void Start_Task(void *parameter); //任务声明
-
-
- /*任务一*/
- #define Mission_One_PRO 12 /*任务优先级*/
- #define Mission_One_SIZE 64 /*任务栈大小*/
- OS_STK Mission_One[Mission_One_SIZE]; //设置一个数组用于存放缓冲数据(入栈时的数据)
- void Mission_One_Func(void *parameter); //任务声明
-
- /*任务二*/
- #define Mission_Two_PRO 14 /*任务优先级*/
- #define Mission_Two_SIZE 64 /*任务栈大小*/
- OS_STK Mission_Two[Mission_Two_SIZE]; //设置一个数组用于存放缓冲数据(入栈时的数据)
- void Mission_Two_Func(void *parameter); //任务声明
-
- /*任务三*/
- #define Mission_Three_PRO 16 /*任务优先级*/
- #define Mission_Three_SIZE 64 /*任务栈大小*/
- OS_STK Mission_Three[Mission_Three_SIZE];//设置一个数组用于存放缓冲数据(入栈时的数据)
- void Mission_Three_Func(void *parameter);//任务声明
-
-
- int main()//一个工程只能有一个main函数
- {
- //优先级分组,代码中只执行一次
- INT8U res;//返回标志
- NVIC_SetPriorityGrouping(5);//优先级分组,组2 101
- Systick_Inti(168);
- Usart1_Init(115200);
-
- OSInit(); // 初始化 uC/OS-II 必须要有
- res=OSTaskCreate(Start_Task,(void *)10,&Start_STask[Start_STACK_SIZE-1],Start_TASK_PRO);//创建初始任务
- if(res==OS_ERR_NONE)
- printf("Start_Task\r\n"); //判断任务创建成功
- OSStart(); //启动多任务内核 调度
- //后面的代码都不会执行
- while(1);
- }
-
- //初始任务,任务中可以创建任务,并且初始任务只执行一次
- void Start_Task(void *parameter)
- {
- INT8U res;//返回标志
- parameter = parameter;//防止编译器报警告
- printf("Perform the initial task\r\n");
- OSStatInit();
-
- res=OSTaskCreate(Mission_One_Func,0,&Mission_One[Mission_One_SIZE-1],Mission_One_PRO);//创建任务
- if(res==OS_ERR_NONE)
- printf("Mission_One_Func\r\n"); //任务创建成功
-
- res=OSTaskCreate(Mission_Two_Func,0,&Mission_Two[Mission_Two_SIZE-1],Mission_Two_PRO);//创建任务
- if(res==OS_ERR_NONE)
- printf("Mission_Two_Func\r\n"); //任务创建成功
-
- res=OSTaskCreate(Mission_Three_Func,0,&Mission_Three[Mission_Three_SIZE-1],Mission_Three_PRO);//创建任务
- if(res==OS_ERR_NONE)
- printf("Mission_Three_Func\r\n"); //任务创建成功
-
- OSTaskDel(OS_PRIO_SELF);//自杀 删除自己
- }
-
- //任务1
- void Mission_One_Func(void *parameter)
- {
- INT8U err;//错误码
- parameter = parameter;//防止编译器报警告
- u32 flag=0;
- while(1)
- {
- printf("Mission_One_Func execute\r\n");
- OSTimeDlyHMSM(0,0,0,500); //500ms 释放CPU
- if(++flag==2)
- {
- flag=0;
- OSTaskSuspend(OS_PRIO_SELF); /* 挂起当前任务 */
- }
- }
- }
- void Mission_Two_Func(void *parameter)
- {
- INT8U err;//错误码
- parameter = parameter;//防止编译器报警告
- u32 flag=0;
- while(1)
- {
- printf("Mission_Two_Func execute\r\n");
- OSTimeDlyHMSM(0,0,0,500); //500ms 释放CPU
- if(++flag==6)
- {
- flag=0;
- OSTaskSuspend(Mission_Three_PRO); /* 挂起任务三 */
- }
- }
- }
- void Mission_Three_Func(void *parameter)
- {
- INT8U err;//错误码
- parameter = parameter;//防止编译器报警告
- u32 flag=0;
- while(1)
- {
- printf("Mission_Three_Func execute\r\n");
- OSTimeDlyHMSM(0,0,0,500); //500ms 释放CPU
- if(++flag==4)
- {
- flag=0;
- OSTaskResume(Mission_One_PRO); /* 唤醒任务一 */
- }
- }
- }
- //任务执行后面只有任务二没有被挂起。主要是为了运用一些常用函数,没有啥意思。
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的使用权。不能用裸机的逻辑去推代码的运。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。