vxWorks FAQ中文版收藏
這是從別處轉(zhuǎn)載的,可以將它復(fù)制下來,查找自己碰到的問題,可能有解答額,呵呵。
前言(Surface):隨著國內(nèi)使用VxWorks的用戶越來越多,為了方便VxWorkers少走一些彎路,特別推出了中文FAQ,其中很多的FAQ來自comp.os.vxworks和原創(chuàng)。(很多FAQ都可以在該新聞組找到英文版)??
??? 文檔的FAQ總共分為7大類:
1.入門FAQ
2.Tornado工具FAQ
3.BSP FAQ
4.文件系統(tǒng) FAQ
5.網(wǎng)絡(luò) FAQ
6.VxWorks操作系統(tǒng) FAQ
7.其它 FAQ
??? 基本涵蓋了Tornado/VxWorks使用中的主要方面。文檔組織本身沒有邏輯上的關(guān)聯(lián),經(jīng)過分類,只是松散的組合在一起,可根據(jù)你的需要選擇閱讀某一部分。
??為了保持本文檔的開放性和可擴充性,歡迎大家把自己曾經(jīng)碰到過的問題及其解決辦法按分類加到文檔里來。在修改本文檔時,請把修改記錄加到歷史記錄里。
??歡迎任何人指出文檔中的錯誤之處,請把錯誤之處發(fā)到附錄B里的任一個EMAIL里,在此對那些問題的提出者、回答者以及文檔的維護者一并表示感謝!??
當(dāng)前版本(Current Version):
version 0.1
?
歷史(History):
2002-08-27 wys205??create 0.1 version
?
目錄(Content):
1.入門FAQ
2.Tornado工具FAQ
2.1 編譯器和鏈接器
2.2 調(diào)試器
2.3 FTP
2.4 主機工具
2.5 安裝
2.6 MAKEFILE
2.7 工程
2.8 目標機服務(wù)器
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環(huán)境 environment
3.6.1 usrSerial.c
3.6.2 prj_vxworks.tcl
3.7 PCI
?
4.文件系統(tǒng) FAQ
4.1 Dos文件系統(tǒng)
4.2 Flash文件系統(tǒng)
4.3 Floppy-disk文件系統(tǒng)
4.4 RAM-disk文件系統(tǒng)
4.5 基本文件系統(tǒng)問題
?
5.網(wǎng)絡(luò) 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 其它網(wǎng)絡(luò)相關(guān)問題
?
6.VxWorks操作系統(tǒng) 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 最近剛開始學(xué)習(xí)VXWORKS,越看越迷糊:
1)BSP,bootImage,VxWorksImage三者的關(guān)系是什么?BSP是BootImage的一部分還是VxWorksImage 的一部分?對于可以自啟動的系統(tǒng)是不是三者合在一起生成一個VxWorks Image?
2)應(yīng)用程序代碼是和VxWorks內(nèi)核一起編譯生成一個VxworksImage嗎?
以上問題是針對于代碼存放在rom介質(zhì)上的系統(tǒng)(如flash)。希望各位大俠不吝賜教!謝謝。。。
A:BSP 是用來支持你的硬件的軟件, 它包含在你的VxWorksImg里面.對于ROM啟動的系統(tǒng)來說, BootImg是ROM里代碼的第一部分, 用來在開機時首先運行. 如果你的所有代碼都在ROM上, 則引導(dǎo)程序把VxWorksImg拷貝到系統(tǒng)內(nèi)存, 然后再跳轉(zhuǎn)的系統(tǒng)內(nèi)存去執(zhí)行.
BSP的作用屏蔽不同的硬件結(jié)構(gòu)(如CPU和外圍芯片)向VxWorks的Kernel提供
它所需要的一個統(tǒng)一的接口調(diào)用(如時鐘)(by 泡泡)
?
bsp: 板級支持包,主要完成目標硬件的初始化工作,提供操作系統(tǒng)一個統(tǒng)一的接口,負責(zé)硬件操作,如中斷處理,啟動,停止,等工作。Bootimage:引導(dǎo)鏡像,我向如果把boot翻譯成啟動不是很是當(dāng)?shù)恼f法,這是一個引導(dǎo)程序,負責(zé)把目標系統(tǒng)環(huán)境初始化,最小的程度,如啟動了串口,或者網(wǎng)絡(luò)接口,可以使用這些接口現(xiàn)在程序,與主機通信,然后獲取你需要的OS-vxworksimage vxworksimage-包含vxworks內(nèi)核以及各種組件的鏡像,也就是object images,這是真正的操作系統(tǒng),通常bootimage負責(zé)獲取這個鏡像,然后跳到鏡像所在的位置開始執(zhí)行。(by hongwind )
?
1.1.2 如何學(xué)習(xí)VXWORK,PSOS入門?
A:初次上站,感覺大家水平一般,入門級選手較多,實時多任務(wù)操作系統(tǒng)和以前大家使用的低端產(chǎn)品,如51機在原理上是不同的,因此大家最好先學(xué)習(xí)多任務(wù)操作系統(tǒng)的原理。否則無法深入學(xué)習(xí)。?
??? 推薦一本書:坦尼博姆著:《操作系統(tǒng)》,各地都有的賣,主要是講MINIX的原理,其實就是UNIX系列操作系統(tǒng)的實現(xiàn)原理,由于VXWORKS和PSOS都是這個系列的操作系統(tǒng),因此理解了這本書,也就理解了它們的工作原理。必將事半功倍,而且對你理解WINDOWS的工作原理也很有好處。??(by bruin)
?
1.2 環(huán)境
1.2.1 斑竹tornado都是支持那些cpu??能列一下嗎或哪里能找到?斑竹tornado都是支持那些cpu??能列一下嗎或哪里能找到?。?!?
A:開發(fā)平臺: 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里??创a還是用Source Insight(by vxfree)
2.Tornado工具FAQ
?
2.1 編譯器和鏈接器
2.1.1 當(dāng)我把多個目標文件鏈接成一個時,出現(xiàn)了一個錯誤:ldppc:built in linker script:43: syntax error 我怎么樣才能消除這個錯誤?
A:請確定你的鏈接器使用了-r參數(shù)。(From: weber.dirk@t-online.de)
?
2.1.2 我怎樣使用新版本的編譯器?
A:參看如下連接,有一個PPC的編譯器http://www.newgcc4vxworks4ppc.cjb.net/
?
2.1.3 當(dāng)用另一個編譯器編譯代碼時,得到更多的錯誤和警告,怎樣才能讓GCC生成更多的警告信息?
A:首先用-Wall參數(shù)打開所有警告開關(guān);另一種生成更多報告的方法就是把文件看作是C++文件,參數(shù)為 -x c++.(From: Claudio Ortega, cortega@sinfomed.org.ar)-Wall不能真正打開所有的警告,我采用由Bruce Evans推薦的參數(shù)而且在FreeBSD環(huán)境下,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 當(dāng)編譯我的模塊時一切都是好的,但是當(dāng)我試圖下載時得到一個錯誤:missing symbol "__eabi"?
A:在你的模塊里可能有個main函數(shù),根據(jù)PPC "extended Application Binary Interface" (eabi)標準,main函數(shù)必須調(diào)用__eabi函數(shù),該函數(shù)為運行你的程序設(shè)置必要的運行環(huán)境。
??由于這個原因GNU編譯器在main函數(shù)里插入 __eabi函數(shù)。Tornado不提供該函數(shù),因為在實時環(huán)境下,你不必寫main函數(shù)。VxWorks在應(yīng)用程序運行前已經(jīng)設(shè)置
好運行環(huán)境了,不再需要main函數(shù)了。(From: Ilia,?iliab@telegate.co.il)
--??作者:lxlong
--??發(fā)布時間:2005-6-25 13:09:28
--??
2.1.5 我生成了2.95.2版本的編譯器,一切正常,但當(dāng)我開始鏈接我的映象時,出現(xiàn)了錯誤,下面是我鏈接ctdt表時的錯誤:
ctdt.o(.data+0x3c):fake: undefined reference to `global constructors keyed to?
_constructor_name_... 許多類似的錯誤,有誰見過這種錯誤嗎?
A: 該問題是由gcc(ver2.7.2-2.95.2)試圖改變它得到靜態(tài)構(gòu)造函數(shù)的方法引起的。它不再對每個構(gòu)造靜態(tài)對象的模塊消除函數(shù),該方法是vxworks在編譯鏈接過程中采用的方法。你可以按如下修改gcc 2.95.2源代碼后,恢復(fù)原先的操作。
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
現(xiàn)在更換到你的編譯目錄,敲入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 怎樣定義一個沒有空洞的結(jié)構(gòu)。
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編譯器開關(guān)。我門最近移除了這個選項,使得我們的C++程序提高了30%-100%的性能。這是因為每次存取結(jié)構(gòu)或類里多字節(jié)值時,都是一個一個字節(jié)操作的??梢允褂胈_attribute__ ((packed)) 方法代替。
(From: Mark Fanara, mfanara@home.cNOSPAMMom, and Francisco Pataro, fpataro@dnaent.com)
2.1.8 我怎樣在一個C程序文件里調(diào)用一個C++函數(shù)?
A: 如果你想在一個C程序文件里調(diào)用一個C++函數(shù),C++函數(shù)必須用extern "C"聲明;否則編譯器將破壞函數(shù)名,把參數(shù)類型說明加在函數(shù)名末尾,并返回該函數(shù)。
(From: Dave Korn)
2.1.9 -fvolatile開關(guān)真的需要嗎?
A: WRS建議我們在編譯kernel/BSP時,使用-fvolatile開關(guān)。它通常缺省打開某個target/h/make/目錄下的文件。
??我們也在我們的應(yīng)用程序編譯過程中使用-fvolatile開關(guān),因為我們參考一些tornado的makefile。當(dāng)我們移除該開關(guān)后,就碰到一些微妙的BUG,如果你編寫驅(qū)動程序應(yīng)當(dāng)小心。
??? -fvolatile開關(guān)使編譯器生成非常conservative的代碼。通過指針使變量值增加(p->x++)不可能如你想象的在一條指令里完成(68k example):
addql #1,a0@(8)
如果采用-fvolatile 開關(guān)你會得到:
??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 我鏈接了許多檔案文件,現(xiàn)在鏈接器在解析文件之間的交叉參考時出現(xiàn)了問題?
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下,它應(yīng)該可能得到ld生成沒有定義的所要求的列表。你需要加一個循環(huán),就象下面一樣:
/*這是原文,我翻譯不好。
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
當(dāng)然它需要另一系列的ESC和; \在每一行,以使得可以在make下運行。(我也重新構(gòu)造了原始的rules.bsp內(nèi)容,我的可能與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開關(guān),或更好的辦法消除任何包含三字符序列‘??X‘的注釋。 (參看K&R書中對X的定義)。
(From: Michael.Ben-Ari@ecitele.com)
2.1.12 為什么編譯的最后步驟時間這么長?
生成.out步驟如下:
??1) 鏈接應(yīng)用程序和庫到partialImage.o
??2) 使用partialImage.o解析出所有靜態(tài)類(munch)
??3) 編譯上面發(fā)現(xiàn)的(ctdt.o)
??4) 用ctdt.o鏈接第一個obj文件partialImage.o
我們的應(yīng)用程序.out文件有10M,但是多數(shù)是調(diào)試信息,size386返回只有1M。我們的下載文件生成需要超過5分鐘,Step #1-3正常需要35秒!但是step #4 需要很多時間,整個過程需要5分30秒。
A: 我不知道為什么這樣?但是我們在step #4不重新使用partialImage.o 而是重新生成它,整個過程45s.(是ld386沒有對符號過濾進行優(yōu)化的原因嗎?)
我只是修改了tornado\target\h\make\rules.vxApp文件,它包含制作應(yīng)用程序的規(guī)則。我修改了上面提到的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
--??發(fā)布時間:2005-6-25 13:11:03
--??
2.1.13 怎樣把一個段裝載到特定的絕對地址?
A: 我曾包含一個腳本做這些工作,最方便得到這個腳本的方法是使用--verbose開關(guān)運行你的鏈接器,例如:?
"ldarm --verbose". 編輯這個文件加入類似如下的段落,
??.text??0x8000 : {
[omit]
????????. = ALIGN(0x8000);
????????/* Create a 8k section of all 0xffff, first value is jump. */
????????FILL(0xffff);
????????LONG(0xeb000004);
????????. = ALIGN(0x2000);
[...]
這將把數(shù)據(jù)放到任何你想放的地方,在程序被鏈接時新的鏈接器腳本必須使用-T參數(shù)。
(From: Bill Pringlemeir, bpringlemeir@yahoo.com)
2.1.14 我在使用C++類型的注釋時,出現(xiàn)錯誤,怎樣改變它?
A: 一種方法是移除-ansi開關(guān)。然而,你可能希望保留你的源代碼與ANSI兼容;所以我更喜歡代碼能在每個地方都能編譯。傳遞"-Wp,-lang-c"參數(shù)只能使CPP的注釋方法可以使用。下面來自預(yù)編譯器文檔
`-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 我在編譯時碰到了關(guān)于cc1參數(shù)/選項的錯誤?
A: 這個可能是由于安裝了Cygwin 或DJGPP引起的。當(dāng)該版本的編譯器在路徑里先于Tornado版本Cygwin的GCC被調(diào)用時,這個版本不知道這些參數(shù)或選項。這個問題可以通過卸載該軟件或確定Tornado版本的編譯器在路徑環(huán)境變量里是頭一個后解決。
2.2 調(diào)試器
2.2.1 我怎么使用GDB的plain版本去調(diào)試我的目標機,而不用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系統(tǒng)平臺上也類似。RDB是windriver以前的調(diào)試協(xié)議,現(xiàn)在變成WDB了。好象沒公布wdb的比特,盡管Tornado使用了gdb。你可能不得不配置RDB。包含RDB組件(INCLUDE_RDB) ,并移除WDB組件(remove INCLUDE_WDB),以使得調(diào)試可以進行。(From: Don Bowman, don@pixstream.com)
2.2.2 我怎么在創(chuàng)建一個任務(wù)后停止它,以使得我能從開始對它進行調(diào)試?
A: 菜單tools->options,選擇debugger頁,選擇always halt after attaching a task和Auto Attach to task -> Always現(xiàn)在輸入一個全局斷點(Shift F9),在它碰到斷點后,它將從mainTask中分離。
(From: Chacha Hindustani, Gurudev@mediaone.net)
2.2.3 為什么當(dāng)我使用SHELL檢查內(nèi)存時,看不到斷點?
A: shell是一個不可中斷的任務(wù),所以任何時間它都在運行在無斷點的環(huán)境。當(dāng)任務(wù)切換引起一個中斷的任務(wù)運行時,斷點將被重新安裝。所以如果查看內(nèi)存中的斷點,只是簡單使用d()或l()命令,它在一個中斷任務(wù)中可以運行,你將看到一個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),但是當(dāng)我試圖用elftobin把它轉(zhuǎn)換成bin格式的(vxworks_rom.bin),得到了如下錯誤:
C:\project\Project3\default\elftobin
2.4.2 我怎樣寫一個WTX工具?
A: 我曾經(jīng)在Tornado 1.0.1 和Windows NT 4.0環(huán)境下寫過一個WTX工具,按下面的例子和Tornado API參考開始,甚至不用關(guān)閉build.讓它獨自按我的步驟工作。就是我使用VC++6編譯,但仍有許多東西丟掉了,不論編譯器是什么版本。我知道我能更熟練的使用路徑里的環(huán)境變量。但有時你只需要它工作,所以下面澄清一下:
原代碼放在$(WIND_BASE)\host\src\wtxtest下,我的安裝目錄或任何其它人的安裝目錄里沒有例子源碼。
按手冊源代碼按如下修改(大多是信號處理代碼修改和增加includes,其它修改在我的程序里說明)把下面的設(shè)置加到工程設(shè)置、 C/C++, Preprocessor: include目錄(路徑按實際情況修改):
C:\Tornado_03\share\src\wtx,C:\Tornado_03\host\include?
預(yù)處理定義:HOST
把下面的設(shè)置加到工程設(shè)置,Link,General:
C:\Tornado_03\host\x86-win32\lib\wtxapidll-d.lib 增加環(huán)境變量WIND_REGISTRY,設(shè)為我的注冊位置。許多痛苦就在發(fā)現(xiàn)這個。手冊里參考wtxEnvironSet()調(diào)用,Windsurf說它是不存在的,但手冊為這個不存在的函數(shù)使用提供了許多參考。我的機器上沒設(shè)置WIND_REGISTRY,所有的Tornado工具都可以不使用它而正常工作。我的工具不能發(fā)現(xiàn)注冊,設(shè)置它并關(guān)閉它(Set it and poof)!注冊發(fā)現(xiàn)了,工具可以工作。
確信起調(diào)用了wtxProbe()去檢查注冊(并且變量被設(shè)置),它可以避免許多痛苦。我也修改那個工具例子代碼。代碼在此#代碼連接#http://www.xs4all.nl/~borkhuis/vxworks/wtxSample.c
(From: Christopher A Leddy, caleddy@west.raytheon.com)
2.4.3 當(dāng)我執(zhí)行wtxwish時,碰到了一個關(guān)于init.tcl文件的錯誤?
A: 不要忘記把TCL_LIBRARY和TK_LIBRARY環(huán)境變量設(shè)置為 $(WIND_BASE)/host/tcl/tcl and
$(WIND_BASE)/host/tcl/tk. init.tcl文件位于TCL_LIBRARY路徑。tk.tcl文件位于目錄。不要使用 $(WIND_BASE) 變量,而是實際路徑。然后從你的TCL/TK目錄執(zhí)行:
wtxwish
2.4.4 我試圖在windows NT4.0 SP5環(huán)境下運行Tornado2.0帶的vxsys程序,碰到一個錯誤: "the system try to access directly to the disk, this is not possible ....."
A: vxsys是DOS程序,不能工作windows環(huán)境下,你應(yīng)該從DOS窗口下運行它。
(From: Andray Kaganovsky, andreyk@home.com)
2.4.5 怎樣創(chuàng)建加密密碼?
A: 你可以使用Tornado自帶的創(chuàng)建密碼程序vxencrypt,但是它功能很弱。sum( p* i ^ i )) * 0x1e3a1d5將HEX字符集轉(zhuǎn)化成ASCII(假定認為你有超過2^32加密密碼)。我能用鋼筆和紙來把它做反變換。你也可以使用loginEncryptInstall()安裝自己的加密算法,對一個強密碼[1],加密知道使用密碼作為KEY。
UNIX傳統(tǒng)使用DES,但需要適當(dāng)?shù)拇a。我使用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
--??發(fā)布時間:2005-6-25 13:11:16
--??
2.5 安裝
2.5.1 當(dāng)我試圖安裝GNU源光盤時,出現(xiàn)了一個關(guān)于文件aux.h的錯誤:permission denied。但該文件并不存在,是怎么回事?
A: 在微軟SW環(huán)境下存在這個問題,"AUX"是保留字,所以任何以"AUX."開頭的都不能存在。任何以設(shè)備名開始的文件名也是不能存在的,例如你不能打開一個叫"LPT1.TXT"的文件。
2.5.2 在我安裝完Tornado或它的補丁后,我所有的C文件類型都被移除了,而使用Tornado作為打開該文件的工具。我怎樣能恢復(fù)到原來的編輯器?
A:Tornado覆蓋注冊表中的實體。你可以用下面的.reg恢復(fù)。警告:在使用這個文件前必須小心!首先讀一下該文件,如果你不理解它就不要使用它。
警告:我在windows95和NT下測試過,如果有時間我會在別的的平臺測試的。如果你在98、2000下使用后可以工作,請告訴我。
首先下載該文件,仔細閱讀它,修改它,使她執(zhí)行你需要的編輯器,然后執(zhí)行它。你怎么修改它?一個方法是執(zhí)行這個文件,然后去瀏覽器View->Options->File Types.這里你可搜索"C源文件"和"C頭文件"。
修改打開命令為你想要的?,F(xiàn)在編輯文件c-files.reg,并移除20行后的部分,第一行以[HKEY_CLASSES_ROOT\c_source_file]開始。再次執(zhí)行,、將把所有文件類型恢復(fù)成你選擇的。
另一種方法:在你的文件類型里找到你的確省編輯器,把這行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 當(dāng)我每次雙擊一個文件,都打開一個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混合在一起。我發(fā)現(xiàn)的唯一不兼容的是MIPS。在安裝了idts134 BSP后,下面的文件會帶來問題:
1)host\resource\tcl\wtxcore.tcl
在最后的函數(shù)里設(shè)置tool為sfgnu替換為gnu.在if結(jié)構(gòu)里增加設(shè)置tool為sfgnu.現(xiàn)在只有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不能發(fā)現(xiàn)我自己的INCLUDE目錄?
A:在C/C++編譯選項里,使用-I
簡單拷貝包含整個應(yīng)用和工程的整個目錄結(jié)構(gòu)到NT,可以解決問題,并生成一個完整的build??截惖搅硪粋€win95和win98上,則建立失敗。失敗的原因是build過程試圖存取一個網(wǎng)絡(luò)驅(qū)動器的共享庫文件。我嘗試了所有的在VPATH里的分隔符組合,他們都可以在NT下工作。
2.6.2 為什么make沒有在我修改了BSP目錄里的文件(比如sysSerial.c)后重新生成我的工程?
A: 在Tornado里你能定義不必掃描的include目錄。其中缺省的目錄之一是BSP目錄(target\config)。如果你從不包含列表里移除它,BSP文件將出現(xiàn)在依賴列表里。在你選擇生成依賴關(guān)系后選擇"高級"按扭,會彈出一個窗口,包含一個選項"Read-only dependency path"從列表中移除.....\target\config。關(guān)閉窗口,重新生成所有的依賴關(guān)系。下次BSP文件被修改后就會正確生成了。
(From: gerard.kerkhofs@nicolet.NOSPAM.nl)
另一個解決辦法是不要刪除該項,但是用.....\target\config\comps替換它。現(xiàn)在你得到所有的BSP目錄里的文件,而不是comps目錄里的,該目錄里放置了許多標準文件。
2.6.3 我怎樣在我的工程里生成一個連接器列表(linker list)?
A: 在build屬性里的缺省連接器命令不被make采用。未了使用額外的連接選項make,把如下內(nèi)容加入到build屬性里:
Macros: Name: LD_PARTIAL_FLAGS_FOR_PARTIALIMAGE?
Value: -Wl,-Map,$(basename $(notdir $(PRJ_FILE))).link
然后修改$(PROJECT_OUT)文件rules.vxApp里的連結(jié)器命令行的LD_PARTIAL:
$(LD_PARTIAL) $(LD_PARTIAL_FLAGS_FOR_PARTIALIMAGE) \?
$(PRJ_OBJS_FOR_LD_PARTIAL) $(PRJ_LIBS) -o partialImage.o
這會在輸出目錄里生成一個linker輸出文件--
2.6.4 怎樣生成C和匯編混合文件?
A: 在你makefile文件添加如下規(guī)則:
%.out: %.o
@objdump$(TOOLENV) -S $< < $@
This will generate a file called
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
puts $fd "PRJ_DIR = [file dir??[prjInfoGet $hProj fileName]]"
This should be changed t puts $fd "PRJ_DIR = .."(With assistance from Bill Pringlemeir, bpringlemeir@yahoo.com)
2.6.5 怎樣把額外的.o文件加入到我的工程里?
A: 把文件加到宏EXTRA_MODULES。文件名用空格分開。確定在同一目錄有目標文件。它也可能把文件放到你的源文件目錄里。在宏里你應(yīng)該使用../
--??作者:lxlong
--??發(fā)布時間:2005-6-25 13:11:33
--??
2.6.6 我想使用make man在我的BSP里生成額外的文檔,但只有sysLib.c的文檔被更新了。我把我的文件加到BSP Makefile里DOC_FILES行?
A:在make環(huán)境下DOC_FILES變量沒被使用。應(yīng)該做如下改變:
1) 把你的文件和makefile里的文件加到DOC_FILES里,應(yīng)該類似下面的行:DOC_FILES = sysLib.c sysTffs.c tycoDrv.c myFile.c
2) 修改rules.x86-win32文件包含DOC_FILES變量的使用,修改如下:
from:
docs:
@echo Processing
@for %f in (sysLib sysTffs tyCoDrv) do @if exist %f.c @echo %f.c & \
??$(CPP) $(CASFLAGS) -C $(DOCFLAGS) %f.c > %f.i & \t?
docs:
@echo Processing
@for %f in ($(basename $(DOC_FILES))) do @if exist %f.c @echo %f.c & \
???? $(CPP) $(CASFLAGS) -C $(DOCFLAGS) %f.c > %f.i & \
到現(xiàn)在,我看到該問題只發(fā)生在windows平臺,unix平臺并沒有這種情況。
2.6.100 MAKEFIEL文件里的疑問?
有誰知道在$(WIND_BASE)/host/include/make/generic2.mh文件里,[! -d ./$(HOST) ]代碼的含義。請大蝦指點。
.....
objdircre:?
if [! -d ./$(HOST) ]; then \
mkdir ./$(HOST); \
fi
....
備注:
HOST=x86-win32
A:該makefile是在編譯tornado的host工具時用到的,這個判斷是在cygwin的shell中執(zhí)行,意思是如果該目錄不存在著創(chuàng)建該目錄。注意:tornado的host工具很多是用cygwin的工具編譯的,所以其風(fēng)格是unix的。(by bestracer)
2.7 工程
2.7.1 當(dāng)我修改了usrConfig.c后,我的應(yīng)用程序并沒改變,怎樣能把改變編譯到應(yīng)用程序里?
A:Tornado 2.0的工程不使用usrConfig.c,它使用配置面板,文件可以在target/config/comps下發(fā)現(xiàn),如果你喜歡用usrConfig.c,make target/config/yourBsp目錄下的 Makefile文件,就可以了。
(From: Roie Geron, roie@ecitele.com)
2.7.2 怎樣不用Tornado重新生成工程文件?
A: 使用如下命令重新生成那些bootable工程文件:
wtxtcl
2.7.3 當(dāng)我生成依賴關(guān)系時,一些依賴關(guān)系丟失了。它們不在Tornado樹中,但include目錄用-I包含和使用VPATH宏?
A:我們以前也碰到同樣的問題,你可以把#include "xxx\xxx\xxx.h"改成#include "xxx/xxx/xxx.h", 然后在試試。(From: ellin_lin@263.net)
2.8 目標機服務(wù)器
2.8.1 怎樣不用Tornado啟動target server?
A:首先創(chuàng)建一個DOS窗口的快捷方式,然后在Tornado里配置你的target server,使得它能正常啟動,并把配置窗口里的配置文本拷貝到DOS快捷方式的屬性里。即可。
(From: John Finley, john@kivala.com)
2.8.2 我的程序正常裝載需要幾秒鐘,但現(xiàn)在裝載一個小的應(yīng)用程序卻需要很長時間。我怎樣加速下載過程?
A:增加你target server的Cache容量,缺省是1M,增加容量將減少下載時間。
(From: Wade Oram, oram_w_t@ifrinternational.co.uk)
2.8.3 當(dāng)我啟動target server時,碰到WTX錯誤,告訴同步停止,我怎么修正它?
A:一個解決問題的辦法是使用遠程registry,即使你在你本機上運行target server,這可以通過使用真實IP設(shè)置遠程registry解決。
??基本上"localhost"得到存儲在Windows registry中的運行registry的機器名。主機上的WTX工具把localhost解析成127.0.0.1,并把它傳給目標機,然后目標機嘗試與127.0.0.1通信,以便符號表的同步和結(jié)束只與自己聯(lián)系而不與主機聯(lián)系。很好的特性。
??如果你的Windows主機有多個網(wǎng)口,并且目標機連在一個次要接口上,這還不足夠。機器名被解析成IP地址,否則目標機不知道。在連接目標機進行符號表同步前,你需要在目標機上使用routeNetAdd命令。
(From: Markus Mitterer, markus.mitterer@sbu1.storkgroup.com and lori@rti.com)
2.8.4 當(dāng)我在SHELL里輸入一個命令時,出現(xiàn)"The target system is not initialized yet. Can‘t roceed."
A:當(dāng)你在目標機配置項里的"Core filea"指定一個"vxWorks"文件作為核心文件(core file),該問題將解決。我指定了"vxWorks_rom"文件,并選擇了"synchronize host/target symbol table"項,它工作的很好。
2.9 Target Shell
2.9.1 當(dāng)我從我的工程里移除shell組件時,我碰到一個dosFsDevInit執(zhí)行錯誤,怎樣能不包含shell而包含DOSFS組件?
A:首先它看起來可能是wierd,后來我想起來老的dosFsLib使用在RAM中的文件名數(shù)據(jù)庫(使用HASH表),所以如果你移除任何可能連接到hashLib中的符號表,就可能不能初始化。一個可能的原因就是沒有人注意到它,因為通常都包含 INCLUDE_STAT_SYM_TBL (也是一種符號表)。所以你應(yīng)該增加 INCLUDE_STAT_SYM_TBL 或簡單的在dosFsInit前調(diào)用hashLibInit() 。
(From: Leonid Rosenboim, leonid@bitband.com)
2.9.2 在啟動windshell時,一般是通過執(zhí)行 windsh.tcl來實現(xiàn)的,我在.wind目錄下創(chuàng)建了這個文件,但它沒執(zhí)行,我什么地方做錯了?
A:沒有,這是windshell的一個bug,它不去搜索Tornado的安裝目錄,只搜索C:上的,所以你應(yīng)該把你的windsh.tcl移動到c:\.wind目錄下,它將執(zhí)行。
2.9.3 當(dāng)我ping 我的"myHost"時,shell好象丟掉許多內(nèi)存,為什么?
A:目標機上的shell為字符串分配內(nèi)存(字符串的地址被傳送給函數(shù))。shell不能決定何時可以安全的釋放內(nèi)存,所以它就把它留在那里,那塊內(nèi)存也不能重新使用。所以下次ping的時候,它又會分配內(nèi)存。
你可以試試使用一個變量:
pingaddress = "myHost"
memShow
ping pingaddress
memShow
(From: Urban Lindberg, urbanl@my-deja.com)
2.9.4 怎樣重復(fù)使用一個不斷增加的參數(shù)的命令?
A:你可以寫一個擴展的重復(fù)命令。在/target/src/usr/usrLib.c 文件里有repeat的源碼,應(yīng)該是很簡單的。
(From: Werner Schiendl,ws-news@gmx.at)
2.9.5 怎樣使用"lkup"列出2個字符的符號?
A:lkup "^[a-z][a-z]$",如果需要3個或更多,lkup "^[a-z][a-z][a-z]$"
(From: p_lavarre@my-deja.com)
2.9.6 怎樣增加SHELL的最大行長(128字符)?
A:我也碰到同樣的問題,我把一些更長的字符串放到變量里,然后在命令行里使用該命令,這樣可以突破128個字符??赡芡ㄟ^設(shè)置環(huán)境變量也可以實現(xiàn),但第一個方法更簡單。
(From: Don Small, dmsmall@sandia.gov)
2.9.7 怎樣能讓我的程序去SHELL正在使用的端口上讀數(shù)據(jù)?
A:我發(fā)現(xiàn)不用SHELL接口,掃描用戶輸入。唯一的方法是先刪除SHELL任務(wù),然后讀數(shù)據(jù),再重新生成SHELL。
/*******************************************************/
shelltid = taskNameToId("tShell");
taskDelete(shelltid);
for( ; ; )
{
??// read
}
shellInit(0,TRUE);
/*******************************************************/
(From: Mridul Gupta, mridulgupta1@yahoo.com)
2.9.8 有shell的替換程序嗎?
A:在如下地址http://www.xmission.com/~bgeer/bgsh.html: BGSH: A VxWorks Shell With Command Line Editing. 可以發(fā)現(xiàn)。
(From: Pekka Taipale, pjt@iki.fi)
2.9.9 怎樣能在我的程序中執(zhí)行SHELL命令,并使用它的輸出?
A:我寫了一個函數(shù)來實現(xiàn)該功能,它把命令作為字符串,并把執(zhí)行結(jié)果輸出到文件里。
?? -> shellToFile("ifShow","ifShow.out")
你可以按你的需求修改它。
//
//
//??This function runs a shell command and captures the output to the
//??specified file
//
extern int consoleFd;
typedef unsigned int (*UINTFUNCPTR) ();
extern "C" int shellToFile(char * shellCmd, char * outputFile)
{
int rtn;
int STDFd;
int outFileFd;
outFileFd = creat( outputFile, O_RDWR);
printf("creat returned %x as a file desc\n",outFileFd);
if (outFileFd != -1)
{
??STDFd=ioGlobalStdGet(STD_OUT);
??ioGlobalStdSet(STD_OUT,outFileFd);
??rtn=execute(shellCmd);
??if (rtn !=0)
????printf("execute returned %d \n",outFileFd);
??ioGlobalStdSet(STD_OUT,STDFd);
}
?? close(outFileFd);
?? return (rtn);
}
(From: RonnoBonno, RHNAssociates@yahoo.com)
2.9.10 怎樣檢查靜態(tài)變量?
A:在映象上執(zhí)行nmxyz,并提出變量地址,你可以隨后導(dǎo)出它的內(nèi)容。
#> nmppc vxWorks | grep ftpsActive 0023dc60 d ftpsActive
(From: Toni Kurzberger, gonozal@gmx.at)