第六七天  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]
  |