ucosii 消息队列的应用

87 篇文章 1 订阅
38 篇文章 0 订阅

       由于某个项目做二次开发,别人用的是UCOS这个嵌入式操作系统.也因为产品的消息处理的需求,所以考虑使用ucos的消息队列方式来实现功能.感觉ucos跟wince或者windows下的消息使用方式还是挺类似.不知道是不是由于都是属于消息队列的范畴的原因.

      关于ucos的原理,网上有很多资料都有介绍,这里也不过多的介绍.直接贴结果与代码。

      先看运行结果吧:

RecvMsqTask is PID == 01 data(02) ===> [  1  ]
RecvMsqTask is PID == 02 data(03) ===> [  11  ]
RecvMsqTask is PID == 03 data(04) ===> [  111  ]
RecvMsqTask is PID == 04 data(05) ===> [  1111  ]
RecvMsqTask is PID == 05 data(06) ===> [  11111  ]
RecvMsqTask is PID == 06 data(07) ===> [  111111  ]
RecvMsqTask is PID == 07 data(08) ===> [  1111111  ]
RecvMsqTask is PID == 08 data(09) ===> [  11111111  ]
RecvMsqTask is PID == 09 data(10) ===> [  111111111  ]
RecvMsqTask is PID == 00 data(11) ===> [  1111111111  ]
RecvMsqTask is PID == 01 data(12) ===> [  11111111111  ]
RecvMsqTask is PID == 02 data(13) ===> [  111111111111  ]
RecvMsqTask is PID == 03 data(14) ===> [  1111111111111  ]
RecvMsqTask is PID == 04 data(15) ===> [  11111111111111  ]
RecvMsqTask is PID == 05 data(16) ===> [  111111111111111  ]
RecvMsqTask is PID == 06 data(17) ===> [  1111111111111111  ]
RecvMsqTask is PID == 07 data(18) ===> [  11111111111111111  ]
RecvMsqTask is PID == 08 data(19) ===> [  111111111111111111  ]
RecvMsqTask is PID == 09 data(20) ===> [  1111111111111111111  ]
RecvMsqTask is PID == 00 data(21) ===> [  11111111111111111111  ]
RecvMsqTask is PID == 01 data(22) ===> [  111111111111111111111  ]
RecvMsqTask is PID == 02 data(23) ===> [  1111111111111111111111  ]
RecvMsqTask is PID == 03 data(24) ===> [  11111111111111111111111  ]
RecvMsqTask is PID == 04 data(25) ===> [  111111111111111111111111  ]
RecvMsqTask is PID == 05 data(26) ===> [  1111111111111111111111111  ]
RecvMsqTask is PID == 06 data(27) ===> [  11111111111111111111111111  ]
RecvMsqTask is PID == 07 data(28) ===> [  111111111111111111111111111  ]
RecvMsqTask is PID == 08 data(29) ===> [  1111111111111111111111111111  ]
RecvMsqTask is PID == 09 data(30) ===> [  11111111111111111111111111111  ]
RecvMsqTask is PID == 00 data(31) ===> [  111111111111111111111111111111  ]
RecvMsqTask is PID == 01 data(32) ===> [  1111111111111111111111111111111  ]
RecvMsqTask is PID == 02 data(33) ===> [  11111111111111111111111111111111  ]
RecvMsqTask is PID == 03 data(34) ===> [  111111111111111111111111111111111  ]
RecvMsqTask is PID == 04 data(35) ===> [  1111111111111111111111111111111111  ]
RecvMsqTask is PID == 05 data(36) ===> [  11111111111111111111111111111111111  ]
RecvMsqTask is PID == 06 data(37) ===> [  111111111111111111111111111111111111  ]
RecvMsqTask is PID == 07 data(38) ===> [  1111111111111111111111111111111111111  ]
RecvMsqTask is PID == 08 data(39) ===> [  11111111111111111111111111111111111111  ]
RecvMsqTask is PID == 09 data(40) ===> [  111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 00 data(41) ===> [  1111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 01 data(42) ===> [  11111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 02 data(43) ===> [  111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 03 data(44) ===> [  1111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 04 data(45) ===> [  11111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 05 data(46) ===> [  111111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 06 data(47) ===> [  1111111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 07 data(48) ===> [  11111111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 08 data(49) ===> [  111111111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 09 data(50) ===> [  1111111111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 00 data(51) ===> [  11111111111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 01 data(52) ===> [  111111111111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 02 data(53) ===> [  1111111111111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 03 data(54) ===> [  11111111111111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 04 data(55) ===> [  111111111111111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 05 data(56) ===> [  1111111111111111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 06 data(57) ===> [  11111111111111111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 07 data(58) ===> [  111111111111111111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 08 data(59) ===> [  1111111111111111111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 09 data(60) ===> [  11111111111111111111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 00 data(61) ===> [  111111111111111111111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 01 data(62) ===> [  1111111111111111111111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 02 data(63) ===> [  11111111111111111111111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 03 data(64) ===> [  111111111111111111111111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 04 data(65) ===> [  1111111111111111111111111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 05 data(66) ===> [  11111111111111111111111111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 06 data(67) ===> [  111111111111111111111111111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 07 data(68) ===> [  1111111111111111111111111111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 08 data(69) ===> [  11111111111111111111111111111111111111111111111111111111111111111111  ]
RecvMsqTask is PID == 09 data(70) ===> [  111111111111111111111111111111111111111111111111111111111111111111111  ]

接下来,看一下代码 ,usos的应用代码:

/*
*********************************************************************************************************
*                                            EXAMPLE CODE
*
*                          (c) Copyright 2009-2011; Micrium, Inc.; Weston, FL
*
*               All rights reserved.  Protected by international copyright laws.
*
*               Please feel free to use any application code labeled as 'EXAMPLE CODE' in
*               your application products.  Example code may be used as is, in whole or in
*               part, or may be used as a reference only.
*
*               Please help us continue to provide the Embedded community with the finest
*               software available.  Your honesty is greatly appreciated.
*
*               You can contact us at www.micrium.com.
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*
*                                          APPLICATION CODE
*
*                                          Microsoft Windows
*
* Filename      : app.c
* Version       : V1.00
* Programmer(s) : JJL
*                 FGK
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                             INCLUDE FILES
*********************************************************************************************************
*/

#include <includes.h>


/*
*********************************************************************************************************
*                                             LOCAL DEFINES
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                            LOCAL VARIABLES
*********************************************************************************************************
*/

static  CPU_STK  AppTaskStartStk[APP_TASK_START_STK_SIZE];


/*
*********************************************************************************************************
*                                         FUNCTION PROTOTYPES
*********************************************************************************************************
*/

static  void  AppTaskStart(void  *p_arg);


/*
*********************************************************************************************************
*                                                main()
*
* Description : This is the standard entry point for C code.  It is assumed that your code will call
*               main() once you have performed all necessary initialization.
*
* Argument(s) : none.
*
* Return(s)   : none.
*********************************************************************************************************
*/

int  main (void)
{
    OSInit();                                                   /* Init uC/OS-II.                                       */

    OSTaskCreateExt((void(*)(void *))AppTaskStart,              /* Create the start task                                */
        (void          *) 0,
        (OS_STK        *)&AppTaskStartStk[APP_TASK_START_STK_SIZE - 1],
        (INT8U          ) APP_TASK_START_PRIO,
        (INT16U         ) APP_TASK_START_PRIO,
        (OS_STK        *)&AppTaskStartStk[0],
        (INT32U         ) APP_TASK_START_STK_SIZE,
        (void          *) 0,
        (INT16U         )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));

    OSStart();                                                  /* Start multitasking (i.e. give control to uC/OS-II).  */
}


/*
*********************************************************************************************************
*                                          STARTUP TASK
*
* Description : This is an example of a startup task.  As mentioned in the book's text, you MUST
*               initialize the ticker only once multitasking has started.
*
* Argument(s) : p_arg       is the argument passed to 'AppTaskStart()' by 'OSTaskCreate()'.
*
* Return(s)   : none.
*
* Note(s)     : (1) The first line of code is used to prevent a compiler warning because 'p_arg' is not
*                   used.  The compiler should not generate any code for this statement.
*********************************************************************************************************
*/

#define TASK_STK_SIZE       512  
static OS_STK Task1_Stk[TASK_STK_SIZE];
static OS_STK Task2_Stk[TASK_STK_SIZE];
#define	MY_MALLOC				malloc
#define	MY_FREE					free

typedef unsigned   char    u8;    /* Unsigned 8 bit quantity         */
typedef signed     char    s8;    /* Signed    8 bit quantity        */
typedef unsigned   short   u16;   /* Unsigned 16 bit quantity        */
typedef signed     short   s16;   /* Signed   16 bit quantity        */
typedef unsigned   long    u32;   /* Unsigned 32 bit quantity        */
typedef signed     long    s32;   /* Signed   32 bit quantity        */


#define MSQ_SIZE_MAX				(30)	//消息队列的大小
#define MSQ_WAIT_TIMEOUT			(50)	//等待TIMEOUT的时间


#define SENDER_ID_LENGTH			(8)
typedef struct{
	u8 uSenderId[SENDER_ID_LENGTH]; //发送者的ID
	u8 ePID;				//事件的PID
	u8 *pData;				//发送的内容
	u32 uSize;				//发送内容的长度
}MSG_INFO,*LPMSG_INFO;

OS_EVENT *g_QSem;
void  *g_QMsgTbl[MSQ_SIZE_MAX];

static void  RecvMsqTask(void)
{
	u8 uErr = 0;
	APP_TRACE_DBG(("RecvMsqTask is Running...\n\r"));

	while (1)
	{
		LPMSG_INFO pMsg = (LPMSG_INFO)OSQPend(g_QSem, MSQ_WAIT_TIMEOUT, &uErr);
		switch (uErr)
		{
		case OS_ERR_NONE://正常接收到一个消息队列
			{
				//APP_TRACE_DBG(("RecvMsqTask is OS_ERR_NONE\n\r"));
				switch (pMsg->ePID)
				{
				default:
					if (pMsg->pData && pMsg->uSize != 0)
					{
						APP_TRACE_DBG(("RecvMsqTask is PID == %02d data(%02d) ===> [  %s  ] \r\n", pMsg->ePID, pMsg->uSize, (char*)pMsg->pData));
						MY_FREE(pMsg->pData);
						pMsg->pData = NULL;
					}
					break;
				}
				MY_FREE(pMsg);
			}
			break;
		case OS_ERR_TIMEOUT://接收数据超时
			APP_TRACE_DBG(("RecvMsqTask is OS_ERR_TIMEOUT \n\r"));
			break;
		}
	}
}


static void  PostMsqTask(void)
{
	LPMSG_INFO pMsgInfo = NULL;
	u8 uErr = 0;
	APP_TRACE_DBG(("PostMsqTask is Running...\n\r"));
	 u8 len = 1;
	while (1)
	{
		pMsgInfo = (LPMSG_INFO)MY_MALLOC(sizeof(MSG_INFO));
		if (pMsgInfo)
		{
			/*测试代码*/
			pMsgInfo->pData = MY_MALLOC(len + 1);
			if (pMsgInfo->pData)
			{
				memset(pMsgInfo->pData,0x31, len);
				pMsgInfo->pData[len] = 0;
				pMsgInfo->ePID = len % 10;
				pMsgInfo->uSize = len + 1;
				uErr = OSQPost(g_QSem, (void*) pMsgInfo);
				if (uErr != OS_ERR_NONE)
				{//表示发送消息队列失败,则清除消息队列
					MY_FREE(pMsgInfo->pData);
					MY_FREE(pMsgInfo);
					APP_TRACE_DBG(("PostMsqTask Fail..\n\r"));
				}
				else
				{/*数据发送成功,由接收数据的任务,处理数据后,对数据进行销毁*/	}
			}
			else
			{
				MY_FREE(pMsgInfo);
				pMsgInfo = NULL;
			}
		}
		if(++len % 70 == 0)
			len = 1;
		OSTimeDlyHMSM(0, 0, 0, 50);
	}
}


static  void  AppTaskStart (void *p_arg)
{
    OS_ERR  err;


   (void)p_arg;

    BSP_Init();                                                 /* Initialize BSP functions                             */
    CPU_Init();                                                 /* Initialize uC/CPU services                           */



	g_QSem = OSQCreate(&g_QMsgTbl[0], MSQ_SIZE_MAX);		//创建消息队列的EVENT

															//新建任务  
	OSTaskCreate(RecvMsqTask, (void *) 0, Task1_Stk + TASK_STK_SIZE - 1, 11);
	OSTaskCreate(PostMsqTask, (void *) 0, Task2_Stk + TASK_STK_SIZE - 1, 12);


#if OS_CFG_STAT_TASK_EN > 0u
    OSStatTaskCPUUsageInit(&err);                               /* Compute CPU capacity with no task running            */
#endif

   // APP_TRACE_DBG(("uCOS-II is Running...\n\r"));

    while (DEF_ON) {                                            /* Task body, always written as an infinite loop.       */
        OSTimeDlyHMSM(0, 0, 1, 0);

        //APP_TRACE_DBG(("Time: %d\n\r", OSTimeGet(&err)));
    }
}



 来自:http://blog.csdn.net/lan120576664

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值