由于某个项目做二次开发,别人用的是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)));
}
}