【iCore4 双核心板_uC/OS-II】例程三:任务的挂起与恢复
一、实验说明:
当一个任务正在运行的时候,由于某种情况可能需要终止运行一段时间,终止的这段时间就是
所谓的任务的挂起,可以由该任务自身或者其他任务来挂起一个任务。当被挂起的任务需要再次运
行的时候,可以恢复被挂起的任务。本实验中红灯和绿灯以固定频率闪烁,当任务寄存器的值达到5
的时候,挂起绿灯闪烁任务,只剩下红灯闪烁,当任务寄存器的值达到10的时候,被挂起的绿灯闪
烁任务恢复,红灯和绿灯又同时闪烁,如此循环往复。
二、实验截图:
三、源代码下载链接:
链接:https://pan.baidu.com/s/1nwdjym1 密码:ugo5
四、核心代码:
/* * Name : main * Description : --- * Author : zh. * * History * -------------------- * Rev : 0.00 * Date : 07/12/2017 * * create. * -------------------- */ /*实验现象: 最开始红灯和绿灯同时以固定频率闪烁,当任务寄存器的值达到5的时候, 挂起绿灯闪烁任务,只剩红灯闪烁;当任务寄存器值达到10的时候,被挂 起的绿灯闪烁任务恢复,红灯和绿灯又同时闪烁,如此循环往复。 */ int main(void) { system_clock.initialize(); //系统时钟初始化 led.initialize(); //LED初始化 usart6.initialize(115200); //串口初始化 usart6.printf("\x0c"); //清屏 usart6.printf("\033[1;32;40m"); //设置字体终端为绿色 usart6.printf("\r\nHello, I am iCore4!\r\n\r\n"); OSInit(); //UCOS初始化 OSTaskCreate(start_task, //创建开始任务 (void*)0, //任务参数 (OS_STK*)&START_TASK_STK[START_STK_SIZE-1], //任务堆栈 START_TASK_PRIO); //任务优先级 OSStart(); //开启UCOS }
/* * Name : start_task * Description : --- * Author : liu. * * History * -------------------- * Rev : 0.00 * Date : 07/12/2017 * * create. * -------------------- */ void start_task(void *pdata) { OS_CPU_SR cpu_sr; OSStatInit();//初始化统计任务 OS_ENTER_CRITICAL();//关中断 OSTaskCreate(led0_task,(void*)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);//创建LED0任务 OSTaskCreate(led1_task,(void*)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);//创建LED1任务 OSTaskCreate(usart_task,(void*)0,(OS_STK*)&USART_TASK_STK[USART_STK_SIZE-1],USART_TASK_PRIO);//创建usart任务 OSTaskSuspend(OS_PRIO_SELF);//挂起start_task任务 OS_EXIT_CRITICAL();//开中断 }
/* * Name : led0_task * Description : --- * Author : liu. * * History * -------------------- * Rev : 0.00 * Date : 07/12/2017 * * create. * -------------------- */ void led0_task(void *pdata) { INT8U err; //定义错误类型 INT8U value; //定义寄存器的值 while(1){ usart6.printf("The task1 is running.\r\n"); value = OSTaskRegGet ( 0, 0, & err ); //获取该任务寄存器的值 if( value < 10 ){ OSTaskRegSet ( 0, 0, ++ value, & err );//寄存器的值加一 }else{ OSTaskRegSet ( 0, 0, 0, & err ); //寄存器值置零 OSTaskResume (LED1_TASK_PRIO); //恢复绿灯LED闪烁的任务 } LED_RED_ON; //红灯亮 OSTimeDlyHMSM(0,0,0,500); //延时500ms LED_RED_OFF; //红灯灭 OSTimeDlyHMSM(0,0,0,500); //延时500ms } } /* * Name : led_task * Description : --- * Author : liu. * * History * -------------------- * Rev : 0.00 * Date : 07/12/2017 * * create. * -------------------- */ void led1_task(void *pdata) { INT8U err; //定义错误类型 INT8U value; //定义寄存器的值 while(1){ usart6.printf("The task2 is running.\r\n"); value = OSTaskRegGet ( 0, 0, & err ); //获取该任务寄存器的值 if ( value < 10 ){ OSTaskRegSet ( 0, 0, ++ value, & err );//寄存器的值加一 }else{ OSTaskRegSet ( 0, 0, 0, & err ); //任务寄存器清0 //寄存器值置零 OSTaskSuspend (LED1_TASK_PRIO); //挂起自身任务 //挂起自身任务 } LED_GREEN_ON; //绿灯亮 OSTimeDlyHMSM(0,0,0,1000); //延时1000ms LED_GREEN_OFF; //绿灯灭 OSTimeDlyHMSM(0,0,0,1000); //延时1000ms } } /* * Name : usart_task * Description : --- * Author : liu. * * History * -------------------- * Rev : 0.00 * Date : 07/12/2017 * * create. * -------------------- */ void usart_task(void *pdata) { double f=0.1; while(1){ usart6.printf("The task3 is running.\r\n"); f+=0.1f; //浮点型运算 usart6.printf("float f=%.4f\r\n",f); //串口输出 OSTimeDlyHMSM(0,0,0,1000); //延时1000ms } }
iCore4链接: