打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
vxWorks使用过程中的100个疑问与解答(上)


在项目中需要适配vxWorks,自己总结的遇到的问题与解决方法,欢迎大家交流vxWorks使用心得。

01

Q:

如何在vxWorks bootrom添加devs命令?

A:

在usrconfig.c中的包含 bootFsLoadInit()

 configAll.h 添加 两个宏定义

/* Define for FS */#define BOOTAPP              /* add by maketure at 20180509 */#define INCLUDE_DOSFS /* add by maketure at 20180509 */

02

Q:

在workbench中如何生成vxWorks的bootrom.bin文件?

A:

(方案1)在workbench中-->open development shell 进入bsp目录,输入make bootrom.bin

(方案2)在workbench中,在工程右键选择Builds Options-->set Active build Spec...-->选择需要生成二进制文件格式

03

Q:

ZYNQ芯片系列中SDK工具用来生成BOOT.bin的bootrom.elf 文件怎么通过workbench获得?

A:

workbench生成的bootrom本身的格式就是elf,故只要重命名

04

Q:

在workbench中如何更新vxWorks library?

A:

(1)P2020相关系列

在workbench中-->open development shell  进入对应的库目录,然后 make TOOL=e500v2diab CPU=PPC32

 (2)ZYNQ系列

make CPU=ARMARCH7 TOOL=diab

make CPU=ARMARCH7 TOOL=diab VXBUILD=SMP

make CPU=ARMARCH7 TOOL=gnu

make CPU=ARMARCH7 TOOL=gnu VXBUILD=SMP

05

Q:

如何对vxwork的输入输出重定向,即printf输出的对象?

A:

(1)ioTaskStdSet 任务级别重定向  ioGlobalStdSet全局的 

void spyComTask    (    int freq,    FUNCPTR printRtn    )    {    int delay = freq * sysClkRateGet ();int consoleFd = open ("/tffs1/output.txt", 2, 0); //把spy任务输出重定向到 tffs里的output.txt文件ioTaskStdSet (0, STD_IN,  consoleFd);ioTaskStdSet (0 ,STD_OUT, consoleFd);ioTaskStdSet (0, STD_ERR, consoleFd);void spyComTask    (    int freq,    FUNCPTR printRtn    )    {    int delay = freq * sysClkRateGet ();int consoleFd = open ("/tffs1/output.txt", 2, 0); //把spy任务输出重定向到 tffs里的output.txt文件ioTaskStdSet (0, STD_IN,  consoleFd);ioTaskStdSet (0 ,STD_OUT, consoleFd);ioTaskStdSet (0, STD_ERR, consoleFd);while (TRUE){spyReportCommon (printRtn);taskDelay (delay);} 
BootRom中的重定向 打开target\config\all\usrconfig.c文件,可以找到这样一行代码: 

consoleFd = NONE; 

此consoleFd变量即标准输入输出句柄,此时为空。

同样,可以找到如下的三行代码: 

ioGlobalStdSet (STD_IN, consoleFd); ioGlobalStdSet (STD_OUT, consoleFd); ioGlobalStdSet (STD_ERR, consoleFd); 
此三行代码的意思是将标准输入输出定向到consoleFd。在这两段代码之间有打开诸如串口、PC console等过程,并将其打开的句柄赋给了  consoleFd,这样就将其标准输入输出定向到PC console等。
同样,如果在定向之前,即ioGlobalStdSet函数之前打开别的I/O设备,如socket、文件、管道等的话,那么标准输入输出就定向到socket、文件、管道等。一般情况下,用户采用串口作为输入输出操作接口,所以我们一般将标准输入输出定向到串口。那么,怎么将标准输入输出定向到串口呢?按照以上原理,只要在ioGlobalStdSet函数之前打开相应的串口并将所打开的串口句柄赋给consoleFd就可以了。实现代码如下:

   /*打开串口,输入输出重定向到超级终端*/ 

 if((consoleFd=open("/tyCo/0",O_RDWR,0))==ERROR)    logMsg("open /tyCo/0 error! \n",0,0,0,0,0,0);   (void)ioctl(consoleFd,FIOBAUDRATE,9600);  (void)ioctl(consoleFd,FIOSETOPTIONS,OPT_TERMINAL&~OPT_ECHO);   (void)ioctl(consoleFd,FIOWFLUSH,0);    (void)ioctl(consoleFd,FIORFLUSH,0);

(2)VxWorks中的重定向

在BootRom中将标准输入输出已经定向到串口,但是在VxWorks中,当BootRom起来将VxWorks引 导后,将执行权交给了VxWorks,而此时VxWorks会将BootRom中对硬件初始化的过程重新初始化,故其定向会重新按照缺省方式定向到PC console,标准VGA输出和键盘输入。那么又怎么将其定向回串口呢?
打开target\config\comps\src\usrPcConsole.c文件 
在其代码中也同样可以看到其定向过程,那么我们也可以按照BootRom的方式将串口打开并定向。

 (3) VxWorks5.5中的输入输出定向 

在VxWorks5.5中,已经将其标准输入输出直接定向到串口,并且其标准输入输出更简单,直接通过target\config\bspName\config.h文件中的宏定义就可以实现。怎么样切换回PC console的输入输出模式呢? 

在target\config\bspName\config.h文件中,可以找到如下定义:

#undef INCLUDE_PC_CONSOLE /* PC keyboard and VGA console */#ifdef INCLUDE_PC_CONSOLE define PC_CONSOLE (0) /* console number */ define N_VIRTUAL_CONSOLES (2) /* shell / application */ #endif /* INCLUDE_PC_CONSOLE *//* PS/2 101-key default keyboard type (use PC_XT_83_KBD for 83-key) */ #define PC_KBD_TYPE (PC_PS2_101_KBD)
从上可以看出,缺省情况下,宏INCLUDE_PC_CONSOLE是关闭的,所以我们在制作  BootRom后,启动时在显示器上会出现如下的输出: 
并且此时会停在这里不动,感觉好象是系统不能启动,其实,系统已经启动起来了,并且其打印信息已经输出到串口,如果你插上串口线的话,可以从超级终端看到打印输出的。
定义宏INCLUDE_PC_CONSOLE后,同时也定义了PC_CONSOLE和键盘类型,这样就可以通过键盘接受标准输入,通过显示器有标准输出。

实际开发中的应用

在实际产品开发中,用户可能会开发适合自己风格的用户操作接口,包括Telnet、console等,console即串口的超级终端输入输出,按照以上方法实现其定向,
但是Telnet时可能就需要随时将标准输入输出定向到打开的相应的Telnet socket。WindRiver公司有一套制作用户接口(CLI)工具——RapidControl,利用此工具可以很快开发出类CISCO风格的Telnet、console。此工具提供了将输入输出定向到Telnet socket的API 函数,但是有很多VxWorks的系统函数如ping、inetstatShow、ipstatShow其输出还是标准的printf,故在Telnet 中调用这些函数时,就需要随时实行标准输入输出的定向。

   假如某Telnet打开的socket为sock: 

   ioGlobalStdSet(STD_OUT,sock);    ioGlobalStdSet(STD_IN,sock);    ioGlobalStdSet(STD_ERR,sock);    ipstatShow();    ioGlobalStdSet(STD_OUT,consoleFd);    ioGlobalStdSet(STD_IN,consoleFd);    ioGlobalStdSet(STD_ERR,consoleFd);
先将输入输出定向到sock,调用相关的函数,再将输入输出定向回来,如果不定向回来的话,那么console和别的Telnet就无法操作了。
06

Q:

vxBusShow 没有命令时,如何解决?

A:

添加组件 vxBus subsystem show routines

如果找到,二者结合成一个instance,否则在vxBusShow里可以看到一个orphan。使用vxBusShow可以比较清晰的看到driver列表和device列表以及orphan列表

07

Q:

如何通过命令行显示驱动 以及设备 (devs)、文件描述的情况?


08

Q:

vxWorks如何查看任务负载?

A:

getcpuusage命令

09

Q:

vxWorks查看与修改系统时间?

A:

10

Q:

VxWorks ifconfig 修改IP , MAC地址等?

A:

 ifAddSet "motetsec0 192.168.5.100 up" ifMaskSet "motetsec0 255.255.255.0 up" ifConfig "motetsec0  192.168.5.100 up" ifConfig "motetsec0  lladdr 192.168.5.100 up"

11

Q:

vxWorks命令行 查看can收发状况

A:

12

Q:

vxWorks查看串口收发情况

A: 

uartShow

13

Q:

vxWorks FUNCPTR 与VOIDFUNCPTR 定义的位置?

A:

vxTypesOld.h  e_vxTypesOld.h
14

Q:

为啥将40wrsample.cdf copy to ${WIND_BASE}/target/config/comps/vxWorks directory然后workbench未出现可配置的界面?

A:

需要重启下workbench

15

Q:

vxWorks怎么查看二进制文件是否有某个符号表?

A:

nmpentium default/vxWorks | grep wrsampleRegister
16

Q:

VxWorks怎么在命令行中测试函数的执行时间?

A:

timexN delay,100
17

Q:

vxWorks怎么获取主机的IP地址?

A:

int bb(){ char name[32]; int ip = 0; char ipadd[15]; char *p; struct in_addr iaddr; if (gethostname(name, 30) == ERROR) //This routine gets the target machine's symbolic name, which can be used for identification   {     fprintf(stderr"Call gethostname failed!\n");     return 0;   } if ((ip = hostGetByName(name)) == ERROR)//这个数怎么变x.x.x.x 例如192.168.0.50   {     fprintf(stderr"Call hostGetByName failed!\n");     return 0;   }    iaddr.s_addr = ip; sprintf(ipadd,"%s",inet_ntoa(iaddr));
 p = inet_ntoa(iaddr); printf("%s\n%d\n  %s\n",name,ip,ipadd); printf("%s\n",p);}

添加组件 vxBus subsystem show routines

gethostName 得到名称为target name This routine gets the target machine's symbolic name, which can be used for identification最后处理得到的ip为 inet on ethernet
18

Q:

windRiver workbench 如何编译静态库?

1. 新建一个“Downloadable Kernel Module Project”工程;

2. 选择对应的硬件环境,此处选择“MIPSI64gnule_SMP”;

3. 选择需要编译生成的库形式,Linker对应生成动态库.out,Librarian对应生成静态库.a;

4. 编译成成对应库文件(此处以静态库为例);

5. 新建一个image工程,点击右键的properties,选择build properties;

6. 点击build properties,选择build macros选项卡,该选项下有两栏需特别注意,一个是EXTRA_MODULES,一个是LIBS,在image工程中我们要链接MODULE工程编译生成的库文件,需要添加在EXTRA_MODULES栏中,可以在其中链接诸如.o、 .a等文件。但是在LIBS中链接这类a文件,会编译报错,至于为何报错,以及这两者有啥区别,有待日后研究……

A:

New Wind River Workbench Project --->类型为static Kernel Library ,不能选择vxwork6.x project 否则看不到static Kernel Library 类型引用为 编译类型需要在工程创建后更改

image:

19

Q:

如何在vxwork使用脚本(镜像和脚本同一级目录,且需要定制shell startup script组件)?

A:

启动参数中的脚本优先于usrAppinit执行.若需要在usrAppInit里面执行,则需要收到调用

usrStartupScript("/tffs0/start_opensca")函数使用?

启动目标机,在bootrom引导vxworks时,指定startup script参数,如:

boot device          : cpm unit number          : 0 processor number     : 0 host name            : chenqi file name            : vxWorks inet on ethernet (e) : 192.168.0.200 host inet (h)        : 192.168.0.118 user (u)             : target ftp password (pw)    : target flags (f)            : 0x0 target name (tn)     : 850pc startup script (s)   : myscript.txt  如果一切正常,vxworks启动完毕之后,会有: Executing startup script myscript.txt ... printf("hello ") hello
出现下面情况ipAttach(0, "motetsec")C interp: unknown symbol name 'ipAttach'   需要添加Attach END to IPv4
20

‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍Q:

如何通过网络设备名获取mac地址?

A:

STATUS get_mac(char* ifName,int ifUnit){END_OBJ *pEnd;UINT8 *pData = NULL;int i =0;STATUS rval =0;pData = (UINT8 *)malloc(MAC_ADRS_LEN);pEnd = endFindByName(ifName,ifUnit);if(pEnd == NULL){perror("pEnd is null \n");return ERROR;}rval = muxIoctl(pEnd,EIOCGADDR,pData);for(i=0;i < MAC_ADRS_LEN;i++){printf("%02x:",*(pData+i));}return rval;}
21

‍‍‍‍Q‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍:

vxWork如何命令行中创建nor flash文件设备?

A:

step one: tffsDevFormat(0,0)---normal step two: usrTffsConfig(0,0,"/tffs0") usrTffsConfig (1, 0, "/tffs1");-> cd "/tffs0"cd: error = 0x16.·value = -1 = 0xffffffffset three:dosfsDiskFormat("/tffs0")
22

Q:

ipAttach 接口作用以及如何加入组件?

A:

主要是建立ip协议栈与mux接口之间的关系?

23

Q:

怎么修改vxWorks编译固定库文件?

A:

The makefile provides a mechanism that allows you to use the local copy insteadof the common version. The following macros designate a private copy of therelated files:For example, to use a private version of usrConfig.c, set the macro USRCONFIG tousrConfig.c in Makefile as follows:USRCONFIG = usrConfig.c
24

Q:

vxWorks target.reg使用什么标记语言?

A:

target.ref   uses the apigen markup language

25

Q:

VxWorks outConsole 可以用于早期打印调试

A:

26

Q:

vxworks 预处理分析

A:

When building a VxWorks image, many compile-time macros are expanded, andit is sometimes difficult to know what the actual numeric values of these macrosare and which branch of conditionally compiled code is being used. The bootromcode, in particular, contains many conditional compilations. One way to find thisinformation is to retrieve the post-processed compiler output.To retrieve the post-processor output for a given object moduleuse the followingcommand:make ADDED_CFLAGS=-E file.o > file.iNext, remove all of the lines starting with # and all blank lines
27

Q:

vxWorks 怎么判断一个任务是否存在,以及怎么根据任务名称过去ID,以及A任务如何等待任务B的结束?

A:

示例为根据等待任务名为"taskIde"结束

if(taskIdVerify(taskNameToId("taskIde")) != ERROR){taskWait(taskNameToId("taskIde"),sysClkRateGet()*2);}
28

Q:

workbench怎么在工程文本中加入路径等

A:

*.mk_USER_CFLAGS     = -I $(BSP_DIR)/net/mii -I $(BSP_DIR)/appDrivers -I $(BSP_DIR)/lib_utils -I $(BSP_DIR)/SRIO -I $(BSP_DIR)/net -I $(BSP_DIR)/mv88e6xxx -I $(BSP_DIR)/net -I $(BSP_DIR)/net/linux_mv88e6xxx -I $(BSP_DIR)/net/gtLib.wpj<BEGIN> BUILD_default_MACRO__USER_CFLAGS-I \$(BSP_DIR)/net/mii \-I \$(BSP_DIR)/appDrivers \-I \$(BSP_DIR)/lib_utils \-I \$(BSP_DIR)/SRIO \-I \$(BSP_DIR)/net \-I \$(BSP_DIR)/mv88e6xxx \-I \$(BSP_DIR)/net \-I \$(BSP_DIR)/net/linux_mv88e6xxx \-I \$(BSP_DIR)/net/gtLib<END>
29

Q:

vxWorks 如何格式化EMMC设备?

A:

30

Q:

workbench 中如何更换 image project bsp?

A:

31

Q:

nfsmaxPath undefined sybmol

A:

关于出现找不到 nfsmaxPath符号表示因为,未定制nfs 客户端与核心组件

IMPORT int          nfsMaxPath;         /* max. length of file path */
32

Q:

vxWorks如何将RTC时间转化成时间戳,然后写入系统时钟?

A:

参考P2020将时钟写进系统时间中,注意vxWorks 中mktime函数存在问题

33

Q:

vxWorks底层接收MAC数据?

A:

34

Q:

如何指定让ping的数据包从哪个网口发送出去?

A:

windows:  ping  -s 192.168.5.84 192.168.5.81 vxworks : ping "-S 192.168.5.82 192.168.5.84"  (-I 可指定网口名)

35

Q:

vxWorks如何 去掉 读秒 

A:

修改启动参数

flags  =0x8

36

Q:

内存分析需要添加的组建 Target 0x02b1cad0 for vector 714 out of range

A:

解决方案:

 - In operating system components / kernel components / : you must include the component "Allow 32-bits branches to handlers"- In operating system components / real time process components / : you must include the component "shared data region support in RTPs or kernel"
37

Q:

vxWorks 常见的内存分配疑问?

A:

38

Q:

vxWorks 怎么建立RAM/MEM文件系统

A:

ramDrv 需要添加组件ram disk driver 和xbd ram disk driver

在代码自己添加内存文件系统

 BLK_DEV * pBlkDev1;    pBlkDev1 = ramDevCreate((char *) sysMemTop(), 51232768327680);    xbdBlkDevCreateSync(pBlkDev1, "/ram");    dosFsVolFormat ("/ram:0", DOS_OPT_BLANK, NULL);
    BLK_DEV * pBlkDev2;    pBlkDev2 = ramDevCreate((char *) (sysMemTop()+0x1000000), 51232768327680);    xbdBlkDevCreateSync(pBlkDev1, "/ram1"); dosFsVolFormat ("/ram1:0", DOS_OPT_BLANK, NULL); 

MEM文件系统:添加memLib 需要添加组件MEM disk driver

memDrv 即可flash也可内存,ramDrv只能用途内存

DOS_OPT_BLANK = 2

总结:

39

Q:

怎么获取vxWorks系统的版本信息?

A:

如何在vxWorks bootrom添加devs命令?

40

Q:

Nandflash page / block相关的信息?

A:

NandFlash页的概念          page: 一个page大小为2K + 64bytes, 如上图所示,其中的64bytes是所在页的infomation, 记录着此页的使用情况,比如剩余存空间等.

 block: 一个block由64个页组成, 一个nandflash芯片由2k个block组成,算算就知道,一个nandflash芯片一共能存储256M的数据.

41

Q:

驱动关于调试打印控制的问题?

A:

#ifdef MHAL_ETH_DEBUG_ON#define LOG_LVL   7#define WARN_LVL     3#define ERROR_LVL  1#define NONE_LVL  0LOCAL int mhalEthernetDgbLvl = NONE_LVL;#define MHAL_ETH_DBG_MSG(level, fmt, a1, a2, a3, a4, a5, a6) \do{ \if(mhalEthernetDgbLvl >= level) \logMsg(fmt,(int)(a1),(int)(a2),(int)(a3),\(int)(a4),(int)(a5),(int)(a6));  \}while ((0))#else#define MHAL_ETH_DBG_MSG(level,fmt,a1,a2,a3,a4,a5,a6)#endif /* MHAL_ETH_DEBUG_ON */vel,fmt,a1,a2,a3,a4,a5,a6)#endif /* MHAL_ETH_DEBUG_ON */
42

Q:

workbench中usrConfig.c 与 prjConfig.c之间的关系?

A:

43

Q:

有的vxWorks 镜像为啥 通过FTP启动后,ls会出现 "cannot open (null)"?

A:

44

Q:

关于workbench编译时为啥会出现找不到sysAmpCpuPrep的符号表?

当前原因是因为配置文件中包含了WRLoad组件,去掉即可。

A:

45

Q:

vxWork 若需要将用户空间的地址与内核空间的地址分开,该怎么做?

A:

这部分和 RTP 组件以及虚拟化内存组件相关

46

Q:

vxWorks flag 参数配置

A:

flags (f)

    一些标志位的集合,每个标志代表一个特殊的选项。这些标志定义如下:

0x01 = 即使processor number为0,也不要激活系统控制器。(这个其实是由使用的板子解释的,所以应参考目标板子的资料)

0x02 = 载入所有VxWorks符号表,而不只是全局部分。

0x04 = 不要自动引导

0x08 = 快速自动引导,也就是自动引导前等的时间短一些。

0x20 = 禁用安全登录。

0x80 = 用TFTP(而不是FTP)来引导。

0x400 = 调试模式。

47

Q:

如何查看vxWorsk tffs文件系统的映射地址

A:

48

Q:

VxWorks 如何产生map文件?

A:

workbench怎么生成带debug调试信息的bootrom

ADDED_CFLAGS +=  -g -O

如何判断elf文件是否包含调试信息

49

Q:

vxWork 怎么链接静态库全部符号表到kernel image?

测试发现static kernel library 链接到kernel image 时只会链接使用到的函数文件

所以采用Relinkable kernel Module,其实就是DKM工程

A:

50

Q:

WRS_ASM("isync")的作用?

A:

eieio, sync 和isync 是上下文同步指令。“上下文同步”指的是:处理器内核包含着多个独立的执行单元,所以它能够并行的执行多个指令并且是乱序的。上下文同步指令用于需要严格秩序的地方,进行强制严格的指令顺序。eieio代表“强制按顺序执行IO”。在执行过程中,加载/存储单元等待前一个访问结束之后再开始运行加载/存储指令。eieio的目的就是为了防止执行过程中的随意加载和存储。在执行FIFO数据的读写变化时这可能是可取的。isync代表“指令同步”。这个指令等待所有的指令完成并放弃预读取指令,导致后续的指令需要从内存中重新读取。isync是上下文同步,它保证所有先前指令都到位并且刷新指令序列(这意味着指令序列中的所有指令需要被重新读取)。sync代表着内存同步指令。它延迟所有后续指令的执行直到先前指令完成,并且不会再产生异常以及直到先前的内存访问完全执行完毕;sync操作不会广播到总线接口。此外,先前指令发起的所有加载和存储高速缓存/总线活动完成。

关注本公众号

掌握更多行业动态

打开公众号名片点击关注

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
VxWorks BSP和启动过程
VxWorks引导启动过程
BSP相关一点资料
基于PowerPC440GP型微控制器的嵌入式系统设计
vxworks 七 T4240 bsp
嵌入式实时操作系统VxWorks入门
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服