葛根和黄芪能一起喝吗:vxworks FAQ(中文)
来源:百度文库 编辑:偶看新闻 时间:2024/05/09 07:05:44
前言(Surface):
随着国内使用VxWorks的用户越来越多,为了方便VxWorkers少走一些弯路,特别推出了中文FAQ,其中
很多的FAQ来自comp.os.vxworks和原创。(很多FAQ都可以在该新闻组找到英文版)
文档的FAQ总共分为7大类:
1.入门FAQ
2.Tornado工具FAQ
3.BSP FAQ
4.文件系统 FAQ
5.网络 FAQ
6.VxWorks操作系统 FAQ
7.其它 FAQ
基本涵盖了Tornado/VxWorks使用中的主要方面。
文档组织本身没有逻辑上的关联,经过分类,只是松散的组合在一起,可根据你的需要选择阅读某一部
分。
为了保持本文档的开放性和可扩充性,欢迎大家把自己曾经碰到过的问题及其解决办法按分类加到文档
里来。在修改本文档时,请把修改记录加到历史记录里。
欢迎任何人指出文档中的错误之处,请把错误之处发到附录B里的任一个EMAIL里,在此对那些问题的提
出者、回答者以及文档的维护者一并表示感谢!
当前版本(Current Version):
version 0.1
历史(History):
2002-08-27 wys205 create 0.1 version
目录(Content):
1.入门FAQ
2.Tornado工具FAQ
2.1 编译器和链接器
2.2 调试器
2.3 FTP
2.4 主机工具
2.5 安装
2.6 MAKEFILE
2.7 工程
2.8 目标机服务器
2.9 Shell
2.10 Telnet
2.11 Tornado
2.12 版本控制
2.13 可视化集成
2.14 Windsh
2.15 WindView
3.BSP FAQ
3.1 不同BSP
3.2 处理器
3.2.1 Power PC
3.2.2 I960
3.2.3 MIPS
3.2.4 ARM
3.2.5 x86
3.3 Bootstrap
3.4 配置你的VxWorks
3.5 VME
3.6 VxWorks环境 environment
3.6.1 usrSerial.c
3.6.2 prj_vxworks.tcl
3.7 PCI
4.文件系统 FAQ
4.1 Dos文件系统
4.2 Flash文件系统
4.3 Floppy-disk文件系统
4.4 RAM-disk文件系统
4.5 基本文件系统问题
5.网络 FAQ
5.1 配置问题
5.2 ARP
5.3 DHCP
5.4 FTP和TFTP
5.5 PPP
5.5.1 PPP on Windows 95
5.5.2 PPP on Windows NT
5.5.3 PPP on Solaris
5.6 Sockets
5.7 Telnet
5.8 SNMP
5.9 其它网络相关问题
6.VxWorks操作系统 FAQ
6.1 C++ issues
6.2 Communication problems
6.3 Interrupts
6.4 LoadModule problems
6.5 pthreads
6.6 Reboot
6.7 Semaphores
6.8 Simulator (VxSim)
6.9 Task related items
6.10 Time/timer related items
6.11 Wind Web Server related items
6.12 Zinc/windML related items
6.13 Other items
6.14 VxWorks AE issues
7.其它 FAQ
7.1 Hard delay
7.2 Memory leaks
7.3 Corba engines
7.4 Web servers
7.5 NTP usage
7.6 Performace / Benchmarks
7.7 SNMP
7.8 Lint
7.9 Encryption
7.10 其它
附录A.一些有用的连接
附录B.维护
1.入门FAQ
1.1 概念
1.1.1 最近刚开始学习VXWORKS,越看越迷糊:
1)BSP,bootImage,VxWorksImage三者的关系是什么?BSP是BootImage的一部分还是VxWorksImage 的一部
分?对于可以自启动的系统是不是三者合在一起生成一个VxWorks Image?
2)应用程序代码是和VxWorks内核一起编译生成一个VxworksImage吗?
以上问题是针对于代码存放在rom介质上的系统(如flash)。希望各位大侠不吝赐教!谢谢。。。
A:BSP 是用来支持你的硬件的软件, 它包含在你的VxWorksImg里面.
对于ROM启动的系统来说, BootImg是ROM里代码的第一部分, 用来
在开机时首先运行. 如果你的所有代码都在ROM上, 则引导程序把
VxWorksImg拷贝到系统内存, 然后再跳转的系统内存去执行.
BSP的作用屏蔽不同的硬件结构(如CPU和外围芯片)向VxWorks的Kernel提供
它所需要的一个统一的接口调用(如时钟)
(by 泡泡)
bsp: 板级支持包,主要完成目标硬件的初始化工作,提供操作系统一个统一的接口,负责硬件操作,
如中断处理,启动,停止,等工作。Bootimage:引导镜像,我向如果把boot翻译成启动不是很是当的说法,
这是一个引导程序,负责把目标系统环境初始化,最小的程度,如启动了串口,或者网络接口,可以使用这
些接口现在程序,与主机通信,然后获取你需要的OS-vxworksimage vxworksimage-包含vxworks内核以及
各种组件的镜像,也就是object images,这是真正的操作系统,通常bootimage负责获取这个镜像,然后跳
到镜像所在的位置开始执行。(by hongwind )
1.1.2 如何学习VXWORK,PSOS入门?
A:初次上站,感觉大家水平一般,入门级选手较多,实时多任务操作系统和以前大家使用的低端产品,如51
机在原理上是不同的,因此大家最好先学习多任务操作系统的原理。否则无法深入学习。
推荐一本书:坦尼博姆著:《操作系统》,各地都有的卖,主要是讲MINIX的原理,其实就是UNIX系列操作
系统的实现原理,由于VXWORKS和PSOS都是这个系列的操作系统,因此理解了这本书,也就理解了它们的工
作原理。必将事半功倍,而且对你理解WINDOWS的工作原理也很有好处。 (by bruin)
1.2 环境
1.2.1 斑竹tornado都是支持那些cpu??能列一下吗或哪里能找到
斑竹tornado都是支持那些cpu??能列一下吗或哪里能找到!!!
A:开发平台: Windows NT, Sun Solaris, SunOS, HP-UX, Win95
支持处理器: x86, 68k, PPC, CPU 32, i960, SPARC, SPARCLite, SH, ColdFire, R3000, R4000,
C16X, ARM, MIPS ...
1.3 编程
1.3.1 vxworks,bsp中有些定义怎么找不到用到的地方,还有些定义找不到在哪里定义过了,比如
MAMR_PTA_SHIFT,哪位大侠给解答一下。不胜感激!
A:在h/drv/multi/ppc860Siu.h里。看代码还是用Source Insight
(by vxfree)
2.Tornado工具FAQ
2.1 编译器和链接器
2.1.1 当我把多个目标文件链接成一个时,出现了一个错误:
ldppc:built in linker script:43: syntax error 我怎么样才能消除这个错误?
A:请确定你的链接器使用了-r参数。
(From: weber.dirk@t-online.de)
2.1.2 我怎样使用新版本的编译器?
A:参看如下连接,有一个PPC的编译器
http://www.newgcc4vxworks4ppc.cjb.net/
2.1.3 当用另一个编译器编译代码时,得到更多的错误和警告,怎样才能让GCC生成更多的警告信息?
A:首先用-Wall参数打开所有警告开关;另一种生成更多报告的方法就是把文件看作是C++文件,参数为
-x c++.(From: Claudio Ortega, cortega@sinfomed.org.ar)
-Wall不能真正打开所有的警告,我采用由Bruce Evans推荐的参数
而且在FreeBSD环境下,BDECFLAGS变量比较固定。
# BDECFLAGS are a set of gcc warning settings that Bruce Evans has suggested
# for use in developing FreeBSD and testing changes. They can be used by
# putting "CFLAGS+=${BDECFLAGS}" in /etc/make.conf. -Wconversion is not
# included here due to compiler bugs, eg: mkdir()\‘s mode_t argument.
#
BDECFLAGS= -W -Wall -ansi -pedantic -Wbad-function-cast -Wcast-align \\
-Wcast-qual -Wchar-subscripts -Winline \\
-Wmissing-prototypes -Wnested-externs -Wpointer-arith \\
-Wredundant-decls -Wshadow -Wstrict-prototypes -Wwrite-strings
This set of flags is *much* pickier than -Wall alone.
(From: W Gerald Hicks)
2.1.4 当编译我的模块时一切都是好的,但是当我试图下载时得到一个错误:missing symbol "__eabi"?
A:在你的模块里可能有个main函数,根据PPC "extended Application Binary Interface" (eabi)
标准,main函数必须调用__eabi函数,该函数为运行你的程序设置必要的运行环境。
由于这个原因GNU编译器在main函数里插入 __eabi函数。
Tornado不提供该函数,因为在实时环境下,你不必写main函数。VxWorks在应用程序运行前已经设置
好运行环境了,不再需要main函数了。
(From: Ilia, iliab@telegate.co.il)
-- 作者:lxlong
-- 发布时间:2005-6-25 13:09:28
--
2.1.5 我生成了2.95.2版本的编译器,一切正常,但当我开始链接我的映象时,出现了错误,下面是我
链接ctdt表时的错误:
ctdt.o(.data+0x3c):fake: undefined reference to `global constructors keyed to
_constructor_name_
... 许多类似的错误,有谁见过这种错误吗?
A: 该问题是由gcc(ver2.7.2-2.95.2)试图改变它得到静态构造函数的方法引起的。它不再对每个构造静
态对象的模块消除函数,该方法是vxworks在编译链接过程中采用的方法。
你可以按如下修改gcc 2.95.2源代码后,恢复原先的操作。
in [source code dir]/gcc/config/arm/vxarm.h, at the very end, add:-
/* More DK patches: we undef these two in order to force the */
/* compiler to output our static constructors and destructors */
/* in the fashion to which it is accustomed.... */
#undef ASM_OUTPUT_CONSTRUCTOR
#undef ASM_OUTPUT_DESTRUCTOR
/* This one is so that GLOBAL_THING gets a $ in it\‘s name */
#undef NO_DOLLAR_IN_LABEL
现在更换到你的编译目录,敲入make clean命令,然后重新编译和安装编译器。我采用这种方法是可以的
,PPC版本的。它使得编译器使用老的方法来making munchable constructors。
希望对你也有帮助。
(From: Dave Korn)
2.1.6 在我编译时,我在编译窗口看到如下输出:
nm386 -g partialImage.o @B:\\Sources\\Components\\Common\\Common_Geni_Test\\Src\\prjObjs.lst | \\
wtxtcl D:\\Tornado\\host\\src\\hutils\\munch.tcl -asm 386 > ctdt.c
...
cc386 -nostdlib -r -Wl,-X partialImage.o ctdt.o -o VxWorksGeniServerTestExe.out
最后一步(linking partialImage.o to ...out)花了很长时间(半个小时),谁有解决办法?
A: 这个可能是munching过程,而不是链接,花了半小时。有人曾贴了一个小窍门来加速。
在munch命令管道里使用"grep GLOBAL"如:
nm386 -g partialImage.o @B:\\Sources\\Components\\Common\\Common_Geni_Test\\Src\\prjObjs.lst
| grep GLOBAL | \\
wtxtcl D:\\Tornado\\host\\src\\hutils\\munch.tcl -asm 386 > ctdt.c
(From: Dave Korn)
2.1.7 怎样定义一个没有空洞的结构。
Q: How do define a structure without holes in it?
A: 我在vxworks中使用GNU编译器
struct ex {
INT8 source;
INT32 txSize;
INT32 datSize;
INT16 cmd;
} __attribute__ ((packed));
typedef struct ex PackedStruct;
注意:如果可能,避免使用-fpack-struct编译器开关。我门最近移除了这个选项,使得我们的C++程序提
高了30%-100%的性能。这是因为每次存取结构或类里多字节值时,都是一个一个字节操作的。可以使用
__attribute__ ((packed)) 方法代替。
(From: Mark Fanara, mfanara@home.cNOSPAMMom, and Francisco Pataro, fpataro@dnaent.com)
2.1.8 我怎样在一个C程序文件里调用一个C++函数?
A: 如果你想在一个C程序文件里调用一个C++函数,C++函数必须用extern "C"声明;否则编译器将破坏函数
名,把参数类型说明加在函数名末尾,并返回该函数。
(From: Dave Korn)
2.1.9 -fvolatile开关真的需要吗?
A: WRS建议我们在编译kernel/BSP时,使用-fvolatile开关。它通常缺省打开某个target/h/make/目录下的
文件。
我们也在我们的应用程序编译过程中使用-fvolatile开关,因为我们参考一些tornado的makefile。
当我们移除该开关后,就碰到一些微妙的BUG,如果你编写驱动程序应当小心。
-fvolatile开关使编译器生成非常conservative的代码。通过指针使变量值增加(p->x++)不可能如你
想象的在一条指令里完成(68k example):
addql #1,a0@(8)
如果采用-fvolatile 开关你会得到:
movel a0@(8),d0
addql #1,d0
movel d0,a0@(8)
movel a0@(8),d0
You can imagine what a C++ application using the "this" pointer everywhere gets compiled into!
(From: Chris Varlese, cv@no.mail.net)
2.1.10 我链接了许多档案文件,现在链接器在解析文件之间的交叉参考时出现了问题?
A: 试试下面的方法
1、把$(LIBS)替换成$(LD_PARTIAL) -o vxWorks.tmp $(MACH_DEP) usrConfig.o version.o
$(LIBS) (在target/h/rules.bsp文件中)。 Now LD_PARTIAL is ccxxx, so you need to specify -Wl,
--group-start to get cc to pass the argument to ld.
2、Try adding a -Usymbol for each symbol that has to be pulled in early.
3、如果办法2 make ld行太笨拙,生成一个.s文件,包含每个没定义的符号和加到链接里的。
4、如果你工作UNIX下,它应该可能得到ld生成没有定义的所要求的列表。你需要加一个循环,就象下面一
样:
/*这是原文,我翻译不好。
1、$(LIBS) is substituted int $(LD_PARTIAL) -o vxWorks.tmp $(MACH_DEP) usrConfig.o version.o
$(LIBS) (in target/h/rules.bsp for a non-project build). Now LD_PARTIAL is ccxxx, so you need
to specify -Wl,--group-start to get cc to pass the argument to ld.
2、Try adding a -Usymbol for each symbol that has to be pulled in early.
3、If (2) make the ld line too unwieldy, generate a .s file that contains: .extern symbol for
each undefined symbol and include that into the link before the libraries
4、If your building on unix, it ought to be possible get ld to generate the required list of
undefines! You need to add a loop! Something like this might work:
*/
[ ! -f undefs.s ] && echo "#" >undefs.s
while
$(CC) -c $(CFLAGS) undefs.s
$(LD_PARTIAL) -o vxWorks.tmp $(MACH_DEP) usrConfig.o version.o \\
undefs.o $(LIBS)
$(NM) vxWorks.tmp | grep \‘ __\‘ | $(MUNCH) > ctdt.c
$(MAKE) CC_COMPILER="-fdollars-in-identifiers" ctdt.o
do
$(LD) $(LDFLAGS) -e $(SYS_ENTRY) $(LD_LOW_FLAGS) -o vxWorks \\
dataSegPad.o vxWorks.tmp ctdt.o tad_hook_list.o 2>&1 | tee ld.errs |
while read file undef ref to symbol
do
[ "$undef" = "undefined" ] || continue
[ "$ref" = "reference" ] || continue
[ "$to" = "to" ] || continue
oifs="$IFS"
IFS="\‘/`"
symbol="`echo $symbol`"
IFS="$oifs"
echo "\\t.extern\\t$symbol"
done | sort -u - undefs.s >undefs.new
cmp -s undefs.s undefs.new && break
mv undefs.new undefs.s
done
cat ld.errs
当然它需要另一系列的ESC和; \\在每一行,以使得可以在make下运行。
(我也重新构造了原始的rules.bsp内容,我的可能与vxWorks原来的有些不同。)
(From: David Laight, dsl@tadpole.co.uk)
2.1.11 警告"trigraphs occured"是什么意思?
A: 对Tornado或Vxoworks没什么要做的。
你可能在你代码(也可能在注释里)中有三字符序列--参看K&R (Kernighan & Ritchie; A12.1 - 这是
ANSI 新引进的。-- 但是GNU手册里提示"You don\‘t want to know about this brain-damage..."
使用-ansi或-trigraphs开关,或更好的办法消除任何包含三字符序列\‘??X\‘的注释。 (参看K&R书中对X
的定义)。
(From: Michael.Ben-Ari@ecitele.com)
2.1.12 为什么编译的最后步骤时间这么长?
生成.out步骤如下:
1) 链接应用程序和库到partialImage.o
2) 使用partialImage.o解析出所有静态类(munch)
3) 编译上面发现的(ctdt.o)
4) 用ctdt.o链接第一个obj文件partialImage.o
我们的应用程序.out文件有10M,但是多数是调试信息,size386返回只有1M。
我们的下载文件生成需要超过5分钟,Step #1-3正常需要35秒!但是step #4 需要很多时间,整个过程需
要5分30秒。
A: 我不知道为什么这样?但是我们在step #4不重新使用partialImage.o 而是重新生成它,整个过程45s.
(是ld386没有对符号过滤进行优化的原因吗?)
我只是修改了tornado\\target\\h\\make\\rules.vxApp文件,它包含制作应用程序的规则。我修改了上面
提到的step $4代码如下:
把$(LD_PARTIAL) $(LD_PARTIAL_LAST_FLAGS) partialImage.o ctdt.o -o $@
替换成$(LD_PARTIAL) $(PRJ_OBJS_FOR_LD_PARTIAL) $(PRJ_LIBS) ctdt.o -o $@
(From: Ole Asbjorn Fadum, OleAsbjornF@scanmar.no)
Some more information.
For a variety of reasons I\‘ve had to do a few build on a slow system. One bit that seemed
exceptionally slow is the \‘binToAsm\‘ call (just after the \‘deflate\‘ generating vxWorks.Z.s).
This is done by
od -bv $infile |
sed -e "s/^[0-9]*[ ]*//;
s/ /, 0/g;
/^[0-9a-fA-F][0-9a-fA-F]/s/^/ .byte 0/"
(ie use od to generate a list of octal bytes, remove the offset, change the spaces to comma,
add the directive - an extra 0 is added to each number to ensure they are octal).
The above is terribly slow... Slightly faster (under solaris) is:
od -An -v -tu1 $infile | tr \‘ \‘ \‘,\‘ |
sed -e \‘s/,00*\\([0-9]\\)/,\\1/g;s/^,/ .byte /\‘
However it is clear that a C program would be even faster... It was still sluggish using
printf, so...
char map[256][4];
for (count = 0; count <= 256; count++)
sprintf( map[ count ], "%d", count );
for (;;) {
count = read( input_fd, buf, BLK_SZ );
if (count <= 0)
break;
for (off = 0; off < count; off++) {
if (off & 15)
putchar( \‘,\‘ );
else
fputs( "\\n .byte ", stdout );
fputs( map[ buf[ off ] ], stdout );
}
}
now the system is spending very little of its time doing this bit (it was a lot slower
than the deflate!). If you are using gcc/gas you can pipe EXTRACT_BIN, COMPRESS, BINTOASM
directly into AS - saving that massive intermediate file...
Build (compiling one small object) just took 6m50 - was over 10 minutes before I played
with binToAsm!
Ages ago I sped up \‘munch\‘ - by grepping out most of the symbols it isn\‘t interested in...
nmarm vxWorks.tmp | tee vxWorks.nm | grep " __" | munch > ctdt.c
(I use the symbol table from this stage for a variety of things...)
(From: David Laight, David.Laight@btinternet.com)
-- 作者:lxlong
-- 发布时间:2005-6-25 13:11:03
--
2.1.13 怎样把一个段装载到特定的绝对地址?
A: 我曾包含一个脚本做这些工作,最方便得到这个脚本的方法是使用--verbose开关运行你的链接器,例
如:
"ldarm --verbose". 编辑这个文件加入类似如下的段落,
.text 0x8000 : {
[omit]
. = ALIGN(0x8000);
/* Create a 8k section of all 0xffff, first value is jump. */
FILL(0xffff);
LONG(0xeb000004);
. = ALIGN(0x2000);
[...]
这将把数据放到任何你想放的地方,在程序被链接时新的链接器脚本必须使用-T参数。
(From: Bill Pringlemeir, bpringlemeir@yahoo.com)
2.1.14 我在使用C++类型的注释时,出现错误,怎样改变它?
A: 一种方法是移除-ansi开关。然而,你可能希望保留你的源代码与ANSI兼容;所以我更喜欢代码能在每
个地方都能编译。传递"-Wp,-lang-c"参数只能使CPP的注释方法可以使用。下面来自预编译器文档
`-lang-c\‘, `-lang-c89\‘, `-lang-c++\‘
`-lang-objc\‘, `-lang-objc++\‘
Specify the source language. `-lang-c\‘ is the default; it allows recognition of C++
comments (comments that begin with `//\‘ and end at end of line), since this is a common
feature and it will most likely be in the next C standard. `-lang-c89\‘ disables recognition
of C++ comments. `-lang-c++\‘ handles C++ comment syntax and includes extra default include
directories for C++. `-lang-objc\‘ enables the Objective C `#import\‘ directive. `-lang-objc++\‘
enables both C++ and Objective C extensions. These options are generated by the compiler
driver gcc, but not passed from the `gcc\‘ command line unless you use the driver\‘s `-Wp\‘
option .
(From: Bill Pringlemeir, bpringlemeir@yahoo.com)
2.1.15 我在编译时碰到了关于cc1参数/选项的错误?
A: 这个可能是由于安装了Cygwin 或DJGPP引起的。当该版本的编译器在路径里先于Tornado版本Cygwin的
GCC被调用时,这个版本不知道这些参数或选项。这个问题可以通过卸载该软件或确定Tornado版本的编译器
在路径环境变量里是头一个后解决。
2.2 调试器
2.2.1 我怎么使用GDB的plain版本去调试我的目标机,而不用Tornado?
A:gdb compiles \‘out of the box\‘ for vxworks.
去cygnus(sourceware.cygnus.com)下载最新的\‘insight\‘软件,该软件是gdb + cygnus的UI(译者:可能是用
户接口)运行 "configure --target=mips-wrs-vxworks". 把mips改成你的处理器,然后运行make.
这样就可以在安装了cygwin的win32平台上运行了,在UNIX系统平台上也类似。
RDB是windriver以前的调试协议,现在变成WDB了。好象没公布wdb的比特,尽管Tornado使用了gdb。你可能
不得不配置RDB。包含RDB组件(INCLUDE_RDB) ,并移除WDB组件(remove INCLUDE_WDB),以使得调试可以进
行。(From: Don Bowman, don@pixstream.com)
2.2.2 我怎么在创建一个任务后停止它,以使得我能从开始对它进行调试?
A: 菜单tools->options,选择debugger页,选择always halt after attaching a task和Auto Attach to
task -> Always
现在输入一个全局断点(Shift F9),在它碰到断点后,它将从mainTask中分离。
(From: Chacha Hindustani, Gurudev@mediaone.net)
2.2.3 为什么当我使用SHELL检查内存时,看不到断点?
A: shell是一个不可中断的任务,所以任何时间它都在运行在无断点的环境。当任务切换引起一个中断的任
务运行时,断点将被重新安装。所以如果查看内存中的断点,只是简单使用d()或l()命令,它在一个中断任
务中可以运行,你将看到一个magic code插入并引起异常。
The shell is an unbreakable task, so all the time it is running the breakpoints are not
installed. When a contexttch causes a breakable task to run, the breakpoints will be
resinstated.
So, to see the breakpoint in memory simply spawn the d() command or l() command. That will
then run in a breakable task, and you should see the magic code inserted to cause
an exception.
(From: John, john_94501@yahoo.com)
2.3 FTP
参看5.4
2.4 主机工具
2.4.1 我制作了一个基于rom的VxWorks(vxWorks_rom),但是当我试图用elftobin把它转换成bin格式的
(vxworks_rom.bin),得到了如下错误:
C:\\project\\Project3\\default\\elftobin vxWorks_rom.bin
seg1 : Expected load address 0xfff00100 but file address is 0x00111670
我怎样才能把这个文件转成二进制格式?
A: 这个问题只在PPC版本中出现过,问题编号为SPR#8845. 已经有个更新版本的elftobin解决了这个问题。
请联系你的销售代理或服务工程师。
2.4.2 我怎样写一个WTX工具?
A: 我曾经在Tornado 1.0.1 和Windows NT 4.0环境下写过一个WTX工具,按下面的例子和Tornado API参考
开始,甚至不用关闭build.让它独自按我的步骤工作。就是我使用VC++6编译,但仍有许多东西丢掉了,不
论编译器是什么版本。我知道我能更熟练的使用路径里的环境变量。但有时你只需要它工作,所以下面澄清
一下:
原代码放在$(WIND_BASE)\\host\\src\\wtxtest下,我的安装目录或任何其它人的安装目录里没有例子源码。
按手册源代码按如下修改(大多是信号处理代码修改和增加includes,其它修改在我的程序里说明)
把下面的设置加到工程设置、 C/C++, Preprocessor:
include目录(路径按实际情况修改):
C:\\Tornado_03\\share\\src\\wtx,C:\\Tornado_03\\host\\include
预处理定义:HOST
把下面的设置加到工程设置,Link,General:
C:\\Tornado_03\\host\\x86-win32\\lib\\wtxapidll-d.lib
增加环境变量WIND_REGISTRY,设为我的注册位置。
许多痛苦就在发现这个。手册里参考wtxEnvironSet()调用,Windsurf说它是不存在的,但手册为这个不存
在的函数使用提供了许多参考。我的机器上没设置WIND_REGISTRY,所有的Tornado工具都可以不使用它而正
常工作。我的工具不能发现注册,设置它并关闭它(Set it and poof)!注册发现了,工具可以工作。
确信起调用了wtxProbe()去检查注册(并且变量被设置),它可以避免许多痛苦。
我也修改那个工具例子代码。代码在此#代码连接#http://www.xs4all.nl/~borkhuis/vxworks/wtxSample.c
(From: Christopher A Leddy, caleddy@west.raytheon.com)
2.4.3 当我执行wtxwish时,碰到了一个关于init.tcl文件的错误?
A: 不要忘记把TCL_LIBRARY和TK_LIBRARY环境变量设置为 $(WIND_BASE)/host/tcl/tcl and
$(WIND_BASE)/host/tcl/tk. init.tcl文件位于TCL_LIBRARY路径。tk.tcl文件位于目录。
不要使用 $(WIND_BASE) 变量,而是实际路径。然后从你的TCL/TK目录执行:
wtxwish
(From: DrDiags, drdiags@flashcom.net)
2.4.4 我试图在windows NT4.0 SP5环境下运行Tornado2.0带的vxsys程序,碰到一个错误: "the system
try to access directly to the disk, this is not possible ....."
A: vxsys是DOS程序,不能工作windows环境下,你应该从DOS窗口下运行它。
(From: Andray Kaganovsky, andreyk@home.com)
2.4.5 怎样创建加密密码?
A: 你可以使用Tornado自带的创建密码程序vxencrypt,但是它功能很弱。
sum( p * i ^ i )) * 0x1e3a1d5将HEX字符集转化成ASCII(假定认为你有超过2^32加密密码)。我能
用钢笔和纸来把它做反变换。
你也可以使用loginEncryptInstall()安装自己的加密算法,对一个强密码[1],加密知道使用密码作为KEY。
UNIX传统使用DES,但需要适当的代码。我使用TEA参看http://vader.brad.ac.uk,因为它是不受妨碍的。
[1] problematical since you have difficulty protecting the password file as none of the
vxWorks filesystems support user-ids.
(From: David Laight)
-- 作者:lxlong
-- 发布时间:2005-6-25 13:11:16
--
2.5 安装
2.5.1 当我试图安装GNU源光盘时,出现了一个关于文件aux.h的错误:permission denied。但该文件并不
存在,是怎么回事?
A: 在微软SW环境下存在这个问题,"AUX"是保留字,所以任何以"AUX."开头的都不能存在。任何以设备名
开始的文件名也是不能存在的,例如你不能打开一个叫"LPT1.TXT"的文件。
2.5.2 在我安装完Tornado或它的补丁后,我所有的C文件类型都被移除了,而使用Tornado作为打开该文件
的工具。我怎样能恢复到原来的编辑器?
A:Tornado覆盖注册表中的实体。你可以用下面的.reg恢复。
警告:在使用这个文件前必须小心!首先读一下该文件,如果你不理解它就不要使用它。
警告:我在windows95和NT下测试过,如果有时间我会在别的的平台测试的。如果你在98、2000下使用后可
以工作,请告诉我。
首先下载该文件,仔细阅读它,修改它,使她执行你需要的编辑器,然后执行它。你怎么修改它?
一个方法是执行这个文件,然后去浏览器View->Options->File Types.这里你可搜索"C源文件"和"C头文件"。
修改打开命令为你想要的。现在编辑文件c-files.reg,并移除20行后的部分,第一行以
[HKEY_CLASSES_ROOT\\c_source_file]开始。再次执行,、将把所有文件类型恢复成你选择的。
另一种方法:在你的文件类型里找到你的确省编辑器,把这行COPY到文件c-files.reg中vim行(BTW:vim
是非常好的编辑器,你可以到http://www.vim.org查询更多信息)。
文件: c-files.reg#文件连接#http://www.xs4all.nl/~borkhuis/vxworks/c-files.reg
2.5.3 当我每次双击一个文件,都打开一个Tornado.我想所有的文件都用一个Tornado打开,怎么做?
A:是的,这是可能。下面的注册文件将完成这个工作。
警告:在使用这个文件前必须小心!首先读一下该文件,如果你不理解它就不要使用它。
编辑该文件,修改Tornado的安装路径为你机器上的安装路径。
文件: TornadoFileTypes.reg#文件连接#http://www.xs4all.nl/~borkhuis/vxworks/TornadoFileTypes.reg
2.5.4 能把多个CPU平台安装到一个目录下吗?
A:可以,但是需要注意几点:
只能把同一版本的安装到同一目录下。这意味着Tornado 2.0.1 for ARM不能同其它版本安装到同一个目录。
也不能把2.0和2.0.2混合在一起。我发现的唯一不兼容的是MIPS。在安装了idts134 BSP后,下面的文件会
带来问题:
1)host\\resource\\tcl\\wtxcore.tcl
在最后的函数里设置tool为sfgnu替换为gnu.在if结构里增加设置tool为sfgnu.现在只有MIPS这个工具变量
被改变。这样更让人满意,如果你只使用MIPS版本它是可以工作的。
2)host\\resource\\tcl\\app-config\\Browser:
在line 138 有个目录为obj...sfgnuvx,对其它CPU来说它是obj...gnuvx. 问题可以通过把这行替换为如
下行解决:
This problem can be solved by replacing this line with the follwoing lines:
if { $cpuType($cpuId) == "RC32364" } {
set name [wtxPath target lib obj$cpuType($cpuId)sfgnuvx]spyLib.o
} else {
set name [wtxPath target lib obj$cpuType($cpuId)gnuvx]spyLib.o
}
然后替换RC32364为你处理器类型的名称。
2.6 MAKEFILE
2.6.1 Make不能发现我自己的INCLUDE目录?
A:在C/C++编译选项里,使用-I选项增加目录,现在在build属性里包含如下内容:
宏名称:VPATH
值:$(filter-out -I.,$(filter -I%,$(CFLAGS)))
在修改了include目录后需要更新编译器选项,VPATH自动被上面规则更新。
在选项改变保存到工作区并确认改变生效后,重新生成依赖关系和开始编译器。
Bob Baker (Bob@dskti.com)曾写过他关于这个问题的经验:
我们在使用Tornado 2编译一个应用程序时碰到了很多问题,如\‘No rule to make target\‘。尝试了所有有
用的办法。如:使用":"替代空格作为VPATH的分隔符。使用" :"或": "或" : "改变宏的顺序。"\\","/","\\\\"
(原文:E.G. using \‘:\‘ for VPATH separators instead of spaces. Using \‘space :\‘ or \‘: space\‘ or
\‘space : space\‘, changing the order of the macro\‘s, forward slashes, back slashes, double
slashes, pointing the PC screen south at dawn etc the problem turned out to be incompatibility
between tornado 2 and win95/98. )证明在Tornado2和WIN95/98上是不兼容的。
简单拷贝包含整个应用和工程的整个目录结构到NT,可以解决问题,并生成一个完整的build。拷贝到另一
个win95和win98上,则建立失败。失败的原因是build过程试图存取一个网络驱动器的共享库文件。我尝试了
所有的在VPATH里的分隔符组合,他们都可以在NT下工作。
2.6.2 为什么make没有在我修改了BSP目录里的文件(比如sysSerial.c)后重新生成我的工程?
A: 在Tornado里你能定义不必扫描的include目录。其中缺省的目录之一是BSP目录(target\\config)。如果
你从不包含列表里移除它,BSP文件将出现在依赖列表里。在你选择生成依赖关系后选择"高级"按扭,会弹
出一个窗口,包含一个选项"Read-only dependency path"从列表中移除.....\\target\\config。关闭窗口,
重新生成所有的依赖关系。下次BSP文件被修改后就会正确生成了。
(From: gerard.kerkhofs@nicolet.NOSPAM.nl)
另一个解决办法是不要删除该项,但是用.....\\target\\config\\comps替换它。现在你得到所有的BSP目录里
的文件,而不是comps目录里的,该目录里放置了许多标准文件。
2.6.3 我怎样在我的工程里生成一个连接器列表(linker list)?
A: 在build属性里的缺省连接器命令不被make采用。未了使用额外的连接选项make,把如下内容加入到build
属性里:
Macros: Name: LD_PARTIAL_FLAGS_FOR_PARTIALIMAGE
Value: -Wl,-Map,$(basename $(notdir $(PRJ_FILE))).link
然后修改$(PROJECT_OUT)文件rules.vxApp里的连结器命令行的LD_PARTIAL:
$(LD_PARTIAL) $(LD_PARTIAL_FLAGS_FOR_PARTIALIMAGE) \\
$(PRJ_OBJS_FOR_LD_PARTIAL) $(PRJ_LIBS) -o partialImage.o
这会在输出目录里生成一个linker输出文件--.link。在这个文件名字映射为原始.o文件而不是
partialImage.o。如果文件使用最终的连接命令生成,它会生成partialImage.o文件的。
2.6.4 怎样生成C和汇编混合文件?
A: 在你makefile文件添加如下规则:
%.out: %.o
@objdump$(TOOLENV) -S $< < $@
这
This will generate a file called.out containing C and assembly code. You need to have
the -g flag for the compiler to get debug informtion in the output file. This information is
needed by objdump.
But this is probably not enough. By default VxWorks puts a name in the object file. This name
consists of the absolute path of the project directory with the complete path of the file name
appended to it. (This can be seen with the command "objdump$(TOOLENV) --debugging
随着国内使用VxWorks的用户越来越多,为了方便VxWorkers少走一些弯路,特别推出了中文FAQ,其中
很多的FAQ来自comp.os.vxworks和原创。(很多FAQ都可以在该新闻组找到英文版)
文档的FAQ总共分为7大类:
1.入门FAQ
2.Tornado工具FAQ
3.BSP FAQ
4.文件系统 FAQ
5.网络 FAQ
6.VxWorks操作系统 FAQ
7.其它 FAQ
基本涵盖了Tornado/VxWorks使用中的主要方面。
文档组织本身没有逻辑上的关联,经过分类,只是松散的组合在一起,可根据你的需要选择阅读某一部
分。
为了保持本文档的开放性和可扩充性,欢迎大家把自己曾经碰到过的问题及其解决办法按分类加到文档
里来。在修改本文档时,请把修改记录加到历史记录里。
欢迎任何人指出文档中的错误之处,请把错误之处发到附录B里的任一个EMAIL里,在此对那些问题的提
出者、回答者以及文档的维护者一并表示感谢!
当前版本(Current Version):
version 0.1
历史(History):
2002-08-27 wys205 create 0.1 version
目录(Content):
1.入门FAQ
2.Tornado工具FAQ
2.1 编译器和链接器
2.2 调试器
2.3 FTP
2.4 主机工具
2.5 安装
2.6 MAKEFILE
2.7 工程
2.8 目标机服务器
2.9 Shell
2.10 Telnet
2.11 Tornado
2.12 版本控制
2.13 可视化集成
2.14 Windsh
2.15 WindView
3.BSP FAQ
3.1 不同BSP
3.2 处理器
3.2.1 Power PC
3.2.2 I960
3.2.3 MIPS
3.2.4 ARM
3.2.5 x86
3.3 Bootstrap
3.4 配置你的VxWorks
3.5 VME
3.6 VxWorks环境 environment
3.6.1 usrSerial.c
3.6.2 prj_vxworks.tcl
3.7 PCI
4.文件系统 FAQ
4.1 Dos文件系统
4.2 Flash文件系统
4.3 Floppy-disk文件系统
4.4 RAM-disk文件系统
4.5 基本文件系统问题
5.网络 FAQ
5.1 配置问题
5.2 ARP
5.3 DHCP
5.4 FTP和TFTP
5.5 PPP
5.5.1 PPP on Windows 95
5.5.2 PPP on Windows NT
5.5.3 PPP on Solaris
5.6 Sockets
5.7 Telnet
5.8 SNMP
5.9 其它网络相关问题
6.VxWorks操作系统 FAQ
6.1 C++ issues
6.2 Communication problems
6.3 Interrupts
6.4 LoadModule problems
6.5 pthreads
6.6 Reboot
6.7 Semaphores
6.8 Simulator (VxSim)
6.9 Task related items
6.10 Time/timer related items
6.11 Wind Web Server related items
6.12 Zinc/windML related items
6.13 Other items
6.14 VxWorks AE issues
7.其它 FAQ
7.1 Hard delay
7.2 Memory leaks
7.3 Corba engines
7.4 Web servers
7.5 NTP usage
7.6 Performace / Benchmarks
7.7 SNMP
7.8 Lint
7.9 Encryption
7.10 其它
附录A.一些有用的连接
附录B.维护
1.入门FAQ
1.1 概念
1.1.1 最近刚开始学习VXWORKS,越看越迷糊:
1)BSP,bootImage,VxWorksImage三者的关系是什么?BSP是BootImage的一部分还是VxWorksImage 的一部
分?对于可以自启动的系统是不是三者合在一起生成一个VxWorks Image?
2)应用程序代码是和VxWorks内核一起编译生成一个VxworksImage吗?
以上问题是针对于代码存放在rom介质上的系统(如flash)。希望各位大侠不吝赐教!谢谢。。。
A:BSP 是用来支持你的硬件的软件, 它包含在你的VxWorksImg里面.
对于ROM启动的系统来说, BootImg是ROM里代码的第一部分, 用来
在开机时首先运行. 如果你的所有代码都在ROM上, 则引导程序把
VxWorksImg拷贝到系统内存, 然后再跳转的系统内存去执行.
BSP的作用屏蔽不同的硬件结构(如CPU和外围芯片)向VxWorks的Kernel提供
它所需要的一个统一的接口调用(如时钟)
(by 泡泡)
bsp: 板级支持包,主要完成目标硬件的初始化工作,提供操作系统一个统一的接口,负责硬件操作,
如中断处理,启动,停止,等工作。Bootimage:引导镜像,我向如果把boot翻译成启动不是很是当的说法,
这是一个引导程序,负责把目标系统环境初始化,最小的程度,如启动了串口,或者网络接口,可以使用这
些接口现在程序,与主机通信,然后获取你需要的OS-vxworksimage vxworksimage-包含vxworks内核以及
各种组件的镜像,也就是object images,这是真正的操作系统,通常bootimage负责获取这个镜像,然后跳
到镜像所在的位置开始执行。(by hongwind )
1.1.2 如何学习VXWORK,PSOS入门?
A:初次上站,感觉大家水平一般,入门级选手较多,实时多任务操作系统和以前大家使用的低端产品,如51
机在原理上是不同的,因此大家最好先学习多任务操作系统的原理。否则无法深入学习。
推荐一本书:坦尼博姆著:《操作系统》,各地都有的卖,主要是讲MINIX的原理,其实就是UNIX系列操作
系统的实现原理,由于VXWORKS和PSOS都是这个系列的操作系统,因此理解了这本书,也就理解了它们的工
作原理。必将事半功倍,而且对你理解WINDOWS的工作原理也很有好处。 (by bruin)
1.2 环境
1.2.1 斑竹tornado都是支持那些cpu??能列一下吗或哪里能找到
斑竹tornado都是支持那些cpu??能列一下吗或哪里能找到!!!
A:开发平台: Windows NT, Sun Solaris, SunOS, HP-UX, Win95
支持处理器: x86, 68k, PPC, CPU 32, i960, SPARC, SPARCLite, SH, ColdFire, R3000, R4000,
C16X, ARM, MIPS ...
1.3 编程
1.3.1 vxworks,bsp中有些定义怎么找不到用到的地方,还有些定义找不到在哪里定义过了,比如
MAMR_PTA_SHIFT,哪位大侠给解答一下。不胜感激!
A:在h/drv/multi/ppc860Siu.h里。看代码还是用Source Insight
(by vxfree)
2.Tornado工具FAQ
2.1 编译器和链接器
2.1.1 当我把多个目标文件链接成一个时,出现了一个错误:
ldppc:built in linker script:43: syntax error 我怎么样才能消除这个错误?
A:请确定你的链接器使用了-r参数。
(From: weber.dirk@t-online.de)
2.1.2 我怎样使用新版本的编译器?
A:参看如下连接,有一个PPC的编译器
http://www.newgcc4vxworks4ppc.cjb.net/
2.1.3 当用另一个编译器编译代码时,得到更多的错误和警告,怎样才能让GCC生成更多的警告信息?
A:首先用-Wall参数打开所有警告开关;另一种生成更多报告的方法就是把文件看作是C++文件,参数为
-x c++.(From: Claudio Ortega, cortega@sinfomed.org.ar)
-Wall不能真正打开所有的警告,我采用由Bruce Evans推荐的参数
而且在FreeBSD环境下,BDECFLAGS变量比较固定。
# BDECFLAGS are a set of gcc warning settings that Bruce Evans has suggested
# for use in developing FreeBSD and testing changes. They can be used by
# putting "CFLAGS+=${BDECFLAGS}" in /etc/make.conf. -Wconversion is not
# included here due to compiler bugs, eg: mkdir()\‘s mode_t argument.
#
BDECFLAGS= -W -Wall -ansi -pedantic -Wbad-function-cast -Wcast-align \\
-Wcast-qual -Wchar-subscripts -Winline \\
-Wmissing-prototypes -Wnested-externs -Wpointer-arith \\
-Wredundant-decls -Wshadow -Wstrict-prototypes -Wwrite-strings
This set of flags is *much* pickier than -Wall alone.
(From: W Gerald Hicks)
2.1.4 当编译我的模块时一切都是好的,但是当我试图下载时得到一个错误:missing symbol "__eabi"?
A:在你的模块里可能有个main函数,根据PPC "extended Application Binary Interface" (eabi)
标准,main函数必须调用__eabi函数,该函数为运行你的程序设置必要的运行环境。
由于这个原因GNU编译器在main函数里插入 __eabi函数。
Tornado不提供该函数,因为在实时环境下,你不必写main函数。VxWorks在应用程序运行前已经设置
好运行环境了,不再需要main函数了。
(From: Ilia, iliab@telegate.co.il)
-- 作者:lxlong
-- 发布时间:2005-6-25 13:09:28
--
2.1.5 我生成了2.95.2版本的编译器,一切正常,但当我开始链接我的映象时,出现了错误,下面是我
链接ctdt表时的错误:
ctdt.o(.data+0x3c):fake: undefined reference to `global constructors keyed to
_constructor_name_
... 许多类似的错误,有谁见过这种错误吗?
A: 该问题是由gcc(ver2.7.2-2.95.2)试图改变它得到静态构造函数的方法引起的。它不再对每个构造静
态对象的模块消除函数,该方法是vxworks在编译链接过程中采用的方法。
你可以按如下修改gcc 2.95.2源代码后,恢复原先的操作。
in [source code dir]/gcc/config/arm/vxarm.h, at the very end, add:-
/* More DK patches: we undef these two in order to force the */
/* compiler to output our static constructors and destructors */
/* in the fashion to which it is accustomed.... */
#undef ASM_OUTPUT_CONSTRUCTOR
#undef ASM_OUTPUT_DESTRUCTOR
/* This one is so that GLOBAL_THING gets a $ in it\‘s name */
#undef NO_DOLLAR_IN_LABEL
现在更换到你的编译目录,敲入make clean命令,然后重新编译和安装编译器。我采用这种方法是可以的
,PPC版本的。它使得编译器使用老的方法来making munchable constructors。
希望对你也有帮助。
(From: Dave Korn)
2.1.6 在我编译时,我在编译窗口看到如下输出:
nm386 -g partialImage.o @B:\\Sources\\Components\\Common\\Common_Geni_Test\\Src\\prjObjs.lst | \\
wtxtcl D:\\Tornado\\host\\src\\hutils\\munch.tcl -asm 386 > ctdt.c
...
cc386 -nostdlib -r -Wl,-X partialImage.o ctdt.o -o VxWorksGeniServerTestExe.out
最后一步(linking partialImage.o to ...out)花了很长时间(半个小时),谁有解决办法?
A: 这个可能是munching过程,而不是链接,花了半小时。有人曾贴了一个小窍门来加速。
在munch命令管道里使用"grep GLOBAL"如:
nm386 -g partialImage.o @B:\\Sources\\Components\\Common\\Common_Geni_Test\\Src\\prjObjs.lst
| grep GLOBAL | \\
wtxtcl D:\\Tornado\\host\\src\\hutils\\munch.tcl -asm 386 > ctdt.c
(From: Dave Korn)
2.1.7 怎样定义一个没有空洞的结构。
Q: How do define a structure without holes in it?
A: 我在vxworks中使用GNU编译器
struct ex {
INT8 source;
INT32 txSize;
INT32 datSize;
INT16 cmd;
} __attribute__ ((packed));
typedef struct ex PackedStruct;
注意:如果可能,避免使用-fpack-struct编译器开关。我门最近移除了这个选项,使得我们的C++程序提
高了30%-100%的性能。这是因为每次存取结构或类里多字节值时,都是一个一个字节操作的。可以使用
__attribute__ ((packed)) 方法代替。
(From: Mark Fanara, mfanara@home.cNOSPAMMom, and Francisco Pataro, fpataro@dnaent.com)
2.1.8 我怎样在一个C程序文件里调用一个C++函数?
A: 如果你想在一个C程序文件里调用一个C++函数,C++函数必须用extern "C"声明;否则编译器将破坏函数
名,把参数类型说明加在函数名末尾,并返回该函数。
(From: Dave Korn)
2.1.9 -fvolatile开关真的需要吗?
A: WRS建议我们在编译kernel/BSP时,使用-fvolatile开关。它通常缺省打开某个target/h/make/目录下的
文件。
我们也在我们的应用程序编译过程中使用-fvolatile开关,因为我们参考一些tornado的makefile。
当我们移除该开关后,就碰到一些微妙的BUG,如果你编写驱动程序应当小心。
-fvolatile开关使编译器生成非常conservative的代码。通过指针使变量值增加(p->x++)不可能如你
想象的在一条指令里完成(68k example):
addql #1,a0@(8)
如果采用-fvolatile 开关你会得到:
movel a0@(8),d0
addql #1,d0
movel d0,a0@(8)
movel a0@(8),d0
You can imagine what a C++ application using the "this" pointer everywhere gets compiled into!
(From: Chris Varlese, cv@no.mail.net)
2.1.10 我链接了许多档案文件,现在链接器在解析文件之间的交叉参考时出现了问题?
A: 试试下面的方法
1、把$(LIBS)替换成$(LD_PARTIAL) -o vxWorks.tmp $(MACH_DEP) usrConfig.o version.o
$(LIBS) (在target/h/rules.bsp文件中)。 Now LD_PARTIAL is ccxxx, so you need to specify -Wl,
--group-start to get cc to pass the argument to ld.
2、Try adding a -Usymbol for each symbol that has to be pulled in early.
3、如果办法2 make ld行太笨拙,生成一个.s文件,包含每个没定义的符号和加到链接里的。
4、如果你工作UNIX下,它应该可能得到ld生成没有定义的所要求的列表。你需要加一个循环,就象下面一
样:
/*这是原文,我翻译不好。
1、$(LIBS) is substituted int $(LD_PARTIAL) -o vxWorks.tmp $(MACH_DEP) usrConfig.o version.o
$(LIBS) (in target/h/rules.bsp for a non-project build). Now LD_PARTIAL is ccxxx, so you need
to specify -Wl,--group-start to get cc to pass the argument to ld.
2、Try adding a -Usymbol for each symbol that has to be pulled in early.
3、If (2) make the ld line too unwieldy, generate a .s file that contains: .extern symbol for
each undefined symbol and include that into the link before the libraries
4、If your building on unix, it ought to be possible get ld to generate the required list of
undefines! You need to add a loop! Something like this might work:
*/
[ ! -f undefs.s ] && echo "#" >undefs.s
while
$(CC) -c $(CFLAGS) undefs.s
$(LD_PARTIAL) -o vxWorks.tmp $(MACH_DEP) usrConfig.o version.o \\
undefs.o $(LIBS)
$(NM) vxWorks.tmp | grep \‘ __\‘ | $(MUNCH) > ctdt.c
$(MAKE) CC_COMPILER="-fdollars-in-identifiers" ctdt.o
do
$(LD) $(LDFLAGS) -e $(SYS_ENTRY) $(LD_LOW_FLAGS) -o vxWorks \\
dataSegPad.o vxWorks.tmp ctdt.o tad_hook_list.o 2>&1 | tee ld.errs |
while read file undef ref to symbol
do
[ "$undef" = "undefined" ] || continue
[ "$ref" = "reference" ] || continue
[ "$to" = "to" ] || continue
oifs="$IFS"
IFS="\‘/`"
symbol="`echo $symbol`"
IFS="$oifs"
echo "\\t.extern\\t$symbol"
done | sort -u - undefs.s >undefs.new
cmp -s undefs.s undefs.new && break
mv undefs.new undefs.s
done
cat ld.errs
当然它需要另一系列的ESC和; \\在每一行,以使得可以在make下运行。
(我也重新构造了原始的rules.bsp内容,我的可能与vxWorks原来的有些不同。)
(From: David Laight, dsl@tadpole.co.uk)
2.1.11 警告"trigraphs occured"是什么意思?
A: 对Tornado或Vxoworks没什么要做的。
你可能在你代码(也可能在注释里)中有三字符序列--参看K&R (Kernighan & Ritchie; A12.1 - 这是
ANSI 新引进的。-- 但是GNU手册里提示"You don\‘t want to know about this brain-damage..."
使用-ansi或-trigraphs开关,或更好的办法消除任何包含三字符序列\‘??X\‘的注释。 (参看K&R书中对X
的定义)。
(From: Michael.Ben-Ari@ecitele.com)
2.1.12 为什么编译的最后步骤时间这么长?
生成.out步骤如下:
1) 链接应用程序和库到partialImage.o
2) 使用partialImage.o解析出所有静态类(munch)
3) 编译上面发现的(ctdt.o)
4) 用ctdt.o链接第一个obj文件partialImage.o
我们的应用程序.out文件有10M,但是多数是调试信息,size386返回只有1M。
我们的下载文件生成需要超过5分钟,Step #1-3正常需要35秒!但是step #4 需要很多时间,整个过程需
要5分30秒。
A: 我不知道为什么这样?但是我们在step #4不重新使用partialImage.o 而是重新生成它,整个过程45s.
(是ld386没有对符号过滤进行优化的原因吗?)
我只是修改了tornado\\target\\h\\make\\rules.vxApp文件,它包含制作应用程序的规则。我修改了上面
提到的step $4代码如下:
把$(LD_PARTIAL) $(LD_PARTIAL_LAST_FLAGS) partialImage.o ctdt.o -o $@
替换成$(LD_PARTIAL) $(PRJ_OBJS_FOR_LD_PARTIAL) $(PRJ_LIBS) ctdt.o -o $@
(From: Ole Asbjorn Fadum, OleAsbjornF@scanmar.no)
Some more information.
For a variety of reasons I\‘ve had to do a few build on a slow system. One bit that seemed
exceptionally slow is the \‘binToAsm\‘ call (just after the \‘deflate\‘ generating vxWorks.Z.s).
This is done by
od -bv $infile |
sed -e "s/^[0-9]*[ ]*//;
s/ /, 0/g;
/^[0-9a-fA-F][0-9a-fA-F]/s/^/ .byte 0/"
(ie use od to generate a list of octal bytes, remove the offset, change the spaces to comma,
add the directive - an extra 0 is added to each number to ensure they are octal).
The above is terribly slow... Slightly faster (under solaris) is:
od -An -v -tu1 $infile | tr \‘ \‘ \‘,\‘ |
sed -e \‘s/,00*\\([0-9]\\)/,\\1/g;s/^,/ .byte /\‘
However it is clear that a C program would be even faster... It was still sluggish using
printf, so...
char map[256][4];
for (count = 0; count <= 256; count++)
sprintf( map[ count ], "%d", count );
for (;;) {
count = read( input_fd, buf, BLK_SZ );
if (count <= 0)
break;
for (off = 0; off < count; off++) {
if (off & 15)
putchar( \‘,\‘ );
else
fputs( "\\n .byte ", stdout );
fputs( map[ buf[ off ] ], stdout );
}
}
now the system is spending very little of its time doing this bit (it was a lot slower
than the deflate!). If you are using gcc/gas you can pipe EXTRACT_BIN, COMPRESS, BINTOASM
directly into AS - saving that massive intermediate file...
Build (compiling one small object) just took 6m50 - was over 10 minutes before I played
with binToAsm!
Ages ago I sped up \‘munch\‘ - by grepping out most of the symbols it isn\‘t interested in...
nmarm vxWorks.tmp | tee vxWorks.nm | grep " __" | munch > ctdt.c
(I use the symbol table from this stage for a variety of things...)
(From: David Laight, David.Laight@btinternet.com)
-- 作者:lxlong
-- 发布时间:2005-6-25 13:11:03
--
2.1.13 怎样把一个段装载到特定的绝对地址?
A: 我曾包含一个脚本做这些工作,最方便得到这个脚本的方法是使用--verbose开关运行你的链接器,例
如:
"ldarm --verbose". 编辑这个文件加入类似如下的段落,
.text 0x8000 : {
[omit]
. = ALIGN(0x8000);
/* Create a 8k section of all 0xffff, first value is jump. */
FILL(0xffff);
LONG(0xeb000004);
. = ALIGN(0x2000);
[...]
这将把数据放到任何你想放的地方,在程序被链接时新的链接器脚本必须使用-T参数。
(From: Bill Pringlemeir, bpringlemeir@yahoo.com)
2.1.14 我在使用C++类型的注释时,出现错误,怎样改变它?
A: 一种方法是移除-ansi开关。然而,你可能希望保留你的源代码与ANSI兼容;所以我更喜欢代码能在每
个地方都能编译。传递"-Wp,-lang-c"参数只能使CPP的注释方法可以使用。下面来自预编译器文档
`-lang-c\‘, `-lang-c89\‘, `-lang-c++\‘
`-lang-objc\‘, `-lang-objc++\‘
Specify the source language. `-lang-c\‘ is the default; it allows recognition of C++
comments (comments that begin with `//\‘ and end at end of line), since this is a common
feature and it will most likely be in the next C standard. `-lang-c89\‘ disables recognition
of C++ comments. `-lang-c++\‘ handles C++ comment syntax and includes extra default include
directories for C++. `-lang-objc\‘ enables the Objective C `#import\‘ directive. `-lang-objc++\‘
enables both C++ and Objective C extensions. These options are generated by the compiler
driver gcc, but not passed from the `gcc\‘ command line unless you use the driver\‘s `-Wp\‘
option .
(From: Bill Pringlemeir, bpringlemeir@yahoo.com)
2.1.15 我在编译时碰到了关于cc1参数/选项的错误?
A: 这个可能是由于安装了Cygwin 或DJGPP引起的。当该版本的编译器在路径里先于Tornado版本Cygwin的
GCC被调用时,这个版本不知道这些参数或选项。这个问题可以通过卸载该软件或确定Tornado版本的编译器
在路径环境变量里是头一个后解决。
2.2 调试器
2.2.1 我怎么使用GDB的plain版本去调试我的目标机,而不用Tornado?
A:gdb compiles \‘out of the box\‘ for vxworks.
去cygnus(sourceware.cygnus.com)下载最新的\‘insight\‘软件,该软件是gdb + cygnus的UI(译者:可能是用
户接口)运行 "configure --target=mips-wrs-vxworks". 把mips改成你的处理器,然后运行make.
这样就可以在安装了cygwin的win32平台上运行了,在UNIX系统平台上也类似。
RDB是windriver以前的调试协议,现在变成WDB了。好象没公布wdb的比特,尽管Tornado使用了gdb。你可能
不得不配置RDB。包含RDB组件(INCLUDE_RDB) ,并移除WDB组件(remove INCLUDE_WDB),以使得调试可以进
行。(From: Don Bowman, don@pixstream.com)
2.2.2 我怎么在创建一个任务后停止它,以使得我能从开始对它进行调试?
A: 菜单tools->options,选择debugger页,选择always halt after attaching a task和Auto Attach to
task -> Always
现在输入一个全局断点(Shift F9),在它碰到断点后,它将从mainTask中分离。
(From: Chacha Hindustani, Gurudev@mediaone.net)
2.2.3 为什么当我使用SHELL检查内存时,看不到断点?
A: shell是一个不可中断的任务,所以任何时间它都在运行在无断点的环境。当任务切换引起一个中断的任
务运行时,断点将被重新安装。所以如果查看内存中的断点,只是简单使用d()或l()命令,它在一个中断任
务中可以运行,你将看到一个magic code插入并引起异常。
The shell is an unbreakable task, so all the time it is running the breakpoints are not
installed. When a contexttch causes a breakable task to run, the breakpoints will be
resinstated.
So, to see the breakpoint in memory simply spawn the d() command or l() command. That will
then run in a breakable task, and you should see the magic code inserted to cause
an exception.
(From: John, john_94501@yahoo.com)
2.3 FTP
参看5.4
2.4 主机工具
2.4.1 我制作了一个基于rom的VxWorks(vxWorks_rom),但是当我试图用elftobin把它转换成bin格式的
(vxworks_rom.bin),得到了如下错误:
C:\\project\\Project3\\default\\elftobin
seg1 : Expected load address 0xfff00100 but file address is 0x00111670
我怎样才能把这个文件转成二进制格式?
A: 这个问题只在PPC版本中出现过,问题编号为SPR#8845. 已经有个更新版本的elftobin解决了这个问题。
请联系你的销售代理或服务工程师。
2.4.2 我怎样写一个WTX工具?
A: 我曾经在Tornado 1.0.1 和Windows NT 4.0环境下写过一个WTX工具,按下面的例子和Tornado API参考
开始,甚至不用关闭build.让它独自按我的步骤工作。就是我使用VC++6编译,但仍有许多东西丢掉了,不
论编译器是什么版本。我知道我能更熟练的使用路径里的环境变量。但有时你只需要它工作,所以下面澄清
一下:
原代码放在$(WIND_BASE)\\host\\src\\wtxtest下,我的安装目录或任何其它人的安装目录里没有例子源码。
按手册源代码按如下修改(大多是信号处理代码修改和增加includes,其它修改在我的程序里说明)
把下面的设置加到工程设置、 C/C++, Preprocessor:
include目录(路径按实际情况修改):
C:\\Tornado_03\\share\\src\\wtx,C:\\Tornado_03\\host\\include
预处理定义:HOST
把下面的设置加到工程设置,Link,General:
C:\\Tornado_03\\host\\x86-win32\\lib\\wtxapidll-d.lib
增加环境变量WIND_REGISTRY,设为我的注册位置。
许多痛苦就在发现这个。手册里参考wtxEnvironSet()调用,Windsurf说它是不存在的,但手册为这个不存
在的函数使用提供了许多参考。我的机器上没设置WIND_REGISTRY,所有的Tornado工具都可以不使用它而正
常工作。我的工具不能发现注册,设置它并关闭它(Set it and poof)!注册发现了,工具可以工作。
确信起调用了wtxProbe()去检查注册(并且变量被设置),它可以避免许多痛苦。
我也修改那个工具例子代码。代码在此#代码连接#http://www.xs4all.nl/~borkhuis/vxworks/wtxSample.c
(From: Christopher A Leddy, caleddy@west.raytheon.com)
2.4.3 当我执行wtxwish时,碰到了一个关于init.tcl文件的错误?
A: 不要忘记把TCL_LIBRARY和TK_LIBRARY环境变量设置为 $(WIND_BASE)/host/tcl/tcl and
$(WIND_BASE)/host/tcl/tk. init.tcl文件位于TCL_LIBRARY路径。tk.tcl文件位于目录。
不要使用 $(WIND_BASE) 变量,而是实际路径。然后从你的TCL/TK目录执行:
wtxwish
(From: DrDiags, drdiags@flashcom.net)
2.4.4 我试图在windows NT4.0 SP5环境下运行Tornado2.0带的vxsys程序,碰到一个错误: "the system
try to access directly to the disk, this is not possible ....."
A: vxsys是DOS程序,不能工作windows环境下,你应该从DOS窗口下运行它。
(From: Andray Kaganovsky, andreyk@home.com)
2.4.5 怎样创建加密密码?
A: 你可以使用Tornado自带的创建密码程序vxencrypt,但是它功能很弱。
sum( p * i ^ i )) * 0x1e3a1d5将HEX字符集转化成ASCII(假定认为你有超过2^32加密密码)。我能
用钢笔和纸来把它做反变换。
你也可以使用loginEncryptInstall()安装自己的加密算法,对一个强密码[1],加密知道使用密码作为KEY。
UNIX传统使用DES,但需要适当的代码。我使用TEA参看http://vader.brad.ac.uk,因为它是不受妨碍的。
[1] problematical since you have difficulty protecting the password file as none of the
vxWorks filesystems support user-ids.
(From: David Laight)
-- 作者:lxlong
-- 发布时间:2005-6-25 13:11:16
--
2.5 安装
2.5.1 当我试图安装GNU源光盘时,出现了一个关于文件aux.h的错误:permission denied。但该文件并不
存在,是怎么回事?
A: 在微软SW环境下存在这个问题,"AUX"是保留字,所以任何以"AUX."开头的都不能存在。任何以设备名
开始的文件名也是不能存在的,例如你不能打开一个叫"LPT1.TXT"的文件。
2.5.2 在我安装完Tornado或它的补丁后,我所有的C文件类型都被移除了,而使用Tornado作为打开该文件
的工具。我怎样能恢复到原来的编辑器?
A:Tornado覆盖注册表中的实体。你可以用下面的.reg恢复。
警告:在使用这个文件前必须小心!首先读一下该文件,如果你不理解它就不要使用它。
警告:我在windows95和NT下测试过,如果有时间我会在别的的平台测试的。如果你在98、2000下使用后可
以工作,请告诉我。
首先下载该文件,仔细阅读它,修改它,使她执行你需要的编辑器,然后执行它。你怎么修改它?
一个方法是执行这个文件,然后去浏览器View->Options->File Types.这里你可搜索"C源文件"和"C头文件"。
修改打开命令为你想要的。现在编辑文件c-files.reg,并移除20行后的部分,第一行以
[HKEY_CLASSES_ROOT\\c_source_file]开始。再次执行,、将把所有文件类型恢复成你选择的。
另一种方法:在你的文件类型里找到你的确省编辑器,把这行COPY到文件c-files.reg中vim行(BTW:vim
是非常好的编辑器,你可以到http://www.vim.org查询更多信息)。
文件: c-files.reg#文件连接#http://www.xs4all.nl/~borkhuis/vxworks/c-files.reg
2.5.3 当我每次双击一个文件,都打开一个Tornado.我想所有的文件都用一个Tornado打开,怎么做?
A:是的,这是可能。下面的注册文件将完成这个工作。
警告:在使用这个文件前必须小心!首先读一下该文件,如果你不理解它就不要使用它。
编辑该文件,修改Tornado的安装路径为你机器上的安装路径。
文件: TornadoFileTypes.reg#文件连接#http://www.xs4all.nl/~borkhuis/vxworks/TornadoFileTypes.reg
2.5.4 能把多个CPU平台安装到一个目录下吗?
A:可以,但是需要注意几点:
只能把同一版本的安装到同一目录下。这意味着Tornado 2.0.1 for ARM不能同其它版本安装到同一个目录。
也不能把2.0和2.0.2混合在一起。我发现的唯一不兼容的是MIPS。在安装了idts134 BSP后,下面的文件会
带来问题:
1)host\\resource\\tcl\\wtxcore.tcl
在最后的函数里设置tool为sfgnu替换为gnu.在if结构里增加设置tool为sfgnu.现在只有MIPS这个工具变量
被改变。这样更让人满意,如果你只使用MIPS版本它是可以工作的。
2)host\\resource\\tcl\\app-config\\Browser:
在line 138 有个目录为obj...sfgnuvx,对其它CPU来说它是obj...gnuvx. 问题可以通过把这行替换为如
下行解决:
This problem can be solved by replacing this line with the follwoing lines:
if { $cpuType($cpuId) == "RC32364" } {
set name [wtxPath target lib obj$cpuType($cpuId)sfgnuvx]spyLib.o
} else {
set name [wtxPath target lib obj$cpuType($cpuId)gnuvx]spyLib.o
}
然后替换RC32364为你处理器类型的名称。
2.6 MAKEFILE
2.6.1 Make不能发现我自己的INCLUDE目录?
A:在C/C++编译选项里,使用-I
宏名称:VPATH
值:$(filter-out -I.,$(filter -I%,$(CFLAGS)))
在修改了include目录后需要更新编译器选项,VPATH自动被上面规则更新。
在选项改变保存到工作区并确认改变生效后,重新生成依赖关系和开始编译器。
Bob Baker (Bob@dskti.com)曾写过他关于这个问题的经验:
我们在使用Tornado 2编译一个应用程序时碰到了很多问题,如\‘No rule to make target\‘。尝试了所有有
用的办法。如:使用":"替代空格作为VPATH的分隔符。使用" :"或": "或" : "改变宏的顺序。"\\","/","\\\\"
(原文:E.G. using \‘:\‘ for VPATH separators instead of spaces. Using \‘space :\‘ or \‘: space\‘ or
\‘space : space\‘, changing the order of the macro\‘s, forward slashes, back slashes, double
slashes, pointing the PC screen south at dawn etc the problem turned out to be incompatibility
between tornado 2 and win95/98. )证明在Tornado2和WIN95/98上是不兼容的。
简单拷贝包含整个应用和工程的整个目录结构到NT,可以解决问题,并生成一个完整的build。拷贝到另一
个win95和win98上,则建立失败。失败的原因是build过程试图存取一个网络驱动器的共享库文件。我尝试了
所有的在VPATH里的分隔符组合,他们都可以在NT下工作。
2.6.2 为什么make没有在我修改了BSP目录里的文件(比如sysSerial.c)后重新生成我的工程?
A: 在Tornado里你能定义不必扫描的include目录。其中缺省的目录之一是BSP目录(target\\config)。如果
你从不包含列表里移除它,BSP文件将出现在依赖列表里。在你选择生成依赖关系后选择"高级"按扭,会弹
出一个窗口,包含一个选项"Read-only dependency path"从列表中移除.....\\target\\config。关闭窗口,
重新生成所有的依赖关系。下次BSP文件被修改后就会正确生成了。
(From: gerard.kerkhofs@nicolet.NOSPAM.nl)
另一个解决办法是不要删除该项,但是用.....\\target\\config\\comps替换它。现在你得到所有的BSP目录里
的文件,而不是comps目录里的,该目录里放置了许多标准文件。
2.6.3 我怎样在我的工程里生成一个连接器列表(linker list)?
A: 在build属性里的缺省连接器命令不被make采用。未了使用额外的连接选项make,把如下内容加入到build
属性里:
Macros: Name: LD_PARTIAL_FLAGS_FOR_PARTIALIMAGE
Value: -Wl,-Map,$(basename $(notdir $(PRJ_FILE))).link
然后修改$(PROJECT_OUT)文件rules.vxApp里的连结器命令行的LD_PARTIAL:
$(LD_PARTIAL) $(LD_PARTIAL_FLAGS_FOR_PARTIALIMAGE) \\
$(PRJ_OBJS_FOR_LD_PARTIAL) $(PRJ_LIBS) -o partialImage.o
这会在输出目录里生成一个linker输出文件--
partialImage.o。如果文件使用最终的连接命令生成,它会生成partialImage.o文件的。
2.6.4 怎样生成C和汇编混合文件?
A: 在你makefile文件添加如下规则:
%.out: %.o
@objdump$(TOOLENV) -S $< < $@
这
This will generate a file called
the -g flag for the compiler to get debug informtion in the output file. This information is
needed by objdump.
But this is probably not enough. By default VxWorks puts a name in the object file. This name
consists of the absolute path of the project directory with the complete path of the file name
appended to it. (This can be seen with the command "objdump$(TOOLENV) --debugging