一、实验说明:
前面介绍通过信息传递可以进行任务间的交流,信息也可以直接发送给一个任务,在uC/OS-II中每一个任务在它们内部都有一个消息队列,也即任务消息队列,用户可以直接给一个任务发送消息,不需要额外的消息队列,这样不公优化了代码,而且比用一个单独的外部消息队列更有效率。任务消息队列建立在每一个任务的内部,如下图。
二、实验截图:
三、源代码下载链接:
链接:https://pan.baidu.com/s/1ggDoXYr 密码:lm3y
四、核心代码:
/*
* Name : main
* Description : ---
* Author : liu.
*
* History
* --------------------
* Rev : 0.00
* Date : 07/12/2017
*
* create.
* --------------------
*/
/*实验现象:
打开串口工具putty.exe,终端显示当前消息队列大小,按下ARM.KEY按键,
显示消息队列大小和消息。
*/
int main(void)
{
system_clock.initialize(); //系统时钟初始化
led.initialize(); //LED初始化
usart6.initialize(); //串口初始化
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*), //任务参数
(OS_STK*)&START_TASK_STK[START_STK_SIZE-], //任务堆栈
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; TaskQ = OSQCreate(&msg[], );//创建消息队列 OSStatInit();//初始化统计任务 OS_ENTER_CRITICAL();//关中断 OSTaskCreate(AppTask1_task,(void*),(OS_STK*)&AppTask1_TASK_STK[AppTask1_STK_SIZE-],AppTask1_TASK_PRIO);//创建AppTask1任务
OSTaskCreate(AppTask2_task,(void*),(OS_STK*)&AppTask2_TASK_STK[AppTask2_STK_SIZE-],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)
{
u8 err;
int i = ;
INT8U buf[]; while(){
i++;
buf[] = i;
buf[] = i + ;
if(ARM_KEY_STATE == KEY_DOWN){ //按键按下
err = OSQPost(TaskQ, (void *)&buf[]);//发送消息队列
switch(err){
case OS_ERR_NONE:
break;
case OS_ERR_Q_FULL:
break;
}
}
OSTimeDlyHMSM(,,,); //延时500ms
}
}
/*
* Name : AppTask2_task
* Description : ---
* Author : liu.
*
* History
* --------------------
* Rev : 0.00
* Date : 07/12/2017
*
* create.
* --------------------
*/
void AppTask2_task(void *pdata)
{
u8 err;
INT8U *s; while(){
usart6.printf("The queue size : %d\r\n",((OS_Q*)(TaskQ->OSEventPtr))->OSQEntries);//消息队列当前的大小
s = OSQPend(TaskQ, , &err); //请求消息队列
if(err == OS_ERR_NONE){
usart6.printf("maseege[0] = %d\r\n",s[]);
usart6.printf("maseege[1] = %d\r\n",s[]);
}
OSTimeDlyHMSM(,,,); //延时500ms
}
}
iCore4链接: