2.消息邮箱操作步骤
1.定义消息邮箱
OS_EVENT * msg_key; //定义按键消息邮箱事件块指针
2.创建消息邮箱
msg_key=OSMboxCreate((void*)0); //创建消息邮箱,定义msg初值为NULL
3请求消息邮箱
//在主任务中请求消息邮箱,切等待时间为10ms,根据消息邮箱中的键值做出不同的动作
void main_task(void *pdata)
{
u32 key=0;
u8 err;
u8 semmask=0;
u8 tcnt=0;
while(1)
{
key=(u32)OSMboxPend(msg_key,10,&err); //请求邮箱函数,请求消息邮箱指针为msg_key,等待时间为100ms
switch(key)
{
case 1://控制DS1
LED1=!LED1;
break;
case 2://发送信号量
semmask=1;
OSSemPost(sem_beep);//发送信号量函数,释放信号量,释放信号量后UART_TASK任务才能执行
OSMutexPost(sem_mutex);//发送互斥型信号量
break;
case 3://清除
LCD_Fill(0,121,lcddev.width,lcddev.height,WHITE);
break;
case 4://校准
OSTaskSuspend(TOUCH_TASK_PRIO); //挂起触摸屏任务
if((tp_dev.touchtype&0X80)==0)TP_Adjust();
OSTaskResume(TOUCH_TASK_PRIO); //解挂
ucos_load_main_ui(); //重新加载主界面
break;
}
if(semmask||sem_beep->OSEventCnt)//需要显示sem,即此时的信号量计数器值不为0
{
LCD_ShowxNum(192,50,sem_beep->OSEventCnt,3,16,0X80);//显示信号量的值
if(sem_beep->OSEventCnt==0)semmask=0; //停止更新
}
if(tcnt==50)//0.5秒更新一次CPU使用率
{
tcnt=0;
POINT_COLOR=BLUE;
LCD_ShowxNum(192,30,OSCPUUsage,3,16,0); //显示CPU使用率
}
tcnt++;
delay_ms(10);
}
}
4.发生消息邮箱
//在按键扫描任务中发生消息邮箱
void key_task(void *pdata)
{
u8 key;
while(1)
{
key=KEY_Scan(0);
if(key)OSMboxPost(msg_key,(void*)key);//向邮箱发送消息函数,把当前KEY值传送到邮箱当中,在main_task中查询该值,以实现KEY任务与MAINR任务之间的通信
delay_ms(10);
}
}
5.查询邮箱的状态
INT8U OSMboxQuery(
OS_EVENT *pevent, //消息邮箱指针
SO_MBOX_DATA *pdata //存放邮箱消息的结构
)
SO_MBOX_DATA 结构如下:
typedef struct
{
void *OSMsg;
INT8U OSEventTb1[OS_EVENT_TBL_SIZE];
INTU8 OSEventGrp;
}SO_MBOX_DATA
6.删除邮箱
OS_EVENT *OSboxDel(
OS_EVENT *pevent, //消息邮箱指针
INT8U opt, //删除选项
INT8U *err //错误信息
)
|