VxWorks扩展了POSIX,为了移植,VxWorks提供了额外的POSIX接口作为可选组件。VxWorks实现了POSIX 1003.1(POSIX .1)一些传统接口以及POSIX.1可选功能中的一些实时接口。
VxWorks提供了很多POSIX兼容的API,但并非全部POSIX API都适合嵌入式和实时系统,或完全兼容VxWorks操作系统。因此,VxWorks在少量情况下强加了以下很小的限制来满足实时系统和VxWorks兼容。
默认配置并不包含POSIX支持。BUNDLE_POSIX捆绑组件为内核空间提供了通用POSIX的支持。如果要细粒度控制POSIX的支持,可以选择单个的组件。
注意:对于内核空间和用户空间的POSIX支持的组件是不同的。
POSIX的组件配置
下表提供了支持内核空间的POSIX的独立组件
通过vmware 来搭建vxworks 的开发环境,然后通过target server 来进行调试程序,网络 下载应用程序,小的应用程序可以顺利download 下去,大的应用程序就不行了。 本文就简要介绍一下如何解决这个问题。
VxWorks 的WDB 通信服务,不支持通信数据的拆包处理,由于网卡的MTU 比较小, 当下载的应用程序比较大的时候,数据会被拆成多个小包,而WDB 不支持拆包,所以导致 target server 在下载的时候抱错,问题的关键在于网卡的MTU,所以可以通过增大网卡的 MTU 来解决这个问题。
下载地址
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)
将下面的代码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一 样了。
© 2024 VxWorks Club