VxWorks编程常用函数说明

合集下载

vxworks中sendto函数调用关系

vxworks中sendto函数调用关系

在VxWorks 实时操作系统中,sendto函数通常用于UDP(用户数据报协议)通信。

UDP 是一种无连接的协议,因此在使用sendto函数时,您不需要建立和终止连接。

以下是sendto函数调用的一般步骤和它们之间的关系:
1.创建Socket:首先,您需要使用socket函数创建一个新的套接字。

套接字是网络通信的端点,
用于发送和接收数据。

2.绑定Socket:接下来,您需要使用bind函数将套接字绑定到一个特定的地址和端口。

这告诉操
作系统这个套接字应该监听哪个IP 地址和端口号。

3.创建UDP 数据报:在VxWorks 中,数据通常以一种叫做"msgBuf" 的结构形式传递。


可以使用msgBfrNew函数创建一个新的msgBuf,并使用msgBfrPut函数将数据放入msgBuf中。

4.发送UDP 数据报:一旦您的数据被放入msgBuf中,您可以使用sendto函数发送它。

sendto函
数需要知道目标IP 地址和端口号,这些信息应该与您想要发送到的设备匹配。

5.接收响应:如果您的应用程序也需要接收数据,您可以使用recvfrom函数来接收响应。

recvfrom函
数将阻塞,直到收到一个数据报或发生错误。

在VxWorks 中使用这些函数时,重要的是要理解实时操作系统的调度特性。

例如,sendto和recvfrom可能会在不同的任务或中断服务程序中调用,这可能会影响它们的执行顺序和时间。

因此,在设计网络通信代码时,需要仔细考虑任务的优先级、任务的调度策略以及可能的中断。

vxworks代码分析

vxworks代码分析

MemPoolEnd
RootTaskMem 10000
RootTask Stack Root_Task TCB
•在系统初始化时在kernelInit()中分配中 断堆栈和RootTask的TCB和Stack.其他部分
作为系统分区分配.
•在RootTask执行完后在taskDestory中把其 TCB和Stack通过MemAddPool()加到系统分
FREE_BLOCK BLOCK_HDR
pPrevHdr pPrevHdr
表示空闲节点
BLOCK_HDR BLOCK_HDR
FREE_BLOCK BLOCK_HDR
pPrevHdr pPrevHdr pPrevHdr
pPrevHdr
表示整块内存的 首尾“哨兵”
表示已用内存
BLOCK_HDR
pPrevHdr
windExit 或intExit 函数将当前任务的寄存器环境保存在 任务控制块中,调用函数reschedule进行任务调度
windLoadContent 函数从新选择的任务控制块中装载寄存器 上下文
windLoadContent 函数中执行指令 pushl WIND_TCB_PC(%eax), 它将新选择任务的tcb 结构中存放的pc地址压入系统堆栈
kernelLib.c (kernel\vxworks4\target\src\wind)
kernelInit()函数(2/2)
在ቤተ መጻሕፍቲ ባይዱ里创建了系统的第一个任务
taskInit (pTcb, "tRootTask", 0, VX_UNBREAKABLE | VX_DEALLOC_STACK, pRootStackBase, (int) rootStackSize, (FUNCPTR) rootRtn, (int) pMemPoolStart, (int)memPoolSize, 0, 0, 0, 0, 0, 0, 0, 0);

vxWorks多任务编程初探(转)

vxWorks多任务编程初探(转)

vxWorks多任务编程初探(转)进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。

程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体。

而进程则不同,它是程序在某个数据集上的执行,是一个动态实体。

它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消,反映了一个程序在一定的数据集上运行的全部动态过程。

线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位。

线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

线程和进程的关系是:线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。

线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)。

根据进程与线程的设置,操作系统大致分为如下类型:1、单进程、单线程:MS-DOS大致是这种操作系统;2、多进程、单线程:多数UNIX(及类Unix的Linux)是这种操作系统;3、多进程、多线程:Windows NT(以及基于NT内核的Windows 2000、XP等)、Solaris 2.x和OS/2都是这种操作系统;4、单进程、多线程:vxWorks就是这种操作系统。

vxWorks只有一个进程(内存空间和资源分配),其任务的概念与线程大致相当,所有任务之间共享内存和其它资源。

vxWorks由一个体积很小的内核及一些可以根据需要进行定制的系统模块组成。

vxWorks 内核最小为8KB,即便加上其它必要模块,所占用的空间也很小,且不失其实时、多任务的系统特征。

vxWorks的内核主要包括:1、多任务:为满足真实世界事件的异步性,现代操作系统需提供多任务支持,由系统内核分配CPU给多个任务并发执行。

vxworksprintf与logMsg及中断相关内容(转载加总结)

vxworksprintf与logMsg及中断相关内容(转载加总结)

vxworksprintf与logMsg及中断相关内容(转载加总结)1. printf需要调用输入/输出设备资源,若在intr中使用printf,可能会由于标准输入/输出设备在被使用中(一般会semtake一下),这导致intr被阻塞,这在vxworks在是不被允许的,可能就导致系统响应速度极其慢或者忽快忽慢(因为通常情况下intr的第一步操作是自私的关闭所有中断,此时资源等到in/out设备可以使用才会继续往下执行)。

logMsg里面的实现是将消息发送给sysLog这个任务,查看一下vxworks发现,这个任务的优先级为0(不知道是不是我们的比较特别)。

这带来一个规则:若在intr中,sysLog不会进行抢占操作将logMsg中的信息输出出来(毕竟interrupt的优先级是最高的),但是intr一执行完,它立刻抢占,将信息输出。

若在普通的任务(优先级 > 0)中调用logMsg,它会毫不留情的抢占,将信息输出。

2. 相关解释printf( ) - write a formatted string to the standard output stream (ANSI).logMsg( ) does not actually perform the output directly to the logging streams, but instead queues the message to the logging task, logMsg( ) can be called from interrupt service routines.printf()是将信息输出到标准输出设备(STDIN/STDOUT)中,如果此时设备正在工作,那么就会发生阻塞.logMsg()是使用消息队列的方式,它将信息地址发送到队列,由专门的任务将信息打印出来.关于LogMsg的工作机理。

LogMsg利用消息队列将用户所发的消息传送给LogTask,然后由LogTask将其显示在屏幕或者其他输出设备上。

vxworks系统及函数详解

vxworks系统及函数详解

VxWork介绍及编程VxWork介绍及编程一.嵌入式操作系统VxWorks简介VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。

良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。

它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。

在美国的F-16、FA-18 战斗机、B-2 隐形轰炸机和爱国者导弹上,甚至连1997年4月在火星表面登陆的火星探测器上也使用到了VxWorks。

实时操作系统和分时操作系统的区别从操作系统能否满足实时性要求来区分,可把操作系统分成分时操作系统和实时操作系统。

分时操作系统按照相等的时间片调度进程轮流运行,分时操作系统由调度程序自动计算进程的优先级,而不是由用户控制进程的优先级。

这样的系统无法实时响应外部异步事件。

实时操作系统能够在限定的时间内执行完所规定的功能,并能在限定的时间内对外部的异步事件作出响应。

分时系统主要应用于科学计算和一般实时性要求不高的场合。

实时性系统主要应用于过程控制、数据采集、通信、多媒体信息处理等对时间敏感的场合。

VxWorks的特点•可靠性操作系统的用户希望在一个工作稳定,可以信赖的环境中工作,所以操作系统的可靠性是用户首先要考虑的问题。

而稳定、可靠一直是VxWorks的一个突出优点。

自从对中国的销售解禁以来,VxWorks以其良好的可靠性在中国赢得了越来越多的用户。

•实时性实时性是指能够在限定时间内执行完规定的功能并对外部的异步事件作出响应的能力。

实时性的强弱是以完成规定功能和作出响应时间的长短来衡量的。

VxWorks 的实时性做得非常好,其系统本身的开销很小,进程调度、进程间通信、中断处理等系统公用程序精练而有效,它们造成的延迟很短。

vxworks7编程指南

vxworks7编程指南

vxworks7编程指南VxWorks 7编程指南VxWorks 7是一款实时操作系统(RTOS),被广泛应用于嵌入式系统开发中。

本文将为读者介绍VxWorks 7的一些基本概念、特性和编程指南,帮助读者更好地理解和应用VxWorks 7。

一、VxWorks 7概述VxWorks 7是一款由美国飞利浦公司(Wind River)开发的实时操作系统,它具有高性能、可靠性和可定制性的特点。

VxWorks 7支持多种硬件平台,包括x86、ARM、PowerPC等,并提供了丰富的开发工具和库函数,方便开发人员进行嵌入式系统的开发。

二、VxWorks 7的特性1. 实时性:VxWorks 7具有非常高的实时性能,能够满足对实时性要求较高的应用场景,如航空航天、军事等领域。

2. 多任务支持:VxWorks 7支持多任务并发执行,可以同时处理多个任务,提高系统的吞吐量和效率。

3. 可定制性:VxWorks 7提供了灵活的系统配置和组件定制功能,开发人员可以根据实际需求进行裁剪和优化,减少系统资源占用。

4. 异常处理:VxWorks 7提供了丰富的异常处理机制,能够有效地处理系统中出现的异常情况,保证系统的稳定性和可靠性。

5. 网络支持:VxWorks 7提供了完善的网络支持,包括TCP/IP协议栈、网络驱动程序等,方便开发人员进行网络应用的开发。

三、VxWorks 7编程指南1. 开发环境搭建:首先,需要安装VxWorks 7的开发工具和相应的编译器。

然后,创建一个新的项目,配置项目的相关参数,如目标硬件平台、编译选项等。

2. 任务创建和管理:使用VxWorks 7提供的API函数,可以创建和管理多个任务。

任务的创建需要指定任务的入口函数和优先级等参数,任务的管理包括任务的启动、挂起、恢复等操作。

3. 任务间通信:VxWorks 7提供了多种任务间通信机制,如消息队列、信号量、邮箱等。

开发人员可以根据实际需求选择合适的通信机制,实现任务间的数据交换和同步。

vxworks下PCI设备驱动开发的相关函数

vxworks下PCI设备驱动开发的相关函数

vxworks下PCI设备驱动开发的相关函数对于vxworks 下PCI 设备调试来说,pciConfigShow 库函数可以帮助显示一些PCI 设备的信息。

VxWorks API Reference : Driver LibrariespciConfigShowNAMEpciConfigShow - Show routines of PCI bus(IO mapped) libraryROUTINESpciDeviceShow( ) - print information about PCI devicespciHeaderShow( ) - print a header of the specified PCI device pciFindDeviceShow( ) - find a device by deviceId, then print an information. pciFindClassShow( ) - find a device by 24-bit class code pciConfigStatusWordShow( ) - show the decoded value of the status word pciConfigCmdWordShow( ) - show the decoded value of the command word pciConfigFuncShow( ) - show configuration details about a function pciConfigTopoShow( ) - show PCI topologySTATUS pciDeviceShow(int busNo /* bus number */)STATUS pciHeaderShow(int busNo, /* bus number */int deviceNo, /* device number */int funcNo /* function number */)STATUS pciFindDeviceShow(int vendorId, /* vendor ID */int deviceId, /* device ID */int index /* desired instance of device */ )STATUS pciFindClassShow(int classCode, /* 24-bit class code */int index /* desired instance of device */ )STATUS pciConfigStatusWordShow (int bus, /* bus */int device, /* device */int function, /* function */void * pArg /* ignored */)STATUS pciConfigCmdWordShow (int bus, /* bus */int device, /* device */int function, /* function */void * pArg /* ignored */)STATUS pciConfigFuncShow(int bus, /* bus */int device, /* device */int function, /* function */void * pArg /* ignored */)void pciConfigTopoShow ()tips:感谢大家的阅读,本文由我司收集整编。

vxworks命令教程2024新版

vxworks命令教程2024新版
文件操作命令
文件创建、打开和关闭
创建文件
使用`creat()`函数创建新文件,需要指定文件名和访 问模式。
打开文件
使用`open()`函数打开已存在的文件,同样需要指定 文件名和访问模式。
关闭文件
使用`close()`函数关闭已打开的文件,释放相关资源 。
文件读写操作
01
读取文件
写入文件
02
03
telnet
远程终端服务命令,用于建立TCP连接 并远程登录到目标主机。
ftp
文件传输协议(FTP)命令,用于在网 络上传输文件。
tftpபைடு நூலகம்
简单文件传输协议(TFTP)命令,用 于在网络上进行简单的文件传输。
网络诊断和调试
netstat
网络统计命令,用于显示网络 连接、路由表、接口状态等网
络相关信息。
在嵌入式系统开发中,命令行接口(CLI )是一个不可或缺的工具。通过CLI,开 发者可以与系统进行交互,执行命令,查 看系统状态,调试问题等。
本教程旨在帮助开发者熟悉并掌握 VxWorks的命令行接口,以便更有效地 进行嵌入式系统开发和调试。
教程范围
基本命令介绍
涵盖VxWorks中常用的基本命令, 如任务管理、内存管理、时间管理
ndp
邻居发现协议(NDP)命令,用于 IPv6网络中的邻居发现和管理。
route
用于设置和查看路由表,实现网络数 据包的正确转发。
dhcpc
动态主机配置协议客户端(DHCP Client)命令,用于从DHCP服务器 获取网络配置信息。
数据传输和接收
ping
用于测试网络连接可达性,发送ICMP 回显请求并接收回显应答。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if (select(width, &readFds, NULL, NULL, NULL) == ERROR) { /*监听*/ close(fds[0]); ... ...; close(fds[3]); return; } for(i=0; i if (FD_ISSET(fds[i], &readFds)) { ... ...; /* 进行读写操作 */
三、IO 系统:ioLib.h 1、系统中的 IO 设备,包括键盘、串口、文件等,都用统一的接口访问。第一步通常先得到 文件描述符,然后进行读写或者设置的工作,最后关闭该描述符。 creat:建立文件 open:得到文件或设备的描述符 read:读文件或设备 write:写文件或设备 ioctl:设置参数 close:关闭文件描述符 remove:删除文件
二、常用的库: #i nclude "taskLib.h" /* 任务 */ #i nclude "msgQLib.h" /* 消息队列 */ #i nclude "semLib.h" /* 信号量 */ #i nclude "ioLib.h" /* IO */ #i nclude "wdLib.h" /* Watch dog */ #i nclude "logLib.h" /* 信息输出 */ #i nclude "socket.h" /* 网络套接字 */
taskSend() { int pd; /* pipe 的描述符 */ if ((pd = open("/pipe/mypipe", O_WRONLY, 0644)) == ERROR) { printf("Open pipe failed!"); } if (semTake(semMID, NO_WAIT) == ERROR) { printf("Pipe in use!"); } write(pd, "a", 1); semGive(semMID); close(pd); }
taskReceive() { uchar_t ch; msgQReceive(msgQID, &ch, 1, WAIT_FOREVER); /* 这里任务会阻塞 */ printf("Received from msgq: %c ", ch); }
2)管道:ioLib.h,系统默认包含了 pipe 驱动组件 pipeDevCreate( ) - 创建管道 pipeDevDelete( ) - 删除管道 由于管道属于 IO,所以可以使用 Select 监听,消息队列不是 IO,不能使用 Select
taskSend() { if (OK != eventSend(taskReceiveID, 0x00000001)) { printf("Event send failed!"); } }
taskReceive() { UINT32 Ev; if (OK!=eventReceive(0x00ffffff, EVENTS_WAIT_ANY, WAIT_FOREVER, &Ev)) { printf("eventReceive Error!\n"); } else { Ev &= 0x00000001; if (Ev) { printf("Event %d received!", Ev); } } }
五、Watch dog :wdLib.h 系统提供了软看门狗定时器,使用也简便: wdCreate( ) - 创建看门狗 wdDelete( ) - 删除 wdStart( ) - 启动 wdCancel( ) - 停止
Init() { /* 创建看门狗 */
if ((wdID = wdCreate()) == NULL) { printf("Watch dog create failed!\n"); } }
VxWorks 编程常用函数说明
这两天在看 VxWorks 下的 socket 网络方面的编程,其中涉及到不少 VxWorks 下的函数使用, 在网上搜了半天觉得这个很不错,于是将其 copy 下来。最后给出了 copy 的链接。 vxWorks 编程指南
一、官方的 Program Guiide\index.html
taskReceive() { semTake(semBID, WAIT_FOREVER); /* 这里任务会阻塞 */ }
4)事件:eventLib 发送事件要指定目标任务的 ID eventReceive( ) - 等待事件 eventSend( ) - 发送事件 eventClear( ) - 清除当前任务的事件.
fds[0] = open(..);... ...;fds[3] = open(..); /* 打开 IO */ width = MAX(fds[0], ... ... , fds[3])+1; /* fd 的最大值+1 */ /* FOREVER {*/ FD_ZERO(&readFds); /* 设置 fd_set 结构 */ FD_SET(fds[0], & readFds);... ...; FD_SET(fds[3], & readFds);
3、通过 Select 函数实现多个 IO 监听:selectLib.h 当等待多个 IO 时,我们可以使用 Select 函数,fd 为文件描述符: int select( int width, /* 最大的 fd,或直接 FD_SETSIZE (2048) */ fd_set * pReadFds, /* 读的 fd 集合 */ fd_set * pWriteFds, /* 写的 fd 集合 */ fd_set * pExceptFds, /* vxWorks 不支持,NULL */ struct timeval * pTimeOut /* 等待时间, NULL = forever */ ) 还有几个宏: FD_SET(fd, &fdset) 设置 fd 的监听位 FD_CLR(fd, &fdset) 清除 fd 的监听位 FD_ZERO(&fdset) 清除所有监听位 FD_ISSET(fd, &fdset) fd 是否有数据 例子,其中 MAX 意为取最大值: Init() { struct fd_set readFds; int fds[4]; int width;
Init() { /* 创建管道 */
if (pipeDevCreate("/pipe/mypipe", 8, 1) != OK) { printf("/pipe/mypipe create fialed!\n"); } /* 创建互斥信号量 */ if ((semMID = semMCreate(SEM_Q_FIFO)) == NULL) { printf("Mutex semaphore create failed!\n"); } }
3)二进制信号量 Init() { /* 创建二进制信号量 */ if ((semBID = semBCreate(SEM_Q_FIFO, SEM_EMPTY)) == NULL) { printf("Binary semaphore create failed!\n"); } }
taskSend() { semGive(semBID); }
memDevCreate("/mem/mem1", buffer, sizeof(buffer)); if ((fd = open("/mem/mem1", O_RDWR, 0644)) != ERROR) { write(fd, &data, sizeof(data)); ... ... close(fd); } memDevDelete("/mem/mem1"); }
2、任务互斥 - 信号量:semLib.h semGive( ) – 释放一个信号量 semTake( ) – 获取一个信号量,会阻塞 semFlush( ) – 使所有阻塞在本信号量上的任务变为就绪状态 semDelete( ) – 删除一个信号量
1)二进制信号量:semBCreate 可用于任务同步和互斥,但常用于任务同步 2)互斥信号量:semMCreate 专门用于任务互斥的信号量,保护临界资源 3)计数信号量:semCCreate 多实例资源的访问控制
} } /* } */ }
四、多任务环境的编程: 1、任务控制:taskLib.h taskSpawn( ) - 创建任务 taskInit( ) -初始化任务,用户自己指定栈和 PCB 地址 taskActivate( ) - 激活已经初始化的任务 exit( ) - 在任务中结束 (ANSI) taskDelete( ) - 删除任务 taskDeleteForce( ) - 强制删除,即使被保护 taskSuspend( ) - 挂起任务 taskResume( ) - 恢复挂起的任务 taskRestart( ) - 重新启动任务 taskPrioritySet( ) - 改变任务优先级 taskPriorityGet( ) - 读取任务优先级 taskLock( ) - 禁止任务调度 taskUnlock( ) - 允许任务调度 taskSafe( ) - 保护任务不被删除 taskUnsafe( ) - 解除保护 taskDelay( ) - 延时 taskIdSelf( ) - 得到当前任务的 ID taskIdVerify( ) - 任务 ID 是否存在 taskTcb( ) - 得到任务控制块(TCB)的地址 taskOptionsSet( ) - 改变任务选项 taskOptionsGet( ) - 得到任务当前选项 taskRegsGet( ) - 得到任务 TCB 中寄存器的信息 taskRegsSet( ) - 设定任务 TCB 中寄存器的信息 taskName( ) - 得到任务名称 taskNameToId( ) - 由名称得到 ID taskIdDefault( ) - 设置默认的任务 ID taskIsReady( ) - 任务是否就绪 taskIsSuspended( ) - 任务是否挂起 taskIdListGet( ) - 得到活动的任务列表
相关文档
最新文档