第六七天 2015年10月02日 周五 例程:UCOSII实验(八)
注:此楼层简单总结开发指南中UCOSII实验2和实验3的程序。原本为了保持更新的顺序相关,计划留楼层当天晚上更新,但没有执行,实际更新事件2015年10月05日 17:00:17,但更新时间仍按预期。
一、UCOSII实验2-信号量和邮箱
1.首先定义两个指针
[mw_shl_code=c,true]OS_EVENT * msg_key; //按键邮箱事件块指针
OS_EVENT * sem_beep; //蜂鸣器信号量指针 [/mw_shl_code]
2.等待信号量
[mw_shl_code=c,true]OSSemPend(sem_beep,0,&err); //等待信号量[/mw_shl_code]
发送信号量
[mw_shl_code=c,true]OSSemPost(sem_beep); //发送信号量[/mw_shl_code]
3.等待消息
[mw_shl_code=c,true]key=(u32)OSMboxPend(msg_key,10,&err);[/mw_shl_code]
发送消息
[mw_shl_code=c,true]OSMboxPost(msg_key,(void*)key);//发送消息[/mw_shl_code]
4.挂起任务
[mw_shl_code=c,true]OSTaskSuspend(TOUCH_TASK_PRIO); //挂起触摸屏任务 [/mw_shl_code]
恢复任务
[mw_shl_code=c,true]OSTaskResume(TOUCH_TASK_PRIO); //解挂[/mw_shl_code]
二、UCOSII实验3-消息队列、信号量集和软件定时器
1.全局变量定义
[mw_shl_code=c,true]OS_EVENT * msg_key; //按键邮箱事件块
OS_EVENT * q_msg; //消息队列
OS_TMR * tmr1; //软件定时器1
OS_TMR * tmr2; //软件定时器2
OS_TMR * tmr3; //软件定时器3
OS_FLAG_GRP * flags_key; //按键信号量集
void * MsgGrp[256]; //消息队列存储地址,最大支持256个消息[/mw_shl_code]
[mw_shl_code=c,true] msg_key=OSMboxCreate((void*)0); //创建消息邮箱
q_msg=OSQCreate(&MsgGrp[0],256); //创建消息队列
flags_key=OSFlagCreate(0,&err); //创建信号量集 [/mw_shl_code]
2.请求消息队列
[mw_shl_code=c,true]p=OSQPend(q_msg,0,&err);//请求消息队列[/mw_shl_code]
发送消息队列
[mw_shl_code=c,true]err=OSQPost(q_msg,p); //发送队列[/mw_shl_code]
3.等待消息
[mw_shl_code=c,true]key=(u32)OSMboxPend(msg_key,10,&err); [/mw_shl_code]
发送消息
[mw_shl_code=c,true]OSMboxPost(msg_key,(void*)key);//发送消息[/mw_shl_code]
4.等待信号量
[mw_shl_code=c,true]flags=OSFlagPend(flags_key,0X001F,OS_FLAG_WAIT_SET_ANY,0,&err);//等待信号量[/mw_shl_code]
发送信号量
[mw_shl_code=c,true]OSFlagPost(flags_key,1<<(key-1),OS_FLAG_SET,&err);//设置对应的信号量为1[/mw_shl_code]
5.定时器,回调函数
[mw_shl_code=c,true]//软件定时器1的回调函数
//每100ms执行一次,用于显示CPU使用率和内存使用率
void tmr1_callback(OS_TMR *ptmr,void *p_arg)
{
static u16 cpuusage=0;
static u8 tcnt=0;
POINT_COLOR=BLUE;
if(tcnt==5)
{
LCD_ShowxNum(182,10,cpuusage/5,3,16,0); //显示CPU使用率
cpuusage=0;
tcnt=0;
}
cpuusage+=OSCPUUsage;
tcnt++;
LCD_ShowxNum(182,30,my_mem_perused(SRAMIN),3,16,0); //显示内存使用率
LCD_ShowxNum(182,50,((OS_Q*)(q_msg->OSEventPtr))->OSQEntries,3,16,0X80);//显示队列当前的大小
}[/mw_shl_code]
创建定时器
[mw_shl_code=c,true]tmr1=OSTmrCreate(10,10,OS_TMR_OPT_PERIODIC,(OS_TMR_CALLBACK)tmr1_callback,0,"tmr1",&err); //100ms执行一次[/mw_shl_code]
启动定时器
[mw_shl_code=c,true]OSTmrStart(tmr1,&err);//启动软件定时器1[/mw_shl_code]
关闭定时器
[mw_shl_code=c,true]OSTmrStop(tmr1,OS_TMR_OPT_NONE,0,&err); //关闭软件定时器1[/mw_shl_code]
重新开启定时器
[mw_shl_code=c,true]OSTmrStart(tmr1,&err); //重新开启软件定时器1[/mw_shl_code]
|