基于嵌入式操作系统vxworks的

author author     2022-12-04     385

关键词:

管道可以看作受驱动器pipeDrv管理的虚拟I/O设备,使用基本的I/O系统接口可以读、写和操作管道,这些函数包括read、write、open、close、ioctl和select等。与pipe密切相关的其它API还有:
(1)pipeDrv(?):初始化pipeDrv,函数原型:
STATUS pipeDrv (void);
(2)pipeDevCreate(?):创建pipe,函数原型:
STATUS pipeDevCreate
??? (
??? char name,????????????? / 创建的pipe名 /
??? int??? nMessages,???????? /
pipe中的最大消息数 /
??? int??? nBytes???????????? /
每个消息的大小 /
??? );
(3)pipeDevDelete:删除pipe,函数原型:
STATUS pipeDevDelete
??? (
??? char
name,????????????? / 要删除的pipe名 /
??? BOOL?? force????????????? / 如果为真,则强制删除pipe /
??? );
下面我们看看pipe使用的demo:
例3:管道
/ includes /
#include "vxWorks.h"
#include "taskLib.h"
#include "stdio.h"
#include "ioLib.h"
#include "pipeDrv.h"
?
/globals /
typedef struct

? VOIDFUNCPTR routine;?? / 函数指针 /
? int arg;
MSG_REQUEST; / message structure /
?
#define TASK_PRI????????? 254???????????? / tServers task‘s priority /
#define TASK_STACK_SIZE? 5000????? / tServer task‘s stack size /
#define PIPE_NAME?????? "/pipe/server"? / name of the pipe device /
#define NUM_MSGS? 10???? / max number of messages in the pipe /
?
LOCAL int pipeFd; / File descriptor for the pipe device /
LOCAL void pipeServer(); / server task /
?
/ serverStart:初始化pipeServer任务以执行管道中夹带的函数 /
STATUS serverStart()

? if (pipeDevCreate(PIPE_NAME, NUM_MSGS, sizeof(MSG_REQUEST)) == ERROR)
?
??? perror("Error in creating pipe"); / print error if pipe is already
????
created, but do not return /
?
?
? /
Open the pipe /
? if ((pipeFd = open(PIPE_NAME, UPDATE, 0)) == ERROR)
?
??? perror("Error in opening pipe device");
??? return (ERROR);
?
?
? /
Spawn the server task /
? if (taskSpawn("tServer", TASK_PRI, 0, TASK_STACK_SIZE, (FUNCPTR)pipeServer, 0,
??? 0, 0, 0, 0, 0, 0, 0, 0, 0) == ERROR)
?
??? perror("Error in spawning tServer task");
??? close(pipeFd);
??? return (ERROR);
?
?
? return (OK);

?
/
serverSend :发送管道消息,将函数指针作为消息的一部分 /
STATUS serverSend(VOIDFUNCPTR routine, /
name of the routine to execute / int arg / argument of the routine /
)

? MSG_REQUEST msgRequest;
? int status;
?
? /
Initialize the message structure /
? msgRequest.routine = routine;
? msgRequest.arg = arg;
?
? /
Send the message and return the results /
? status = write(pipeFd, (char
) &msgRequest, sizeof(MSG_REQUEST));
?
? return ((status == sizeof(MSG_REQUEST)) ? OK : ERROR);

?
/ pipeServer:读取管道消息并执行管道消息中夹带的函数 /
LOCAL void pipeServer()

? MSG_REQUEST msgRequest;
?
? while (read(pipeFd, (char) &msgRequest, sizeof(MSG_REQUEST)) > 0)
??? (
msgRequest.routine)(msgRequest.arg);

?? 上述程序中,pipeServer执行于非常低的优先级(254级),当我们在shell中输入“serverSend(VOIDFUNCPTR routine, int arg)” 时,pipeServer将读到管道中的消息,并执行“routine (arg)”。
?????? 为对此进行验证,我们在程序中再添加一个函数:
void PRINT(int arg)

?????? printf("%d",arg);

当我们在tShell中输入“serverSend(PRINT,2);”,在VxSim中将输出2。
9.套接字
不论网络中的节点使用什么操作系统,套接字的通信都是完全对等的。套接字有两种:
(1)流套接字(SOCK_STREAM,采用TCP协议):流套接字提供了双向的、有序的、无重复并且无记录边界的数据流服务;
(2)数据报套接字(SOCK_DGRAM,采用UDP协议):数据报套接字也支持双向数据传输,但并不保证是可靠、有序和无重复的。
另外还有一种RAW套接字,但不常见。
VxWorks中与Socket相关的函数有:
(1)socket():创建套接字?? ,原型为:
int socket
??? (
??? int domain,??? /
address family (for example, AF_INET) /
??? int type,????? /
SOCK_STREAM, SOCK_DGRAM, or SOCK_RAW /
??? int protocol?? /
socket protocol (usually 0) /
??? );
(2)bind():给套接字绑定名称 ,原型为:
STATUS bind
??? (
??? int?????????????? s,????? /
socket descriptor /
??? struct sockaddr
name,?? / name to be bound /
??? int??????????? namelen / length of name /
??? );
(3)listen():服务端监听TCP连接请求,原型为:
STATUS listen
??? (
??? int s,??????????????????? / socket descriptor /
??? int backlog?????????????? / number of connections to queue /
??? );
(4)accept():服务端接受TCP连接请求,原型为:
int accept
??? (
??? int?? ?????????s,????? / socket descriptor /
??? struct sockaddr addr,?? / peer address /
??? int
?????????? addrlen / peer address length /
??? );
(5)connect():客户端请求连接套接字,原型为:
STATUS connect
??? (
??? int?????????????? s,????? / socket descriptor /
??? struct sockaddr name,?? / addr of socket to connect /
??? int??????????? namelen /
length of name, in bytes /
??? );
(6)shutdown():关闭套接字间连接,原型为:
STATUS shutdown
??? (
??? int s,??? ????????????/
socket to shut down /
??? int how ???????????? /
0:receives disallowed;1:sends disallowed;
2:sends and receives disallowed /
??? );
(7)sendto()、send()、sendmsg():发送数据
int sendto
??? (
??? int?????????????? s,????? /
socket to send data to /
??? caddr_t?????????? buf,??? /
pointer to data buffer /
??? int????? ?????????bufLen, /
length of buffer /
??? int?????????????? flags,? /
flags to underlying protocols /
??? struct sockaddr
to,???? / recipient‘s address /
??? int?????????????? tolen?? / length of to sockaddr /
??? );
?
int send
??? (
??? int????? ????s,?????????? / socket to send to /
??? const char buf,???????? / pointer to buffer to transmit /
??? int????????? bufLen,????? /
length of buffer /
??? int????????? flags??????? /
flags to underlying protocols /
??? );
?
int sendmsg
??? (
??? int???????????? sd,?????? /
socket to send to /
??? struct msghdr
mp,?????? / scatter-gather message header /
??? int???????????? flags???? / flags to underlying protocols /
??? );
(8)recvfrom ()、recv ()、recvmsg ():接收数据
int recvfrom
??? (
??? int? ?????????????s,?????? / socket to receive from /
??? char ??????????? buf,???? / pointer to data buffer /
??? int?????????????? bufLen,? /
length of buffer /
??? int?????????????? flags,?? /
flags to underlying protocols /
??? struct sockaddr
from,??? / where to copy sender‘s addr /
??? int ???????????? pFromLen / value/result length of from /
??? );
?
int recv
??? (
??? int??? s,???????????????? /
socket to receive data from /
??? char
buf,?????????????? / buffer to write data to /
?? ?int??? bufLen,??????????? / length of buffer /
??? int??? flags????????????? / flags to underlying protocols /
??? );
?
int recvmsg
??? (
??? int???????????? sd,?????? / socket to receive from /
??? struct msghdr mp,?????? / scatter-gather message header /
??? int???????????? flags???? /
flags to underlying protocols /
??? );
限于篇幅的关系,我们在此不在列举socket通信的例子。但在最后一次连载的综合实例中,将包括完整的socket通信过程源代码。
10.信号与异常处理
信号是VxWorks中用于异常处理的方式,信号的驱动和执行机制有点类似于硬件中断(可以认为是一种软件上的通告,即software notification)。信号的生存期为从“产生”到“传递”,一个“产生”而未“传递”的信号处于pending状态。信号适宜进行异常处理,任务间的通信不要使用信号。
下面是从Embry-Riddle Real-Time Laboratory试验课程中获得的一个signal的例子:
例4:信号与异常处理
/
includes /
#include "vxWorks.h"
#include "sigLib.h"
#include "taskLib.h"
#include "stdio.h"
?
/
function prototypes /
void catchSIGINT(int);
void sigCatcher(void);
?
/
globals /
#define NO_OPTIONS 0
#define ITER1 100
#define LONG_TIME 1000000
#define HIGHPRIORITY 100
#define LOWPRIORITY 101
int ownId;
?
void sigGenerator(void) /
task to generate the SIGINT signal /

? int i, j, taskId;
? STATUS taskAlive;
?
? if ((taskId = taskSpawn("signal", 100, 0x100, 20000, (FUNCPTR)sigCatcher, 0,??? 0, 0, 0, 0, 0, 0, 0, 0, 0)) == ERROR)
??? printf("taskSpawn sigCatcher failed ");
?
? ownId = taskIdSelf(); /
get sigGenerator‘s task id /
?
? taskDelay(30); /
allow time to get sigCatcher to run /
?
? for (i = 0; i < ITER1; i++)
?
??? if ((taskAlive = taskIdVerify(taskId)) == OK)
???
????? printf("+++++++++++++++++++++++++++++++SIGINT sinal generated ");
????? kill(taskId, SIGINT); /
generate signal /
????? /
lower sigGenerator priority to allow sigCatcher to run /
????? taskPrioritySet(ownId, LOWPRIORITY);
???
??? else
???? /
sigCatcher is dead */
????? break;
?
? printf(" sigGenerator Exited ");

?
void sigCatcher(void) / task to handle the SIGINT signal /

? struct sigaction newAction;
? int i, j;
?
? newAction.sa_handler = catchSIGINT; / set the new handler /
? sigemptyset(&newAction.sa_mask); / no other signals blocked /
? newAction.sa_flags = NO_OPTIONS; / no special options /
?
? if (sigaction(SIGINT, &newAction, NULL) ==? - 1)
??? printf("Could not install signal handler ");
?
? for (i = 0; i < ITER1; i++)
?
??? for (j = 0; j < LONG_TIME; j++)
????? ;
??? printf("Normal processing in sigCatcher ");
?
?
? printf(" +++++++++++++++sigCatcher Exited+++++++++++++++ ");

?
void catchSIGINT(int signal) / signal handler code /

? printf("-------------------------------SIGINT signal caught ");
? / increase sigGenerator priority to allow sigGenerator to run /
? taskPrioritySet(ownId, HIGHPRIORITY);

分析以上程序,kill()函数产生信号,其原型为:
int kill
??? (
??? int tid,????????????????? / task to send signal to /
??? int signo???????????????? / signal to send to task /
??? );
sigaction()函数将信号与信号处理函数进行绑定,一个信号处理函数类似于程序中的catchSIGINT函数,一般结构为:
void sigHandlerFunction(int signalNumber)

... / signal handler code /

sigaction()函数的原型为:
int sigaction
??? (
??? int?????????????? signo, / signal of handler of interest /
??? const struct sigaction pAct,? / location of new handler /
??? struct sigaction
?? pOact? / location to store old handler /
??? );
?signo为信号序号,而输入参数pAct中存放的是信号处理函数的信息,pOact是一个输出参数,可以获得老的信号处理函数信息。
运行上述程序,输出结果为:
Normal processing in sigCatcher?
…???? //大量的Normal processing in sigCatcher
Normal processing in sigCatcher?
+++++++++++++++sigCatcher Exited+++++++++++++++
————————————————

vxworksqnxxenomaiintimesylixosucos等实时操作系统的性能特点

Vxworks、QNX、Xenomai、Intime、Sylixos、Ucos等实时操作系统的性能特点VxWorks操作系统VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统,是嵌入式开发环境的关键组成部分。其内核支持多任务调度(采用基... 查看详情

揭秘vxworks——直击物联网安全罩门

...风河(WindRiver)公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。VxWorks支持... 查看详情

在vxworks中,period命的具体用法是怎样的

在vxworks中,period命的具体用法是怎样的嵌入式实时操作系统VxWorks入门嵌入式Linux系统是标准Linux在嵌入式领域的延伸,其特点和功能与标准Linux几乎完全相同。Linux系统的稳定性和健壮性已经在真实世界中得到了证明,在工业控... 查看详情

第三周作业

1.阅读笔记:VxWorks实时操作系统的特点     VxWorks是美国温瑞尔系统(WindRiver)公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。良好的持续发展能力、高性能的内核... 查看详情

vxworks和linux系统这2者的区别是啥呢?

...tem公司(以下简称风河公司,即WRS公司)推出的一个实时操作系统。Tornado是WRS公司推出的一套实时操作系统开发环境,类似MicrosoftVisualC,但是提供了更丰富的调试、仿真环境和工具。嵌入式Vxworks系统的主要应用领域主要有以下... 查看详情

vxworksfuzzing之道:vxworks工控实时操作系统漏洞挖掘调试与利用揭秘

...sp;是世界上使用最广泛的一种在嵌入式系统中部署的实时操作系统,是由美国WindRiver公司(简称风河公司,即WRS 公司)于1983年设计开发的。其市场范围跨越所有的安全关键领域,仅举几例,包括火星好奇心流浪者、波音787... 查看详情

pixhawk---基于nsh的firmware开发与调试

1相关知识了解1.1Nuttx系统??嵌入式实时操作系统(RTOS)。强调标准兼容和小型封装,具有从8位到32位微控制器环境的高度可扩展性。NuttX主要遵循Posix和ANSI标准,对于在这些标准下不支持的功能。或者不适用于深度嵌入环境的功... 查看详情

如何避免 VxWorks 中条件变量中的竞争条件

...013-09-3013:58:29【问题描述】:我们正在基于VxWorks5.5的专有嵌入式平台上进行编程。在我们的工具箱中,我们有一个条件变量,它是使用VxWorks二进制信号量实现的。现在,POSIX提供了一个等待函数,该函数也接受一个互斥体。这将... 查看详情

[架构之路-125]-《软考-系统架构设计师》-操作系统-4-浅谈vxworks与linux操作系统的区别

相同点(1)都可以用于嵌入式操作系统(2)都提供多任务的执行环境(3)WindRiverSystem公司可以提供者两种操作系统的硬件定制化(BSP)2.不同点2.1内核结构不同vxworks是微内核,只提供基本的服务... 查看详情

基于龙芯cpu的气井控制器的软件设计

...十年代末以来,Vxwork、pSOS、Neculeus和WindowsCE等嵌入式操作系统相继出现逐步成熟起来。然而,对于成本要求尽可能低廉的嵌入式领域的产品,此类针对商用而专门研发的操作系统的价格相对高昂,难以接受。此外&... 查看详情

网络操作系统安全与防范方面的论文应该写些啥?

...基本原理、环境配置和程序示例。关键词:VxWorks;实时操作系统;嵌入式操作系统;串行通信[中国论文联盟www.lwlm.com][Abstract]Combiningwiththeapplicationofwindtunnelmeasureandcontrolsystemwithembeddedreal-timeoperatingsystemVxWorks,withtheserialcommunicationin... 查看详情

tornado的主要特点

...性,开发人员能按照应用需求分配所需的资源,而不是为操作系统分配资源。从需要几K字节存储区的嵌入设计到需求更多的操作系统功能的复 查看详情

基于fpga的嵌入式图像处理系统设计pdf

... 作者还结合自己的经验,介绍了研制开发基于fpga的嵌入式图像处理系统所需要的正确思路以及许多实用性技巧,并给出了许多图像处理算法在fpga上的具体实现方法以及多个基于fpga实现嵌入式图像处理系统的应用实例。《基... 查看详情

linux和嵌入式linux有啥区别

【Linux】Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux也可以安装在各种计算机硬件设备中,如收集、平板电脑、路由器、台式计算机、超级计算机等等,人们也已经习... 查看详情

基于microblaze的嵌入式系统设计

...rend.com/d6-xilinx/article/2013-03/3863.html 摘 要:当今时代,嵌入式系统已经无所不在,与人们的日常生活息息相关。嵌入式系统以微处理器为核心,以计算机技术为基础,其主要特征是实时性强。据统计,目前世界上微处理器每年生产... 查看详情

为基于 ARM 的嵌入式系统创建 coredump

】为基于ARM的嵌入式系统创建coredump【英文标题】:CreatingcoredumpforARMbasedembeddedsystem【发布时间】:2014-10-2922:00:57【问题描述】:我基本上是在跟进coredumpnotesection。我没有发布那个问题,但我正在尝试做同样的事情:编写一个程... 查看详情

dodobox一个基于所有平台的嵌入式操作系统(os)

DodoBox是为广大应用开始者提供的一个跨平台应用发布平台。它提供了客户端和服务器端的SDK及详细的开发者帮助文件,帮助开发者创建、移植软件应用或游戏应用。DodoBox基于OpenGL技术,提供了简单,高效的开发接口,方便开发... 查看详情

linux系统与嵌入式linux有啥区别和关系?

LinuxLinux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、台式计算机、大型机和超级计算机。Linux是一个领先... 查看详情