?? c04d_pipe.c
字號:
/* C04d_pipe.c P100 */
/* 頭文件 */
#include "vxWorks.h"
#include "ioLib.h"
#include "pipeDrv.h"
/* 宏定義 */
#define MAX_MSGS (10) /* 管道中最大消息個數(shù) */
#define MAX_MSG_LEN (100) /* 消息長度 */
#define STACK_SIZE 20000 /* 分配給每個任務(wù)的堆棧大小 */
#define DELAY_TICKS 50 /* 向管道寫入消息的間隔時間 */
/* 全局變量 */
int tidTask1; /* 任務(wù)ID定義 */
int tidTask2;
int demoPipeFd; /* 管道的文件描述符 */
/* 函數(shù)聲明 */
STATUS progStart(void);
STATUS task1(void);
STATUS task2(void);
void progStop(void);
/******************************************************************
*
* progStart - 啟動實(shí)例程序
*
* 負(fù)責(zé)創(chuàng)建并打開管道,負(fù)責(zé)創(chuàng)建任務(wù)
*
* RETURNS: OK, ERROR
*/
STATUS progStart(void)
{
int result; /* 記錄函數(shù)返回的結(jié)果 */
/* 負(fù)責(zé)創(chuàng)建一個名為”/pipe/demo”的管道 */
result = pipeDevCreate("/pipe/demo", MAX_MSGS, MAX_MSG_LEN);
if (result == ERROR)
{
return ERROR;
}
/* 將管道打開,并將管道的文件描述符保存至demoPipeFd */
demoPipeFd = open("/pipe/demo", O_RDWR, 0);
if (demoPipeFd == ERROR)
{
return ERROR;
}
/* 創(chuàng)建任務(wù) */
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);
}
/* 定義發(fā)送消息的內(nèi)容 */
#define MESSAGE "Greetings from Task 1"
/******************************************************************
*
* task1 – 周期性地向管道寫入消息
*
* 用于周期性地向管道寫入消息
*
* RETURNS: OK
*/
STATUS task1(void)
{
FOREVER
{
/* 向管道寫入一條消息 */
taskDelay(DELAY_TICKS);
}
return (OK);
}
/******************************************************************
*
* task2 – 從管道讀出消息并顯示
*
* 通過select()偵聽管道,當(dāng)管道中有數(shù)據(jù)到來時,將消息讀出并顯示
*
* RETURNS: OK
*/
STATUS task2(void)
{
char msgBuf[MAX_MSG_LEN]; /* 用于接收消息 */
int len = 0; /* 保存接收的消息地長度 */
int result; /* 用于保存select()的返回結(jié)果 */
fd_set readFd; /* 文件描述符集合,用于偵聽管道的讀緩沖 */
FOREVER
{
/* 初始化數(shù)據(jù) */
memset(msgBuf, 0, MAX_MSG_LEN);
len = 0;
/* 讀出一整條消息,當(dāng)管道空時,阻塞(Pend)在select()上等待 */
while (len < sizeof(MESSAGE))
{
/* 偵聽管道的讀緩沖 */
FD_ZERO(&readFd);
FD_SET(demoPipeFd, &readFd);
result = select(sizeof(fd_set), &readFd,
NULL, NULL, NULL);
if (result <= 0)
{
return ERROR;
}
/* 從管道中讀出數(shù)據(jù) */
len += read(demoPipeFd, msgBuf, sizeof(MESSAGE) - len);
}
/* 顯示收到的消息 */
printf("Message from task 1: %s\n", msgBuf);
}
return OK;
}
/******************************************************************
*
* progStop - 停止實(shí)例程序
*
* 調(diào)用本函數(shù)來停止本實(shí)例程序,刪除創(chuàng)建的任務(wù)并關(guān)閉、刪除管道設(shè)備。
*
* RETURNS: N/A
*/
void progStop(void)
{
/* 刪除創(chuàng)建的任務(wù) */
taskDelete(tidTask1);
taskDelete(tidTask2);
/* 關(guān)閉打開的管道并刪除管道設(shè)備 */
close(demoPipeFd);
pipeDevDelete("pipe/demo", TRUE);
printf("BYE!\n");
return;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -