• UCOSIII再学习——1


    创建一个任务:
    //创建主任务
    OSTaskCreate((OS_TCB 	* )&Main_TaskTCB,		
    			 (CPU_CHAR	* )"Main task", 		
    			 (OS_TASK_PTR )main_task, 			
    			 (void		* )0,					
    			 (OS_PRIO	  )MAIN_TASK_PRIO,     
    			 (CPU_STK   * )&MAIN_TASK_STK[0],	//堆栈地址起始	
    			 (CPU_STK_SIZE)MAIN_STK_SIZE/10,	//堆栈深度通常为堆栈大小的十分之一	
    			 (CPU_STK_SIZE)MAIN_STK_SIZE,		//堆栈大小		
    			 (OS_MSG_QTY  )0,					
    			 (OS_TICK	  )0,  					
    			 (void   	* )0,					
    			 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
    			 (OS_ERR 	* )&err);
    			 
    
    
    创建一个定时器	  :OS_TMR		tmr1;	//定义一个定时器
    //创建定时器1(当有时间延迟时,执行完一次时间延迟之后,每个周期再按照时间周期执行,单次还是循环则由周期模式决定)
    OSTmrCreate((OS_TMR		*)&tmr1,		//定时器1
    			(CPU_CHAR	*)"tmr1",		//定时器名字
    			(OS_TICK	 )0,			//0ms			时间延迟
    			(OS_TICK	 )50,          	//50*10=500ms	时间周期
    			(OS_OPT		 )OS_OPT_TMR_PERIODIC, //周期模式
    			(OS_TMR_CALLBACK_PTR)tmr1_callback,//定时器1回调函数
    			(void	    *)0,			//参数为0
    			(OS_ERR	    *)&err);		//返回的错误码
    
    	定时器回调函数:
    	void tmr1_callback(void *p_tmr,void *p_arg)
    	
    
    创建一个互斥信号量:OS_MUTEX	TEST_MUTEX;						//定义一个互斥信号量
    创建一个信号量:	OS_SEM		MY_SEM;							//定义一个信号量,用于访问共享资源
    请求信号量:OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); 	//请求信号量,此时别的任务不能访问共享资源
    			memcpy(share_resource,task2_str,sizeof(task2_str));	//向共享资源区拷贝数据,将数据拷贝到共享资源区域
    发送信号量:OSSemPost (&MY_SEM,OS_OPT_POST_1,&err);				//发送信号量,释放完成之后别的任务才能访问
    
    OSSemPost发送一次信号量MY_SEM.Ctr++;
    OSSemPend请求一次信号量MY_SEM.Ctr--;当OSSemPend请求一次后,当再次运行到到该函数时,如果没有OSSemPost则阻塞到该地方,
    
    任务内嵌信号量:
    请求信号量:	OSTaskSemPend(0,OS_OPT_PEND_BLOCKING,0,&err);			//请求任务内建的信号量
    发送信号量:	OSTaskSemPost(&Task2_TaskTCB,OS_OPT_POST_NONE,&err);	//使用系统内建信号量向任务task2发送信号量
    
    
    创建一个消息队列  :OS_Q 		DATA_Msg;				//定义一个消息队列,用于发送数据
    消息队列剩余的个数:(总的-用的)DATA_Msg.MsgQ.NbrEntriesSize-DATA_Msg.MsgQ.NbrEntries
    发送消息:
    	OSQPost((OS_Q*		)&KEY_Msg,		
    			(void*		)&key,
    			(OS_MSG_SIZE)1,
    			(OS_OPT		)OS_OPT_POST_FIFO,
    			(OS_ERR*	)&err);
    请求消息:
    	//请求消息KEY_Msg
    	key=OSQPend((OS_Q*			)&KEY_Msg,   
    				(OS_TICK		)0,
    				(OS_OPT			)OS_OPT_PEND_BLOCKING,
    				(OS_MSG_SIZE*	)&size,		
    				(CPU_TS*		)0,
    				(OS_ERR*		)&err);
    
    事件标志组:
    #define KEY0_FLAG		0x01
    #define KEY1_FLAG		0x02
    #define KEYFLAGS_VALUE	0X00						
    OS_FLAG_GRP	EventFlags;		//定义一个事件标志组
    
    	flags_num=OSFlagPost((OS_FLAG_GRP*)&EventFlags,
    						 (OS_FLAGS	  )KEY0_FLAG,
    						 (OS_OPT	  )OS_OPT_POST_FLAG_SET,
    						 (OS_ERR*	  )&err);
    	flags_num=OSFlagPost((OS_FLAG_GRP*)&EventFlags,
    						 (OS_FLAGS	  )KEY1_FLAG,
    						 (OS_OPT	  )OS_OPT_POST_FLAG_SET,
    						 (OS_ERR*     )&err);
    	OSFlagPend((OS_FLAG_GRP*)&EventFlags,
    			   (OS_FLAGS	)KEY0_FLAG+KEY1_FLAG,
    			   (OS_TICK     )0,
    			   (OS_OPT	    )OS_OPT_PEND_FLAG_SET_ALL+OS_OPT_PEND_FLAG_CONSUME,
    			   (CPU_TS*     )0,
    			   (OS_ERR*	    )&err);
    
  • 相关阅读:
    约瑟夫问题的解法集锦
    java调用com组件将office文件转换成pdf
    hdu(1069)——Monkey and Banana(LIS变形)
    Unix网络编程之环境搭建
    atitit. java queue 队列体系and自己定义基于数据库的队列总结o7t
    怎样使Dialog像Activity一样随心所欲的使用?
    获取全部分组中某列最大的行
    Class C++
    spring mvc +Mybatis3.1 整合的时候异常
    Linux 编译C++ 与 设置 Vim
  • 原文地址:https://www.cnblogs.com/hhsxy/p/14018396.html
Copyright © 2020-2023  润新知