?? c04b_msgq.c
字號:
/* C04b_msgQ.c P88 */
/* 頭文件 */
#include "vxWorks.h"
#include "msgQLib.h"
/* 宏定義 */
#define MAX_MSGS (10) /* 消息隊列長度 */
#define MAX_MSG_LEN (100) /* 消息隊列中消息的最大長度 */
#define STACK_SIZE 20000 /* 分配給每個任務的堆棧大小 */
#define DELAY_TICKS 50 /* 發送消息的間隔時間 */
/* 全局變量 */
int tidTask1; /* 任務ID定義 */
int tidTask2;
MSG_Q_ID myMsgQId; /* 消息隊列ID定義 */
/* 函數聲明 */
STATUS progStart(void);
STATUS task1(void);
STATUS task2(void);
void progStop(void);
/******************************************************************
*
* progStart - 啟動實例程序
*
* 負責創建消息隊列與任務
*
* RETURNS: OK, ERROR
*/
STATUS progStart(void)
{
/* 創建消息隊列 */
myMsgQId = msgQCreate(MAX_MSGS, MAX_MSG_LEN, MSG_Q_PRIORITY);
if (myMsgQId == NULL)
{
return (ERROR);
}
/* 創建任務 */
tidTask1 = taskSpawn("tTask1", 200, 0, STACK_SIZE,
(FUNCPTR)task1,0,0,0,0,0,0,0,0,0,0);
tidTask2 = taskSpawn("tTask2", 220, 0, STACK_SIZE,
(FUNCPTR)task2,0,0,0,0,0,0,0,0,0,0);
return (OK);
}
/* 定義發送消息的內容 */
#define MESSAGE "Greetings from Task 1"
/******************************************************************
*
* task1 – 周期性地向消息隊列發送消息
*
* 用于周期性地向消息隊列發送消息,
* 設置發送優先級為MSG_PRI_NORMAL,timeout參數為WAIT_FOREVER
*
* RETURNS: OK
*/
STATUS task1(void)
{
FOREVER
{
/* 向消息隊列發送一條普通優先級的消息,
* 當消息隊列滿時,阻塞(Pend)等待
*/
if (msgQSend(myMsgQId, MESSAGE, sizeof(MESSAGE),
WAIT_FOREVER, MSG_PRI_NORMAL) == ERROR)
{
return (ERROR);
}
/* 延遲,以保證消息被tTask2處理 */
taskDelay(DELAY_TICKS);
}
return (OK);
}
/******************************************************************
*
* task2 – 接收消息并顯示
*
* 從消息隊列接收消息,當消息隊列空時阻塞(Pend)等待,收到消息后顯示
*
* RETURNS: OK
*/
STATUS task2(void)
{
char msgBuf[MAX_MSG_LEN];
FOREVER
{
/* 清空消息接收緩沖 */
memset(msgBuf, 0, MAX_MSG_LEN);
/* 從消息隊列接收消息,當消息隊列空時阻塞(Pend)等待 */
if (msgQReceive(myMsgQId, msgBuf, MAX_MSG_LEN, WAIT_FOREVER)
== ERROR)
{
return (ERROR);
}
/* 將接收到的消息顯示出來 */
printf("Message from task 1: %s\n", msgBuf);
}
return OK;
}
/******************************************************************
*
* progStop - 停止實例程序
*
* 調用本函數來停止本實例程序,刪除創建的任務并釋放消息隊列資源。
*
* RETURNS: N/A
*/
void progStop(void)
{
/* 刪除創建的任務 */
taskDelete(tidTask1);
taskDelete(tidTask2);
/* 釋放信號量資源 */
msgQDelete(myMsgQId);
printf("BYE!\n");
return;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -