📄 c04d_pipe.c
字号:
/* C04d_pipe.c P100 */
/* 头文件 */
#include "vxWorks.h"
#include "ioLib.h"
#include "pipeDrv.h"
/* 宏定义 */
#define MAX_MSGS (10) /* 管道中最大消息个数 */
#define MAX_MSG_LEN (100) /* 消息长度 */
#define STACK_SIZE 20000 /* 分配给每个任务的堆栈大小 */
#define DELAY_TICKS 50 /* 向管道写入消息的间隔时间 */
/* 全局变量 */
int tidTask1; /* 任务ID定义 */
int tidTask2;
int demoPipeFd; /* 管道的文件描述符 */
/* 函数声明 */
STATUS progStart(void);
STATUS task1(void);
STATUS task2(void);
void progStop(void);
/******************************************************************
*
* progStart - 启动实例程序
*
* 负责创建并打开管道,负责创建任务
*
* RETURNS: OK, ERROR
*/
STATUS progStart(void)
{
int result; /* 记录函数返回的结果 */
/* 负责创建一个名为”/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;
}
/* 创建任务 */
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 – 周期性地向管道写入消息
*
* 用于周期性地向管道写入消息
*
* RETURNS: OK
*/
STATUS task1(void)
{
FOREVER
{
/* 向管道写入一条消息 */
write(demoPipeFd, MESSAGE, sizeof(MESSAGE));
taskDelay(DELAY_TICKS);
}
return (OK);
}
/******************************************************************
*
* task2 – 从管道读出消息并显示
*
* 通过select()侦听管道,当管道中有数据到来时,将消息读出并显示
*
* RETURNS: OK
*/
STATUS task2(void)
{
char msgBuf[MAX_MSG_LEN]; /* 用于接收消息 */
int len = 0; /* 保存接收的消息地长度 */
int result; /* 用于保存select()的返回结果 */
fd_set readFd; /* 文件描述符集合,用于侦听管道的读缓冲 */
FOREVER
{
/* 初始化数据 */
memset(msgBuf, 0, MAX_MSG_LEN);
len = 0;
/* 读出一整条消息,当管道空时,阻塞(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;
}
/* 从管道中读出数据 */
len += read(demoPipeFd, msgBuf, sizeof(MESSAGE) - len);
}
/* 显示收到的消息 */
printf("Message from task 1: %s\n", msgBuf);
}
return OK;
}
/******************************************************************
*
* progStop - 停止实例程序
*
* 调用本函数来停止本实例程序,删除创建的任务并关闭、删除管道设备。
*
* RETURNS: N/A
*/
void progStop(void)
{
/* 删除创建的任务 */
taskDelete(tidTask1);
taskDelete(tidTask2);
/* 关闭打开的管道并删除管道设备 */
close(demoPipeFd);
pipeDevDelete("pipe/demo", TRUE);
printf("BYE!\n");
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -