UCOSII任务管理与创建任务

8 篇文章 0 订阅
5 篇文章 2 订阅

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

目录

任务管理函数:

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);

作用:获取任务信息

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

示例代码

#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的使用权。不能用裸机的逻辑去推代码的运。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小刘刘的奇妙冒险

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值