基本流程:
一共创建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 } }