一、实验说明:
消息邮箱是uC/OS-II中的另一种通信机制,可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量。通常该指针指向一个包含了“消息”的特定数据结构。
二、实验截图:
三、源代码下载链接:
链接: 密码:psk3
四、核心代码:
/* * Name : main * Description : --- * Author : liu. * * History * -------------------- * Rev : 0.00 * Date : 07/12/2017 * * create. * -------------------- *//*实验现象: 打开串口工具putty.exe,按下ARM.KEY按键,终端显示此时任务1的运行次数;松开按键,停止显示。 */int main(void){ system_clock.initialize(); //系统时钟初始化 led.initialize(); //LED初始化 usart6.initialize(115200); //串口初始化 key.initialize(); usart6.printf("\x0c"); //清屏 usart6.printf("\033[1;32;40m"); //设置字体终端为绿色 usart6.printf("\r\n Hello, I am iCore4!\r\n\r\n"); LED_RED_ON; 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; TaskMbox = OSMboxCreate(0);//创建邮箱 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){ int timer = 0; char cnt[20]; while(1){ if(ARM_KEY_STATE == KEY_DOWN){ timer++; sprintf(cnt,"%d",timer); //数据转换 OSMboxPost(TaskMbox, &cnt); //发送邮箱 } 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; u8 *s; while(1){ s = (INT8U *)OSMboxPend(TaskMbox,OS_TICKS_PER_SEC,&err); if(err == OS_ERR_NONE){ usart6.printf("\r\nThe number of task1 : %s\r\n",s); //打印出邮箱的值 } OSTimeDlyHMSM(0,0,0,500); //延时500ms }}
iCore4链接: