UCOSIII(二)LED灯任务闪烁

基本流程:

一共创建3个任务,start_task,led0_task,led1_task,在main函数里边只初始化任务start_task,然后在任务start_task中再创建剩余的两个任务,创建好后就把start_task自身挂起,不再执行。在led0_task和led1_task间,他们是通过延时函数来跳出自身任务,主要是延时函数中包括OSSched(),这个函数的作用就是找到下一个可以执行的任务去执行,这样在led1任务中延时的时间去执行任务二,这样cpu一直在运行中,而不是像裸机时delay就啥也不干,从而提高效率,呈现出类似的并行性。

代码组成:

三个任务的定义:

#define START_TASK_PRIO 3 //define priority
#define START_TASK_STK_SIZE 128 //define the task stack size
OS_TCB START_TASK_TCB; //define task control block
CPU_STK START_TASK_STK[START_TASK_STK_SIZE];//define task stack
void start_task(void *p_arg);//(void *p_arg ) is necessary

#define LED0_TASK_PRIO 4 //define priority
#define LED0_TASK_STK_SIZE 128 //define the task stack size
OS_TCB LED0_TASK_TCB; //define task control block
CPU_STK LED0_TASK_STK[LED0_TASK_STK_SIZE];//define task stack
void led0_task(void *p_arg);//(void *p_arg ) is necessary

#define LED1_TASK_PRIO 5 //define priority
#define LED1_TASK_STK_SIZE 128 //define the task stack size
OS_TCB LED1_TASK_TCB; //define task control block
CPU_STK LED1_TASK_STK[LED0_TASK_STK_SIZE];//define task stack
void led1_task(void *p_arg);//(void *p_arg ) is necessary

主函数:

int main(void)
{
    OS_ERR  err;
    CPU_SR_ALLOC();
    
    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz   
  HAL_Init();                     //初始化HAL库
  delay_init(180);                //初始化延时函数
  uart_init(115200);              //初始化USART
  LED_Init();                     //初始化LED 
  OSInit(&err);
    
    OS_CRITICAL_ENTER();//进入代码临界保护区
    
    OSTaskCreate (&START_TASK_TCB, (CPU_CHAR *)"start_task",start_task,0,START_TASK_PRIO,START_TASK_STK,START_TASK_STK_SIZE/10,START_TASK_STK_SIZE,0, 0,0,OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,&err);
    
    OS_CRITICAL_EXIT();//退出代码临界保护区
    OSStart(&err);      //开启UCOSIII
    while(1);
}

start_task:

void start_task(void *p_arg)
{
    
    OS_ERR  err;
    CPU_SR_ALLOC();
    CPU_Init();
    OS_CRITICAL_ENTER();//进入代码临界保护区
    
    OSTaskCreate (&LED0_TASK_TCB, (CPU_CHAR *)"led0_task",led0_task,0,LED0_TASK_PRIO,LED0_TASK_STK,LED0_TASK_STK_SIZE/10,LED0_TASK_STK_SIZE,0, 0,0,OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,&err);
    OSTaskCreate (&LED1_TASK_TCB, (CPU_CHAR *)"led1_task",led1_task,0,LED1_TASK_PRIO,LED1_TASK_STK,LED1_TASK_STK_SIZE/10,LED1_TASK_STK_SIZE,0, 0,0,OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,&err);
    
    OS_CRITICAL_EXIT();//退出代码临界保护区
    OS_TaskSuspend((OS_TCB*)&START_TASK_TCB,&err);        //挂起开始任务    
  printf("
 start任务完成 
");    
}

led0_task:

void led0_task(void *p_arg)
{
    OS_ERR err;
    p_arg = p_arg;
    while(1)
    {
        printf("
 执行任务1 
");
        LED0=0;    //LED0打开
        OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //延时200ms
        LED0=1;    //LED0关闭
        OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //延时500ms
    }
}

led1_task:

void led1_task(void *p_arg)
{
    p_arg = p_arg;
    while(1)
    {
        printf("
 执行任务2 
");
        LED1=!LED1;
    delay_ms(500);//延时500ms
    }
}
原文地址:https://www.cnblogs.com/CaiFengYuanXing/p/13758018.html