本文我们将探讨VxWorks网络协议栈的原理以及结构。我们会对VxWorks的网络协议栈和MUX接口、MUX接口工作流程分析和MUX的应用都做了具体的分析和讲解。

在多种网络协议以及产品的支持下,让我们的生活工作有了更多的选择。那么这里我们就将介绍一下VxWorks网络协议栈等相关的内容。VxWorks是美国Wind River System公司(风河公司)推出的一个运行在目标机上的高性能、可裁减的嵌入式实时操作系统.它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军 事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通信、军事演习、弹道制导、飞机导航等.VxWorks操作系统包括进程管理、存储管理、设 备管理、文件系统管理、网络协议及系统应用等几个部分.VxWorks只占用很小的存储空间,并可高度裁减,保证了系统能以较高的效率运行.它可以根据用 户需求进行组合,其开放式结构对工业标准的支持使开发者只须做最少的工作即可设计有效的适合于不同用户的要求.

1 VxWorks的网络协议栈和MUX接口

VxWorks中的网络协议栈叫作SENS(Scalable Enhanced Network Stack),即可裁减强网络协议栈.SENS是基于4.4BSD TCP/IP协议栈发展而来的,包含了许多4.4BSD TCP/IP协议栈没的协议;而且SENS在实现一些协议功能时增加了许多新特性,如在IP协议实现时增加了多播功能.SENS协议栈层次如图1所示.

vxworks network protocol

1. 与任务相关的命令

sp adr, args... : Spawn a task, pri=100, opt=0x19, stk=20000

sp 函数地址, 参数1, 参数2,...

启动任务,最多接受9个参数,默认的优先级100、堆栈20000字节

e.g: sp copy, "vxWorks.st", "/tffs0/vxWorks.st"

period n,,[arg1],...,[arg8]
创建一个周期调用的任务,周期为n秒,最多接受8个参数
repeat m,,[arg1],...,[arg8]
创建一个反复调用的任务,调用次数为m,m=0时永久调用,最多也是8个参数
  • ts tidX -挂起任务
  • tr tidX -恢复挂起的任务
  • td tidX -删除任务
  • i tidX -显示任务基本信息,参数为0时显示全部任务
  • ti tidX -显示任务详细信息,包括寄存器、堆栈等
  • tt tidX -显示任务的函数调用关系
  • tw (taskName) Find info about the object the task is pending on
  • checkStack tidX -显示任务堆栈使用的历史统计,参数为0时显示全部任务

其中tidX可以为任务ID 也可以为任务名

2、系统信息

  • ld < filename Load a file
  • unld < "moduleName" Unload file
  • bootChange Modify the saved boot parameters
  • logout Log out of the target
  • lkAddr addr -显示addr地址附近的符号表
  • l addr,[n] -显示addr地址开始的n条指令的反汇编,n省略时默认为10条指
  • memShow 1 -显示系统分区上空闲和已分配空间的总数等
  • printErrno value -打印系统定义的错误码的宏
  • lkup ["string"] -在系统符号表中查找并列出含有"string"字符的函数及全局变量

注:lkup,有两个特殊参数:

0,给出符号表统计;""(空字符串),列出全部符号 lkup "excExcHandle"

在VxWorks下怎样用startup的启动脚本,大家应该都知道,举个例子:

需要define下面的两个宏:

#define INCLUDE_SHELL
#define INCLUDE_STARTUP_SCRIPT 

usrConfig.c中会调用:

#ifdef INCLUDE_STARTUP_SCRIPT
    usrStartupScript (startupScriptFieldSplit (sysBootParams.startupScript));
#endif

这里可能会遇到一个问题,就是sata/sd/usb 之类的不工作。原因是这个函数是在usrRoot根任务下执行的,优先级是0,而sata/sd/usb 之类的会创建一个自己相应的任务去维护这些设备,显然只有当root任务执行完后这些任务才会开始执行,所以调到usrStartupScript的时候,sata/sd/usb 之类还没有准备好,当然无法正常工作了,解决办法有很多,比如在usrStartupScript 之前加taskDelay(),让sata/sd/usb 之类的任务先运行,我推荐的一种方法是: 在这个函数里多open几次这个设备,第一次肯定不成功,第二次应该就可以了:

VxWorks有dosFs和hrFs,都可以用作Nor Flash或者SPI Flash文件系统,需要定义如下宏:

#define INCLUDE_TFFS
#ifdef INCLUDE_TFFS
#define INCLUDE_TFFS_SHOW
#define INCLUDE_TFFS_MOUNT
#define INCLUDE_ERF
#define INCLUDE_DEVICE_MANAGER
#define INCLUDE_FS_EVENT_UTIL
#define INCLUDE_FS_MONITOR
#define INCLUDE_XBD
#define INCLUDE_XBD_BLK_DEV
#define INCLUDE_XBD_TRANS
#define INCLUDE_DISK_UTIL
#define INCLUDE_DISK_PART      
#define INCLUDE_RAWFS          
#endif

#undef INCLUDE_HRFS  -- 用的话打开就行
#ifdef INCLUDE_HRFS
#   define INCLUDE_HRFS_FORMAT    
#   define INCLUDE_HRFS_CHKDSK    
#endif

#undef INCLUDE_DOSFS -- 用的话打开就行
#ifdef INCLUDE_DOSFS
#   define INCLUDE_DOSFS_DIR_FIXED
#   define INCLUDE_DOSFS_DIR_VFAT
#   define INCLUDE_DOSFS_FAT
#   define INCLUDE_DOSFS_FMT
#   define INCLUDE_DOSFS_CHKDSK
#   define INCLUDE_DOSFS_MAIN
#   define INCLUDE_DOSFS_SHOW
#endif  

建立文件系统过程如下:

VxWorks里怎样load一个文件到内存? 这个文件可以是在SD、USB、ATA这类的存储设备,也可以通过ftp网络下载;

下面是相关的实现代码,分享给大家:


STATUS ldToMem
    (
    char * fileName
    )
    {
        UINT8 * pData;
        FILE *  fp;
        UINT32  FileSize;

        if (NULL == (fp = fopen(fileName,"rb")))
        {
            printf("open file failure\n");
            return ERROR;
        }

#if FALSE
        pfile = fopen("/sd0:0/fileName","rb");
#endif

        fseek (fp, 0, SEEK_END);
        FileSize = (UINT32) ftell (fp);
        fseek (fp, 0, SEEK_SET);

        if ((pData = malloc(FileSize)) == NULL)
        {
            printf("malloc failure\n");
            return ERROR;
        }

        if (fread (pData, 1, FileSize, fp) != FileSize)
        {
            printf("malloc failure\n");
            free(pData);
            return ERROR;
        }

        printf("ldToMem OK pointer @ 0xx FileSize %d\n",pData, FileSize);
}