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); } }