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);
    }
}
原文地址:https://www.cnblogs.com/nasduc/p/5053353.html