跳至主要内容

博文

【转】嵌入式实时系统VxWorks入门

嵌入式 实时操作系统 VxWorks 入门��开发环境构建 VxWorks 操作系统是美国WindRiver公司于1983年设计开发的一种 嵌入式 实时操作系统(RTOS),它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。在美国的 F-16、FA-18 战斗机、B-2隐形轰炸机和爱国者导弹上,甚至连1997年4月在火星表面登陆的火星探测器上也使用到了 VxWorks 。 VxWorks 原先对中国区禁止销售,自解禁以来,在我们的军事、通信、工业控制等领域得到了非常广泛的应用。 VxWorks 的实时性体现在能于限定的时间内执行完所规定的功能,并能在限定的时间内对外部的异步事件作出响应。因此,实时性系统主要应用于过程控制、数据采集、通信、多媒体信息处理等对时间敏感的场合。本文将对这个操作系统进行一个入门级的、全面的介绍。为力求展示其全貌,全文共分五章: (1)搭建 VxWorks 嵌入式 开发环境; (2)简要介绍 VxWorks 的基本组成,内核的基本结构; (3)概述 VxWorks 板级支持包(BSP)的概念及 VxWorks 的启动过程; (4)介绍 VxWorks 设备驱动的架构及编写方法; (5)指明 VxWorks 应用开发的思路,任务调度及任务同步、中断与任务的同步机制。 以上各章中将贯穿着许多实例,由于本文定位于入门级教程,所以文中的实例都将十分简单。下面我们进入第一章内容的讲解。 如图1, 嵌入式 系统的调试方法一般为通过PC(宿主机)上的集成开发环境交叉编译针对特定电路板(目标机)的程序,然后将程序通过目标板的JTAG、串口或网口等途径下载到目标板上运行。因此,为了构造一个 嵌入式 系统的学习环境,拥有一块包含CPU、存储器及I/O电路(构造计算机系统)的目标电路板往往是必要的。虽然许多集成开发环境附带模拟软件,但仅限于指令集的模拟,均无法模拟物理的目标机硬件平台,因而在其上只能进行应用程序的象征性模拟开发。但是,并非所有人都能拥有一块物理的电路板。在这种情况下,我们如何构造一个模拟的开发环境,其学习效果就如同拥有完全真实的电路板一样呢?本文试图解答此问题,主体内容包括四个方面: (1) 利用VMware等软件模拟真实的...

【转】select问题

问: 该串口初始化如下 ioctl(comm2Fd,FIOBAUDRATE,9600) ioctl(comm2Fd,FIOSETOPTIONS,OPT_RAW) 使用如下 FD_ZERO   (&readFds); FD_SET   (comm2Fd,   &readFds);   width   =   comm2Fd   +   1; FD_ISSET   (comm2Fd,   &readFds); FOREVER { if(timeoutvalue==0) { printf("\nselect   start!\n"); selectnum   =   select   (width,   &readFds,   NULL,   NULL,   NULL); printf("\nselect   over!\n"); }                                 ........... } 现在的状况是程序跑一段时间后会死机或这个串口通讯任务死掉,每次死机都是"select   start!"打印出来,而"select   over!"打印不出来,在仅这个串口通讯任务死掉的情况下,用comm1Fd超级终端登陆,查询任务状态,会发现tExcTask任务居然处于挂起状态??? 哪位大哥帮忙分析一下或给予一点提示,小弟不胜感激!! 答: sele...

【转】VxWorks串口编程实例

//**************************************************************************** // // 下面这些函数是使能串口 UART,并从串口发送接收数据,不同的硬件串口,程// 序都是类似的,只要改一下相应的硬件参数即可 // //**************************************************************************** //**************************************************************************** // // UARTEnable 设置串口UART,并使能 // //**************************************************************************** long UARTEnable(long lPort, long lDataRate, long lDataBits, long lStopBits, long lParity, long lEvenParity) { unsigned char *pucPtr = (unsigned char *)HwBaseAddress; //硬件的基地址 long lRates[12] = { 115200, 76800, 57600, 38400, 28800, 19200, 14400, 9600, 4800, 2400, 1200, 110 }; //串口波特率 long lDivisors[12] = { 1, 2, 3, 5, 7, 11, 15, 23, 47, 95, 191, 2094 }; long lIdx, lConfig; // // 赋波特率值 // for(lIdx = 0; lIdx < 12; lIdx++) { if(lRates[lIdx] == lDataRate) { break; } } if(lIdx == 12) { return(0); } lConfig = lDivisors[lIdx]; // // 设置有效的数据位宽度 // switch(lDataBits) { case 5...

【转】移植Linux的应用软件到Windows

一.前言     Linux 拥有丰富各种源代码资源,但是大部分代码在 Windows 平台情况是无法正常编译的。 Windows 平台根本无法直接利用这些源代码资源。如果想要使用完整的代码,就要做移植工作。因为C/C++ Library的不同和其他的一些原因,移植C/C++代码是一项困难的工作。本文将以一个实际的例子(Tar)来说明如何把 Linux 代码移植到 Windows 平台上。移植过程将尽量少修改代码,以便代码的运行逻辑不会发生任何变动。保留绝大部分软件主要功能。    二.准备工作    Tar是 Linux 平台下面一个打包工具。移植这样一个程序到 Windows 平台需要做那些工作呢?    首先是一些准备工作,在 Windows 平台上面安装上Cygwin的最新版本,在Cygwin中安装好GCC等开发工具。 同样也需要一个 Windows 开发环境。可以使用最新版本Visual Studio, Microsoft Visual Studio .NET 2003。从 www.gnu.org 上取得Tar的最新源代码,版本是1.13。在Cygwin下面解开tar-1.13.tar.gz.源代码包。注意请不要在 Windows 下面使用WINRAR或者WINZIP来解压缩。 WINRAR和WINZIP在解压缩某些tar.gz包的时候会有问题。使得解包之后的目录和文件出现异常。如果是源代码包将有可能不能在Cygwin下面正确编译。解开压缩包之后,进入 tar-1.13目录,在当前的目录下面输入./configure命令,运行完毕之后,再次输入make命令。开始编译tar的Cygwin版本。编译基本上不会有问题,进入src目录,可以看到新编译好的Tar程序tar.exe。    Cygwin是一个API层的 Linux 模拟环境。如果能够在Cygwin下面编译,运行。实际上也就是能在 Windows 下面编译和运行,只是需要有一层中间API模拟某些 Linux 特有的操作。简单的判断一个 Linux 程序能不能移植到 Windows 平台下面,就是看是否能在Cygwin下面编译源代码,并运行程序。...

【转】VxWorks入门

1.VxWorks开发方式:交叉开发,即将开发分为主机(host)和目标机(target)两部分。 类似于dos下C语言程序的开发。 合并开发的优点:简单 缺点:资源消耗量大,CPU支持,非标准体系的支持 host (Tornado) target(vxWork) 小程序模块 vxWorks实际采用开发模式 Tornado提供:编辑,编译,调试,性能分析工具,是vxWorks的开发工具 vxWorks:面向对象可以剪裁的实际运行操作系统 2.vxWorks启动方式 <1>Rom方式 (vxWork_rom) vxWorks直接烧入rom <2>Rom引导方式(bootrom+vxWorks) 其中bootrom烧入rom,vxWorks可以通过从串口,网口,硬盘,flash等下载!这里的bootrom不是开发环境中的bootable,在开发环境里bootable指的是vxWorks,downloadable指application 3.调试 <1>attachs/20060907_164540_564.rar 用来在多任务调试时将调试对象绑定到某个任务 <2>任务级调试(attachs/20060907_164540_564.rar taskName) 单个任务的调试不会影响到其他任务的运行,主要用来调用户的应用程序。 全局断点:在调另一任务或本任务时,系统运行本任务断点,则停下。各任务要配合使用。 任务断点:调本任务时,系统运行到本任务断点,则停下。如果没有attachs/20060907_164540_564.rar到本任务,不起作用。 一次性断点:跑到一次之后自动删除。 <3>系统级调试(attachs/20060907_164540_564.rar system) 把所有task和系统core、中断看成一个整体,可用于调试系统和中断。对中断调试,如果不是系统级调试,无论是那种断点都不起作用 !wdbAgent不在调试范围内,当任务级调试时工作在中断方式,系统级调试工作在轮询方式。 !可是使用命令行方式的调试,参看crossWind教程。 4.调度 优先级调度(无条件) 时间片:同优先级,如果时间片没有打开,任务采取先到先运行,运行完毕在交出cpu,如果打开,则轮流使用cpu。 !死循环使比它...

【转】提高Linux的连接限制

一般linux下TCP连接的限制在TD_SETSIZE,系统默认为1024,由FD_SETSIZE决定。 1.修改方法:   修改/usr/etc/security/limits.conf文件,加入     *soft nofile 20000     *hard nofile 20000   然后reboot系统。 服务器就可以建立连接到20000个了,其连接方法是直接用connect,accept,注意这里用select是不可以的。 2.上面的方法在不用select方法的情况下是不可以的,如果你用select,那么仍然只能打开1024个,这是因为select的数目由FD_SETSIZE决定的。那么我们可以改用poll来替代select,poll数组大小可以根据我们自己的需要来定义,这样就解决了这个问题。 3.linux中的是通过文件方式来管理系统的,因此系统能承载多少TCP连接和系统文件打开数目能力是相关的。 另外在/proc/sys/file-max中定义了,系统最多能够打开的文件数目。 附代码:  服务器端:pollserver.cpp    #include <iostream> #include <ctype.h> #include <errno.h> #include <signal.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/file.h> #include <sys/ioctl.h> #include <sys/wait.h> #include <sys/types.h> //#include <asm/poll.h> #include <netdb.h> #include <unistd.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string> #include <sys/p...

【转】ISO C和POSIX头文件

ISO C标准定义的头文件(24项) <assert.h>       ----------------------   验证程序断言 <complex.h>    ----------------------   支持复数算术运算 <ctype.h>        ----------------------   字符类型 <errno.h>        ----------------------   出错码 <fenv.h>          ----------------------   浮点环境 <float.h>          ----------------------   浮点常量 <inttypes.h>    ----------------------   整型格式转换 <iso646.h>      ----------------------   替代关系操作符宏 <limits.h>         ----------------------   实现常量 <locale.h>      ...