【iCore4 双核心板_uC/OS-II】例程六:信号量——任务同步
一、实验说明:
信号量是一个多任务内核提出的一个协议机构,上一个实验中我们介绍了信号量访问共享资源
的功能,其实信号量最初是用来控制访问共享资源的,它还可以用来同步一个中断服务函数和一个任
务,或者同步一个任务和另一个任务。
二、实验截图:
三、源代码下载链接:
链接:https://pan.baidu.com/s/1bpUaFmB 密码:dwre
四、核心代码:
/* * Name : main * Description : --- * Author : liu. * * History * -------------------- * Rev : 0.00 * Date : 07/12/2017 * * create. * -------------------- */ /*实验现象: 打开串口工具putty.exe,终端显示此时信号量的值为0,按下ARM.KEY后,信号量的值每隔500ms增加1, 当松开ARM.KEY后,信号量的值开始减小,绿色ARM.LED开始闪烁,知道信号量的值减小为0,绿色LED熄灭。 */ int main(void) { system_clock.initialize(); //系统时钟初始化 led.initialize(); //LED初始化 usart6.initialize(115200); //串口初始化 key.initialize(); 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; TaskSem = OSSemCreate(1);//创建信号量 OSStatInit();//初始化统计任务 OS_ENTER_CRITICAL();//关中断 OSTaskCreate(AppTask1_task,(void*)0,(OS_STK*)&AppTask1_TASK_STK[AppTask1_STK_SIZE-1],AppTask1_TASK_PRIO);//创建AppTask1任务 OSTaskCreate(AppTask2_task,(void*)0,(OS_STK*)&AppTask2_TASK_STK[AppTask2_STK_SIZE-1],AppTask2_TASK_PRIO);//创建AppTask2任务 OSTaskSuspend(OS_PRIO_SELF);//挂起start_task任务 OS_EXIT_CRITICAL();//开中断 }
/* * Name : AppTask1_task * Description : --- * Author : liu. * * History * -------------------- * Rev : 0.00 * Date : 07/12/2017 * * create. * -------------------- */ void AppTask1_task(void *pdata) { while(1){ if(ARM_KEY_STATE == KEY_DOWN){ OSSemPost(TaskSem); //发送信号量 } usart6.printf("\x0c"); //清屏 usart6.printf("\033[1;32;40m"); //设置字体终端为绿色 usart6.printf("\r\n Hello, I am iCore4!\r\n\r"); usart6.printf("\r\n The value of Sem: %d\r",TaskSem->OSEventCnt);//打印出信号量的值 OSTimeDlyHMSM(0,0,0,500); //延时500ms } } /* * Name : AppTask2_task * Description : --- * Author : liu. * * History * -------------------- * Rev : 0.00 * Date : 07/12/2017 * * create. * -------------------- */ void AppTask2_task(void *pdata) { u8 err; while(1){ if(ARM_KEY_STATE == KEY_UP){ OSSemPend(TaskSem,0,&err); //请求信号量 LED_GREEN_ON; //绿灯亮 OSTimeDlyHMSM(0,0,0,500); //延时500ms LED_GREEN_OFF; //绿灯灭 OSTimeDlyHMSM(0,0,0,500); //延时500ms }else{ OSTimeDlyHMSM(0,0,0,500); //延时1000ms } } }
iCore4链接: