ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

UCOSIII(一)LED灯交替闪烁

2020-10-01 16:04:17  阅读:279  来源: 互联网

标签:UCOSIII TASK LED void STK task OS 闪烁 define


基本流程:

一共创建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("\r\n start任务完成 \r\n");    
}

 

 

led0_task:

void led0_task(void *p_arg)
{
    OS_ERR err;
    p_arg = p_arg;
    while(1)
    {
        printf("\r\n 执行任务1 \r\n");
        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("\r\n 执行任务2 \r\n");
        LED1=!LED1;
    delay_ms(500);//延时500ms
    }
}

 

标签:UCOSIII,TASK,LED,void,STK,task,OS,闪烁,define
来源: https://www.cnblogs.com/CaiFengYuanXing/p/13758018.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有