UCOS II 的消息队列

#include "sys.h" 	
#include "delay.h"	
#include "led.h"
#include "includes.h"
//USB相关
#include "usb_lib.h"
#include "hw_config.h"
#include "usbio.h"
#include "malloc.h"	   

extern uint8_t USB_Received_Flag;//USB接收到数据标志位
uint8_t 	Ins_Flag = 0;
uint8_t 	Ins_Count = 0;
uint8_t 	Ins_Table[64];
uint8_t 	Ins_Table_Copy[64];
uint8_t   Ins_Table_Flag = 0;

uint8_t i ;
/************************************************
************************************************/

/UCOSII任务设置///
//START 任务
//设置任务优先级
#define START_TASK_PRIO      			10 //开始任务的优先级设置为最低
//设置任务堆栈大小
#define START_STK_SIZE  				64
//任务堆栈	
OS_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *pdata);	

//触摸屏任务  
#define TOUCH_TASK_PRIO       9
#define	TOUCH_STK_DIZE       64
OS_STK TOUCH_TASK_STK[ TOUCH_STK_DIZE] ;
void TOUCH_TASK(void *pdata);

 			   
//LED0任务  模拟蜂鸣器
//设置任务优先级
#define LED0_TASK_PRIO       			3 
//设置任务堆栈大小
#define LED0_STK_SIZE  		    		64
//任务堆栈	
OS_STK LED0_TASK_STK[LED0_STK_SIZE];
//任务函数
void led0_task(void *pdata);


//LED1任务
//设置任务优先级
#define LED1_TASK_PRIO       			6 
//设置任务堆栈大小
#define LED1_STK_SIZE  					64
//任务堆栈
OS_STK LED1_TASK_STK[LED1_STK_SIZE];
//任务函数
void led1_task(void *pdata);

//主任务  通过查询消息,根据消息,执行LED1 LED0  触摸屏任务等等
#define MAIN_TASK_PRIO       5
#define	MAIN_STK_DIZE       128
OS_STK MAIN_TASK_STK[ MAIN_STK_DIZE] ;
void MAIN_TASK(void *pdata);

//USB数据处理任务
#define USB_DATA_TASK_PRIO       4
#define	USB_DATA_STK_DIZE       64
OS_STK USB_DATA_TASK_STK[ USB_DATA_STK_DIZE] ;
void USB_DATA_TASK(void *pdata);

//消息队列显示
#define QMSGSHOW_TASK_PRIO       7
#define	QMSGSHOW_STK_DIZE       128
OS_STK QMSGSHOW_TASK_STK[ QMSGSHOW_STK_DIZE] ;
void qmsgshow_TASK(void *pdata);


OS_EVENT *mes_key;  //模拟按键邮箱指针
OS_EVENT *sem_beep;  // 蜂鸣器信号量指针
OS_EVENT *q_msg ;  // 消息队列
void * MsgGrp[256];// 消息队列存储地址,最大支持256个消息 
u8 send_data[256] ;  // 要发送的消息

 int main(void)
 {	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
	delay_init();	    //延时函数初始化	  
	LED_Init();		  	//初始化与LED连接的硬件接口
	USB_Interrupts_Config();
	Set_USBClock();
	/* 配置USB D+ 线为全速模式 */
	//USB_Cable_Config2 (ENABLE);	
	USB_Init();	
 my_mem_init(SRAMIN);  //初始化内部内存池
	OSInit();   
 	OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
	OSStart();	  	 
}
	  
//开始任务
void start_task(void *pdata)
{
   OS_CPU_SR cpu_sr=0; // OS_ENTER_CRITICAL();	OS_EXIT_CRITICAL();	 有用到
	pdata = pdata; 
	mes_key = OSMboxCreate( (void *) 0 );  // 创建消息邮箱
	sem_beep = OSSemCreate(0);				 // 创建信号量
	q_msg = OSQCreate(& MsgGrp[0], 256  );  //创建消息队列
//	 OS_Q * pq = (OS_Q *)q_msg->OSEventPtr;
	OSStatInit();         //初始化CPU统计任务.这里会延时 1 秒钟左右 //比如得到CPU使用率
  OS_ENTER_CRITICAL();			//进入临界区(无法被中断打断)    
 	OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);						   
// 	OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);	
	OSTaskCreate(USB_DATA_TASK,(void *)0, (OS_STK*)& USB_DATA_TASK_STK[USB_DATA_STK_DIZE-1], USB_DATA_TASK_PRIO);
	OSTaskCreate(TOUCH_TASK,(void *)0, (OS_STK*)& TOUCH_TASK_STK[TOUCH_STK_DIZE-1], TOUCH_TASK_PRIO);
	OSTaskCreate(qmsgshow_TASK,(void *)0, (OS_STK*)& QMSGSHOW_TASK_STK[QMSGSHOW_STK_DIZE-1], QMSGSHOW_TASK_PRIO);
	
//	OSTaskCreate(MAIN_TASK,(void *)0,(OS_STK*)&MAIN_TASK_STK[MAIN_STK_DIZE-1],MAIN_TASK_PRIO);	
	OSTaskSuspend(LED0_TASK_PRIO );
  OSTaskSuspend(QMSGSHOW_TASK_PRIO );
	OSTaskSuspend(START_TASK_PRIO);	//挂起起始任务.
	OS_EXIT_CRITICAL();				//退出临界区(可以被中断打断)
}


void qmsgshow_TASK(void *pdata)
{
	u8 *p; u8 err; u8 i = 0 ;
	OS_Q_DATA query;
		while(1)
	{
		OSQQuery(q_msg ,& query );
		USB_SendData32A( query.OSNMsgs ,"L");

			delay_ms(100);		
			p = OSQPend(q_msg , 0 , &err  );	
	//		USB_SendData32A( *p ,"Y");
			USB_SendData( p ,13);
		
		delay_ms(100);
	}
}
	
//用于给消息队列发送消息
void TOUCH_TASK(void *pdata)
{
	u8 *p; u8 err;
	
	static u8 msg_cnt = 0; //msg 编号
	p = mymalloc( SRAMIN,13); // //申请 13 个字节的内存 //不能用局部变量传到消息队列,除非每次都malloc  空间
	while(1)
	{
		if(p)
		{
			msg_cnt++ ;
			send_data[msg_cnt ] = msg_cnt ;
			USB_SendData32A( msg_cnt ,"S");
//			delay_ms(100);
//			sprintf((char*)p,"ALIENTEK %03dA",msg_cnt);			
//			sprintf((char*)p,"%03d",msg_cnt);
			err = OSQPost( q_msg , send_data + msg_cnt ); // 先进先出FIFO
			if( err !=  OS_ERR_NONE)
				{
//					USB_SendData32A( msg_cnt ,"S");
					OSTaskSuspend( QMSGSHOW_TASK_PRIO);
				}
		}		
		delay_ms(500);
	}
}

//LED0任务 //测试,提示程序运行状态
void led0_task(void *pdata)
{	 	
	u8 *p; u8 err; 
		while(1)
	{
		OS_Q_DATA query;
		OSQQuery(q_msg ,& query );
		USB_SendData32A( query.OSNMsgs ,"T");
//		p = OSQAccept(q_msg  , &err);
		p = OSQPend(q_msg , 0 , &err  );
		delay_ms(200);
		USB_SendData32A( *p ,"Y");
//			USB_SendData( p ,12);
		
		delay_ms(100);
	}
}

//LED1任务  //
void led1_task(void *pdata)
{	  
	
	static uint16_t i=0;
	while(1)
	{
		i = ( i+1 + 20) % 20 ; // 模运算 i = 0~19循环
	//	USB_SendData32A( i ,"R");
//		LED1=0;
//		delay_ms(3);
//		LED1=1;
		delay_ms(500);
	};
}


//USB_DATA_TASK任务 、、测试按键扫描任务,优先级最高,得到消息通过消息邮箱发送出去
void USB_DATA_TASK(void *pdata)
{	  
	u8 key;
	while(1)
	{
		if( Ins_Flag == 2){
			Ins_Table_Flag = 1;
			for( i = 0 ; i < 64 ; i++){
				Ins_Table_Copy[i ] = Ins_Table[i];
			}			
			Ins_Table_Flag = 0;
			
			switch(Ins_Table_Copy[1] ){
				case 'C' :USB_SendData( (uint8_t *) "CE",sizeof("CE")/sizeof(uint8_t));  break;
				case 'D' : OSTaskSuspend(LED0_TASK_PRIO );  break;  // 挂起任务
				case 'F' : OSTaskResume(LED0_TASK_PRIO );  break;  // 恢复任务
				case 'G' : OSTaskSuspend(TOUCH_TASK_PRIO ) ; break ; //挂起任务
				case 'K' : OSTaskResume(TOUCH_TASK_PRIO); break ;
//				case 'G' : OSTaskDelReq(LED1_TASK_PRIO ) ; break ; //发送删除LED1任务请求
//				case 'K' : OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);
										break;
				case 'L' : OSTaskSuspend(QMSGSHOW_TASK_PRIO );  break;  // 挂起任务
				case 'l' : OSTaskResume(QMSGSHOW_TASK_PRIO );  break;  // 恢复任务
				
				//模拟用消息邮箱发送数据
				case 'T' : key  =  1 ;OSMboxPost(mes_key ,  (void *)key );  break; 
				case 'Y' : key  =  2 ;OSMboxPost(mes_key , (void *)key );  break; 
				case 'U' : key  =  3 ;OSMboxPost(mes_key , (void *)key );  break; 
				case 'I' : key  =  4 ;OSMboxPost(mes_key , (void *)key );  break; 
				case 'O' : key  =  5 ;OSMboxPost(mes_key , (void *)key );  break; 
				default : USB_SendData( (uint8_t *) "PE",sizeof("PE")/sizeof(uint8_t));  break;
			}
			
			Ins_Flag = 0 ;
		}
		delay_ms(10);
	};
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值