亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 消息隊列.c

?? 這個程序演示基本的消息隊列。程序啟動設計了6個普通應用任務以及一個控制任務TAC,等待消息的任務總是按照優先級的高低來決定獲得消息的順序,實現消息隊列的使用。
?? C
字號:
/**********************************************************************************************************
 * 
 *				                電子科技大學嵌入式軟件工程中心 版權所有
 * 					
 * 								Copyright (C) 2007 UESTC ESEC
 *
 **********************************************************************************************************/

/**********************************************************************************************************
 * 目的:
 *      這個程序演示基本的消息隊列。程序啟動設計了6個普通應用任務以及一個控制任務TAC,等待消息的任務總是按照優先級的高低來決定獲得
 * 消息的順序,實現消息隊列的使用。
 **********************************************************************************************************/

#include "../ucos/includes.h"
#include "../bsp/Uart.h"

extern T_UART_PORT uartPort0;
extern void ucBsp_Init(void);
extern void Timer_Start(void);
extern void CPSR_Init(void);


/*
*********************************************************************************************************
*                                               CONSTANTS
*********************************************************************************************************
*/

#define  TASK_STK_SIZE                 512       /* Size of each task's stacks (# of WORDs)            */
#define  N_TASKS                        3        /* Number of tasks which wait for queue1              */

/*
*********************************************************************************************************
*                                               VARIABLES
*********************************************************************************************************
*/

OS_STK        TaskStk1[N_TASKS][TASK_STK_SIZE];   /* Tasks stacks                                  */
OS_STK        TaskStk2[N_TASKS][TASK_STK_SIZE];
OS_STK        TaskStartStk[TASK_STK_SIZE];        /* Startup task stack                            */
OS_STK        TaskConStk[TASK_STK_SIZE];
//OS_STK		  TaskQueryStk[TASK_STK_SIZE];
INT8U         TaskData1[N_TASKS];                 /* Parameters to pass to each task               */
INT8U         TaskData2[N_TASKS];
OS_EVENT      *q1;                                /* 2 queue                                       */
OS_EVENT	  *q2;
void          *Msg1[6];							  /* 2 arry for msg                                */
void          *Msg2[6];

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

        void  Taskq1(void *pdata);                      /* Function prototypes of taskq1s                  */
		void  Taskq2(void *pdata);                      /* Function prototypes of taskq2s                  */
        void  TaskStart(void *pdata);					/* Function prototypes of Startup task             */
        void  TaskCon(void *pdata);                     /* Function prototypes of Control task             */
        void  TaskQuery();
static  void  TaskStartCreateTasks(void);

        void  TaskQuery(void);

/*
*********************************************************************************************************
*                                                MAIN
*********************************************************************************************************
*/
int  main (void)
{
	//板級初始化
	ucBsp_Init();	
	//open the interrupt bit 'I'
	CPSR_Init();
	//Initialize uC/OS-II
    OSInit();

	Uart_PutString(uartPort0,"\t本程序演示uC/OS-II消息隊列管理的基本思想和策略: ");
	Uart_PutLine(uartPort0,"程序啟動設計了6個普通應用任\n\r務以及一個控制任務TAC,等待消息的任務總是按照優先級的高低來決定獲得消息的順序,實現消息\n\r隊列的使用");
	Uart_PutString(uartPort0,"請按任意鍵繼續......");
	Uart_GetChar(uartPort0);
	Uart_PutLine(uartPort0,"");

	//建立消息隊列 
	q1 = OSQCreate(&Msg1[0],6);
	q2 = OSQCreate(&Msg2[0],6);
	
	OSTaskCreate(TaskStart,  (void *)0,  &TaskStartStk[TASK_STK_SIZE - 1], 0);

	//Start multitasking
    OSStart();
	return 1;
}


/*
*********************************************************************************************************
*                                              STARTUP TASK
*********************************************************************************************************
*/

void  TaskStart (void *pdata)
{
	pdata = pdata;
	Timer_Start();
	TaskStartCreateTasks();
	OSTaskSuspend(OS_PRIO_SELF);
}

/*
***************************************************************************************************************
*                                             CREATE TASKS
***************************************************************************************************************
*/

void  TaskStartCreateTasks (void)
{
	
	INT8U  i;
	//Create N_TASKS+N_TASKS identical tasks
    for (i = 0; i <N_TASKS; i++)
	{
		TaskData1[i] = i;
		OSTaskCreate(Taskq1, (void *)&TaskData1[i], &TaskStk1[i][TASK_STK_SIZE - 1], i+1);
	}
    for (i = 0; i <N_TASKS; i++)
	{
		TaskData2[i] = i;
		OSTaskCreate(Taskq2, (void *)&TaskData2[i], &TaskStk2[i][TASK_STK_SIZE - 1], i+4);
	}
	//Create control tasks
	OSTaskCreate(TaskCon, (void *)0, &TaskConStk[TASK_STK_SIZE - 1],i+4);
}

/*
*********************************************************************************************************
*                                                  TASKq1
*********************************************************************************************************
*/

void  Taskq1 (void *pdata)
{
	INT8U  err;
	INT8U  id;
	void   *mg;
	
	id=*(int *)pdata;
	
	for (;;)
	{
		//等待消息隊列中的消息
		//OSQPend()函數用于任務等待消息。
		//消息通過中斷或另外的任務發送給需要的任務。
		//消息是一個以指針定義的變量,在不同的程序中消息的使用也可能不同。
		//如果調用OSQPend()函數時隊列中已經存在需要的消息,那么該消息被返回給OSQPend()函數的調用者,隊列中清除該消息。
		//如果調用OSQPend()函數時隊列中沒有需要的消息,OSQPend()函數掛起當前任務直到得到需要的消息或超出定義的超時時間。
		//如果同時有多個任務等待同一個消息,μC/OS-Ⅱ默認最高優先級的任務取得消息并且任務恢復執行。
		//	一個由OSTaskSuspend()函數掛起的任務也可以接受消息,但這個任務將一直保持掛起狀態直到通過調用OSTaskResume()函數恢復任務的運行。
		mg=OSQPend(q1,0,&err);
		Uart_PutLine(uartPort0,"Task__%d got a Message:\t %s",id,(char *)mg);

		//Wait 2 second
		//按照時、分、秒、毫秒進行延時的函數
		OSTimeDlyHMSM(0, 0, 2, 0);
	}
}

/*
*********************************************************************************************************
*                                                  TASKq2
*********************************************************************************************************
*/

void  Taskq2 (void *pdata)
{
	INT8U  err;
	INT8U  id;
	void   *mg;
	
	id=*(int *)pdata;
	
	for (;;)
	{
		OSTimeDlyHMSM(0, 0, 2, 0);
		mg=OSQPend(q2,0,&err);
		switch(err)
		{
			case OS_NO_ERR:
				Uart_PutLine(uartPort0,"\tTask__%d got:\t%s.", id+3, (char *)mg);
				OSTimeDlyHMSM(0, 0, 0, 200*(4-id));
				break;
			default :
				Uart_PutLine(uartPort0, "Queue__2 is EMPTY!,Task__%d cannot get message!",id+3);
				OSTimeDlyHMSM(0, 0, 0, 200*(4-id));
				break;
		}
	}
}

/*
*********************************************************************************************************
*                                                  TASKcon
*********************************************************************************************************
*/

void  TaskCon (void *pdata)
{
	INT8U  i,j;
	INT8U  err;
	INT8U  note=1;                   										/* for flush the queue                  */

	//queue1's message
	static char *s[]={
		"message___0",
		"message___1",
		"message___2",
		"message___3",
		"message___4",
		"message___5"
	};
	
	//queue2's message
	static char *t[]={
		"message___A",
		"message___B",
		"message___C",
		"message___D",
		"message___E",
		"message___F"
	};

	pdata=pdata;

    for (;;)
     {
     	Uart_PutLine(uartPort0,"");
 		Uart_PutLine(uartPort0,"-------------Add message to queue1-------------");
     	Uart_PutLine(uartPort0,"");
		for( i = 0 ; i < 6 ; i++ )
		{
			//向消息隊列發送一則消息,插在前面(LIFO)			
			err = OSQPostFront(q1,(void*)s[i]);
			switch(err)
			{
				case OS_NO_ERR:
					Uart_PutLine(uartPort0,"\tQueue1___%d add:\t%s",i,s[i]);
                   	OSTimeDlyHMSM(0, 0, 0, 150);
					break;
				case OS_Q_FULL:
					Uart_PutLine(uartPort0,"Queue1 is full, cannot added!");
					OSTimeDlyHMSM(0, 0, 0, 150);
					break;
				default :break;
			}
		}
		
		Uart_PutLine(uartPort0,"");
    	Uart_PutLine(uartPort0,"-------------Add message to queue2-------------");
     	Uart_PutLine(uartPort0,"");

		for( j = 0 ; j < 6 ; j++ )
		{
			//OSQPost()函數通過消息隊列向任務發送消息。
			//消息是一個指針長度的變量,在不同的程序中消息的使用也可能不同。
			//如果隊列中已經存滿消息,返回錯誤碼。
			//OSQPost()函數立即返回調用者,消息也沒有能夠發到隊列。
			//如果有任何任務在等待隊列中的消息,最高優先級的任務將得到這個消息。
			//如果等待消息的任務優先級比發送消息的任務優先級高,那么高優先級的任務將得到消息而恢復執行,也就是說,發生了一次任務切換。
			//消息隊列是先入先出(FIFO)機制的,先進入隊列的消息先被傳遞給任務。
			err = OSQPost(q2,(void*)t[j]);
			switch(err)
			{
				case OS_NO_ERR:
					//消息已經放入消息隊列
					Uart_PutLine(uartPort0,"\tQueue2__%d add:\t%s",j,t[j]);
	                OSTimeDlyHMSM(0, 0, 0, 150);
					break;
				case OS_Q_FULL:
					//消息隊列已滿
					Uart_PutLine(uartPort0,"Queue2 FULL!cannot add.");
					OSTimeDlyHMSM(0, 0, 0, 150);
					break;
				default :
					break;
			}
		}		

		if(note==1)
		{
			//OSQFlush()函數清空消息隊列并且忽略發送往隊列的所有消息。
			//不管隊列中是否有消息,這個函數的執行時間都是相同的。
			OSQFlush(q1);
			Uart_PutLine(uartPort0,"\n\r--------------Queue1 Cleared Up--------------\n\r");
			note=0;
		}
		else
		{
			OSQFlush(q2);
			Uart_PutLine(uartPort0,"\n\r--------------Queue2 Cleared Up--------------\n\r");
			note=1;
		}
		TaskQuery();
    }
}
void  TaskQuery()
{
	INT8U  err;
	OS_Q_DATA data;
	
 	//取得消息隊列本身的消息
 	//OSQQuery()函數用來取得消息隊列的信息。
 	//用戶程序必須建立一個OS_Q_DATA的數據結構,該結構用來保存從消息隊列的事件控制塊得到的數據。
 	//通過調用OSQQuery()函數可以知道任務是否在等待消息、有多少個任務在等待消息、隊列中有多少消息以及消息隊列可以容納的消息數。
 	//OSQQuery()函數還可以得到即將被傳遞給任務的消息的信息。
	err=OSQQuery(q1,&data);
	
	if(err==OS_NO_ERR)
	{
		Uart_PutLine(uartPort0,"\n\r------------Queue1's Information------------");
		Uart_PutLine(uartPort0,"\tNextMsg:\t%s\n\r",(char *)data.OSMsg);
		Uart_PutLine(uartPort0,"\tNumMsg:\t%d",data.OSNMsgs);
		Uart_PutLine(uartPort0,"\tQSize:\t%d",data.OSQSize);
		Uart_PutLine(uartPort0,"----------------------------------------------");
	}
	OSTimeDlyHMSM(0, 0, 3, 500);

	err=OSQQuery(q2,&data);	
	if(err==OS_NO_ERR)
	{
		Uart_PutLine(uartPort0,"\n\r------------Queue2's Information------------");
		Uart_PutLine(uartPort0,"\tNextMsg:\t%s\n\r",(char *)data.OSMsg);
		Uart_PutLine(uartPort0,"\tNumMsg:\t%d",data.OSNMsgs);
		Uart_PutLine(uartPort0,"\tQSize:\t%d",data.OSQSize);
		Uart_PutLine(uartPort0,"----------------------------------------------");
	}
	OSTimeDlyHMSM(0, 0, 3, 500);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩三级.com| 99久久综合狠狠综合久久| 在线观看区一区二| 亚洲色欲色欲www| 欧美在线免费观看亚洲| 午夜精品久久久久久不卡8050| 91久久免费观看| 日韩精品一二区| 精品国产免费视频| 成人午夜电影网站| 最新国产精品久久精品| 欧美无人高清视频在线观看| 性欧美疯狂xxxxbbbb| 日韩欧美激情在线| 国产.欧美.日韩| 亚洲综合无码一区二区| 日韩一区二区三区电影在线观看| 激情图片小说一区| 国产精品拍天天在线| 91小视频免费观看| 日本最新不卡在线| 国产欧美日韩视频一区二区| 色妞www精品视频| 免费人成网站在线观看欧美高清| 国产香蕉久久精品综合网| 99久久免费精品高清特色大片| 亚洲一区二三区| 精品久久久久久久久久久久久久久久久| 国产一区二区中文字幕| 亚洲激情综合网| 亚洲精品在线观看视频| 91在线视频观看| 欧美视频在线观看一区二区| 蜜桃一区二区三区在线观看| 成人免费小视频| 欧美一区二区三区免费大片| av在线不卡网| 久久精品国产成人一区二区三区| 亚洲欧洲性图库| 日韩精品一区二区在线观看| 一本大道久久a久久精二百| 久久狠狠亚洲综合| 一区二区三区在线看| 国产午夜精品美女毛片视频| 欧美亚州韩日在线看免费版国语版| 狠狠色伊人亚洲综合成人| 一区二区三区中文在线观看| 久久精品在这里| 91精品一区二区三区久久久久久| av激情亚洲男人天堂| 国产一区二区精品在线观看| 天天色综合天天| 亚洲人午夜精品天堂一二香蕉| 久久综合九色综合久久久精品综合| 欧美日韩久久久| 99麻豆久久久国产精品免费| 国产精品综合网| 麻豆成人免费电影| 五月天激情小说综合| 亚洲人成人一区二区在线观看 | 国产精品久久久久久久久久久免费看| 欧美无砖专区一中文字| 99在线热播精品免费| 国产寡妇亲子伦一区二区| 奇米777欧美一区二区| 亚洲福利视频一区二区| 亚洲精品欧美在线| 亚洲欧美国产77777| 国产精品第四页| 国产精品美女久久久久久久久久久| 欧美精品一区二区在线观看| 日韩免费一区二区| 91精品国产日韩91久久久久久| 欧美日韩亚洲另类| 欧美亚洲国产bt| 欧美日韩精品免费| 欧美色窝79yyyycom| 91黄色免费网站| 欧美亚洲图片小说| 在线观看欧美日本| 欧美色图在线观看| 91精品欧美一区二区三区综合在| 欧美伊人久久久久久午夜久久久久| 91麻豆精品秘密| 91久久精品一区二区二区| 91久久国产最好的精华液| 91久久一区二区| 欧美久久久久免费| 欧美妇女性影城| 欧美α欧美αv大片| 久久中文娱乐网| 国产精品人妖ts系列视频| 国产精品久久久久天堂| 中文字幕视频一区二区三区久| 亚洲色图制服诱惑 | 成人午夜视频免费看| bt欧美亚洲午夜电影天堂| 91国产免费观看| 精品1区2区3区| 欧美一卡2卡3卡4卡| 久久夜色精品一区| 国产精品传媒视频| 亚洲二区在线观看| 久久国产夜色精品鲁鲁99| 国产一区在线观看视频| 成人精品免费视频| 欧美三电影在线| 精品福利av导航| 亚洲欧洲中文日韩久久av乱码| 亚洲成av人**亚洲成av**| 久草中文综合在线| 成人av综合一区| 欧美少妇xxx| 久久久美女毛片| 亚洲六月丁香色婷婷综合久久 | 天堂一区二区在线| 国产精品综合二区| 一本色道久久综合精品竹菊| 欧美一级精品大片| 中文字幕一区二区三区在线不卡| 视频在线观看91| 成人精品国产福利| 欧美久久久久久蜜桃| 国产欧美日韩激情| 日日骚欧美日韩| 99久久99久久精品免费观看| 91麻豆精品国产91久久久| 国产精品久久久久久久浪潮网站| 亚洲mv在线观看| 99久久精品国产观看| 欧美成人女星排名| 亚洲综合男人的天堂| 国产91精品一区二区| 欧美精品一卡二卡| 最新不卡av在线| 国产一区美女在线| 欧美高清你懂得| 亚洲精品久久久久久国产精华液| 激情五月婷婷综合网| 欧美三级视频在线| 国产精品久久久久久久久快鸭| 九九视频精品免费| 欧美剧在线免费观看网站 | 亚洲激情图片一区| 国产福利91精品一区二区三区| 欧美人动与zoxxxx乱| 亚洲三级在线播放| 懂色av噜噜一区二区三区av| 日韩欧美中文字幕精品| 亚洲已满18点击进入久久| 成人黄色免费短视频| 精品国产青草久久久久福利| 亚洲第一激情av| 色欧美片视频在线观看| 国产精品女主播在线观看| 久久国产精品第一页| 欧美色视频在线| 亚洲人成人一区二区在线观看| 国产成人亚洲精品青草天美| 欧美精品一区二区三区很污很色的| 爽好多水快深点欧美视频| 欧美午夜精品久久久久久孕妇| 亚洲精品国久久99热| 99久久er热在这里只有精品66| 国产天堂亚洲国产碰碰| 国产一区二区在线电影| 精品国一区二区三区| 久久国产福利国产秒拍| 日韩欧美色综合| 久久激五月天综合精品| 精品伦理精品一区| 寂寞少妇一区二区三区| 日韩一区二区三区免费看| 免费观看在线色综合| 欧美电影免费观看高清完整版在线观看| 午夜精品福利在线| 欧美一区二区三区不卡| 久久se精品一区精品二区| 精品福利一区二区三区免费视频| 激情久久久久久久久久久久久久久久| 精品日韩av一区二区| 国内精品久久久久影院色| 国产日韩欧美a| 99久久精品免费| 亚洲国产精品尤物yw在线观看| 在线观看亚洲精品| 日日摸夜夜添夜夜添亚洲女人| 日韩一区二区三区在线| 国产一区二区毛片| 国产精品免费视频一区| 在线亚洲欧美专区二区| 日韩高清一区在线| 久久久久久久国产精品影院| 99久久精品国产麻豆演员表| 亚洲国产一区二区a毛片| 日韩欧美色综合| 成人黄动漫网站免费app| 亚洲午夜影视影院在线观看| 欧美一区二区国产| 成人性生交大片免费看视频在线 |