这里不讲解代码,只讲如何使用。
目录
任务管理函数:
OSInit()
原型:void OSInit(void);
OSStart()
原型:void OSStart(void);
作用: 任务调度,OSStart后面的代码都不执行
OSStatInit()
原型:void OSStatInit (void);
OSTaskChangePrio ()
原型:INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio);
作用:改变一个任务的优先级
注意:任务执行过程中可以更改优先级,但是所更改的优先级不能存在使用,否则报错
OSTaskCreate()
原型:INT8U OSTaskCreate(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio);
OSTaskCreateExt ()
作用:创建一个新任务
注意:和OSTaskCreate()一样,但是返回值更多
OSTaskDel ()
原型:INT8U OSTaskDel(INT8U prio);
作用:删除任务,删除后优先级可以重新创建任务使用(删除后优先级退出队列)
OSTaskDelReq()
原型:INT8U OSTaskDelReq(INT8U prio);
作用:删除任务,可以删除自身或者其他任务,输入优先级即可
注意:删除自身用 OS_PRIO_SELF
OSTaskNameGet()
作用:获取指定优先级任务名
OSTaskNameSet()
作用:设置任务名
OSTaskResume()
原型:INT8U OSTaskResume(INT8U prio);
OSTaskSuspend()
原型:INT8U OSTaskSuspend ( INT8U prio);
作用:无条件挂起一个任务(休眠不再参与任务调度)
注意:挂起任务还可以唤醒,还在任务队列之中,与删除不同。
OSTaskStkChk()
原型:INT8U OSTaskStkChk(INT8U prio, OS_STK_DATA *p_stk_data);
作用:检查任务堆栈状态
注意:任务栈很重要,如果设置小了,可能造成程跑飞。
OSTaskQuery ()
作用:获取任务信息
创建任务一般来说我会先创建一个起始任务,然后在起始任务中创建其他任务,再把起始任务删除。
示例代码
#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的使用权。不能用裸机的逻辑去推代码的运。