当前位置:首页 > VxWorks
  • Wind River Labs推动智能边缘创新开发

    领先的智能边缘软件提供商风河系统公司近日推出Wind River Labs,这是一个为开发人员量身定制的新网站,技术人员可以在此获得软件工程、概念验证、开源集成、实验性软件和新技术的相关支持。该网站还为开发者社区提供了首个免费VxWorks®实时操作系统(RTOS)软件开发工具包(SDK)。 Wind River Labs是一个可供开发人员(不限于风河的客户)在边缘进行协作创新的环境,并可实验机器学习和计算机视觉等功能。以此为基础开发人员还可与创建项目的软件工程师互动,与其他软件工程师共同应对类似的挑战,并与风河生态系统成员共同探索新市场和前瞻性设计。 可用的VxWorks SDK包含面向Raspberry Pi和UP Squared硬件的开源板卡支持包。开发人员现在可以下载最新版本的VxWorks以及ROS2(机器人操作系统)等项目,并可立即在这个行业领先的操作系统上开展原型设计和应用设计。 Wind River Labs的其他特色项目包括: · 适用于 Wind River Linux的TensorFlow · 适用于VxWorks的OpenCV · 适用于VxWorks的Microsoft Azure IoT SDK · 适用于VxWorks的 AWS IoT Device SDK · 适用于VxWorks的Google Cloud IoT Core SDK · 适用于VxWorks的Google Test支持 · 适用于VxWorks Remote Compute的OpenAMP 风河首席战略官Gareth Noyes表示:“由于软件数量的激增以及相关的自治和智能系统的快速发展,推动协作创新比以往任何时候都更加重要。Wind River Labs使开发人员可以尽早接触尖端软件工程,并通过工作代码、示例以及技术方法和社区项目来支持创意共享。” Wind River Labs扩展了风河公司软件产品集的综合性,全面覆盖从原型到设计、从开发到部署的多变开发流程。无论您的开发团队是从开源开始,还是需要Linux/RTOS、亦或是两者兼而有之,风河现在都能提供完整支持。Wind River Labs还具备足够的灵活性,使公司能够推出极具竞争力的产品,既借力于最新的社区驱动型创新,又满足关键任务应用所要求的功能安全性、信息安全性和可靠性。

    时间:2020-02-26 关键词: VxWorks sdk 智能边缘软件

  • 风河宣布VxWorks RTOS支持RISC-V架构

    风河宣布VxWorks RTOS支持RISC-V架构

    新闻要点 -VxWorks是支持RISC-V架构且部署最为广泛的商业化RTOS -借力最新开源硬件指令集架构,风河持续增强在RTOS业界的领先地位 -风河同时加入了RISC-V基金会 领先的智能边缘软件提供商风河®近日宣布,其业界领先的VxWorks®实时操作系统(RTOS)支持RISC-V开源架构。在RISC-V开源硬件指令集架构(ISA)之上,VxWorks是部署最为广泛的商业化RTOS。风河公司同时也加入了RISC-V基金会,这是一个非营利性机构,致力于RISC-V ISA及其软硬件生态系统的标准化、保护和推广,面向所有计算设备应用。 VxWorks支持RISC-V架构,这是RTOS领域又一轮创新浪潮的最新成果,从而使其成为首屈一指的RTOS,率先做到对C++ 17、Boost、Python和Rust技术集的全部支持。 RISC-V基金会CEO Calista Redmond说:“我们非常高兴地欢迎风河加入RISC-V基金会以及我们的全球生态系统。VxWorks大大扩展了RISC-V在嵌入式开发领域的发展空间。我们期待风河公司和RISC-V社区能够继续推进软件开发进程。” 风河公司产品副总裁Michel Genard说:“RISC-V为开源架构硬件开发注入活力,并获得了巨大的行业吸引力,这令人兴奋不已。风河公司很兴奋能够推进VxWorks创新,并通过与其他伙伴的通力合作,共同为RISC-V的成功做出贡献,正如我们与SiFive公司和MicroChip公司合作,为他们的Unleashed和PolarFire® SoC FPGA板提供支持一样。” Microchip公司FPGA业务市场助理副总裁Shakeel Peera说:“VxWorks对于我们基于RISC-V的PolarFire SoC FPGA系列提供支持,将为嵌入式系统设计者带来非常有吸引力的产品,因为他们越来越需要实时Linux解决方案来解决低功耗、热效率和安全性方面的问题。我们与风河公司的合作关系非常重要,因为我们将共同努力推进RISC-V生态系统和社区建设。” SiFive公司总裁兼CEO Naveed Sherwani博士说:“风河公司VxWorks支持RISC-V架构,这是RISC-V生态系统持续发展的重要一步。能够在SiFive 核心 IP和设备上运行VxWorks,这将在全世界开辟新的应用市场。” 2019年12月9日至12日在圣何塞举行的RISC-V基金会峰会上,风河公司在Microchip 公司展位上,展示了VxWorks成功运行在SiFive公司 RISC-V HiFive Unleashed板上的展品。

    时间:2019-12-25 关键词: 风河 VxWorks risc-v rtos

  • 风河运用VxWorks嵌入式软件开发进行了重新的定义

    风河运用VxWorks嵌入式软件开发进行了重新的定义

    全球领先的智能边缘软件提供商风河公司近日宣布,推出其业界领先的实时操作系统(RTOS) VxWorks 的最新版本。同时VxWorks 是第一个、也是唯一一个支持 C++17、Boost、Python 和 Rust 技术集的实时操作系统(RTOS)。 基于 LLVM 的全新基础架构,支持各种现代化高效工具和框架。 VxWorks 最新版本将用户友好型桌面、企业平台以及云原生开发环境带入了嵌入式市场。 过去 30 多年来,这个平台一直推动着嵌入式应用功能安全性和信息性的发展,并提供了高度确定性的性能。在此过程中,VxWorks 不断发展,满足了软件开发人员不断变化的需求。VxWorks 最新版本性能出众、行业领先,重新定义了嵌入式软件开发,必将创造更大的商业价值,大幅度推动创新、提高生产效率。 各行各业都在快速推进由自动化向自治化的转型,同时大量吸引着接受过云原生技术训练的新一代开发人员,因此就需要一种更加现代化的开发方法,以便软件工程师能够运用当今主流工具和编程语言来开展创新。现在,VxWorks 使各种背景的开发人员都能够借助于主流编程语言和库以及基于云的开发工具和基础设施,从而开创了关键任务型应用系统的新时代,具有最高级别的功能安全性与信息安全性是其中的必然要求。 最新版本的 VxWorks 将用户友好型桌面、企业平台以及云原生开发环境带入了嵌入式市场,具有以下特色: 是第一个、也是唯一一个支持 C++17、Boost、Python 和 Rust 技术集的实时操作系统,并继续为 Ada 和 SPARK 等语言提供支持。 基于 LLVM 的全新基础架构,支持各种现代化高效工具和框架、新的开源板级支持包(BSP),如树莓派(Raspberry Pi )和 TI Sitara Am65x,可实现快速原型开发并提供了选择的灵活性。 OpenSSL 1.1.1 最新加密软件库包。 VDC Research 执行副总裁 Chris Rommel 指出:“新一代自治化智能系统的设计目标要求新的技术来优化开发流程,然而同样重要的是,需要使开发平台与当今工程师不断发展的技能协调一致。基于风河公司长期服务于关键任务系统的经验,其新版 VxWorks 为新一代系统开发很好地解决了这两个问题。” 风河公司产品副总裁 Michel Genard 表示:“为了履行我们对实时操作系统(RTOS)创新的承诺,风河正在以 VxWorks 来颠覆和重新定义嵌入式开发的工程模式,让开发变得更为简便易行,进而提高了生产率。当今的实时操作系统(RTOS)必须接受现代化开发实践,这意味着要与开发人员使用的主流框架、语言和方法相兼容,同时还不能牺牲功能安全性、信息安全性、性能和可靠性。”

    时间:2019-10-16 关键词: 风河 嵌入式开发 VxWorks

  • rtl8139 END驱动性能分析

    rtl8139 END驱动性能分析

    RTL8139 网卡性能提升分析3162412793@qq.com技术交流QQ群:691976956 一、数据接收优化数据接收优化,主要是从如下几个点出发进行驱动软件的修改:接收中断实现上下部方式,中断中通过发送同步信号量,收包由一个阻塞的任务来获取到该信号量后开始进行接收的动作。原始方式:当有网络数据包接收完毕后,CPU会进中断服务程序,中断服务中,通过一个系统API函数来挂接收包任务,那就是netJobAdd,该函数原形如下:   STATUS netJobAdd     (     FUNCPTR routine, /*在工作程序队列中要加的例行程序*/     int param1, /*这个例行程序的第一个参数*/     int param2, /*这个例行程序的第二个参数*/     int param3, /*这个例行程序的第三个参数*/     int param4, /*这个例行程序的第四个参数*/     int param5,/*这个例行程序的第五个参数*/     )而默认情况下,netJobAdd 接口将 routine 函数和相应的参数传递到 tNet0 任务重被执行,而该任务的优先级是 50(VxWorks6.6版本是50, 不记得VxWorks5.5.1是多少了,也许是45),该优先级固定死了,没有提升的空间。改进方式:经过上述的分析后,可以在中断服务程序中释放一个同步信号量,通知接收数据包的任务来收包,而该收包任务的优先级可以自定义调整,也就是具体实现中断上下部的方式。 LOCAL void rtl81x9Int    (    RTL81X9END_DEVICE  *pDrvCtrl    ){… #if  0    if (stat & RTL_IPT_RX_OK)    {        if (netJobAdd ((FUNCPTR)rtl81x9HandleRecvInt,(int) pDrvCtrl,0, 0, 0, 0) != OK)            DRV_LOG(DRV_DEBUG_INT, "xl: netJobAdd (rtl81x9HandleRecvInt) failedn", 0, 0, 0, 0, 0, 0);        DRV_LOG(DRV_DEBUG_RX, "RTL_IPT_RX_OKn", 0, 0, 0, 0, 0, 0);*/}#endif if (stat & RTL_IPT_RX_OK){if(pDrvCtrl->unit == 0){/*释放信号量,开始接收数据*/semGive(rtlNetTaskSemId0);}}}      收包任务的实现      /*数据接收任务0*/void rtlRecvTask0(RTL81X9END_DEVICE *   pDrvCtrl){    FOREVER    {        /* wait for somebody to wakeus up */       semTake (rtlNetTaskSemId0, WAIT_FOREVER);       rtl81x9HandleRecvInt(pDrvCtrl);    }} 在start 函数中,启动一个接受数据包的任务,如下代码所示。 VxWorks系统下的缓冲区管理机制的研究网络协议存储池使用mBlk结构、clBlk结构、簇缓冲区和netBufLib提供的函数进行组织和管理。mBlk和clBlk结构为簇缓冲区(cluster)中数据的缓冲共享和缓冲链接提供必要的信息。netBufLib例程使用mBlk和clBlk来管理cluster和引用cluster中的数据,这些结构体中的信息用于管理cluster中的数据并且允许他们通过引用的形式来实现数据共享,从而达到数据“零拷贝”的目的。 结构体mBlk和clBlk及其数据结构mBlk是访问存储在内存池中数据的最基本对象,由于mBlk仅仅只是通过clBlk来引用数据,这使得网络层在交换数据时就可以避免数据复制。只需把一个mBlk连到相应mBlk链上就可以存储和交换任意多的数据。一个mBlk结构体包括两个成员变量mNext和mNextPkt,由它们来组成纵横两个链表:mNext来组成横的链表,这个链表中的所有结点构成一个包(packet);mNextPkt来组成纵的链表,这个链表中的每个结点就是一个包(packet),所有的结点链在一起构成一个包队列,如图1所示。 结构体mBlk和clBlk的数据结构如下所示:struct mBlk{M_BLK_HDR    mBlkHdr;              /* header */M_PKT_HDR    mBlkPktHdr;         /* pkthdr */CL_BLK *         pClBlk;      /* pointer to cluster blk */} M_BLK; struct clBlk{     CL_BLK_LIST  clNode;/* union of next clBlk */    UINT       clSize;/* cluster size*/    int    clRefCnt;/*countof thecluster */    struct netPool *  pNetPool;  /* pointer to the netPool */} CL_BLK; /* header at beginning of each mBlk */struct mHdr{    struct mBlk *     mNext;/* nextbuffer in chain */     struct mBlk * mNextPkt;/* next chain inqueue/record */     char *mData;                /* location of data */ int mLen;/* amount of data in this mBlk */ UCHAR   mType;/* type of data in this mBlk */ UCHAR   mFlags;               /* flags; see below */} M_BLK_HDR; /* record/packet header in first mBlk of chain; valid if M_PKTHDR set */struct          pktHdr{struct ifnet *         rcvif;/* rcvinterface */int      len;             /* total packet length */} M_PKT_HDR; 网络协议存储池的初始化VxWorks在网络初始化时给网络协议分配存储池并调用netPoolInit()函数对其初始化,由于一个网络协议通常需要不同大小的簇,因此它的存储池也必须包含很多簇池(每一个簇池对应一个大小的簇)。如图2所示。另外,每个簇的大小必须为2的方幂,最大可为64KB(65536),存储池的常用簇的大小为64,128,256,512,1024比特,簇的大小是否有效取决于CL_DESC表中的相关内容,CL_DESC表是由netPoolInit()函数调用设定的。 网络协议存储池初始化后的结构 使用netBufLib进行内存池管理 netBufLib提供了mBlks与clBlks结构,其中mBlks指向clBlks,而clBlks指向实际存贮数据的Cluster。不同层次之间交互数据可以直接通过传递mBlks链来进行,而不用进行多余的数据拷贝。其中clBlks的作用是,记录有多少个mBlks对其进行了引用,当引用为零时才可以释放。不同的mBlks可以指向相同的clBlks,以共享数据。 对于发送或接收的包可以由多个分开的内存块组成,也可以由一块大的内存块组成。因此对于一个包来说,它有一个mBlks链,链接着这个包的所有clusters。一个包也应该可以由一个大cluster组成,要是这样的话,一个包就只要有一个mBlks就行了。mBlks除链接着本身的所有的mBlks外,mBlks头还链接着下一个包的mBlks链的头。 Clusters大小:对于Clusters的大小,可以有不同型号。用于protocol的内存池,可以有不同大小的Clusters型号,但型号大小仍有限定(见参考资料)。用于driver的内存池,只有一种大小的Cluster。其大小与MTU(max transport unit)类似。 建立内存池内骤:调用netPoolInit(),初始化缓冲池参数。预留mBlk,clBlk,cluster结构空间等。此步应在初始化时进行。 在Clusters中保存数据:1、在初始化时,调用netClusterGet()来预留Clusters空间。2、当组装好数据或接收到数据则装进Clusters中的一个。3、调用netClBlkGet()来预留clBlk结构。4、调用netClBlkJoin()连接clBlk到包含数据的Cluster。5、调用netMblkGet()预留mBlk结构。6、调用netMblkClJoin()连接mBlk结构到clBlk。 释放mBlks,clBlks,Clusters:释放mBlks链:netMblkClChainFree().这将释放链中所有的mBlks。同时减少clBlks中mBlks对其的引用,若减少至零,则clBlks及Clusters被释放。释放单独mBlk,clBlk,Cluster: netMblkClFree(); protocol与driver间传数据:driver调用MUX的muxReceive();MUX调用protocol的stackRcvRtn()函数;当muxReceive()正确返回后,driver确定数据己发送,接下来的buffer释放,由协议栈上层来完成。(The upper layers of the stack are responsible for freeing the memory back to the driver’s memory pool.) 三、网络收包分析网卡收包有一系列需要注意的地方。3.1 数据包的格式定义数据包的格式如下。    /* cur_rx:            31           16 15             0          ------------------------------------------------------         0:     |    WORD1    |     WORD2    |  -----           ------------------------------------------------------                                                            _/    +4:    ------------------------------------------------------           |            DWORD3            |          ------------------------------------------------------           WORD1:  Receive Status Flag;           WORD2:  Receive Package Length;           DWORD3: Receive PackageData Start Address.     */      数据包开头的4字节是接收的状态标志和数据长度信息,后面才是数据的开始地址,也就是说,拷贝数据的地址从当前的指针位置 cur_rx + 4 开始,尾部是4字节的帧校验序列 FCS (Frame Check Sequence), FCS 采用32位CRC循环冗余校验对从"目标MAC地址"字段到"数据"字段的数据校验,一般该数据没有使用。 数据拷贝当前一帧数据的长度信息是存放在位置指针的头四个字节中的,具体如上所述。获取到的长度包含了4字节的状态信息,然后是数据,然后是4字节的 FCS。拷贝数据动作:如果没有跨尾,则直接拷贝即可。    memcpy (pNewCluster, readPtr + 4,len);        计算下一次DMA数据存放的地址;    cur_rx = (cur_rx + len + 4 + 3)& ~3;如果有跨尾,则分两次拷贝wrapSize = (int) ((readPtr + len) - (pDrvCtrl->ptrRxBufSpace +RTL_RXBUFLEN));/* Copy in first section of message as stored *//* at the end of the ring buffer             */memcpy (pNewCluster, readPtr + 4, len-wrapSize-4);/* Copy in end of message as stored *//* at the start of the ring buffer */memcpy (pNewCluster +len - wrapSize - 4, pDrvCtrl->ptrRxBufSpace,wrapSize);/* there have some error compiler's bug in this line*//* If I just copy the correct bytes the last two bytes will*//* have some trouble, so I copy extra bytes to fix the CPU or*//* OS's bug vic                    */ 计算下一次DMA数据存放的地址;    cur_rx = (wrapSize + 4 + 3) &~3;3.2 数据接收由硬件DMA从FIFO到主内存后,提交给 pMblk 的内存链之Cluster,最理想的是实现“零拷贝”。   原始方式:网卡MAC接收到数据后,先进入到内部的64K+16字节的FIFO,然后由 DMA直接将 FIFO中的数据通过PCI Master 的方式来传递到主存,主存为一个环形的内存缓冲区,如上述图所示。当有完整的数据包过来后,通过中断通知CPU,进入到中断服务程序处理接收逻辑。首先读取接收状态,如果发现是发送中断,则直接调用发送中断服务程序,如果是接收中断,且没有发现接收错误,则发送同步信号量,收包任务被激活,进入到收包程序。 收包程序将读命令寄存器,获取到 bit 0 的数值,如果该数值一直为0,则表示缓冲区中还有数据没有取完,通过一个循环操作解析数据包,拷贝到 Cluster, 连接到clBlk, 最后连接到 mBlk, 然后提交到协议栈,直到取完为止,中间有一系列的容错处理,还有注意内存拷贝的指针计算等操作,都在里面。 改进方式:上述的原始的方式,存在一个很明显的问题,那就是进行了数据的拷贝。分配给DMA的环行缓冲区地址是独立的,数据首先会到这里,而我们最终提交给协议栈的内存空间却是另一个内存块,该内存块也是由用户自己分配的,那么就需要进行从第一个内存地址空间到另一个内存地址空间的搬移,这样大大地浪费了操作系统的时间,效率自然就降低了。鉴于此,可以考虑一点,能否在由DMA环行缓冲区拷贝数据到Cluster 改为直接使用DMA的环行缓冲区作为内存管理 Cluster 的新地址,说的比较多,估计也听的有点不太明白,看下面的对比图。 原始的操作方式  现在的操作方式 这样直观看了后,发现效率肯定有明显的差别,前者需要内存拷贝,后者不需要内存拷贝。具体的,在实现后者的设计思想上,有一些技巧需要考虑的。因为硬件设计特点,当DMA环行缓冲区到尾后,如果条件允许,数据将会自动从DMA缓冲区头开始存放数据,目前设置的DMA缓冲区大小为 64K+16(16字节用于软件自动调节下次存放的指针位置,确保是对齐的地址)。这样的话,如果按照提交指针的方式,则会有点问题,为什么呢?因为,恰巧当数据包跨缓冲区尾和区头的时候,这样提交指针就会出现数据错误。具体原因分析如下:虽然分配了一段地址给DMA环行缓冲区,看起来是一个环,但实际上,地址不是连接在一起的,而是一块内存,只是通过配置了寄存器后告诉硬件DMA,到内存的尾了,就自动从头开始存放而已。  如果接收到的数据包没有跨尾,则可以直接提交当前的入口指针即可,否则,如果出现了跨尾,则还是按照上述的操作会出现问题,看下图。  如果出现跨尾,则直接提交 Data Pointer 后将使用了后面虚线的内容,而不会使用前面的数据块,暂时无法实现自动回头的功能。有两种方式解决该问题,一种就是,在网卡驱动 start函数中,动态分配一个1518+8字节的内存块,然后将上述出现了分离的数据拷贝到该内存块,然后将该内存首地址join到 clBlk 即可;另一种就是,在分配DMA环行缓冲区的时候,在原来的64K+16字节的基础上,多分配1518+8字节的空间,如上述的虚线框所示,这样的话,只需要将上述的最头上的兰色框的数据拷贝到DMA End地址之后,然后可以直接提交 Data Pointer  join到 clBlk 即可。       但是在实际中,按照后者操作的方式,出现了一些问题,需要解决。 问题点如下: 按照后者的方式操作后,PING 没有问题,小量发送数据包也没有问题,当使用发包工具大量发包的时候,只要在串口控制台上按下任何的命令,都会出现如下的错误信息: data accessException current instruction address: 0x001ebce4Machine Status Register: 0x00003032Data Access Register: 0x5fff0017Condition Register: 0x42048042Data storage interrupt Register: 0x40000000Task: 0x273b470 "tRtlRxTask0"0x273b470 (tRtlRxTask0): task 0x273b470 has had a failure and has beenstopped.0x273b470 (tRtlRxTask0): fatal kernel task-level exception! 通过DEBUG方式,依次查找出现问题的原因。上述错误信息指令地址在0x001ebce4,一般而言,如果修改代码,重新编译,该地址将会变化。 在命令行下查看了该地址信息,如下: -> lkAddr 0x001ebce4 0x001eb290 netMblkChainDup          text    0x001ec398 muxTxRestart             text    0x001ec48c muxReceive               text    0x001ec6a0 muxSend                  text    0x001ec6d8 _muxTkSendNpt            text    0x001ec7c0 _muxTkSendEnd            text    0x001eca98 muxTkSend                 text    0x001ecac8 muxTkReceive             text    0x001ecd04 ipcom_sem_wait           text    0x001ecd28 ipcom_mutex_lock         text    0x001ecd4c ipcom_sem_interrupt_flush text   0x001ecd6c ipcom_sem_flush          text    value = 0 = 0x0 问题点应该可以锁定在 netMblkChainDup 这个函数中。 可以使用 tt 命令跟踪下。跟踪发现,在 netMblkChainDup 函数里面出现了异常。 -> tt tRtlRxTask 0x000962f8 vxTaskEntry  +0x48 :rtlRecvTask0 (0x270d9e8)0x00030324 rtlRecvTask0 +0x28 : semTake ()0x0016d9d4 semTake      +0x138:semBTake ()value = 0 = 0x0 正常情况下,如上述所示。 如果出现了上述的数据非法访问错误,则网络收包任务将被迫停止。通过 tt 命令后就可以发现,通过一系列的函数调用后,最后的执行函数为netMblkChainDup,估计在该函数中,释放了一些内存,然后继续使用导致。 但是有一点不太明白的是,如在 shell下不执行任何的操作,网络可以承受不停的冲击,没有什么问题,如果一旦操作后,系统就挂死了。 反汇编,找到该指令的地址所在:可以使用 objdumpppc –D vxWorks>img.s -> objdumpppc –D vxWorks >img.s  找到目标地址:  如何实现DMA缓冲区和 pMblk 的缓冲区管理链中的 Cluster的内存共享,以达到“零拷贝”。该部分的内存共享,如上述分析,可能存在一些问题。实际测试的结果是,网络在该情况下可以正常的收发包,但是,内存可能出现了问题,或者操作系统的任务栈遭受了破坏,shell 下无法输入命令,只要一输入,系统就挂死了。同上3),原因还没有找到。 借助以前开发VxWorks系统下的 1394驱动经验,能否借助于消息队列来提升性能?借助于 Linux 系统下面的接收机制初始化使能中断后,第一次无论是发送完成或接收中断,进去后,关闭所有中断,然后读取中断状态寄存器,判断是何种类型的中断,如果是发送完成中断,则在退出中断之前,仅仅打开发送中断,如果是接收中断,则在退出中断之前,不使能接收中断,等接收数据包任务完成后再使能该中断。总结为一句话,发送中断按照原始的处理方式,而接收中断第一次进中断后,屏蔽该中断类型,中断服务程序释放一个同步信号量,激活收包任务,采用轮询的方式直到将数据包接收完毕后再打开接收中断。 二、数据发送优化在阅读发送函数时,发现协议栈(以下简称上层),将pMblk 指针传递给发送函数,然后再查询是否有可用的发送描述符后,对上层的数据包进行拷贝到发送描述符对应的缓冲区,设置发送,等待完成。这里对速度影响比较大的点就是,执行了数据的拷贝动作,参考如下代码:LOCAL STATUS rtl81x9Send    (    RTL81X9END_DEVICE           *pDrvCtrl,           /* device ptr */    M_BLK_ID                     pMblk               /* data to send */){…               /* Replace this code !! */        #if 0                len = netMblkToBufCopy(pMblk, pBuf, NULL);               netMblkClChainFree(pMblk);        #endif                len =pMblk->mBlkHdr.mLen;                                   /*pMblk->mBlkPktHdr.len = len;*/                                len = max (len, ETHERSMALL);                tx_val = len + (0x38mBlkHdr.mData;                 …                /* Flush the writepipe */                CACHE_PIPE_FLUSH ();                netMblkClChainFree(pMblk); /* Add byalex */}上述代码中,红色字体部分是原始的代码,需要进行拷贝,这样会影响到发送性能,修改为蓝色字体部分,基本上实现了“零拷贝”,经过 EtherPeek 发包软件测试,没有问题。 

    时间:2019-10-08 关键词: VxWorks 5.5 rtl8139

  • VxWorks汉字显示解决方案

    VxWorks汉字显示解决方案3162412793@qq.com技术交流QQ群: 691976956一. VxWorks操作系统图形显示方案VxWorks作为嵌入式实时操作系统的龙头老大,在国内应用已非常广泛,其中包括工业控制、医疗设备、家庭视听、车载电子等许多需要本地显示的行业。作为国内的显示应用,汉字显示是必不可少的,而vxWorks原厂商没有直接提供完备的汉字显示解决方案,本文就这个热点论题,通过对VxWorks显示组件的分析,具体给出一种汉字显示的方案。VxWorks的汉字显示首先需要一种图形解决方案,只有工作在图形模式下才可能显示汉字。vxWorks有三种显示的方案可供选择:1. WindML + Zinc:WindML是wind river mutli-media library 的简称,其中包含UGL(universal graphics library)。该组件直接控制显示硬件,主要提供显示模式设置、标准输入输出控制、点线面作图等函数,编程接口很类似于Torbo C,Borland C里的图形库。Zinc基于WindML,提供了类Windows风格的接口,有各种控件被封装于内,编程接口很类似于windows编程。2.WindML + Jworks:Jworks 提供Java的支持,在VxWorks上启动Java 虚拟机来解释Java语言,图形开发编程接口是Java语言,Java虚拟机的图形实现基于WindML。3.web server + WindML + Jworks + browser:web server 使显示编程接口成为编写网页,可以通过远程的browser来访问而使设备具有远程显示接口,也可以在本机做browser使设备具有本机显示接口,该browser的实现需要WindML或Jworks的支持。上述方案内,纯web server的方案不需要本地汉字显示,只要在网页上放国标码或unicode码等,由远程的browser去实现显示;其它方案基本上都需要WindML的支持,这是因为VxWorks系统里所有底层的显示操作都是通过WindML实现。二.汉字显示方案实现本地汉字显示的方案一定会涉及到WindML,只是不同的方案对WindML的依赖程度有所不同,一般有如下几种:1.利用WindML对双字节编码的支持,实现对汉字的点阵存储、点阵获取、点阵显示的全过程,并使用WindML的双字节显示函数实现汉字码到汉字显示。这种方法使用了系统机制,是最根本的解决方法,并使使用WindML的其它上层组件很方便的实现汉字显示。2.自己开发点阵存储、点阵获取、点阵显示,改造WindML的双字节或单字节显示函数,使其能判断汉字码,一旦判断出汉字码,则使用自己开发的点阵获取、点阵显示等把汉字显示出来。该方法对点阵的操作更加灵活,适合非标准的点阵算法,或者当开发者已有成熟的点阵操作方法时,把该方法绑接到WindML上。3.完全自己开发一套点阵存储、点阵获取、点阵显示、汉字显示函数,使用者使用特定的汉字显示函数把汉字显示出来。该方法具有最大的灵活性,甚至不理睬WindML的任何机制,直接在上层组件里实现,但这种方法使程序的中英文混合显示变得复杂,程序可移植性也比较差。本文将就第一种显示方案和第一种汉字显示方案详细论述WindML的双字节编码机制,并利用该机制构建WindML汉字显示框架,并论述Zinc如何使用该框架。这些机制和思路其实是任何方案都需要考虑的,对绕开WindML的方案也具有指导和借鉴意义。三. WindML的点阵参数先来讨论一下WindML点阵的各种参数:1.每个字模都有一个占据的空间,该空间对于点阵字库里的每个字是一样大的,所有字符点阵的大小都不应该超过该空间,如果超过,显示时超出部分将被截掉。相关参数有:maxAdvance:最大宽度(横向)大小,点为单位。maxAscent,maxDescent:maxAscent + maxDescend 是最大长度(即纵向)大小,两数的交界决定了一个baseline,maxAscent是baseline以上的长度,maxDescent是baseline以下的部分。Baseline对于定位具体字符点阵的打点起始位置非常重要,另外如果有一行来自同一个字符集的字符串,则这些字符的baseline是在一条线上的。maxAscent + maxDescent 有时被称为字符表高度height,注意要与下面所述的字符高度区别开来。2.每个字符点阵也有一个范围大小,该大小与每个字符有关,该大小一般不会填满整个字模空间。相关参数有:width:宽度。height:高度。ascent:点阵打点开始位置在baseline之上的偏移,如果是负数,则点阵在baseline之下开始打点。ascent和height决定了点阵从字模的多少行开始打点,要打多少行。而列的打点起始位置,固定是0,即字模的最左边,所以只有width描述打点的宽度。3. 字符横向和纵向都要有额外空间,以防止字符粘接重叠。相关参数有:leading:行间距。4. 对字符的一些变换选项,字符读取的标志等。相关参数有:pixelSize:平均行、列大小。weight:行、列加粗属性。italic:斜体属性。spacing:字符行间距属性。charSet:字符集标志。faceName:字符集名称。familyName:字符集的家族名称。scalable:字符放大缩小比例。WindML显示字符时,以maxAscent + maxDescend作为字符高度(不加leading),以width作为字符宽度(不以maxAdvance,不判断spacing),根据字符ascent和字符height取出字符点阵数据,进行weight、italic、scalable等运算(很多运算需要用户开发),然后输出到屏幕。四.WindML的点阵存储结构和操作方法WindML双字节编码显示的参数和实现思路集中体现在点阵存储文件的结构上,该文件的框架如下(这些文件在WIND_BASE/target/src/ugl/fonts/bmf目录下):UGL_LOCAL const unsigned char UGL_FAR_DATA page0Data[]= { … /* 0x0023 ('#') */ 0, /* page*/ 0x23, /*index*/ 0, /*size (MSB)*/ 20, /*size (LSB)*/ 8, /*width*/ 16, /*height*/ 14, /*ascent*/ 0x00,0x00,0x00,0x00,0x44,0x44,0x44,0xfe,0x44,0x44,0x44,0xfe,0x44,0x44,0x44,0x00, /*data*/ /*0x0024 and other characters*/ … … /*end*/ 0,0,0,0 }/*西文扩展为双字节编码的点阵表*/ /*上表解析: page + index 就是该字符的ASCII编码,不过扩为了双字节; size (MSB) + size (LSB) 是该字符的点阵信息大小,注意实际描述体的长度是2(2字节page,index)+ 该大小 + 1 (从0开始编大小,所以从1数要加1),而ascent之后的真正点阵数据的大小是 该大小减4 ; width + height 是该点阵资料的宽度和长度; ascent是点阵处在baseline以上的偏移位置,baseline的位置要看整个字符表描述结构的定义; data 是按行扫描得到的点阵资料,是列递增把行显示效果排成一个连续空间后,按字节来描述每位的打点状态;如果行宽不是8位的整数倍,不会把位补0去凑8位整数倍。 字符点阵描述数据依次往下排列,直到以4个0标示结束。 */ UGL_LOCAL const unsigned char UGL_FAR_DATA page1Data[]= { 0x81, /*page*/ 0x40, /*index*/ 0, /*size*/ 36, /*size*/ 16, /*width*/ 16, /*height*/ 14, /*ascent*/ 0x00, 0x08, 0xff, 0xfc, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x10, 0x1f, 0xf8, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x02, 0x20, 0x01, 0x40, 0x00, 0x80, /*other characters*/ … … /*end*/ 0,0,0,0 }/*国标码对应的点阵表*/ /*上表解析: 数据含义与西文表类似,注意字码是双字节国标码 */ UGL_LOCAL const unsigned char * const pageArray[] = { page0Data, page1Data, UGL_NULL };/*总的点阵资料表*/ /*上表解析: 把分类的点阵资料表汇集成一张表,总表以UGL_NULL结束,注意各个分表是以0,0,0,0结束; 可以把汉字表按GB2312编码的page分类,构建多个汉字分表,然后把分表指针填入该表,当然也可以做成一个汉字大表,把指针放在该表,甚至也可以把中西文点阵做成中西文混合大表,然后把该表指针放在该数组里。 */ const UGL_BMF_FONT_DESC uglBMFFont_Song_16 = { /* UGL_FONT_DESC structure */ { { 16, 16}, /* pixelSize */ {UGL_FONT_BOLD_OFF, UGL_FONT_BOLD_OFF }, /* weight */ UGL_FONT_UPRIGHT, /* italic */ UGL_FONT_PROPORTIONAL, /* spacing */ UGL_FONT_UNICODE, /* char set */ "Song 16x16 Dot", /* face name */ "Song" /* family name */ },/*点阵名称等点阵属性表*/ /* UGL_BMF_FONT_DESC structure */ /*点阵表的属性和位置*/ 2, /* leading */ 14, /* maxAscent */ 2, /* maxDescent */ 14, /* maxAdvance */ pageArray /* glyph pages */ };/*点阵描述结构*/ /*上表解析: 首先是定义属性表,然后是定义字模和间距,并定义总的点阵描述表指针。 */ 最后定义的const UGL_BMF_FONT_DESC uglBMFFont_Song_16 包含了该点阵的所有信息。只要能定位住该结构,则任何能在该点阵表内匹配出字码的字都可以显示出来。WindML选择不同的点阵就是选择不同的该结构去做点阵寻址,其实现的大体过程如下:1.WIND_BASE/target/src/ugl/config/uglBmfCfg.c文件描述了整个系统能使用的字符集,如:extern const UGL_BMF_FONT_DESC uglBMFFont_Courier_12; extern const uglBMFFont_Song_16; /*就是上面的例子*/ const UGL_BMF_FONT_DESC * uglBMFFontData[] = { &uglBMFFont_Courier_12, &uglBMFFont_Song_16, NULL }; 2.通过如uglDriverFind (UGL_FONT_ENGINE_TYPE, 0, (UGL_UINT32 *)&fontDrvId);的调用定位点阵驱动,即控制对点阵表访问、打点等操作的函数;通过如uglFontFindString(fontDrvId, "familyName=Song; pixelSize = 16", &systemFontDef);的调用定位点阵描述结构;通过如fontSystem = uglFontCreate(fontDrvId, &systemFontDef));的调用绑接点阵和点阵驱动,并标识为fontSystem;如此重复创建多个字符集的点阵标识。3.通过如uglFontSet(gc, fontSystem);的调用设置当前字符集;通过如uglTextDrawW(gc, iX, iY, iLength, caString);的调用在iX, iY的位置显示caString里的字码。可见,只要开发者根据上述的存储结构开发出对应的字符点阵,然后把点阵描述结构加入到uglBMFFontData,便可以使用系统的函数使用这些点阵了。在Dos/Windows、linux系统下有一些应用程序,可以把操作系统的点阵导出为C文件或数组,把这些导出的文件加以调整,就可以得到vxWorks系统支持的格式。五.Zinc对汉字的支持只要WindML的汉字支持做成功,则可以按如下方法使Zinc支持汉字:WIND_BASE/target/src/zinc/generic/i_ugldsp.cpp 文件是WindML与Zinc的接口文件,在ZafScreenDisplay::ZafScreenDisplay 函数里使用上述的函数定义了Zinc要使用的字符集,把这些字符集改成汉字字符集,并且把Zinc配置成支持UNICODE的方式重新编译,则Zinc就自然支持汉字显示了。六.注意事项和总结在使用过程中,还要注意几个问题:Tornado对汉字的编译,如果把汉字定义为如short ca[ ]={ '董' ,0x00} (把单个汉字定义在单引号),则编译生成的目标码是正序的国标码;如果定义为如”董”(双引号定义出的汉字字符串),则编译生成的目标码是反序的国标码。这样,就必须约定一种定义,以根据该约定产生的国标码来构建字符点阵表(需要改变表里面的字码顺序)。如果使用双引号定义汉字字符串,要注意该串数据是以一个字节0结束,使用uglTextDrawW要求是字为单位,所以,需要在该字符串结尾补一个0(”00”即可)。有些字库表的字码是UNICODE的编码,尤其是使用一些操作系统的点阵导出程序生成的字库表,UNICODE编码与国标码有一一对应关系,可以把这样的字库表转换过来或者在程序里适当位置把要显示的内容转为UNICODE再显示。本文就嵌入式操作系统上使用汉字这一热门论题,论述了VxWorks上的图形实现方案、汉字开发方案,图形组件WindML对多字节码的支持特性,并在论述特性的同时,列举了宋体16点阵的框架,帮助汉字开发者理解点阵实现的细节;在论述WindML汉字操作函数之后,提出了在Zinc层实现汉字显示的方法和编程时的注意事项。这套方案已经成功的实现,并在上海大众的导航产品、南京电力的电力控制产品等项目上获得成功的应用。

    时间:2019-08-26 关键词: VxWorks windml

  • vxworks内存管理

    vxworks内存管理

    1、vxworks内存管理基本概念(1)内存和外部存储器的概念:一般RAM属于内存而Flash、ROM、NVRAM是嵌入式操作系统的外部存储器;(2)操作系统的内存分配一般都在系统启动或者复位的情况下进行,在运行时尽量避免内存动态申请和释放,因为这样会带来系统的不稳定性;(3)vxworks为用户提供了2中内存区域:一种是Region内存域,是可变长的内存区域;另一种是partition内存分区,是定长的;vxworks内核和应用程序对内存的操作都是基于内存分区进行的;2、vxworks中的内存布局(1)vxworks 中主要涉及到的内存单元的概念有:内存分区、内存池、内存块;①内存池是一块连续的内存区域,包含一块或者多块内存块;这些区域由memPartAlloc和memPartFree来申请和释放;②内存分区:包含自身的描述信息和一个或者多个内存池,描述信息保存在内存分区中而内存池就是该内存分区拥有的实际内存空间;内存分区在刚创建的时候只有一个内存池,用户程序可以往该内存分区中增加别的内存池,操作系统和通常大部分用户对内存的操作,都发生在系统的内存池中;(2)vxworks启动的是BootRom+vxworks方式,那么系统中先后存在2种内存布局;①BootRom运行时的内存布局:reboot启动系统时,内存RESERVED和USE_REVERSE_MEM不会清楚UIqing这俩快内存区域,系统冷启动时会清楚所有的内存区域;因此可以利用热启动不进行清清除这俩块内存区域来记录一些非常关键的信息写入USE_REVERSE_MEM中来 解决问题,②vxworks运行时内存布局3、内存分配的算法 (1)内存的管理方法分为2种,可用表和自由链;①可用表:即一张二维表格,每个表项记录了一个空闲内存块,主要参数包括块号、长度、起始地址;管理比较简单,但是表的大小无法确定,自身需要占用内存;②自由链:自由链利用每个空闲块开始的几个内存单元存放本空闲块的大小以及下个空闲块的起始地址;缺点是查询量较大,但是自由链指针利用了自身的空闲单元,因此不需要额外占用内存块;链表大小没有限制,容易添加或者删除节点,vxworks中利用自由链来管理内存空闲块;(2)内存分配算法:可以分为三种,最先适应法、最佳适应法和最坏适应法;①最先适应法:可用表和自由链按起始地址递增的次序排列,特点:一旦找到大于或者等于所要求的内存长度的内存块,则结束搜索;该算法将从找到的内存划分出用户需要的内存分配给用户,如果相邻的有空闲块则将剩余部分与空闲块合并;②最佳适应法:要求空闲内存块按照从小到大的次序组成可用表或自由链。当系统申请一个内存时,内存管理程序从表头开始查找直到找到大雨裹着等于需要的空闲内存块为止,当内存块大于申请的内存块时,按照最先适应法去处理;③最坏适应法:与最佳适应法正好相反,要求空闲块按照从大到小的次序组成可用表或者西游链,当系统申请内存时首先检查第一个空闲块的大小是否等于或大于所要求的内存块大小,如果大于则分配给用户,然后调整空闲块的可用表或者自由链;三种方法最佳适应法具有最佳性能,由于最先适应法和最坏适应法都需要对空闲内存块进行排序,而最佳适应法只是调整空闲块的大小,位置并未发生改变;最先适应法得到的内存空间最接近用户所需求内存的大小,往往剩下的空闲内存块会很小,不便于得到利用,容易产生碎片;相反最坏适应法剩下的空闲块可能会大,容易被使用,相对减少内存碎片的产生;vxworks基于以上原因和嵌入式系统的实时性采用了最先适应法;vxworks没有清楚碎片的功能,因此在实时系统设计中应该尽量避免内存碎片的产生;4、内存管理API函数1、创建内存分区memPartCreate,该函数创建了一个内存分区,包含一个内存值,返回值为分区ID,以便之后进行操作,有了内存分区就方便管理多个内存池;PART_ID memPartCrete{/*内存分区的起始地址*/char *pPool;/*内存分区的大小*/unsigned poolSize;}2、memPartAddToPool在内存分区中增加一个额外单独的内存池,每调用一次memPartAddToPool分区中的内存池数量就加1;一个分区中相邻的内存池地址不一定连续创建成功返回OK,失败返回ERROR;STATUS memPartAddToPool{/*内存分区的ID*/FAST PART_ID partId;/*内存池的起始地址*/FAST char *pPool;/*内存池的大小*/FAST unsigned poolSize;}3、memPartAlignedAlloc在指定内存分区的内存池中分配一个内存块时2的整数次幂的内存块;void *memPartAlignedAlloc{FAST PART_ID partId;unsigned nBytes;unsigend aligment;}在没有内存共享的情况下memPartAlignedAlloc和memPartAlloc作用相同;4、memPartFree/malloc/free/calloc/cfree登;

    时间:2019-07-10 关键词: VxWorks 内存管理

  • vxWorks FAQ中文版收藏

    这是从别处转载的,可以将它复制下来,查找自己碰到的问题,可能有解答额,呵呵。前言(Surface):随着国内使用VxWorks的用户越来越多,为了方便VxWorkers少走一些弯路,特别推出了中文FAQ,其中很多的FAQ来自comp.os.vxworks和原创。(很多FAQ都可以在该新闻组找到英文版)      文档的FAQ总共分为7大类:1.入门FAQ2.Tornado工具FAQ3.BSP FAQ4.文件系统 FAQ5.网络 FAQ6.VxWorks操作系统 FAQ7.其它 FAQ    基本涵盖了Tornado/VxWorks使用中的主要方面。文档组织本身没有逻辑上的关联,经过分类,只是松散的组合在一起,可根据你的需要选择阅读某一部分。  为了保持本文档的开放性和可扩充性,欢迎大家把自己曾经碰到过的问题及其解决办法按分类加到文档里来。在修改本文档时,请把修改记录加到历史记录里。  欢迎任何人指出文档中的错误之处,请把错误之处发到附录B里的任一个EMAIL里,在此对那些问题的提出者、回答者以及文档的维护者一并表示感谢!  当前版本(Current Version):version 0.1 历史(History):2002-08-27 wys205  create 0.1 version 目录(Content):1.入门FAQ2.Tornado工具FAQ2.1 编译器和链接器2.2 调试器2.3 FTP2.4 主机工具2.5 安装2.6 MAKEFILE2.7 工程2.8 目标机服务器2.9 Shell2.10 Telnet2.11 Tornado2.12 版本控制2.13 可视化集成2.14 Windsh2.15 WindView 3.BSP FAQ3.1 不同BSP3.2 处理器3.2.1 Power PC3.2.2 I9603.2.3 MIPS3.2.4 ARM3.2.5 x863.3 Bootstrap3.4 配置你的VxWorks3.5 VME3.6 VxWorks环境 environment3.6.1 usrSerial.c3.6.2 prj_vxworks.tcl3.7 PCI 4.文件系统 FAQ4.1 Dos文件系统4.2 Flash文件系统4.3 Floppy-disk文件系统4.4 RAM-disk文件系统4.5 基本文件系统问题 5.网络 FAQ5.1 配置问题5.2 ARP5.3 DHCP5.4 FTP和TFTP5.5 PPP5.5.1 PPP on Windows 955.5.2 PPP on Windows NT5.5.3 PPP on Solaris5.6 Sockets5.7 Telnet5.8 SNMP5.9 其它网络相关问题 6.VxWorks操作系统 FAQ6.1 C++ issues6.2 Communication problems6.3 Interrupts6.4 LoadModule problems6.5 pthreads6.6 Reboot6.7 Semaphores6.8 Simulator (VxSim)6.9 Task related items6.10 Time/timer related items6.11 Wind Web Server related items6.12 Zinc/windML related items6.13 Other items6.14 VxWorks AE issues7.其它 FAQ7.1 Hard delay7.2 Memory leaks7.3 Corba engines7.4 Web servers7.5 NTP usage7.6 Performace / Benchmarks7.7 SNMP7.8 Lint7.9 Encryption7.10 其它 附录A.一些有用的连接附录B.维护 1.入门FAQ1.1 概念1.1.1 最近刚开始学习VXWORKS,越看越迷糊:1)BSP,bootImage,VxWorksImage三者的关系是什么?BSP是BootImage的一部分还是VxWorksImage 的一部分?对于可以自启动的系统是不是三者合在一起生成一个VxWorks Image?2)应用程序代码是和VxWorks内核一起编译生成一个VxworksImage吗?以上问题是针对于代码存放在rom介质上的系统(如flash)。希望各位大侠不吝赐教!谢谢。。。A:BSP 是用来支持你的硬件的软件, 它包含在你的VxWorksImg里面.对于ROM启动的系统来说, BootImg是ROM里代码的第一部分, 用来在开机时首先运行. 如果你的所有代码都在ROM上, 则引导程序把VxWorksImg拷贝到系统内存, 然后再跳转的系统内存去执行.BSP的作用屏蔽不同的硬件结构(如CPU和外围芯片)向VxWorks的Kernel提供它所需要的一个统一的接口调用(如时钟)(by 泡泡) bsp: 板级支持包,主要完成目标硬件的初始化工作,提供操作系统一个统一的接口,负责硬件操作,如中断处理,启动,停止,等工作。Bootimage:引导镜像,我向如果把boot翻译成启动不是很是当的说法,这是一个引导程序,负责把目标系统环境初始化,最小的程度,如启动了串口,或者网络接口,可以使用这些接口现在程序,与主机通信,然后获取你需要的OS-vxworksimage vxworksimage-包含vxworks内核以及各种组件的镜像,也就是object images,这是真正的操作系统,通常bootimage负责获取这个镜像,然后跳到镜像所在的位置开始执行。(by hongwind ) 1.1.2 如何学习VXWORK,PSOS入门?A:初次上站,感觉大家水平一般,入门级选手较多,实时多任务操作系统和以前大家使用的低端产品,如51机在原理上是不同的,因此大家最好先学习多任务操作系统的原理。否则无法深入学习。     推荐一本书:坦尼博姆著:《操作系统》,各地都有的卖,主要是讲MINIX的原理,其实就是UNIX系列操作系统的实现原理,由于VXWORKS和PSOS都是这个系列的操作系统,因此理解了这本书,也就理解了它们的工作原理。必将事半功倍,而且对你理解WINDOWS的工作原理也很有好处。  (by bruin) 1.2 环境1.2.1 斑竹tornado都是支持那些cpu??能列一下吗或哪里能找到?斑竹tornado都是支持那些cpu??能列一下吗或哪里能找到!!! A:开发平台: Windows NT, Sun Solaris, SunOS, HP-UX, Win95 支持处理器: x86, 68k, PPC, CPU 32, i960, SPARC, SPARCLite, SH, ColdFire, R3000, R4000, C16X, ARM, MIPS ...1.3 编程1.3.1 vxworks,bsp中有些定义怎么找不到用到的地方,还有些定义找不到在哪里定义过了,比如MAMR_PTA_SHIFT,哪位大侠给解答一下。不胜感激!     A:在h/drv/multi/ppc860Siu.h里。看代码还是用Source Insight(by vxfree)2.Tornado工具FAQ 2.1 编译器和链接器2.1.1 当我把多个目标文件链接成一个时,出现了一个错误:ldppc:built in linker script:43: syntax error 我怎么样才能消除这个错误?A:请确定你的链接器使用了-r参数。(From: weber.dirk@t-online.de) 2.1.2 我怎样使用新版本的编译器?A:参看如下连接,有一个PPC的编译器http://www.newgcc4vxworks4ppc.cjb.net/ 2.1.3 当用另一个编译器编译代码时,得到更多的错误和警告,怎样才能让GCC生成更多的警告信息?A:首先用-Wall参数打开所有警告开关;另一种生成更多报告的方法就是把文件看作是C++文件,参数为 -x c++.(From: Claudio Ortega, cortega@sinfomed.org.ar)-Wall不能真正打开所有的警告,我采用由Bruce Evans推荐的参数而且在FreeBSD环境下,BDECFLAGS变量比较固定。 # BDECFLAGS are a set of gcc warning settings that Bruce Evans has suggested# for use in developing FreeBSD and testing changes.  They can be used by# putting "CFLAGS+=${BDECFLAGS}" in /etc/make.conf.  -Wconversion is not# included here due to compiler bugs, eg: mkdir()‘s mode_t argument.#BDECFLAGS=-W -Wall -ansi -pedantic -Wbad-function-cast -Wcast-align \     -Wcast-qual -Wchar-subscripts -Winline \     -Wmissing-prototypes -Wnested-externs -Wpointer-arith \     -Wredundant-decls -Wshadow -Wstrict-prototypes -Wwrite-strings This set of flags is *much* pickier than -Wall alone. (From: W Gerald Hicks) 2.1.4 当编译我的模块时一切都是好的,但是当我试图下载时得到一个错误:missing symbol "__eabi"?A:在你的模块里可能有个main函数,根据PPC "extended Application Binary Interface" (eabi)标准,main函数必须调用__eabi函数,该函数为运行你的程序设置必要的运行环境。  由于这个原因GNU编译器在main函数里插入 __eabi函数。Tornado不提供该函数,因为在实时环境下,你不必写main函数。VxWorks在应用程序运行前已经设置好运行环境了,不再需要main函数了。(From: Ilia, iliab@telegate.co.il)--  作者:lxlong--  发布时间:2005-6-25 13:09:28--  2.1.5 我生成了2.95.2版本的编译器,一切正常,但当我开始链接我的映象时,出现了错误,下面是我链接ctdt表时的错误:ctdt.o(.data+0x3c):fake: undefined reference to `global constructors keyed to _constructor_name_... 许多类似的错误,有谁见过这种错误吗?A: 该问题是由gcc(ver2.7.2-2.95.2)试图改变它得到静态构造函数的方法引起的。它不再对每个构造静态对象的模块消除函数,该方法是vxworks在编译链接过程中采用的方法。你可以按如下修改gcc 2.95.2源代码后,恢复原先的操作。in [source code dir]/gcc/config/arm/vxarm.h, at the very end, add:- /*  More DK patches: we undef these two in order to force the  *//*  compiler to output our static constructors and destructors    *//*  in the fashion to which it is accustomed....  */#undef ASM_OUTPUT_CONSTRUCTOR#undef ASM_OUTPUT_DESTRUCTOR/*  This one is so that GLOBAL_THING gets a $ in it‘s name  */#undef NO_DOLLAR_IN_LABEL现在更换到你的编译目录,敲入make clean命令,然后重新编译和安装编译器。我采用这种方法是可以的,PPC版本的。它使得编译器使用老的方法来making munchable constructors。希望对你也有帮助。(From: Dave Korn)2.1.6 在我编译时,我在编译窗口看到如下输出:nm386 -g partialImage.o @B:\Sources\Components\Common\Common_Geni_Test\Src\prjObjs.lst | \wtxtcl D:\Tornado\host\src\hutils\munch.tcl -asm 386 > ctdt.c   ...cc386 -nostdlib -r -Wl,-X  partialImage.o ctdt.o -o VxWorksGeniServerTestExe.out最后一步(linking partialImage.o to ...out)花了很长时间(半个小时),谁有解决办法?A: 这个可能是munching过程,而不是链接,花了半小时。有人曾贴了一个小窍门来加速。在munch命令管道里使用"grep GLOBAL"如:nm386 -g partialImage.o @B:\Sources\Components\Common\Common_Geni_Test\Src\prjObjs.lst | grep GLOBAL | \wtxtcl D:\Tornado\host\src\hutils\munch.tcl -asm 386 > ctdt.c(From: Dave Korn)2.1.7 怎样定义一个没有空洞的结构。Q: How do define a structure without holes in it?A: 我在vxworks中使用GNU编译器struct ex {INT8  source;INT32 txSize;INT32 datSize;INT16 cmd;} __attribute__ ((packed));typedef struct ex PackedStruct;注意:如果可能,避免使用-fpack-struct编译器开关。我门最近移除了这个选项,使得我们的C++程序提高了30%-100%的性能。这是因为每次存取结构或类里多字节值时,都是一个一个字节操作的。可以使用__attribute__ ((packed)) 方法代替。(From: Mark Fanara, mfanara@home.cNOSPAMMom, and Francisco Pataro, fpataro@dnaent.com)2.1.8 我怎样在一个C程序文件里调用一个C++函数?A: 如果你想在一个C程序文件里调用一个C++函数,C++函数必须用extern "C"声明;否则编译器将破坏函数名,把参数类型说明加在函数名末尾,并返回该函数。(From: Dave Korn)2.1.9 -fvolatile开关真的需要吗?A: WRS建议我们在编译kernel/BSP时,使用-fvolatile开关。它通常缺省打开某个target/h/make/目录下的文件。  我们也在我们的应用程序编译过程中使用-fvolatile开关,因为我们参考一些tornado的makefile。当我们移除该开关后,就碰到一些微妙的BUG,如果你编写驱动程序应当小心。    -fvolatile开关使编译器生成非常conservative的代码。通过指针使变量值增加(p->x++)不可能如你想象的在一条指令里完成(68k example):addql #1,a0@(8)如果采用-fvolatile 开关你会得到:  movel a0@(8),d0  addql #1,d0  movel d0,a0@(8)  movel a0@(8),d0You can imagine what a C++ application using the "this" pointer everywhere gets compiled into! (From: Chris Varlese, cv@no.mail.net)2.1.10 我链接了许多档案文件,现在链接器在解析文件之间的交叉参考时出现了问题?A: 试试下面的方法1、把$(LIBS)替换成$(LD_PARTIAL) -o vxWorks.tmp $(MACH_DEP) usrConfig.o version.o $(LIBS) (在target/h/rules.bsp文件中)。 Now LD_PARTIAL is ccxxx, so you need to specify -Wl,--group-start to get cc to pass the argument to ld. 2、Try adding a -Usymbol for each symbol that has to be pulled in early. 3、如果办法2 make ld行太笨拙,生成一个.s文件,包含每个没定义的符号和加到链接里的。4、如果你工作UNIX下,它应该可能得到ld生成没有定义的所要求的列表。你需要加一个循环,就象下面一样:/*这是原文,我翻译不好。1、$(LIBS) is substituted int $(LD_PARTIAL) -o vxWorks.tmp $(MACH_DEP) usrConfig.o version.o $(LIBS) (in target/h/rules.bsp for a non-project build). Now LD_PARTIAL is ccxxx, so you need to specify -Wl,--group-start to get cc to pass the argument to ld. 2、Try adding a -Usymbol for each symbol that has to be pulled in early. 3、If (2) make the ld line too unwieldy, generate a .s file that contains: .extern symbol for each undefined symbol and include that into the link before the libraries 4、If your building on unix, it ought to be possible get ld to generate the required list of undefines! You need to add a loop! Something like this might work: */   [ ! -f undefs.s ] && echo "#" >undefs.s   while  $(CC) -c $(CFLAGS) undefs.s  $(LD_PARTIAL) -o vxWorks.tmp $(MACH_DEP) usrConfig.o version.o \undefs.o $(LIBS)  $(NM) vxWorks.tmp | grep ‘ __‘ | $(MUNCH) > ctdt.c  $(MAKE) CC_COMPILER="-fdollars-in-identifiers" ctdt.o  do  $(LD) $(LDFLAGS) -e $(SYS_ENTRY) $(LD_LOW_FLAGS) -o vxWorks \dataSegPad.o vxWorks.tmp ctdt.o tad_hook_list.o 2>&1 | tee ld.errs |while read file undef ref to symbol do   [ "$undef" = "undefined" ] || continue   [ "$ref" = "reference" ] || continue   [ "$to" = "to" ] || continue   oifs="$IFS"   IFS="‘/`"   symbol="`echo $symbol`"   IFS="$oifs"   echo "\t.extern\t$symbol"   done | sort -u - undefs.s >undefs.new   cmp -s undefs.s undefs.new && break   mv undefs.new undefs.s   done   cat ld.errs当然它需要另一系列的ESC和; \在每一行,以使得可以在make下运行。(我也重新构造了原始的rules.bsp内容,我的可能与vxWorks原来的有些不同。)(From: David Laight, dsl@tadpole.co.uk)2.1.11 警告"trigraphs occured"是什么意思?A: 对Tornado或Vxoworks没什么要做的。你可能在你代码(也可能在注释里)中有三字符序列--参看K&R (Kernighan & Ritchie; A12.1 - 这是ANSI 新引进的。-- 但是GNU手册里提示"You don‘t want to know about this brain-damage..." 使用-ansi或-trigraphs开关,或更好的办法消除任何包含三字符序列‘??X‘的注释。 (参看K&R书中对X的定义)。(From: Michael.Ben-Ari@ecitele.com)2.1.12 为什么编译的最后步骤时间这么长?生成.out步骤如下:  1) 链接应用程序和库到partialImage.o  2) 使用partialImage.o解析出所有静态类(munch)  3) 编译上面发现的(ctdt.o)  4) 用ctdt.o链接第一个obj文件partialImage.o我们的应用程序.out文件有10M,但是多数是调试信息,size386返回只有1M。我们的下载文件生成需要超过5分钟,Step #1-3正常需要35秒!但是step #4 需要很多时间,整个过程需要5分30秒。A: 我不知道为什么这样?但是我们在step #4不重新使用partialImage.o 而是重新生成它,整个过程45s.(是ld386没有对符号过滤进行优化的原因吗?)我只是修改了tornado\target\h\make\rules.vxApp文件,它包含制作应用程序的规则。我修改了上面提到的step $4代码如下:把$(LD_PARTIAL) $(LD_PARTIAL_LAST_FLAGS) partialImage.o ctdt.o -o $@替换成$(LD_PARTIAL) $(PRJ_OBJS_FOR_LD_PARTIAL) $(PRJ_LIBS) ctdt.o -o $@(From: Ole Asbjorn Fadum, OleAsbjornF@scanmar.no)Some more information. For a variety of reasons I‘ve had to do a few build on a slow system. One bit that seemed exceptionally slow is the ‘binToAsm‘ call (just after the ‘deflate‘ generating vxWorks.Z.s). This is done by od -bv $infile | sed -e "s/^[0-9]*[ ]*//;s/ /, 0/g;/^[0-9a-fA-F][0-9a-fA-F]/s/^/ .byte 0/"(ie use od to generate a list of octal bytes, remove the offset, change the spaces to comma, add the directive - an extra 0 is added to each number to ensure they are octal). The above is terribly slow... Slightly faster (under solaris) is: od -An -v -tu1 $infile | tr ‘ ‘ ‘,‘ |   sed -e ‘s/,00*\([0-9]\)/,\1/g;s/^,/      .byte   /‘However it is clear that a C program would be even faster... It was still sluggish using printf, so...char map[256][4];  for (count = 0; count <= 256; count++)    sprintf( map[ count ], "%d", count );for (;;) {    count = read( input_fd, buf, BLK_SZ );    if (count <= 0)    break;  for (off = 0; off < count; off++) {    if (off & 15)       putchar( ‘,‘ );    else       fputs( "\n      .byte   ", stdout  );    fputs( map[ buf[ off ] ], stdout );        }    }now the system is spending very little of its time doing this bit (it was a lot slower than the deflate!). If you are using gcc/gas you can pipe EXTRACT_BIN, COMPRESS, BINTOASM directly into AS - saving that massive intermediate file... Build (compiling one small object) just took 6m50 - was over 10 minutes before I played with binToAsm!Ages ago I sped up ‘munch‘ - by grepping out most of the symbols it isn‘t interested in...nmarm vxWorks.tmp | tee vxWorks.nm | grep " __" | munch > ctdt.c(I use the symbol table from this stage for a variety of things...) (From: David Laight, David.Laight@btinternet.com)--  作者:lxlong--  发布时间:2005-6-25 13:11:03--  2.1.13 怎样把一个段装载到特定的绝对地址?A: 我曾包含一个脚本做这些工作,最方便得到这个脚本的方法是使用--verbose开关运行你的链接器,例如: "ldarm --verbose". 编辑这个文件加入类似如下的段落,  .text  0x8000 : {[omit]        . = ALIGN(0x8000);        /* Create a 8k section of all 0xffff, first value is jump. */        FILL(0xffff);        LONG(0xeb000004);        . = ALIGN(0x2000);[...]这将把数据放到任何你想放的地方,在程序被链接时新的链接器脚本必须使用-T参数。(From: Bill Pringlemeir, bpringlemeir@yahoo.com)2.1.14 我在使用C++类型的注释时,出现错误,怎样改变它?A: 一种方法是移除-ansi开关。然而,你可能希望保留你的源代码与ANSI兼容;所以我更喜欢代码能在每个地方都能编译。传递"-Wp,-lang-c"参数只能使CPP的注释方法可以使用。下面来自预编译器文档`-lang-c‘, `-lang-c89‘, `-lang-c++‘ `-lang-objc‘, `-lang-objc++‘ Specify the source language. `-lang-c‘ is the default; it allows recognition of C++ comments (comments that begin with `//‘ and end at end of line), since this is a common feature and it will most likely be in the next C standard. `-lang-c89‘ disables recognition of C++ comments. `-lang-c++‘ handles C++ comment syntax and includes extra default include directories for C++. `-lang-objc‘ enables the Objective C `#import‘ directive. `-lang-objc++‘ enables both C++ and Objective C extensions. These options are generated by the compiler driver gcc, but not passed from the `gcc‘ command line unless you use the driver‘s `-Wp‘ option .(From: Bill Pringlemeir, bpringlemeir@yahoo.com)2.1.15 我在编译时碰到了关于cc1参数/选项的错误?A: 这个可能是由于安装了Cygwin 或DJGPP引起的。当该版本的编译器在路径里先于Tornado版本Cygwin的GCC被调用时,这个版本不知道这些参数或选项。这个问题可以通过卸载该软件或确定Tornado版本的编译器在路径环境变量里是头一个后解决。2.2 调试器2.2.1 我怎么使用GDB的plain版本去调试我的目标机,而不用Tornado?A:gdb compiles ‘out of the box‘ for vxworks.去cygnus(sourceware.cygnus.com)下载最新的‘insight‘软件,该软件是gdb + cygnus的UI(译者:可能是用户接口)运行 "configure --target=mips-wrs-vxworks". 把mips改成你的处理器,然后运行make.这样就可以在安装了cygwin的win32平台上运行了,在UNIX系统平台上也类似。RDB是windriver以前的调试协议,现在变成WDB了。好象没公布wdb的比特,尽管Tornado使用了gdb。你可能不得不配置RDB。包含RDB组件(INCLUDE_RDB) ,并移除WDB组件(remove INCLUDE_WDB),以使得调试可以进行。(From: Don Bowman, don@pixstream.com)2.2.2 我怎么在创建一个任务后停止它,以使得我能从开始对它进行调试?A: 菜单tools->options,选择debugger页,选择always halt after attaching a task和Auto Attach to task -> Always现在输入一个全局断点(Shift F9),在它碰到断点后,它将从mainTask中分离。(From: Chacha Hindustani, Gurudev@mediaone.net)2.2.3 为什么当我使用SHELL检查内存时,看不到断点?A: shell是一个不可中断的任务,所以任何时间它都在运行在无断点的环境。当任务切换引起一个中断的任务运行时,断点将被重新安装。所以如果查看内存中的断点,只是简单使用d()或l()命令,它在一个中断任务中可以运行,你将看到一个magic code插入并引起异常。The shell is an unbreakable task, so all the time it is running the breakpoints are not installed. When a contexttch causes a breakable task to run, the breakpoints will be resinstated. So, to see the breakpoint in memory simply spawn the d() command or l() command. That will then run in a breakable task, and you should see the magic code inserted to cause an exception. (From: John, john_94501@yahoo.com)2.3 FTP参看5.42.4 主机工具2.4.1 我制作了一个基于rom的VxWorks(vxWorks_rom),但是当我试图用elftobin把它转换成bin格式的(vxworks_rom.bin),得到了如下错误:C:\project\Project3\default\elftobin2.4.2 我怎样写一个WTX工具?A: 我曾经在Tornado 1.0.1 和Windows NT 4.0环境下写过一个WTX工具,按下面的例子和Tornado API参考开始,甚至不用关闭build.让它独自按我的步骤工作。就是我使用VC++6编译,但仍有许多东西丢掉了,不论编译器是什么版本。我知道我能更熟练的使用路径里的环境变量。但有时你只需要它工作,所以下面澄清一下:原代码放在$(WIND_BASE)\host\src\wtxtest下,我的安装目录或任何其它人的安装目录里没有例子源码。按手册源代码按如下修改(大多是信号处理代码修改和增加includes,其它修改在我的程序里说明)把下面的设置加到工程设置、 C/C++, Preprocessor: include目录(路径按实际情况修改):C:\Tornado_03\share\src\wtx,C:\Tornado_03\host\include 预处理定义:HOST把下面的设置加到工程设置,Link,General:C:\Tornado_03\host\x86-win32\lib\wtxapidll-d.lib 增加环境变量WIND_REGISTRY,设为我的注册位置。许多痛苦就在发现这个。手册里参考wtxEnvironSet()调用,Windsurf说它是不存在的,但手册为这个不存在的函数使用提供了许多参考。我的机器上没设置WIND_REGISTRY,所有的Tornado工具都可以不使用它而正常工作。我的工具不能发现注册,设置它并关闭它(Set it and poof)!注册发现了,工具可以工作。确信起调用了wtxProbe()去检查注册(并且变量被设置),它可以避免许多痛苦。我也修改那个工具例子代码。代码在此#代码连接#http://www.xs4all.nl/~borkhuis/vxworks/wtxSample.c(From: Christopher A Leddy, caleddy@west.raytheon.com)2.4.3 当我执行wtxwish时,碰到了一个关于init.tcl文件的错误?A: 不要忘记把TCL_LIBRARY和TK_LIBRARY环境变量设置为 $(WIND_BASE)/host/tcl/tcl and$(WIND_BASE)/host/tcl/tk. init.tcl文件位于TCL_LIBRARY路径。tk.tcl文件位于目录。不要使用 $(WIND_BASE) 变量,而是实际路径。然后从你的TCL/TK目录执行:wtxwish2.4.4 我试图在windows NT4.0 SP5环境下运行Tornado2.0带的vxsys程序,碰到一个错误: "the system try to access directly to the disk, this is not possible ....."A: vxsys是DOS程序,不能工作windows环境下,你应该从DOS窗口下运行它。(From: Andray Kaganovsky, andreyk@home.com)2.4.5 怎样创建加密密码?A: 你可以使用Tornado自带的创建密码程序vxencrypt,但是它功能很弱。sum( p* i ^ i )) * 0x1e3a1d5将HEX字符集转化成ASCII(假定认为你有超过2^32加密密码)。我能用钢笔和纸来把它做反变换。你也可以使用loginEncryptInstall()安装自己的加密算法,对一个强密码[1],加密知道使用密码作为KEY。UNIX传统使用DES,但需要适当的代码。我使用TEA参看http://vader.brad.ac.uk,因为它是不受妨碍的。[1] problematical since you have difficulty protecting the password file as none of the vxWorks filesystems support user-ids.(From: David Laight)--  作者:lxlong--  发布时间:2005-6-25 13:11:16--  2.5 安装2.5.1 当我试图安装GNU源光盘时,出现了一个关于文件aux.h的错误:permission denied。但该文件并不存在,是怎么回事?A: 在微软SW环境下存在这个问题,"AUX"是保留字,所以任何以"AUX."开头的都不能存在。任何以设备名开始的文件名也是不能存在的,例如你不能打开一个叫"LPT1.TXT"的文件。2.5.2 在我安装完Tornado或它的补丁后,我所有的C文件类型都被移除了,而使用Tornado作为打开该文件的工具。我怎样能恢复到原来的编辑器?A:Tornado覆盖注册表中的实体。你可以用下面的.reg恢复。警告:在使用这个文件前必须小心!首先读一下该文件,如果你不理解它就不要使用它。警告:我在windows95和NT下测试过,如果有时间我会在别的的平台测试的。如果你在98、2000下使用后可以工作,请告诉我。首先下载该文件,仔细阅读它,修改它,使她执行你需要的编辑器,然后执行它。你怎么修改它?一个方法是执行这个文件,然后去浏览器View->Options->File Types.这里你可搜索"C源文件"和"C头文件"。修改打开命令为你想要的。现在编辑文件c-files.reg,并移除20行后的部分,第一行以[HKEY_CLASSES_ROOT\c_source_file]开始。再次执行,、将把所有文件类型恢复成你选择的。另一种方法:在你的文件类型里找到你的确省编辑器,把这行COPY到文件c-files.reg中vim行(BTW:vim是非常好的编辑器,你可以到http://www.vim.org查询更多信息)。文件: c-files.reg#文件连#http://www.xs4all.nl/~borkhuis/vxworks/c-files.reg2.5.3 当我每次双击一个文件,都打开一个Tornado.我想所有的文件都用一个Tornado打开,怎么做?A:是的,这是可能。下面的注册文件将完成这个工作。警告:在使用这个文件前必须小心!首先读一下该文件,如果你不理解它就不要使用它。编辑该文件,修改Tornado的安装路径为你机器上的安装路径。文件: TornadoFileTypes.reg#文件连接#http://www.xs4all.nl/~borkhuis/vxworks/TornadoFileTypes.reg2.5.4 能把多个CPU平台安装到一个目录下吗?A:可以,但是需要注意几点:只能把同一版本的安装到同一目录下。这意味着Tornado 2.0.1 for ARM不能同其它版本安装到同一个目录。也不能把2.0和2.0.2混合在一起。我发现的唯一不兼容的是MIPS。在安装了idts134 BSP后,下面的文件会带来问题:1)host\resource\tcl\wtxcore.tcl在最后的函数里设置tool为sfgnu替换为gnu.在if结构里增加设置tool为sfgnu.现在只有MIPS这个工具变量被改变。这样更让人满意,如果你只使用MIPS版本它是可以工作的。2)host\resource\tcl\app-config\Browser:在line 138 有个目录为obj...sfgnuvx,对其它CPU来说它是obj...gnuvx. 问题可以通过把这行替换为如下行解决:This problem can be solved by replacing this line with the follwoing lines:   if { $cpuType($cpuId) == "RC32364" } {    set name [wtxPath target lib obj$cpuType($cpuId)sfgnuvx]spyLib.o    } else {    set name [wtxPath target lib obj$cpuType($cpuId)gnuvx]spyLib.o  }然后替换RC32364为你处理器类型的名称。2.6 MAKEFILE2.6.1 Make不能发现我自己的INCLUDE目录?A:在C/C++编译选项里,使用-I简单拷贝包含整个应用和工程的整个目录结构到NT,可以解决问题,并生成一个完整的build。拷贝到另一个win95和win98上,则建立失败。失败的原因是build过程试图存取一个网络驱动器的共享库文件。我尝试了所有的在VPATH里的分隔符组合,他们都可以在NT下工作。2.6.2 为什么make没有在我修改了BSP目录里的文件(比如sysSerial.c)后重新生成我的工程?A: 在Tornado里你能定义不必扫描的include目录。其中缺省的目录之一是BSP目录(target\config)。如果你从不包含列表里移除它,BSP文件将出现在依赖列表里。在你选择生成依赖关系后选择"高级"按扭,会弹出一个窗口,包含一个选项"Read-only dependency path"从列表中移除.....\target\config。关闭窗口,重新生成所有的依赖关系。下次BSP文件被修改后就会正确生成了。(From: gerard.kerkhofs@nicolet.NOSPAM.nl)另一个解决办法是不要删除该项,但是用.....\target\config\comps替换它。现在你得到所有的BSP目录里的文件,而不是comps目录里的,该目录里放置了许多标准文件。2.6.3 我怎样在我的工程里生成一个连接器列表(linker list)?A: 在build属性里的缺省连接器命令不被make采用。未了使用额外的连接选项make,把如下内容加入到build属性里:Macros: Name: LD_PARTIAL_FLAGS_FOR_PARTIALIMAGE Value: -Wl,-Map,$(basename $(notdir $(PRJ_FILE))).link然后修改$(PROJECT_OUT)文件rules.vxApp里的连结器命令行的LD_PARTIAL:$(LD_PARTIAL) $(LD_PARTIAL_FLAGS_FOR_PARTIALIMAGE) \ $(PRJ_OBJS_FOR_LD_PARTIAL) $(PRJ_LIBS) -o partialImage.o这会在输出目录里生成一个linker输出文件--2.6.4 怎样生成C和汇编混合文件?A: 在你makefile文件添加如下规则:%.out: %.o@objdump$(TOOLENV) -S $< < $@This will generate a file calledBut this is probably not enough. By default VxWorks puts a name in the object file. This name consists of the absolute path of the project directory with the complete path of the file name appended to it. (This can be seen with the command "objdump$(TOOLENV) --debuggingputs $fd "PRJ_DIR = [file dir  [prjInfoGet $hProj fileName]]"This should be changed t puts $fd "PRJ_DIR = .."(With assistance from Bill Pringlemeir, bpringlemeir@yahoo.com)2.6.5 怎样把额外的.o文件加入到我的工程里?A: 把文件加到宏EXTRA_MODULES。文件名用空格分开。确定在同一目录有目标文件。它也可能把文件放到你的源文件目录里。在宏里你应该使用../--  作者:lxlong--  发布时间:2005-6-25 13:11:33--  2.6.6 我想使用make man在我的BSP里生成额外的文档,但只有sysLib.c的文档被更新了。我把我的文件加到BSP Makefile里DOC_FILES行?A:在make环境下DOC_FILES变量没被使用。应该做如下改变:1) 把你的文件和makefile里的文件加到DOC_FILES里,应该类似下面的行:DOC_FILES = sysLib.c sysTffs.c tycoDrv.c myFile.c2) 修改rules.x86-win32文件包含DOC_FILES变量的使用,修改如下:from:docs:@echo Processing@for %f in (sysLib sysTffs tyCoDrv) do @if exist %f.c @echo %f.c & \  $(CPP) $(CASFLAGS) -C $(DOCFLAGS) %f.c > %f.i & \t docs:@echo Processing@for %f in ($(basename $(DOC_FILES))) do @if exist %f.c @echo %f.c & \     $(CPP) $(CASFLAGS) -C $(DOCFLAGS) %f.c > %f.i & \到现在,我看到该问题只发生在windows平台,unix平台并没有这种情况。2.6.100 MAKEFIEL文件里的疑问?有谁知道在$(WIND_BASE)/host/include/make/generic2.mh文件里,[! -d ./$(HOST) ]代码的含义。请大虾指点。.....objdircre: if [! -d ./$(HOST) ]; then \mkdir ./$(HOST); \fi....备注:HOST=x86-win32A:该makefile是在编译tornado的host工具时用到的,这个判断是在cygwin的shell中执行,意思是如果该目录不存在着创建该目录。注意:tornado的host工具很多是用cygwin的工具编译的,所以其风格是unix的。(by bestracer)2.7 工程2.7.1 当我修改了usrConfig.c后,我的应用程序并没改变,怎样能把改变编译到应用程序里?A:Tornado 2.0的工程不使用usrConfig.c,它使用配置面板,文件可以在target/config/comps下发现,如果你喜欢用usrConfig.c,make target/config/yourBsp目录下的 Makefile文件,就可以了。(From: Roie Geron, roie@ecitele.com)2.7.2 怎样不用Tornado重新生成工程文件?A: 使用如下命令重新生成那些bootable工程文件:wtxtcl2.7.3 当我生成依赖关系时,一些依赖关系丢失了。它们不在Tornado树中,但include目录用-I包含和使用VPATH宏?A:我们以前也碰到同样的问题,你可以把#include "xxx\xxx\xxx.h"改成#include "xxx/xxx/xxx.h", 然后在试试。(From: ellin_lin@263.net)2.8 目标机服务器2.8.1 怎样不用Tornado启动target server?A:首先创建一个DOS窗口的快捷方式,然后在Tornado里配置你的target server,使得它能正常启动,并把配置窗口里的配置文本拷贝到DOS快捷方式的属性里。即可。(From: John Finley, john@kivala.com)2.8.2 我的程序正常装载需要几秒钟,但现在装载一个小的应用程序却需要很长时间。我怎样加速下载过程?A:增加你target server的Cache容量,缺省是1M,增加容量将减少下载时间。(From: Wade Oram, oram_w_t@ifrinternational.co.uk)2.8.3 当我启动target server时,碰到WTX错误,告诉同步停止,我怎么修正它?A:一个解决问题的办法是使用远程registry,即使你在你本机上运行target server,这可以通过使用真实IP设置远程registry解决。  基本上"localhost"得到存储在Windows registry中的运行registry的机器名。主机上的WTX工具把localhost解析成127.0.0.1,并把它传给目标机,然后目标机尝试与127.0.0.1通信,以便符号表的同步和结束只与自己联系而不与主机联系。很好的特性。  如果你的Windows主机有多个网口,并且目标机连在一个次要接口上,这还不足够。机器名被解析成IP地址,否则目标机不知道。在连接目标机进行符号表同步前,你需要在目标机上使用routeNetAdd命令。(From: Markus Mitterer, markus.mitterer@sbu1.storkgroup.com and lori@rti.com)2.8.4 当我在SHELL里输入一个命令时,出现"The target system is not initialized yet. Can‘t roceed."A:当你在目标机配置项里的"Core filea"指定一个"vxWorks"文件作为核心文件(core file),该问题将解决。我指定了"vxWorks_rom"文件,并选择了"synchronize host/target symbol table"项,它工作的很好。2.9 Target Shell2.9.1 当我从我的工程里移除shell组件时,我碰到一个dosFsDevInit执行错误,怎样能不包含shell而包含DOSFS组件?A:首先它看起来可能是wierd,后来我想起来老的dosFsLib使用在RAM中的文件名数据库(使用HASH表),所以如果你移除任何可能连接到hashLib中的符号表,就可能不能初始化。一个可能的原因就是没有人注意到它,因为通常都包含 INCLUDE_STAT_SYM_TBL (也是一种符号表)。所以你应该增加 INCLUDE_STAT_SYM_TBL 或简单的在dosFsInit前调用hashLibInit() 。(From: Leonid Rosenboim, leonid@bitband.com)2.9.2 在启动windshell时,一般是通过执行 windsh.tcl来实现的,我在.wind目录下创建了这个文件,但它没执行,我什么地方做错了?A:没有,这是windshell的一个bug,它不去搜索Tornado的安装目录,只搜索C:上的,所以你应该把你的windsh.tcl移动到c:\.wind目录下,它将执行。2.9.3 当我ping 我的"myHost"时,shell好象丢掉许多内存,为什么?A:目标机上的shell为字符串分配内存(字符串的地址被传送给函数)。shell不能决定何时可以安全的释放内存,所以它就把它留在那里,那块内存也不能重新使用。所以下次ping的时候,它又会分配内存。你可以试试使用一个变量:pingaddress = "myHost"memShowping pingaddressmemShow(From: Urban Lindberg, urbanl@my-deja.com)2.9.4 怎样重复使用一个不断增加的参数的命令?A:你可以写一个扩展的重复命令。在/target/src/usr/usrLib.c 文件里有repeat的源码,应该是很简单的。(From: Werner Schiendl,ws-news@gmx.at)2.9.5 怎样使用"lkup"列出2个字符的符号?A:lkup "^[a-z][a-z]$",如果需要3个或更多,lkup "^[a-z][a-z][a-z]$"(From: p_lavarre@my-deja.com)2.9.6 怎样增加SHELL的最大行长(128字符)?A:我也碰到同样的问题,我把一些更长的字符串放到变量里,然后在命令行里使用该命令,这样可以突破128个字符。可能通过设置环境变量也可以实现,但第一个方法更简单。(From: Don Small, dmsmall@sandia.gov)2.9.7 怎样能让我的程序去SHELL正在使用的端口上读数据?A:我发现不用SHELL接口,扫描用户输入。唯一的方法是先删除SHELL任务,然后读数据,再重新生成SHELL。/*******************************************************/shelltid = taskNameToId("tShell");taskDelete(shelltid);for( ; ; ){  // read}shellInit(0,TRUE);/*******************************************************/(From: Mridul Gupta, mridulgupta1@yahoo.com)2.9.8 有shell的替换程序吗?A:在如下地址http://www.xmission.com/~bgeer/bgsh.html: BGSH: A VxWorks Shell With Command Line Editing. 可以发现。(From: Pekka Taipale, pjt@iki.fi)2.9.9 怎样能在我的程序中执行SHELL命令,并使用它的输出?A:我写了一个函数来实现该功能,它把命令作为字符串,并把执行结果输出到文件里。   -> shellToFile("ifShow","ifShow.out")你可以按你的需求修改它。//////  This function runs a shell command and captures the output to the//  specified file//extern int consoleFd;typedef unsigned int (*UINTFUNCPTR) ();extern "C" int shellToFile(char * shellCmd, char * outputFile){int rtn;int STDFd;int outFileFd;outFileFd = creat( outputFile, O_RDWR);printf("creat returned %x as a file desc\n",outFileFd);if (outFileFd != -1){  STDFd=ioGlobalStdGet(STD_OUT);  ioGlobalStdSet(STD_OUT,outFileFd);  rtn=execute(shellCmd);  if (rtn !=0)    printf("execute returned %d \n",outFileFd);  ioGlobalStdSet(STD_OUT,STDFd);}   close(outFileFd);   return (rtn);}(From: RonnoBonno, RHNAssociates@yahoo.com)2.9.10 怎样检查静态变量?A:在映象上执行nmxyz,并提出变量地址,你可以随后导出它的内容。#> nmppc vxWorks | grep ftpsActive 0023dc60 d ftpsActive(From: Toni Kurzberger, gonozal@gmx.at)

    时间:2019-07-10 关键词: VxWorks

  • VxWorks任务调度

    VxWorks任务有五种基本状态:就绪、休眠、延时、悬置、运行就绪态是任务获取了除了CPU以外的所有资源休眠态是任务等待除CPU以外的其它资源,通常是等待信号量,也成为阻塞态延时态是通过调用taskdelay函数主动释放CPU一段时间,时间到了之后就进入就绪态悬置态是一种处于调试的状态整个系统中只有一个任务是处于运行态的,通常是由处于ready态的最高优先级的任务转化来的,如果所有的任务都不处于就绪态,那么系统会自动运行一个IDLE态(shell看到的状态)          操作系统大部分的任务调度过程是由任务调度核心根据不同的调度算法实现的。几种常用的任务调度算法:时间片轮转、优先级抢占、独占资源VxWorks实现上面的三种算法并根据配置可以组合起来使用,系统默认的是优先级抢占和独占资源的调度策略。时间片轮转调度算法是多个任务运行时,每个任务只能运行一个时间片,不管当前任务是否执行完毕,都要释放CPU资源,并在ready队列末尾排序,在ready队列中最高优先级的任务会获得CPU资源并开始执行,这样循环调度,函数kernelTimeSlice(int ticks)可以使能VxWorks的时间片轮转机制。优先级抢占是指当一个高优先级的任务处于ready状态时,如果当前运行的状态比较低,,则当前任务释放CPU进入ready状态,高优先级的任务将会获取CPU并开始执行。独占资源是指当一个任务获取CPU开始执行,若没有更高优先级的任务处于ready状态,则该任务会一直占用CPU直到该任务执行完成。VxWorks中默认没有使用时间片轮转机制,在该系统中时间片只是起到了计时的作用,比如对taskdelay、等待信号量等计时。系统的tick:可通过sysClkRateSet()设置系统tick,比如输入参数为60,代表1/60s一个tick,1/60s这个时间是通过系统时钟中断产生的。任务举例:void task_test(){    taskSpawn ("tLow", 200, 0, 8000, (FUNCPTR) lowMain, 0,0,0,0,0,0,0,0,0,0);    taskSpawn ("tHigh", 151, 0, 8000, (FUNCPTR) highMain, 0,0,0,0,0,0,0,0,0,0);}void highMain(){    while(1) {        printf(“1”);    }}void lowMain(){    while(1) {        printf(“2”);    }}具体执行过程是:当在shell中输入函数名task_test后,tshell任务会依次调用taskSpawn函数进行任务创建,分别创建两个优先级不同的任务,当task_test函数完成后,tshell任务释放CPU,刚才创建的两个任务中高优先级任务会获取CPU并开始执行(体现VxWorks优先级抢占式),因为高优先级任务在while(1)中执行,并没有释放CPU资源,所以低优先级的任务不会获取CPU开始执行(体现独占式)。这种情况下会一直打印”11111”若修改高优先级入口函数为void highMain(){taskdelay(10);    while(1) {        printf(“1”);    }}那么tshell任务结束后,先开始执行10tick的低优先级任务,打印10tick时间的”2”(每个tick为1/60s),之后高优先级任务会抢占CPU并开始执行,之后会一直打印”1”。

    时间:2019-07-09 关键词: VxWorks 任务调度

  • VxWorks上高精度定时器(auxClk)的配置和使用

    有很多第三方的库 对vxWorks不支持高精度的时钟描述应该是很多年前的说法了,比如你的文档提到的x86的HPET这个在vxWorks6.8.x , 6.9.x , 7等主流版本上早已经支持,对QorIQ的目前也支持全面了的,只要是片上硬件有的(目前不论是什么架构的CPU/chipset),vxWorks都在BSP和driver中进行了支持。step1:首先需要在kernel中定义INCLUDE_AUX_CLKstep2:设置AUX的normalpinlv以及最大和最小频率#define AUX_CLK_RATE_MIN 1#define AUX_CLK_RATE_MAX 50000#define AUX_CLK_RATE 20000step 3:注册AUX CLK的ISRstep4 :Enable AUX CLKstep5:使用vxbAuxClkShow和vxbSysClkShow来检查有没有配置正确就可以了。使用例子:#includeUINT32 l_aux_clk_isr_flag=0;void l_aux_clk_isr(void){           l_aux_clk_isr_flag++;           logMsg("l_aux_clk_isrn",1,2,3,4,5,6);}void usrAppInit (void)    {#ifdef USER_APPL_INIT USER_APPL_INIT;  /* for backwards compatibility */#endif    /* add application specific code here */          vxbAuxClkConnect(l_aux_clk_isr,0);          printf("vxbAuxClkConnect,setupedn");          vxbAuxClkEnable();    }

    时间:2019-07-04 关键词: VxWorks

  • VxWorks上从romInit跳转到romStart时的地址计算

    以前在分析VxWorks启动代码时一直有一个疑问,为什么跳转到romStart时需要复杂的计算才能跳转??按道理跳转之需要用 bl [c函数名]就可以实现跳转的了。比如bl romCStartup函数的调用。实践证明bl romStart是无法工作的!!!!原因如下:在bootrom的运行是分两个阶段的,一阶段是在flash中运行,这段代码的用途是把bootrom的搬移(copy)到RAM_HIGH_ADRS +0x100 (PowerPC平台,0x100是RESET VECTOR)也就是ROM_TEXT_ADRS (PowerPC平台上),此时romStart的地址已经不是编译阶段链接器所给出的地址了(编译器给出的地址一般可能是0xFF00xxxx),而romStart在RAM中地址可能是0x0100xxxx,所以若想跳转到RAM中的romStart只能通过romInit来计算获得了。/*  * SDRAM pattern test of romCStartup  */ bl romCStartup /* initialize the stack pointer */ lis sp, HIADJ(STACK_ADRS) addi sp, sp, LO(STACK_ADRS)  /* go to C entry point */ addi sp, sp, -FRAMEBASESZ  /* get frame stack */ /*   * calculate C entry point: routine - entry point + ROM base   * routine = romStart = R6  * entry point = romInit = R7  * ROM base = ROM_TEXT_ADRS = R8  * C entry point: R6 - R7 + R8   */ lis r6, HIADJ(romStart)  addi r6, r6, LO(romStart) /*R6 with C entry point r6 = romStart,Link address in flash*/ lis r7, HIADJ(romInit)        /* R7  = romInit  ,Linking address ,in flash*/ addi r7, r7, LO(romInit) lis r8, HIADJ(ROM_TEXT_ADRS) addi r8, r8, LO(ROM_TEXT_ADRS) sub r6, r6, r7 /* Calcualate offset from romInitr6=r6-r7*/ add r6, r6, r8  /* Add with ROM_TEXT_ADRSr6=r6+r8 */ mtlr r6      /* move C entry point to LR  */ blr          /* Jump to the C entry point (relocated!) */FUNC_END(romInit)FUNC_END(_romInit)

    时间:2019-06-14 关键词: VxWorks powerpc

  • VxWorks6.9上以太网2层发包程序

    #includetypedef struct pkt_arp_struct{    /* ARP header, names taken from RFC 826 */    UINT16    hrd;    /* Hardware address space (e.g. Ethernet,                         Packet Radio Net.) */    UINT16    pro;    /* Protocol address space. For Ethernet                         hardware, this is from the set of Ethernet                         types */    UINT8     hln;    /* Hardware address length, 6 for Ethernet */    UINT8     pln;    /* Protocol address length, 4 for IPv4 */    UINT16    op;     /* Opcodes, IPNET_ARP_OP_REQUEST or                         IPNET_ARP_OP_REPLY */    UINT8     eth_src[6];    UINT8     ip_src[4];    UINT8     eth_dst[6];    UINT8     ip_dst[4];}pkt_arp;STATUS gem1Send2(void){// UINT8    dataBuffer[512]; UINT8    src[6]={0x00,0x0A,0x35,0x01,0x02,0x23}; UINT8    dst[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};   pkt_arp    *arp;  Ipcom_pkt    *pkt; Ipnet_netif         *netif;     END_OBJ     *pEnd;    GEM_DRV_CTRL*pDrvCtrl;             pEnd=endFindByName("gem",1);          pDrvCtrl = (GEM_DRV_CTRL *)pEnd;          if(NULL==pEnd)     {      printf("Could not find END objn");      return ERROR;           }  netif=ipnet_if_nametonetif(0,"gem1");        pkt = ipcom_pkt_malloc(sizeof(pkt_arp), IP_FLAG_FC_STACKCONTEXT);    if (pkt)    {        pkt->start   = ipcom_conf_max_link_hdr_size;        pkt->end     = pkt->start;        pkt->ipstart = pkt->start;        pkt->ifindex = netif->ipcom.ifindex;    }    arp = ipcom_pkt_push_back(pkt, sizeof(pkt_arp));    arp->hrd = ip_htons(0x0001);    arp->pro = ip_htons(0x0800);    arp->hln = 6;    arp->pln = sizeof(struct Ip_in_addr);    arp->op  = ip_htons(0x0001);  //(void)ipnet_if_output(netif, pkt);        ipnet_eth_add_hdr(pkt,netif,dst,src,0x0608);        mux2Send(pEnd,pkt);  /*ipnet_if_indextonetif*/}

    时间:2019-06-13 关键词: VxWorks

  • vxworks编译过程常见问题解决方案

    vxworks编译过程常见问题解决方案

    1.VXworks中增加c文件夹或者文件此时需要增加新增文件的文件路径:如下2.当文件中有同名的文件,删除一个文件后会出现链接的错误,此时解决方案如下:增加需要使用的为灰色的c文件在.o文件中此时保存,重新编译那么问题就解决了!   

    时间:2019-06-12 关键词: VxWorks

  • VxWorks6.9 辅助时钟,高精度定时器精度测试函数!

    unsigned int auxClkTestCnt=0;void timerTestIsr(void){ auxClkTestCnt++;}void auxClkTest(unsigned int cnt){  auxClkTestCnt=0; vxbAuxClkConnect(timerTestIsr,0);  vxbAuxClkDisable(); vxbAuxClkRateSet(2000);  vxbAuxClkEnable(); taskDelay(sysClkRateGet()*10); vxbAuxClkDisable(); printf("Tick count is 2000,auxClkTestCnt=%dn",auxClkTestCnt);    auxClkTestCnt=0; vxbAuxClkDisable(); vxbAuxClkRateSet(1000);  vxbAuxClkEnable(); taskDelay(sysClkRateGet()*10); vxbAuxClkDisable(); printf("Tick count is 1000,auxClkTestCnt=%dn",auxClkTestCnt);   auxClkTestCnt=0; vxbAuxClkDisable(); vxbAuxClkRateSet(4000);  vxbAuxClkEnable(); taskDelay(sysClkRateGet()*10); vxbAuxClkDisable(); printf("Tick count is 4000,auxClkTestCnt=%dn",auxClkTestCnt); }

    时间:2019-06-12 关键词: VxWorks

  • 基于Windows平台VxWorks交叉编译工具设计

    1 交叉编译工具链功能说明 交叉编译技术,就是一种在一个异构平台上编译出目标平台程序的技术。比如在PC平台(X86 CPU)上编译出能运行在以VxWorks为内核的CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放到VxWorks CPU平台上才能运行。 每一个软件在编译的过程中都要经过一系列的处理,才能从源代码变成可执行的目标代码。这一系列处理包括预编译、高级语言编译、汇编、链接及重定位。这一套流程里面用到的每个工具和相关的库组成的集合,就称为工具链( chain)。以GNU的开发工具GCC为例,它就包括了预编译器CPP、C编译器GCC、汇编器AS和链接器LD等。在GNU自己对工具链定义中,还加进了一套额外的用于处理二进制包的工具包Binutils,整个工具链应该是GCC+Binutils+Glibc。对于i586-wrs-vxworks工具来说,因为在生成VxWorks交叉编译工具链时,用到的C库文件是从Tornado开发软件中提取出来的,所以生成的实际交叉编译工具链应该是GCC+Binutils+Tornado(C库文件)。GCC(GNU C Compiler)是一个C语言编译器。随着众多自由开发者的加入和GCC自身的发展,如今的GCC已经是一个包含众多语言的编译器了。其中包括C、C++、Ada、Object C和等。所以,GCC也就变为GNU Compiler Collection,也就是GNU编译器集合。当然,如今的GCC借助其特性,具有了交叉编译器的功能,所以又将GCC称为交叉编译工具链。 2 i586-wrs-vxworks交叉编译工具链制作背景 现在市场上有很多公司的选用的是基于WindRiver(风河)公司的Vxworks系列产品。 一般说来,在开发VxWorks嵌入式的平台时,开发厂商会推出一整套交叉编译工具链来配合自身的嵌入式产品,但是这些由商业公司提供的工具链,都不会附有工具链相关的源代码和制作方法,灵活性不足,并且它们一般都与整套开发系统捆绑销售使用,成本较高。为了更好地理解这种技术和降低成本,我们使用了国际开源组织GNU开发的工具链作为产品开发的工具,提供了更好的使用灵活性。 3 交叉编译工具链设计 要构建出一个交叉工具链,需要解决3个问题: ①这个工具链必须是可以运行在原工作站平台上的。 ②需要更换一个与目标平台对应的汇编器,使得工具链能产生对应的目标代码。 ③要更换一套与目标平台对应的二进制库,使得工具链在连接时能找到正确的二进制库。 根据这样的思路,采取了如下几个步骤: 3.1 确定宿主机平台、目标机平台及开发工具 根据项目要求,GCC交叉编译工具要能工作在基于Windows构架的平台,编译生成的可执行代码要能够满足基于X86结构的VxWorks嵌入式平台。编译时选用的开发平台为Windows XP,开发工具为Cygwin。 Cygwin当初首先对GCC、GDB、GAS等开发工具进行了改进,使它们能够生成并解释Win32的目标文件。然后,他们要把这些工具移植到Wi-ndows平台上去。一种方案是基于Win32 API对这些工具的源代码进行大幅修改,这样显然需要做大量工作。因此,采取了一种不同的方法——写一个共享库(cygwin.dll),把Win32 API中没有的风格的调用(如fork、spawn、signals、、等)封装在里面,也就是说,基于Win32 API写了一个Llnix系统库的模拟层。这样,只要把这些工具的源代码和这个共享库连接到一起,就可以使用主机上的交叉编译器来生成可以在Windows平台上运行的工具集。 host_alias(宿主机名称) = i686?pc?cygwin32 host_cpu(宿主机cpu构架) = i686 host_(宿主机产商)= pc host_os(宿主机操作平台) = cygwin32 target_alias(目标机名称) = i586?wrs?vxworks target_cpu(目标机cpu构架) = i586 target_(目标机产商) = wrs target_os(目标机操作平台) = vxworks 3.2 选择开发资源包 GCC、Binutils文件均有各自的版本号,不是任意组合都可以编译成功并最终建立一个交叉编译环境的。基于稳定性方面考虑,这里选用的GCC和Binutils版本较老一点,但是大多数工程人员推荐的版本(Binutils-2.10,.95.3)。 3.3 建立环境变量 该步骤的目的是方便重复输入路径,直接输入绝对路径也是可行的。声明以下环境变量的目的是在之后编译工具库的时候会用到,方便输入,尤其是可以降低输错路径的风险。 export PRJROOT="/VxWorks" export TARGET="i586"?wrs?vxworks export PREFIX=$PRJROOT/s export TARGET_PREFIX=$PREFIX/$TARGET export PATH=$PREFIX/bin:$PATH 3.4 生成Binutils二进制库 Binutils是GNU工具之一,它包括链接器、汇编器和用于目标文件和档案的工具,是二进制代码的处理维护工具。安装Binutils工具包含的程序有addr2line、ar、as、c++filt、gprof、ld、am、objcopy、objdump、ranlib、readelf、size、strings、、libiberty、libbfd和libopcodes。 首先安装二进制工具,使用主机的GCC进行编译。生成的交叉二进制工具i586-wrs-vxworks-ar、i586-wrs-vxwor-ks-as、i586-wrs-vxworks-ld等是编译交叉程序的基础,所以必须放到第一步进行。编译过程如下: cd $PRJROOT cd tar xzvf binutils 2.10.tar.gz p binutils cd build binutils ../binutils 2.10/configure target=$TARGET prefix=$PREFIX prefix=$PREFIX export PATH=$PREFIX/bin:$PATH 编译完成以后,将会生成Binutils工具,对这些工具作用的解释略——编者注。 3.5 生成i586-wrs-vxworks交叉编译工具链 配置参数如下: cd $PRJROOT/build tar ?xjvf gcc?2.95.3.tar.bz2 build?gcc cd build?gcc ../gcc 2.95.3/configure tatget=$TARGET prefix=$PREFIX ?prefix=$PREFIX ?=/c/Tornado/target/h libs= /c/Tornado /target/lib included gettext with gnu as with gnu ld enable languages=c,c++ v LANGUAGES="c c++" make LANGUAGES="c c++" 执行完编译,安装命令之后,将会在$PREFIX/bin/文件夹中生成工具。至此,一个完整的基于VxWorks的GCC交叉编译工具链就建立起来了。 5 结论 本文生成的i586-wrs-vxworks交叉编译工具链通过了大量的工程实践与测试,可以良好地运行在基于Windows操作系统的PC机平台上,编译和链接基于Vx-Works平台的程序,从而满足了VxWorks商业软件嵌入式应用的开源化,能为客户节约不少经济开销,但是改进GCC对代码的优化还有待进一步的研究。

    时间:2019-01-01 关键词: Windows 平台 VxWorks 工具

  • 风河VxWorks成为欧洲EGNOS卫星导航系统项目IPF的操作系统

    全资子公司风河系统公司(Wind River)日前宣布,风河VxWorks被欧洲EGNOS卫星导航系统(European Geostationary Navigation )项目作为完整性处理工具(Integrity Facility,IPF)的操作系统。IPF工具由a公司负责开发和部署,作为整个卫星导航系统的关键性要素,用于验证卫星广播发送给关键安全级用户的信息,例如处于飞行途中的飞机或者正在通过狭窄航道的船舶等。 如果没有EGNOS,民用航空等领域的用户就不可能放心地使用各种卫星导航系统(例如全球定位系统)。EGNOS使这些用户能够完全信赖卫星导航信号的精确性,从而缩短路程距离,降低驾驶燃油消耗。 EGNOS系统是欧洲自主建设的第一个卫星导航系统,它通过增强目前在运行的美国的和俄罗斯的GLONASS这两个军用系统来满足关键安全级用户的需求。 EGNOS系统包含了三颗地球同步卫星和一张地面站网络,通过在传送的信号中加入由和GLONASS卫星提供的定位信息,提升了系统的可靠性和精确性,从而实现精准导航。使用EGNOS系统,欧洲以及更多地区的用户能够实现2米以内精度的定位,而单独使用GPS或GLONASS系统只能达到20米的精度。 EGNOS系统是由欧洲局(ESA) 、欧盟(EC)和欧洲航空安全组织(Eurocontrol) 联合开发的项目。它是欧洲全球导航卫星系统()计划的第一步行动,同时也是目前正在欧洲进行研发的完整全球卫星系统——伽利略()计划的前奏。 风河航空与国防行业高级项目经理Alex Wilson表示:“满足关键安全级别的安全认证”是一个昂贵而耗时的过程。选择VxWorks这个已获得安全认证的行业领先,使得a这样业界领先的设备制造商获得了足够稳健性和功能性,最大程度地降低了开发风险,缩短了安全认证过程所需的时间。” EGNOS IPF基于架构运行,已经全面完成了面向EUROCAE ED-12B B级别(与 DO-178B B安全级别完全对等)的高级安全认证,这也成为EGNOS系统在关键安全级别应用中部署的重要里程碑。 目前,一项使用EGNOS系统引导飞机着陆的试验已成功完成。在西班牙San Sebastian机场的04号跑道,一架Air Nostrum Dash-8飞机采用名为LPV(Localizer Vertical)的技术,完成了四次飞行着陆试验。在这种着陆过程中,采用了一种专用的卫星导航接收器,它一方面为飞行员提供侧向导航(lateral guidance)的功能,替代或增强降落定位器(localizer)——将飞机定位在跑道中线的无线电航向信标,同时也提供垂直导航(vertical guidance)功能。

    时间:2019-01-01 关键词: 操作系统 项目 导航系统 VxWorks 欧洲

  • VC、Linux、vxWorks读写物理扇区小结

    直接上程序:1. Windows下的VC:HANDLE hDevice = CreateFile("\\.\I:", GENERIC_READ|GENERIC_WRITE,     FILE_SHARE_READ | FILE_SHARE_WRITE,    NULL, OPEN_EXISTING, 0, NULL   );    if (hDevice == INVALID_HANDLE_VALUE)    {   printf("打开磁盘错误n"); return 0;   }   //读扇区 DWORD bytesread = 0;  unsigned char Buffer[1000] = {0}; int SectorNumber=0; //for (int SectorNumber=0; SectorNumber<100; SectorNumber++) { SetFilePointer (hDevice, SectorNumber*512, 0, FILE_BEGIN);   ReadFile (hDevice, Buffer, 512, &bytesread, NULL);   getch(); } //写操作 memset(Buffer, 0x35, 512); SetFilePointer (hDevice, SectorNumber*512, 0, FILE_BEGIN);   WriteFile (hDevice, Buffer, 512, &bytesread, NULL);上面的CreateFile函数的第一个参数,是C: ,D:类似的盘符2. vxWorks读扇区:参考mkboot.c源程序得到char lbaSectorZero[1024] = {0}; int line, j; ATA_RAW ataRaw = {0};     ataRaw.cylinder   = 0;     ataRaw.head       = 0;     ataRaw.sector     = 1;     ataRaw.pBuf       = (char *)lbaSectorZero;     ataRaw.nSecs      = 1;      ataRaw.direction  = O_RDONLY;     ataRawio (0, 0, &ataRaw);      for(line=0; line<32; line++) { for(j=0; j<16; j++) { printf("%02x ", (unsigned char)lbaSectorZero[line*16+j]); } printf("n"); }ataRawio.direction为0时是读,为1时是写,其他参考 target/h/drv/hdisk/ataDrv.h的ATA_RAW定义。3. Linux:下面的/dev/sde,是U盘插上去后显示的设备符合:  #include#include#include#include#include#include#include#include#include#include/*  *   */ int main(int argc, char** argv)  { int fd=0; int sizes = 0; char buf[1000] = {0};         int line, j; fd = open("/dev/sde", O_RDONLY); if(fd !=-1) { ioctl(fd, BLKSSZGET, &sizes); printf("sector size=%dn", sizes); lseek(fd, 0, SEEK_SET); read(fd, buf, sizes);                                  for(line=0; line<32; line++)                 {                     for(j=0; j<16; j++)                     {                         printf("%02x ", (unsigned char)buf[line*16+j]);                     }                     printf("n");                 } }     return (EXIT_SUCCESS); }

    时间:2018-11-26 关键词: Linux VxWorks 读写物理扇区

  • VxWorks嵌入式操作系统C/S模式编程

    VxWorks嵌入式操作系统C/S模式编程

    1 引言 VxWorks 操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(),是嵌入式开发环境的关键组成部分。良好的持续发展能力、高性能的内核以及友好的用户开发环境,使其在嵌入式实时操作系统领域占据一席之地。他以良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。2 VxWorks的特点2.1 可靠性稳定、可靠是VxWorks的一个突出优点,因而他得到了越来越多的用户的认可。2.2 实时性实时性是指能够在限间内执行完规定的功能并对外部的异步事件做出响应的能力。实时性的强弱是以完成规定功能和做出响应时间的长短来衡量的。VxWorks有很强的实时性,其系统本身的开销很小,进程调度、进程间通信、中断处理等系统公用程序精练而有效,他们造成的延迟很短。VxWorks提供的多任务机制中对任务的控制采用了优先级抢占(Preemptive Priority Scheduling)和轮转调度(Round-Robin Scheduling)机制,也充分保证了可靠的实时性,使同样的硬件配置能满足更强的实时性要求,为应用的开发留下更大的余地。 2.3 可裁减性VxWorks由一个体积很小的内核及一些可以根据需要进行定制的系统模块组成。VxWorks内核最小为8kB,即便加上必要模块,所占用的空间也很小,且不失其实时、多任务的系统特征。由于他的高度灵活性,用户可以很容易地对这一操作系统进行定制或做适当开发,来满足自己的实际应用需要。 3 C/S模式网络编程网络是VxWorks系统之间以及与系统联系的主要途径。在VxWorks网络结构的最底层,通常使用以太网作为传输媒介;而在传输媒介的上一层,则使用TCP/IP和UDP/IP协议。VxWorks网络编程中最常见的是C/S模式,在该模式下,服务器端有一个任务(或多个任务)在指定的端口等待客户来连接,服务程序等待客户的连接信息,一旦连接上之后,就可以按照设计的数据交换方法和格式进行数据的传输;而客户端则在需要的时候发出向服务端的连接请求。客户端与服务器端的关系如图1所示。3.1 C/S模式网络编程原理网络通信的基石是套接字,一个套接字是通信的一端。VxWorks为用户提供了2种套接字,即流套接字和数据报套接字。流式套接字定义了一种可靠的面向连接的服务,实现了无差错无重复的顺序数据传输。数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错。五连接的服务一般都是面向事务处理的,一个请求一个应答就完成了客户端与服务端之间的信息交互。无连接的套接字C/S模式程序的流程如图2所示。面向连接的服务比无连接的服务处理起来要复杂。面向连接的套接字C/S模式程序的流程如图3所示。套接字工作过程如下:服务器首先启动,通过调用()建立一个套接口,然后调用()将该套接口和本地网络地址联系在一起,再调用listen()使套接口做好侦听的准备,并规定他的请求队列的长度,之后就调用accept()来接收连接。客户在建立套接口后就可调用connect()和服务器建立连接。连接一旦建立,客户机和服务器之间就可以通过调用recv()/recvfrom()和send()/sendto()来发送和接收数据。最后,待数据传送结束后,双方调用()关闭套接口。3.2 编程实例下面给出一个面向连接的点对点实时通信的工程应用的实例。该实例应用于作者所在的网络测试项目中。他由两部分组成,服务器在VxWorks操作系统下运行,客户机在Windows下运行。3.2.1 服务端的程序设计服务端的程序设计在结构上可以使用两种基本模式:循环模式和并发模式。循环模式 服务端进程在总体上是一个循环,一次处理一个请求。在有很多客户端请求时,请求放人队列,依次等待处理。如果某个请求的处理时间过长,就会导致队列满而不能接受新的请求。并发模式 服务端进程可以同时处理多个请求,结构上一般采用父进程接受请求,然后调用fork产生子进程,由于进程处理请求。该模式的优点是可以同时处理多个请求,客户端等待时间短。由于是面向连接的点对点通信,所以实例中采用了循环模式。(1)建立自己的套接口sHost=(AF_INET,SOCK_STREAM,0)该函数建立指定通信域、数据类型和协议下的套接口,通信域为AF_INET(惟一支持的格式),数据类型SOCK-STREAM表示建立流式套接口,第3个参数为0,即协议缺省。(2)绑定本地地址(sHost,(struct sockaddr * )&serverAddr,sizeof(serverAddr))该函数将服务器地址与sHost绑定在一起,其中,serverAddr是sockaddr_in结构,其成员描述了本地端口号和本地主机地址,经过()将服务器进程在网上标识出来。(3)开始侦听listen(sHost,2)该函数表示连接请求队列长度为2,即允许有2个请求,若多于2个请求,则出现错误,给出错误代码WSAECONNREFUSED。(4)等待接收连接snew=accept(sHost,(struct sockaddr*)&clientAddr,sizeof(clientAddr)))该函数阻塞等待请求队列中的请求,一旦有连接请求来,该函数就建立一个和sHost有相同属性的新的套接口。clientAddr也是一个sockaddr_in结构,连接建立时填入请求连接的客户端的地址。(5)接收、发送数据recv(snew,recvbuffer,buflen,0)send(snew,sendbuffer,buflen,0)recv()和send()分别负责接收和发送数据,recv()从snew(建立连接的套接口)接收数据,放人recvbuffer中,send()则将sendbuffer中数据发送给snew,第4个参数,表示该函数调用方式,通常用于诊断程序或路由选择程序,可选择MSG-DONTROUTE和MSG-OOB,MSG-WAITALL,MSG_DONTWAIT,0表示缺省。(6)关闭套接口(sHost)(snew)3.2.2 客户端程序设计所谓客户端程序,指用来向服务端发出服务请求的程序。客户端需要知道服务端的地址、服务所提供的端口号以及服务所使用的传输层协议:TCP还是UDP。该实例基于面向连接的TCP协议。(1)调用WSAStartup()函数初始化WindowsSockets DLLStatus = WSAStartup (VersionReqd,lpmyWSAData)(2)创建一个通信域为Internet、SOCK_STREAM类型、使用TCP协议的套接字sClient = (AF_INET, SOCK_STREAM,IPPROTO_TCP)(3)设置与套接字sClient相关的属性选项int sockopt=1setsockopt (sClient,IPPROTO_TCP,SO_KEEPALIVE,(char *)&sockopt,sizeof(int))setsockopt()函数用于任意类型、任意状态套接口的设置选项值。在不同协议层上存在选项,但往往是在最高的套接口层次上,设置选项影响套接口的操作,诸如操作的阻塞与否、包的选径方式、带外数据的传送等。该实例中打开了SO_KEEPALIVE选项,使得套接字sClient实现在TCP连接情况下允许使用保持活动包。(4)在套接字sClient上向服务器建立一个连接connect (sClient,(struct sockaddr *)&serverAddr,sizeof(serverAddr))该函数让系统知道写到sClient的数据将发往何地,而且只有该地址发来的数据才被sClient接收。其中,serverAddr是sockaddr_in结构,其成员描述了服务器的地址族,提供的端口号以及服务器地址,如下,serverAddr.Sin_family=AF_INETserverAddr.sin_addr.s_addr=inet_addr(ServerAddress)serverAddr.sin_port=htons(Port)其中:ServerAddress和Port通过参数传人。(5)接收、发送数据recv (sClient,recvbuffer,buflen,0)send (sClient,sendbuffer,buflen,0)(6)关闭套接口Close (sClient) 4 结 语VxWorks操作系统是目前在国内外风行的嵌入式强实时操作系统,而网络编程又是嵌入式实时系统软件的设计核心之一。本文作者介绍了基于TCP的面向连接的C/S模式的编程方法。该方法已经在NA3100网络测试仪中得到了良好而有效的应用。嵌入式操作系统vxworks

    时间:2018-11-20 关键词: 操作系统 模式 嵌入式 嵌入式开发 VxWorks

  • vxWorks应用程序加载的另一种办法

    现在我们的工作中,应用程序一般都是和BSP联编,然后将vxworks_rom.bin烧到班子里。在BSP启动后,调用应用程序的函数的。 但是这样有个问题,就是应用程序和BSP结合的太紧密了。BSP开发者得将BSP代码给应用程序开发者,或者应用程序开发者得将应用程序编译后的.a文件给BSP开发者,才能完成程序的升级! 那么下面的方法是我这两天弄出来的,可以将应用程序和BSP开发分离的一个办法。只要开始将接口约定好就可以了!还不是很成熟,我也还没有正式在项目中使用,但是我相信这是一个不错的选择! 首先,要建立一个文件系统,TFFS的文件系统就可以。磁盘大小只要可以放的下应用程序编译后的文件就好了。这步就不赘述了。 然后,在BSP工程的usrApp中添加下载应用程序模块和启动接口程序的代码。下面主要说明这步,代码如下: #include "loadLib.h" #include "stdio.h" #include "taskLib.h" #include "ioLib.h"   extern SYMTAB_ID sysSymTbl; void usrAppInit (void)     { #ifdef USER_APPL_INIT  USER_APPL_INIT;  /* for backwards compatibility */ #endif  FUNCPTR taskEntry=NULL;  SYM_TYPE *pType;  intfd=open("/tffs0/appProj.out",O_RDONLY,0);  if(fd==NULL)  {  printf("/nopen project fail../n");  return;  }  if(loadModule(fd,LOAD_ALL_SYMBOLS)==ERROR)  {  printf("/nload module fail.../n");  return;  }  if(symFindByName(sysSymTbl,"appEntry",(char* *)&taskEntry,pType)==ERROR)  {  printf("/nfind symbol fail.../n");  return;  }       taskSpawn("entry",100,0,1024,taskEntry,0,0,0,0,0,0,0,0,0,0);      /* add application specific code here */  }  主要代码。只要应用程序将升级后的工程编译成.out文件,上传到磁盘/tffs0中,就可以了!当然,应用程序的入口函数appEntry不能变。 最后,这段代码如果之间运行,可能会遇到一些问题:  1.loadMoudle失败,报错Relocation value doesnot fit in 24 bits。这是因为函数在内存中的位置超出了跳转的最大距离(一般跳转指令是24bit,32M).为了解决这个问题,按如下步骤:     在应用程序的工程中选择"Builds"->"default"->"c/c++complier",在后边加入-mlongcall(GUN)或者-Xcode-absolute-far(diab),点击OK. 把这个编译出来的.out文件上传到文件系统。 2.symFindByName失败。这个原因可能是因为应用程序的工程是cpp文件,也就是c++文件。c++编译出来的文件,符号表的入口和C不同,所以找不到。如,同样的entry(void,int)函数,C编译出来就是entry,而C++可能是entry_Fvi,这个由于不同的编译器而不同。解决这个问题,有两个办法:   (1).入口函数所在的文件,不要用cpp文件,全部改用c文件。   (2).cpp文件中的入口函数包含在external "C" {}中。

    时间:2018-11-13 关键词: VxWorks 应用程序加载

  • QT 4.8.5 在 VxWorks 6.8/6.9 系统下的使用方法

    QT 4.8.5 在 VxWorks 6.8/6.9 系统下的使用方法

    QT 4.8.5 在 VxWorks 6.8/6.9 系统下的使用方法3162412793@qq.com技术交流QQ群: 6919769561、安装 VxWorks6.8/6.9具体步骤参照 VxWorks6.8/6.9 使用说明.注意:安装windml时,选者GNU且不要选择支持PNG之类的其他支持安装内核时,注意要配置内核。 2、编译QT在整个编译过程中若有问题可以可参考qt目录下的dochtmlinstallation.html帮助文档 2.1安装授权文件将QT目录下的license拷贝到到C:Documents and Settings注:win7系统下拷贝文件到C:Users 2.2安装MinGW编译器步骤一:解压MinGW-gcc440_1步骤二:将解压出来的mingw文件夹拷贝到系统盘根目录,C:MinGW步骤三:新建系统变量MINGW_HOME。右击桌面电脑图标->属性->高级系统设置->选择高级标签->环境变量,如下图所示:      点击新建,输入变量名和路径如下图所示:          编辑系统变量Path,在尾部加入%MINGW_HOME%bin,如下图所示:            2.3安装strawberry编译器双击strawberry安装程序,根据自身系统悬着32位还是64位,如下图所示:      按照安装向导,安装完毕即可,安装完毕后请重启计算机。 2.4 配置QT步骤一:将QT源文夹qt-everywhere-enterprise-src-4.8.5更名为qtsimdkm后放到硬盘根目录,如C:qtsimdkm。 别忘了将补丁文件打上。 步骤二:运行vxworks shell,如下图所示    步骤三:进入qtsimdkm所在目录,如G: qtsimdkm,如下图所示:      步骤四:在shell下输入以下配置命令:configure -static -release -embedded -platform win32-g++ -xplatform qws/vxworks-simdkm-g++ -make make -hostprefix %CD% -prefix /tmp/qtsimdkm -qt-sql-sqlite -no-script -nomake examples–nomake demos -qt-zlib -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg -no-openssl -no-dbus 注:该命令为VxWorks simpc版本,具体硬件请根据CPU型号,输入-help命令后参照qt目录下的dochtmlinstallation.html文档自行设置配置命令出现如下界面后,输入“y”接受授权开始配置。     2.5编译QT等待配置完毕后,输入make进行编译 2.6编译应用程序步骤一:将应用工程(例如g:qtsimdkmdemosbooks)下的所有文件拷入QT的bin目录下(例如:g:qtsimdkmbin),如下图所示:      步骤二:将编译windml时生成的obj文件夹拷贝到和qtsimdkm同样的根目录下,例如g:obj注:该文件夹内存放着windml的库文件,配带的是simpc版,若在硬件板上运行,请使用Workbench自行配置并生成对应的CPU版本。 步骤三:在Shell下输入命令进入qt的bin目录,然后输入qmake –o Makefile 工程文件名(例如:qmake –o Makefile books.pro)生成Makefile文件,如下图所示: 步骤四:生成makefile文件后,输入make编译应用程序,如下图所示:      编译完成后,会生成对应工程名的可执行文件(例如books),如下图所示: 2.7运行可执行文件步骤一:在硬盘根目录建立运行文件夹tmp,例如g:tmp步骤二:将前面生成的可执行文件(例如books)复制到tmp文件夹内。步骤三:将vxWorks、vxWorks.sym复制到tmp文件内。注:配带的这两个文件为simpc版的,如在硬件上运行,请使用Workbench配置并生成对应的CPU版本。步骤四:将g:qtsimdkm目录下的Lib文件夹复制到g:tmpqtsimdkm下,如下图所示:          步骤五:在Shell下进入运行目录g:tmp,输入vxsim –f vxworks –size 1000m启动模拟器,如下图所示:             当出现如下界面时,表示启动模式器成功:           步骤六:在模拟器中输入ld<可执行文件名(例如ld<books)加载应用程序。步骤七:输入应用程序的入口函数运行程序,一般为Main出现如下界面表示运行成功:      有任何技术问题, 欢迎在下方留言!      

    时间:2018-11-08 关键词: VxWorks qt4.8

  • VxWorks嵌入式实时操作系统结构简析

    VxWorks嵌入式实时操作系统结构简析

    关键词:嵌入式 实时 操作系统 微内核 任务 中断 调度 目标系统一 VxWorks实时操作系统背景 用户在开发具有日益复杂的32位嵌入式处理器的产品时,需要一个用来连接产品应用程序和底层硬件的操作系统。用户所寻求的操作系统应该具有的最重要的特点包括:可靠性高的实时性能 可下载到最终产品的板上内存的丰富和灵活的功能模块集与全面的主机开发环境的可协同工作。VxWorks操作系统是美国WindRiver公司于1987年设计开发的一种嵌入式实时操作系统(),是Tornado II嵌入式开发环境的关键组成部分。 VxWorks是Windriver公司开发专门为实时嵌入式系统设计开发的操作系统软件,为程序员提供了高效的实时任务调度、中断管理,实时的系统资源以及实时的任务间通信。应用程序员可以将尽可能多的精力放在应用程序本身,而不必再去关心系统资源的管理。该系统主要应用在单板机、数据网络(以太网交换机、路由器)和通信方面等多方面。通过对VxWorks的研究,可以使我们对嵌入式操作系统的研究和开发更进一步,尤其对国内的类似研制厂家有借鉴意义。 VxWorks操作系统的主要功能 目前VxWorks操作系统的版本为VxWorks 5.4,其核心功能主要有:微内核wind 任务间通信机制 网络支持 文件系统和I/O管理 标准实时扩展 C++以及标准支持这些核心功能可以与WindRiver系统的附件和Tornado合作伙伴的产品结合在一起使用。二 VxWorks实时操作系统的简介VxWorks实时操作系统包括微内核wind、网络支持、文件系统和I/O管理、C++和标准支持等核心功能。1. 微内核设计 处于VxWorks实时操作系统核心的是高性能的微内核wind。这个微内核支持所有的实时特征:快速任务切换、中断支持、抢占式和时间片轮转调度等。微内核设计减少了系统开销,从而保证了对外部事件的快速、确定的反应。 运行环境也提供了有效的任务间通信机制,允许独立的任务在实时系统中与其行动相协调。开发者在开发应用程序时可以使用多种方法:用于简单数据共享的共享内存、用于单CPU的多任务间信息交换的消息队列和管道、套接口、用于网络通信的远程过程调用、用于处理异常事件的信号等。为了控制关键的系统资源,提供了三种信号灯:二进制、计数、有优先级继承特性的互斥信号灯。2. 可裁剪的运行软件 VxWorks之所以设计为具有可裁剪性,是为了使开发者能够根据自己的应用程序需要,而不是根据操作系统的需要,来分配稀少的内存资源。从需要几个KB字节内存的深层嵌入式设计到需要更多的操作系统的功能的复杂的高端的实时系统,开发者也许需要从100多个不同的选项中进行选择以产生上百种的配置方式。许多独立的模块都是在开发时要使用而在产品中却不再使用。 而且,这些子系统本身也是可裁剪的,这样就允许开发者为最广泛的应用程序进行更为优化的VxWorks运行环境配置。例如,如果应用程序不需要某些功能模块,就可以将它移出 C运行库;如果应用程序不需要某些特定的内核同步对象,这些对象也可以忽略。还有,TCP、UDP、套接口和标准Berkeley服务也可以根据需要将之移出或移入网络协议栈。 这些配置选项可以通过Tornado II的项目工具图形接口轻易地选择。开发者也可以使用Tornado II的自动裁剪特性,自动地分析应用程序代码并合并合适的选项。三 VxWorks操作系统的基本结构VxWorks操作系统的基本构成部件主要有以下五个部分:板级支持包BSP(Board ) 微内核wind 网络系统 文件系统 I/O系统VxWorks 操作系统包括了板级支持包BSP(Board )、进程管理、存储管理、设备管理、文件系统管理、网络协议及系统应用等几个部分。VxWorks只占用了很小的存储空间,并可高度裁减,保证了系统能以较高的效率运行。 1.板级支持包 BSP(Board ) 板级支持包对各种板子的硬件功能提供了统一的软件接口,它包括硬件初始化、中断的产生和处理、硬件时钟和计时器管理、局域和总线内存地址映射、内存分配等等。每个板级支持包括一个 ROM 启动(Boot ROM)或其它启动机制。 2.高性能的实时操作系统核心 wind [1].VxWorks 的核心,被称作 wind,包括多任务调度(采用优先级抢占方式),任务间的同步和进程间通信机制以及中断处理,看门狗和内存管理机制。一个多任务环境允许实时应用程序以一套独立任务的方式构筑,每个任务拥有独立的执行线程和它自己的一套系统资源。进程间通信机制使得这些任务的行为同步、协调。 [2].wind使用中断驱动和优先级的方式。它缩短了上下文转换的时间开销和中断的时延。在 VxWorks 中,任何例程都可以被启动为一个单独的任务,拥有它自己的上下文和堆栈。还有一些其它的任务机制可以使任务挂起、继续、删除、延时或改变优先级。 [3].wind 核提供信号量作为任务间同步和互斥的机制。在 wind 核中有几种类型的信号量,它们分别针对不同的应用需求:二进制信号量、计数信号量、互斥信号量和 信号量。所有的这些信号量是快速和高效的,它们除了被应用在开发设计过程中外,还被广泛地应用在 VxWorks 高层应用系统中。对于进程间通信,wind 核也提供了诸如消息队列、管道、套接字和信号等机制。 3.网络设施 VxWorks的网络结构如图所示,它提供了对其它网络和 TCP/IP 网络系统的"透明"访问,包括与BSD套接字兼容的编程接口,远程过程调用(RPC),(可选项),远程文件访问(包括客户端和服务端的NFS机制以及使用RSH,FTP 或 P的非NFS机制)以及 和 ARP 代理。无论是松耦合的串行线路、标准的以太网连接还是紧耦合的利用共享内存的背板总线,所有的 VxWorks 网络机制都遵循标准的 协议。4.文件系统 VxWorks 提供的快速文件系统适合于实时系统应用。它包括几种支持使用块设备(如磁盘)的本地文件系统。这些设备都使用一个标准的接口从而使得文件系统能够被灵活地在设备驱动程序上移植。 VxWorks 也支持 磁带设备的本地文件系统。VxWorks I/O 体系结构甚至还支持在一个单独的 VxWorks 系统上同时并存几个不同的文件系统。VxWorks 支持四种文件系统: dosFs rt11Fs rawFs tapeFs。 另一方面,普通数据文件,外部设备都统一作为文件处理。它们在用户面前有相同的语法定义,使用相同的保护机制。这样既简化了系统设计又便于用户使用。5.I/O 系统VxWorks 提供了一个快速灵活的与 C 兼容的 I/O 系统,包括 标准的缓冲 I/O 标准的异步 I/OVxWorks 包括以下驱动程序:网络驱动 管道驱动 RAM盘驱动 驱动 键盘驱动 显示驱动 磁盘驱动 并口驱动 四Tornado II系统开发工具了解Vxworks操作系统的构成,对我们开发目标系统上的软件和调试有重要意义,同时也能链接其内核的许多功能方便共享。在Tornado集成环境上的开发其基本点是动态链接与加载,即Tornado允许开发者增量地将目标模块加载到目标系统上去,这种动态的链接和加载功能是Tornado系统的核心功能,可以使开发者省去通常的开发步骤:在主机上将应用程序与内核链接起来,然后将整个应用程序下载到目标系统上去。这样,编辑-测试-调试的周期会大为缩短;而且,所有的模块都是可以共享的,主机上的应用程序模块也不需要重新链接,所以,加载目标模块到运行中的VxWorks目标系统中以达到调试和重新配置的目的成为可能。关于如何调试VXWORKS目标系统本文不赘述。

    时间:2018-10-31 关键词: 操作系统 嵌入式 VxWorks 结构 实时

首页  上一页  1 2 3 4 5 6 7 8 9 10 下一页 尾页
发布文章

技术子站

更多

项目外包