zoukankan      html  css  js  c++  java
  • ucos学习1-Task1

    uCOS的学习,最先接触的肯定都是Task。关于task,最重要的就是理清楚几个概念。

    一、Task由三部分组成:

    1、任务控制块TCB,包含各种task相关的参数和信息。

    2、堆栈。在创建task的时候,会创建堆栈,存放CPU的寄存器。在任务切换的时候,会保存CPU的寄存器。

    3、task的代码,一般就是一个无限循环。一个小点:如果代码中没有delay之类的函数,task有可能永远占用这个CPU,而使得其他task没法跑起来。

    下面是一个简单的例子,显示了几个task相关的函数的调用。

    演示了task1的创建。由task1创建task2,暂停和重启task2。

    task1暂停调度,然后重启调度。

    #include "sys.h"
    #include "delay.h"
    #include "usart.h"
    #include "led.h"
    #include "includes.h"
    
    void task1(void *pdata);
    #define TASK1_PRIO                  10
    #define TASK1_STK_SIZE 64
    
    void task2(void *pdata);
    #define TASK2_PRIO                  11
    #define TASK2_STK_SIZE 64
    
    OS_STK TASK1[TASK1_STK_SIZE];
    OS_STK TASK2[TASK2_STK_SIZE];
    
    
    int main(void)
    {
        delay_init(168);          
        LED_Init();                
        OSInit();
        OSTaskCreate(task1,(void *)0,(OS_STK *)&TASK1[TASK1_STK_SIZE-1],TASK1_PRIO);
        OSStart();
    }
    
    void task1(void *pdata)
    { OS_CPU_SR cpu_sr=0;
        int i=0;
        while(1)
        {
            LED0=0;
            delay_ms(100);
            LED0=1;
            delay_ms(300);
            i++;
            if(i==10)
            {
                OSTaskCreate(task2,(void *)0,(OS_STK *)&TASK2[TASK2_STK_SIZE-1],TASK2_PRIO); //创建task2
            }
            if(i==20)
            {
                OSTaskSuspend(TASK2_PRIO);
            }
            if(i==30)
            {
                OSTaskResume(TASK2_PRIO);
            }
            if(i==40)
            {
                OSSchedLock();
            }
            if(i==50)
            {
                OSSchedUnlock();
            }
            
        }
    }
    
    void task2(void *pdata)
    { OS_CPU_SR cpu_sr=0;
        while(1)
        {
            LED1=0;
            delay_ms(100);
            LED1=1;
            delay_ms(300);
        }
    }
  • 相关阅读:
    React Native 实现MQTT 推送调研 (1)
    bpmn的依赖注入
    vdom diff
    浏览器渲染与event loop
    uni-app 通过后缀名区分不同渠道版本
    网页定宽 栅格布局
    网页顶部菜单导航和左侧菜单导航的区别?
    Android利用tcpdump和wireshark抓取网络数据包
    就算做了
    我眼中的Serverless
  • 原文地址:https://www.cnblogs.com/nasduc/p/5053353.html
Copyright © 2011-2022 走看看