zoukankan      html  css  js  c++  java
  • 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
        }
    }
  • 相关阅读:
    对Promise的研究4
    对Promise的研究3
    对Promise的研究2
    对promise的研究1
    数据结构_栈
    数据结构_队列(普通队列和双端队列)
    数据结构_链表(单链表,单向循环链表,双链表)
    数据库进行参数化,查询一行或多行语句
    数据库基础应用
    选择排序
  • 原文地址:https://www.cnblogs.com/CaiFengYuanXing/p/13758018.html
Copyright © 2011-2022 走看看