POSIX能力

VxWorks扩展了POSIX,为了移植,VxWorks提供了额外的POSIX接口作为可选组件。VxWorks实现了POSIX 1003.1(POSIX .1)一些传统接口以及POSIX.1可选功能中的一些实时接口。

POSIX和实时系统

VxWorks提供了很多POSIX兼容的API,但并非全部POSIX API都适合嵌入式和实时系统,或完全兼容VxWorks操作系统。因此,VxWorks在少量情况下强加了以下很小的限制来满足实时系统和VxWorks兼容。

  • 交换内存到磁盘不适合实时系统,VxWorks没有提供这种能力。它提供了POSIX的页锁定功能方便移植到VxWorks。这函数并没有其它用途--在VxWorks中页总是被锁定。
  • VxWorks任务在系统层被调度,进程本身不被调度。因而,POSIX访问函数允许2种植(PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS),VxWorks只实现了系统层范围。

配置VxWorks使用POSIX能力

默认配置并不包含POSIX支持。BUNDLE_POSIX捆绑组件为内核空间提供了通用POSIX的支持。如果要细粒度控制POSIX的支持,可以选择单个的组件。

注意:对于内核空间和用户空间的POSIX支持的组件是不同的。

POSIX的组件配置

下表提供了支持内核空间的POSIX的独立组件

一、概述

通过vmware 来搭建vxworks 的开发环境,然后通过target server 来进行调试程序,网络 下载应用程序,小的应用程序可以顺利download 下去,大的应用程序就不行了。 本文就简要介绍一下如何解决这个问题。

二、问题复现

1、 错误现象

WTX 0x100de Error

三、分析问题

VxWorks 的WDB 通信服务,不支持通信数据的拆包处理,由于网卡的MTU 比较小, 当下载的应用程序比较大的时候,数据会被拆成多个小包,而WDB 不支持拆包,所以导致 target server 在下载的时候抱错,问题的关键在于网卡的MTU,所以可以通过增大网卡的 MTU 来解决这个问题。

下载地址

Files:
Date 2018-08-06
File Size 263.56 KB
Download 556

VxWorks下aux clock的使用示例:利用辅助时钟进行对某些函数运行时间进行精确计时。

首先需要在VxWorks映像中包含辅助时钟,包含组件hardware->peripherals->clocks->AUX clock,并将参数 AUX_CLK_RATE_MAX 改大点,默认只有5000的。

然后在程序中的调用,比如要记录某个函数的执行时间,函数假设为为test(),示例如下:

被调用的函数:

int g_aux_clock_tick=0;

int myISR(void)
{
    g_aux_clock_tick++;
}

进行调用操作:

test(void)
{
    sysAuxClkConnect((FUNCPTR)myISR, 0);
    sysAuxClkRateSet(100000);   // 10us一次
    sysAuxClkEnable();
    test();     // 要计时的程序
    sysAuxClkDisable();
    // 然后查看g_aux_clock_tick的计数值是多少就知道了
}

在VxWorks Image Project的kernel configuration中增加FTP Server组件(INCLUDE_IPFTPS)

  1. 将Authentication callback routine (FTPS_AUTH_CALLBACK_HOOK)挂到自己的回调函数myAuthenticateCallback;
  2. 将FTP initial directory 定义为"/tffs0";将FTP root directory定义为"/";
  3. 将install ftp server callback routine (FTPS_INSTALL_CALLBACK_HOOK)定义为TRUE;

将下面的代码copy到usrAppInit.c,放在usrAppInit()前

#include "iprip.h"
#include "ipftps.h"

int myAuthenticateCallback (Ipftps_session * session,char * password)
{
    return 0;
}

如果需要密码验证,可以修改myAuthenticateCallback函数如下

int myAuthenticateCallback (Ipftps_session * session,char * password)
{
if ( (strcmp (session->username, "abc") == 0)&& (strcmp (password, "123") == 0))
    return 0;
else
return -1;
}

操作系统总是基于某个时钟节拍来跑的,这个节拍的得到往往是通过硬件时钟中断得到,一般来说这个中断的优先级就比NMI低一点点,比其他的都高。

这个中断是供给操作系统用的,操作系统用他来进行调度等各种处理。而在VxWorks中的一个重要参数就是SYS_CLK_RATE这个参数,也就是系统时钟率。它的含义是:系统时钟滴嗒在一秒钟之内发生多少次。

比如说,你定义为 60,那么系统时钟在1s中将发生60次中断,两次之间的时间差就是1/60s。发生中断后,操作系统可以进行任务切换。也就是说,如果你有一个任务被挂起,则至少要过1/60s后被激活(其它中断除外)。

又假如你设置为1000,那么系统时钟1秒发生1000次中断,两个时间差就是1ms。而函数sysClkRateGet就是用来获取系统时钟率的,如果你没有调用sysClkRateSet() 函数对系统时钟率进行重新设置的 话,其返回值应该是你在config.h中定义的SYS_CLK_RATE宏的值。而函数taskDelay()是以tick数目为单位的,比如 taskDelay(1) 是指将调用该函数的任务延迟1个tick。那么时间是多少呢,根据你的SYS_CLK_RATE的值,其实际时间不同,但具体 时间是1/SYS_CLK_RATE。假如SYS_CLK_RATE是1000,那么就是1ms。如果是60那么就大约是16.67ms。

通常来讲,VxWorks手册建议不要将时钟率设得太高,否则它就由硬实时变得趋向于软实时了。因为过高的时钟率使得内核调度频繁进入,可能导致一些低优先 级的硬件中断不能得到及时响应。当然,也不要太担心,在x86系统中完全可以设置为1000,这样比较好使,1个tick就是1ms,跟Windows一 样了。