电竞比分网-中国电竞赛事及体育赛事平台

分享

vxworks FAQ(中文)

 skywood 2006-11-03

前言(Surface):
    隨著國(guó)內(nèi)使用VxWorks的用戶(hù)越來(lái)越多,為了方便VxWorkers少走一些彎路,特別推出了中文FAQ,其中
很多的FAQ來(lái)自comp.os.vxworks和原創(chuàng)。(很多FAQ都可以在該新聞組找到英文版)  
    文檔的FAQ總共分為7大類(lèi):
1.入門(mén)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使用中的主要方面。
    文檔組織本身沒(méi)有邏輯上的關(guān)聯(lián),經(jīng)過(guò)分類(lèi),只是松散的組合在一起,可根據(jù)你的需要選擇閱讀某一部
分。
    為了保持本文檔的開(kāi)放性和可擴(kuò)充性,歡迎大家把自己曾經(jīng)碰到過(guò)的問(wèn)題及其解決辦法按分類(lèi)加到文檔
里來(lái)。在修改本文檔時(shí),請(qǐng)把修改記錄加到歷史記錄里。
    歡迎任何人指出文檔中的錯(cuò)誤之處,請(qǐng)把錯(cuò)誤之處發(fā)到附錄B里的任一個(gè)EMAIL里,在此對(duì)那些問(wèn)題的提
出者、回答者以及文檔的維護(hù)者一并表示感謝!  


當(dāng)前版本(Current Version):
version 0.1


歷史(History):
2002-08-27 wys205  create 0.1 version


目錄(Content):
1.入門(mén)FAQ
2.Tornado工具FAQ
2.1 編譯器和鏈接器
2.2 調(diào)試器
2.3 FTP
2.4 主機(jī)工具
2.5 安裝
2.6 MAKEFILE
2.7 工程
2.8 目標(biāo)機(jī)服務(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)問(wèn)題


5.網(wǎng)絡(luò) FAQ
5.1 配置問(wèn)題
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)問(wè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.維護(hù)



1.入門(mén)FAQ
1.1 概念
1.1.1 最近剛開(kāi)始學(xué)習(xí)VXWORKS,越看越迷糊:
1)BSP,bootImage,VxWorksImage三者的關(guān)系是什么?BSP是BootImage的一部分還是VxWorksImage 的一部
分?對(duì)于可以自啟動(dòng)的系統(tǒng)是不是三者合在一起生成一個(gè)VxWorks Image?
2)應(yīng)用程序代碼是和VxWorks內(nèi)核一起編譯生成一個(gè)VxworksImage嗎?
以上問(wèn)題是針對(duì)于代碼存放在rom介質(zhì)上的系統(tǒng)(如flash)。希望各位大俠不吝賜教!謝謝。。。


A:BSP 是用來(lái)支持你的硬件的軟件, 它包含在你的VxWorksImg里面.
對(duì)于ROM啟動(dòng)的系統(tǒng)來(lái)說(shuō), BootImg是ROM里代碼的第一部分, 用來(lái)
在開(kāi)機(jī)時(shí)首先運(yùn)行. 如果你的所有代碼都在ROM上, 則引導(dǎo)程序把
VxWorksImg拷貝到系統(tǒng)內(nèi)存, 然后再跳轉(zhuǎn)的系統(tǒng)內(nèi)存去執(zhí)行.


BSP的作用屏蔽不同的硬件結(jié)構(gòu)(如CPU和外圍芯片)向VxWorks的Kernel提供
它所需要的一個(gè)統(tǒng)一的接口調(diào)用(如時(shí)鐘)
(by 泡泡)


bsp: 板級(jí)支持包,主要完成目標(biāo)硬件的初始化工作,提供操作系統(tǒng)一個(gè)統(tǒng)一的接口,負(fù)責(zé)硬件操作,
如中斷處理,啟動(dòng),停止,等工作。Bootimage:引導(dǎo)鏡像,我向如果把boot翻譯成啟動(dòng)不是很是當(dāng)?shù)恼f(shuō)法,
這是一個(gè)引導(dǎo)程序,負(fù)責(zé)把目標(biāo)系統(tǒng)環(huán)境初始化,最小的程度,如啟動(dòng)了串口,或者網(wǎng)絡(luò)接口,可以使用這
些接口現(xiàn)在程序,與主機(jī)通信,然后獲取你需要的OS-vxworksimage vxworksimage-包含vxworks內(nèi)核以及
各種組件的鏡像,也就是object images,這是真正的操作系統(tǒng),通常bootimage負(fù)責(zé)獲取這個(gè)鏡像,然后跳
到鏡像所在的位置開(kāi)始執(zhí)行。(by hongwind )


1.1.2 如何學(xué)習(xí)VXWORK,PSOS入門(mén)?
A:初次上站,感覺(jué)大家水平一般,入門(mén)級(jí)選手較多,實(shí)時(shí)多任務(wù)操作系統(tǒng)和以前大家使用的低端產(chǎn)品,如51
機(jī)在原理上是不同的,因此大家最好先學(xué)習(xí)多任務(wù)操作系統(tǒng)的原理。否則無(wú)法深入學(xué)習(xí)。
推薦一本書(shū):坦尼博姆著:《操作系統(tǒng)》,各地都有的賣(mài),主要是講MINIX的原理,其實(shí)就是UNIX系列操作
系統(tǒng)的實(shí)現(xiàn)原理,由于VXWORKS和PSOS都是這個(gè)系列的操作系統(tǒng),因此理解了這本書(shū),也就理解了它們的工
作原理。必將事半功倍,而且對(duì)你理解WINDOWS的工作原理也很有好處。  (by bruin)



1.2 環(huán)境
1.2.1 斑竹tornado都是支持那些cpu??能列一下嗎或哪里能找到
斑竹tornado都是支持那些cpu??能列一下嗎或哪里能找到!?。?
A:開(kāi)發(fā)平臺(tái): 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中有些定義怎么找不到用到的地方,還有些定義找不到在哪里定義過(guò)了,比如
MAMR_PTA_SHIFT,哪位大俠給解答一下。不勝感激!
A:在h/drv/multi/ppc860Siu.h里??创a還是用Source Insight
(by vxfree)



2.Tornado工具FAQ


2.1 編譯器和鏈接器
2.1.1 當(dāng)我把多個(gè)目標(biāo)文件鏈接成一個(gè)時(shí),出現(xiàn)了一個(gè)錯(cuò)誤:
ldppc:built in linker script:43: syntax error 我怎么樣才能消除這個(gè)錯(cuò)誤?
A:請(qǐng)確定你的鏈接器使用了-r參數(shù)。
(From: weber.dirk@t-online.de)


2.1.2 我怎樣使用新版本的編譯器?
A:參看如下連接,有一個(gè)PPC的編譯器
http://www.newgcc4vxworks4ppc./


2.1.3 當(dāng)用另一個(gè)編譯器編譯代碼時(shí),得到更多的錯(cuò)誤和警告,怎樣才能讓GCC生成更多的警告信息?
A:首先用-Wall參數(shù)打開(kāi)所有警告開(kāi)關(guān);另一種生成更多報(bào)告的方法就是把文件看作是C++文件,參數(shù)為
-x c++.(From: Claudio Ortega, cortega@sinfomed.org.ar)


-Wall不能真正打開(kāi)所有的警告,我采用由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)編譯我的模塊時(shí)一切都是好的,但是當(dāng)我試圖下載時(shí)得到一個(gè)錯(cuò)誤:missing symbol "__eabi"?
A:在你的模塊里可能有個(gè)main函數(shù),根據(jù)PPC "extended Application Binary Interface" (eabi)
標(biāo)準(zhǔn),main函數(shù)必須調(diào)用__eabi函數(shù),該函數(shù)為運(yùn)行你的程序設(shè)置必要的運(yùn)行環(huán)境。
    由于這個(gè)原因GNU編譯器在main函數(shù)里插入 __eabi函數(shù)。
    Tornado不提供該函數(shù),因?yàn)樵趯?shí)時(shí)環(huán)境下,你不必寫(xiě)main函數(shù)。VxWorks在應(yīng)用程序運(yùn)行前已經(jīng)設(shè)置
好運(yùn)行環(huán)境了,不再需要main函數(shù)了。
(From: Ilia, iliab@telegate.co.il)


--  作者:lxlong
--  發(fā)布時(shí)間:2005-6-25 13:09:28

--  

2.1.5 我生成了2.95.2版本的編譯器,一切正常,但當(dāng)我開(kāi)始鏈接我的映象時(shí),出現(xiàn)了錯(cuò)誤,下面是我
鏈接ctdt表時(shí)的錯(cuò)誤:
ctdt.o(.data+0x3c):fake: undefined reference to `global constructors keyed to
_constructor_name_
... 許多類(lèi)似的錯(cuò)誤,有誰(shuí)見(jiàn)過(guò)這種錯(cuò)誤嗎?

A: 該問(wèn)題是由gcc(ver2.7.2-2.95.2)試圖改變它得到靜態(tài)構(gòu)造函數(shù)的方法引起的。它不再對(duì)每個(gè)構(gòu)造靜
態(tài)對(duì)象的模塊消除函數(shù),該方法是vxworks在編譯鏈接過(guò)程中采用的方法。
你可以按如下修改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版本的。它使得編譯器使用老的方法來(lái)making munchable constructors。
希望對(duì)你也有幫助。
(From: Dave Korn)

2.1.6 在我編譯時(shí),我在編譯窗口看到如下輸出:
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)花了很長(zhǎng)時(shí)間(半個(gè)小時(shí)),誰(shuí)有解決辦法?
A: 這個(gè)可能是munching過(guò)程,而不是鏈接,花了半小時(shí)。有人曾貼了一個(gè)小竅門(mén)來(lái)加速。
在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 怎樣定義一個(gè)沒(méi)有空洞的結(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編譯器開(kāi)關(guān)。我門(mén)最近移除了這個(gè)選項(xiàng),使得我們的C++程序提
高了30%-100%的性能。這是因?yàn)槊看未嫒〗Y(jié)構(gòu)或類(lèi)里多字節(jié)值時(shí),都是一個(gè)一個(gè)字節(jié)操作的??梢允褂?br>__attribute__ ((packed)) 方法代替。
(From: Mark Fanara, mfanara@home.cNOSPAMMom, and Francisco Pataro, fpataro@dnaent.com)


2.1.8 我怎樣在一個(gè)C程序文件里調(diào)用一個(gè)C++函數(shù)?

A: 如果你想在一個(gè)C程序文件里調(diào)用一個(gè)C++函數(shù),C++函數(shù)必須用extern "C"聲明;否則編譯器將破壞函數(shù)
名,把參數(shù)類(lèi)型說(shuō)明加在函數(shù)名末尾,并返回該函數(shù)。
(From: Dave Korn)

2.1.9 -fvolatile開(kāi)關(guān)真的需要嗎?
A: WRS建議我們?cè)诰幾gkernel/BSP時(shí),使用-fvolatile開(kāi)關(guān)。它通常缺省打開(kāi)某個(gè)target/h/make/目錄下的
文件。
    我們也在我們的應(yīng)用程序編譯過(guò)程中使用-fvolatile開(kāi)關(guān),因?yàn)槲覀儏⒖家恍﹖ornado的makefile。
當(dāng)我們移除該開(kāi)關(guān)后,就碰到一些微妙的BUG,如果你編寫(xiě)驅(qū)動(dòng)程序應(yīng)當(dāng)小心。
    -fvolatile開(kāi)關(guān)使編譯器生成非常conservative的代碼。通過(guò)指針使變量值增加(p->x++)不可能如你
想象的在一條指令里完成(68k example):

    addql #1,a0@(8)
如果采用-fvolatile 開(kāi)關(guān)你會(huì)得到:
    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)在鏈接器在解析文件之間的交叉參考時(shí)出現(xiàn)了問(wè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行太笨拙,生成一個(gè).s文件,包含每個(gè)沒(méi)定義的符號(hào)和加到鏈接里的。
4、如果你工作UNIX下,它應(yīng)該可能得到ld生成沒(méi)有定義的所要求的列表。你需要加一個(gè)循環(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下運(yùn)行。
(我也重新構(gòu)造了原始的rules.bsp內(nèi)容,我的可能與vxWorks原來(lái)的有些不同。)
(From: David Laight, dsl@tadpole.co.uk)

2.1.11 警告"trigraphs occured"是什么意思?
A: 對(duì)Tornado或Vxoworks沒(méi)什么要做的。
你可能在你代碼(也可能在注釋里)中有三字符序列--參看K&R (Kernighan & Ritchie; A12.1 - 這是
ANSI 新引進(jìn)的。-- 但是GNU手冊(cè)里提示"You don\‘t want to know about this brain-damage..."
使用-ansi或-trigraphs開(kāi)關(guān),或更好的辦法消除任何包含三字符序列\(zhòng)‘??X\‘的注釋。 (參看K&R書(shū)中對(duì)X
的定義)。
(From: Michael.Ben-Ari@ecitele.com)

2.1.12 為什么編譯的最后步驟時(shí)間這么長(zhǎng)?
生成.out步驟如下:
  1) 鏈接應(yīng)用程序和庫(kù)到partialImage.o
  2) 使用partialImage.o解析出所有靜態(tài)類(lèi)(munch)
  3) 編譯上面發(fā)現(xiàn)的(ctdt.o)
  4) 用ctdt.o鏈接第一個(gè)obj文件partialImage.o
我們的應(yīng)用程序.out文件有10M,但是多數(shù)是調(diào)試信息,size386返回只有1M。
我們的下載文件生成需要超過(guò)5分鐘,Step #1-3正常需要35秒!但是step #4 需要很多時(shí)間,整個(gè)過(guò)程需
要5分30秒。

A: 我不知道為什么這樣?但是我們?cè)趕tep #4不重新使用partialImage.o 而是重新生成它,整個(gè)過(guò)程45s.

(是ld386沒(méi)有對(duì)符號(hào)過(guò)濾進(jìn)行優(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ā)布時(shí)間:2005-6-25 13:11:03

--  

2.1.13 怎樣把一個(gè)段裝載到特定的絕對(duì)地址?
A: 我曾包含一個(gè)腳本做這些工作,最方便得到這個(gè)腳本的方法是使用--verbose開(kāi)關(guān)運(yùn)行你的鏈接器,例
如:
"ldarm --verbose". 編輯這個(gè)文件加入類(lèi)似如下的段落,
  .text  0x8000 : {
[omit]
        . = ALIGN(0x8000);
        /* Create a 8k section of all 0xffff, first value is jump. */
        FILL(0xffff);
        LONG(0xeb000004);
        . = ALIGN(0x2000);
[...]
這將把數(shù)據(jù)放到任何你想放的地方,在程序被鏈接時(shí)新的鏈接器腳本必須使用-T參數(shù)。
(From: Bill Pringlemeir, bpringlemeir@yahoo.com)

2.1.14 我在使用C++類(lèi)型的注釋時(shí),出現(xiàn)錯(cuò)誤,怎樣改變它?
A: 一種方法是移除-ansi開(kāi)關(guān)。然而,你可能希望保留你的源代碼與ANSI兼容;所以我更喜歡代碼能在每
個(gè)地方都能編譯。傳遞"-Wp,-lang-c"參數(shù)只能使CPP的注釋方法可以使用。下面來(lái)自預(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 我在編譯時(shí)碰到了關(guān)于cc1參數(shù)/選項(xiàng)的錯(cuò)誤?
A: 這個(gè)可能是由于安裝了Cygwin 或DJGPP引起的。當(dāng)該版本的編譯器在路徑里先于Tornado版本Cygwin的
GCC被調(diào)用時(shí),這個(gè)版本不知道這些參數(shù)或選項(xiàng)。這個(gè)問(wèn)題可以通過(guò)卸載該軟件或確定Tornado版本的編譯器
在路徑環(huán)境變量里是頭一個(gè)后解決。

2.2 調(diào)試器
2.2.1 我怎么使用GDB的plain版本去調(diào)試我的目標(biāo)機(jī),而不用Tornado?
A:gdb compiles \‘out of the box\‘ for vxworks.
去cygnus(sourceware.cygnus.com)下載最新的\‘insight\‘軟件,該軟件是gdb + cygnus的UI(譯者:可能是用
戶(hù)接口)運(yùn)行 "configure --target=mips-wrs-vxworks". 把mips改成你的處理器,然后運(yùn)行make.
這樣就可以在安裝了cygwin的win32平臺(tái)上運(yùn)行了,在UNIX系統(tǒng)平臺(tái)上也類(lèi)似。
RDB是windriver以前的調(diào)試協(xié)議,現(xiàn)在變成WDB了。好象沒(méi)公布wdb的比特,盡管Tornado使用了gdb。你可能
不得不配置RDB。包含RDB組件(INCLUDE_RDB) ,并移除WDB組件(remove INCLUDE_WDB),以使得調(diào)試可以進(jìn)
行。(From: Don Bowman, don@pixstream.com)

2.2.2 我怎么在創(chuàng)建一個(gè)任務(wù)后停止它,以使得我能從開(kāi)始對(duì)它進(jìn)行調(diào)試?
A: 菜單tools->options,選擇debugger頁(yè),選擇always halt after attaching a task和Auto Attach to
task -> Always
現(xiàn)在輸入一個(gè)全局?jǐn)帱c(diǎn)(Shift F9),在它碰到斷點(diǎn)后,它將從mainTask中分離。
(From: Chacha Hindustani, Gurudev@mediaone.net)

2.2.3 為什么當(dāng)我使用SHELL檢查內(nèi)存時(shí),看不到斷點(diǎn)?
A: shell是一個(gè)不可中斷的任務(wù),所以任何時(shí)間它都在運(yùn)行在無(wú)斷點(diǎn)的環(huán)境。當(dāng)任務(wù)切換引起一個(gè)中斷的任
務(wù)運(yùn)行時(shí),斷點(diǎn)將被重新安裝。所以如果查看內(nèi)存中的斷點(diǎn),只是簡(jiǎn)單使用d()或l()命令,它在一個(gè)中斷任
務(wù)中可以運(yùn)行,你將看到一個(gè)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 主機(jī)工具
2.4.1 我制作了一個(gè)基于rom的VxWorks(vxWorks_rom),但是當(dāng)我試圖用elftobin把它轉(zhuǎn)換成bin格式的
(vxworks_rom.bin),得到了如下錯(cuò)誤:
C:\\project\\Project3\\default\\elftobin <vxWorks_rom> vxWorks_rom.bin
seg1 : Expected load address 0xfff00100 but file address is 0x00111670
我怎樣才能把這個(gè)文件轉(zhuǎn)成二進(jìn)制格式?
A: 這個(gè)問(wèn)題只在PPC版本中出現(xiàn)過(guò),問(wèn)題編號(hào)為SPR#8845. 已經(jīng)有個(gè)更新版本的elftobin解決了這個(gè)問(wèn)題。
請(qǐng)聯(lián)系你的銷(xiāo)售代理或服務(wù)工程師。

2.4.2 我怎樣寫(xiě)一個(gè)WTX工具?
A: 我曾經(jīng)在Tornado 1.0.1 和Windows NT 4.0環(huán)境下寫(xiě)過(guò)一個(gè)WTX工具,按下面的例子和Tornado API參考
開(kāi)始,甚至不用關(guān)閉build.讓它獨(dú)自按我的步驟工作。就是我使用VC++6編譯,但仍有許多東西丟掉了,不
論編譯器是什么版本。我知道我能更熟練的使用路徑里的環(huán)境變量。但有時(shí)你只需要它工作,所以下面澄清
一下:
原代碼放在$(WIND_BASE)\\host\\src\\wtxtest下,我的安裝目錄或任何其它人的安裝目錄里沒(méi)有例子源碼。
按手冊(cè)源代碼按如下修改(大多是信號(hào)處理代碼修改和增加includes,其它修改在我的程序里說(shuō)明)
把下面的設(shè)置加到工程設(shè)置、 C/C++, Preprocessor:
include目錄(路徑按實(shí)際情況修改):
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è)為我的注冊(cè)位置。
許多痛苦就在發(fā)現(xiàn)這個(gè)。手冊(cè)里參考wtxEnvironSet()調(diào)用,Windsurf說(shuō)它是不存在的,但手冊(cè)為這個(gè)不存
在的函數(shù)使用提供了許多參考。我的機(jī)器上沒(méi)設(shè)置WIND_REGISTRY,所有的Tornado工具都可以不使用它而正
常工作。我的工具不能發(fā)現(xiàn)注冊(cè),設(shè)置它并關(guān)閉它(Set it and poof)!注冊(cè)發(fā)現(xiàn)了,工具可以工作。
確信起調(diào)用了wtxProbe()去檢查注冊(cè)(并且變量被設(shè)置),它可以避免許多痛苦。
我也修改那個(gè)工具例子代碼。代碼在此#代碼連接#http://www./~borkhuis/vxworks/wtxSample.c

(From: Christopher A Leddy, caleddy@west.raytheon.com)


2.4.3 當(dāng)我執(zhí)行wtxwish時(shí),碰到了一個(gè)關(guān)于init.tcl文件的錯(cuò)誤?
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) 變量,而是實(shí)際路徑。然后從你的TCL/TK目錄執(zhí)行:
wtxwish <yourTclFile>
(From: DrDiags, drdiags@flashcom.net)

2.4.4 我試圖在windows NT4.0 SP5環(huán)境下運(yùn)行Tornado2.0帶的vxsys程序,碰到一個(gè)錯(cuò)誤: "the system
try to access directly to the disk, this is not possible ....."
A: vxsys是DOS程序,不能工作windows環(huán)境下,你應(yīng)該從DOS窗口下運(yùn)行它。
(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(假定認(rèn)為你有超過(guò)2^32加密密碼)。我能
用鋼筆和紙來(lái)把它做反變換。
你也可以使用loginEncryptInstall()安裝自己的加密算法,對(duì)一個(gè)強(qiáng)密碼[1],加密知道使用密碼作為KEY。
UNIX傳統(tǒng)使用DES,但需要適當(dāng)?shù)拇a。我使用TEA參看http://vader.,因?yàn)樗遣皇芊恋K的。

[1] problematical since you have difficulty protecting the password file as none of the
vxWorks filesystems support user-ids.
(From: David Laight)


--  作者:lxlong
--  發(fā)布時(shí)間:2005-6-25 13:11:16

--  

2.5 安裝

2.5.1 當(dāng)我試圖安裝GNU源光盤(pán)時(shí),出現(xiàn)了一個(gè)關(guān)于文件aux.h的錯(cuò)誤:permission denied。但該文件并不
存在,是怎么回事?
A: 在微軟SW環(huán)境下存在這個(gè)問(wèn)題,"AUX"是保留字,所以任何以"AUX."開(kāi)頭的都不能存在。任何以設(shè)備名
開(kāi)始的文件名也是不能存在的,例如你不能打開(kāi)一個(gè)叫"LPT1.TXT"的文件。

2.5.2 在我安裝完Tornado或它的補(bǔ)丁后,我所有的C文件類(lèi)型都被移除了,而使用Tornado作為打開(kāi)該文件
的工具。我怎樣能恢復(fù)到原來(lái)的編輯器?
A:Tornado覆蓋注冊(cè)表中的實(shí)體。你可以用下面的.reg恢復(fù)。
警告:在使用這個(gè)文件前必須小心!首先讀一下該文件,如果你不理解它就不要使用它。
警告:我在windows95和NT下測(cè)試過(guò),如果有時(shí)間我會(huì)在別的的平臺(tái)測(cè)試的。如果你在98、2000下使用后可
以工作,請(qǐng)告訴我。
首先下載該文件,仔細(xì)閱讀它,修改它,使她執(zhí)行你需要的編輯器,然后執(zhí)行它。你怎么修改它?
一個(gè)方法是執(zhí)行這個(gè)文件,然后去瀏覽器View->Options->File Types.這里你可搜索"C源文件"和"C頭文件"。
修改打開(kāi)命令為你想要的?,F(xiàn)在編輯文件c-files.reg,并移除20行后的部分,第一行以
[HKEY_CLASSES_ROOT\\c_source_file]開(kāi)始。再次執(zhí)行,、將把所有文件類(lèi)型恢復(fù)成你選擇的。
另一種方法:在你的文件類(lèi)型里找到你的確省編輯器,把這行COPY到文件c-files.reg中vim行(BTW:vim
是非常好的編輯器,你可以到http://www.查詢(xún)更多信息)。
文件: c-files.reg#文件連接#http://www./~borkhuis/vxworks/c-files.reg

2.5.3 當(dāng)我每次雙擊一個(gè)文件,都打開(kāi)一個(gè)Tornado.我想所有的文件都用一個(gè)Tornado打開(kāi),怎么做?
A:是的,這是可能。下面的注冊(cè)文件將完成這個(gè)工作。
警告:在使用這個(gè)文件前必須小心!首先讀一下該文件,如果你不理解它就不要使用它。
編輯該文件,修改Tornado的安裝路徑為你機(jī)器上的安裝路徑。
文件: TornadoFileTypes.reg#文件連接#http://www./~borkhuis/vxworks/TornadoFileTypes.reg

2.5.4 能把多個(gè)CPU平臺(tái)安裝到一個(gè)目錄下嗎?
A:可以,但是需要注意幾點(diǎn):
只能把同一版本的安裝到同一目錄下。這意味著Tornado 2.0.1 for ARM不能同其它版本安裝到同一個(gè)目錄。
也不能把2.0和2.0.2混合在一起。我發(fā)現(xiàn)的唯一不兼容的是MIPS。在安裝了idts134 BSP后,下面的文件會(huì)
帶來(lái)問(wèn)題:
1)host\\resource\\tcl\\wtxcore.tcl
在最后的函數(shù)里設(shè)置tool為sfgnu替換為gnu.在if結(jié)構(gòu)里增加設(shè)置tool為sfgnu.現(xiàn)在只有MIPS這個(gè)工具變量
被改變。這樣更讓人滿(mǎn)意,如果你只使用MIPS版本它是可以工作的。
2)host\\resource\\tcl\\app-config\\Browser:
在line 138 有個(gè)目錄為obj...sfgnuvx,對(duì)其它CPU來(lái)說(shuō)它是obj...gnuvx. 問(wèn)題可以通過(guò)把這行替換為如
下行解決:
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為你處理器類(lèi)型的名稱(chēng)。

2.6 MAKEFILE
2.6.1 Make不能發(fā)現(xiàn)我自己的INCLUDE目錄?
A:在C/C++編譯選項(xiàng)里,使用-I<dir>選項(xiàng)增加目錄,現(xiàn)在在build屬性里包含如下內(nèi)容:
宏名稱(chēng):VPATH
值:$(filter-out -I.,$(filter -I%,$(CFLAGS)))
在修改了include目錄后需要更新編譯器選項(xiàng),VPATH自動(dòng)被上面規(guī)則更新。
在選項(xiàng)改變保存到工作區(qū)并確認(rèn)改變生效后,重新生成依賴(lài)關(guān)系和開(kāi)始編譯器。
Bob Baker (Bob@dskti.com)曾寫(xiě)過(guò)他關(guān)于這個(gè)問(wèn)題的經(jīng)驗(yàn):
我們?cè)谑褂肨ornado 2編譯一個(gè)應(yīng)用程序時(shí)碰到了很多問(wèn)題,如\‘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上是不兼容的。

簡(jiǎn)單拷貝包含整個(gè)應(yīng)用和工程的整個(gè)目錄結(jié)構(gòu)到NT,可以解決問(wèn)題,并生成一個(gè)完整的build??截惖搅硪?br>個(gè)win95和win98上,則建立失敗。失敗的原因是build過(guò)程試圖存取一個(gè)網(wǎng)絡(luò)驅(qū)動(dòng)器的共享庫(kù)文件。我嘗試了
所有的在VPATH里的分隔符組合,他們都可以在NT下工作。

2.6.2 為什么make沒(méi)有在我修改了BSP目錄里的文件(比如sysSerial.c)后重新生成我的工程?
A: 在Tornado里你能定義不必掃描的include目錄。其中缺省的目錄之一是BSP目錄(target\\config)。如果
你從不包含列表里移除它,BSP文件將出現(xiàn)在依賴(lài)列表里。在你選擇生成依賴(lài)關(guān)系后選擇"高級(jí)"按扭,會(huì)彈
出一個(gè)窗口,包含一個(gè)選項(xiàng)"Read-only dependency path"從列表中移除.....\\target\\config。關(guān)閉窗口,
重新生成所有的依賴(lài)關(guān)系。下次BSP文件被修改后就會(huì)正確生成了。
(From: gerard.kerkhofs@nicolet.NOSPAM.nl)
另一個(gè)解決辦法是不要?jiǎng)h除該項(xiàng),但是用.....\\target\\config\\comps替換它。現(xiàn)在你得到所有的BSP目錄里
的文件,而不是comps目錄里的,該目錄里放置了許多標(biāo)準(zhǔn)文件。

2.6.3 我怎樣在我的工程里生成一個(gè)連接器列表(linker list)?
A: 在build屬性里的缺省連接器命令不被make采用。未了使用額外的連接選項(xiàng)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
這會(huì)在輸出目錄里生成一個(gè)linker輸出文件--<Project>.link。在這個(gè)文件名字映射為原始.o文件而不是
partialImage.o。如果文件使用最終的連接命令生成,它會(huì)生成partialImage.o文件的。

2.6.4 怎樣生成C和匯編混合文件?
A: 在你makefile文件添加如下規(guī)則:
%.out:          %.o
                @objdump$(TOOLENV) -S $< < $@

This will generate a file called <file>.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
<object file>", in the first few lines the filename is given.) This is caused by the fact that
the compiler is called with the complete path of the sourcefile. This can be changed to ".." in
the Makefile. But the Makefile is generated each time the configuration is changed.
To correct this the file prj_vxApp.tcl can be changed to write ".." to the Makefile istead of
the complete path. This is done in the function makeGen. The original line in this function is:

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。文件名用空格分開(kāi)。確定在同一目錄有目標(biāo)文件。它也可能把文件放到你
的源文件目錄里。在宏里你應(yīng)該使用../<object files name>格式。這樣做的優(yōu)點(diǎn)是你能make clean或
rebuild所有文件而沒(méi)有松散你的目標(biāo)文件。


--  作者:lxlong
--  發(fā)布時(shí)間:2005-6-25 13:11:33

--  

2.6.6 我想使用make man在我的BSP里生成額外的文檔,但只有sysLib.c的文檔被更新了。我把我的文件加
到BSP Makefile里DOC_FILES行?
A:在make環(huán)境下DOC_FILES變量沒(méi)被使用。應(yīng)該做如下改變:
1) 把你的文件和makefile里的文件加到DOC_FILES里,應(yīng)該類(lèi)似下面的行:
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)在,我看到該問(wèn)題只發(fā)生在windows平臺(tái),unix平臺(tái)并沒(méi)有這種情況。


2.6.100 MAKEFIEL文件里的疑問(wèn)?
有誰(shuí)知道在$(WIND_BASE)/host/include/make/generic2.mh文件里,[! -d ./$(HOST) ]代碼的含義。
請(qǐng)大蝦指點(diǎn)。
.....
objdircre:
if [! -d ./$(HOST) ]; then \\
mkdir ./$(HOST); \\
fi
....
備注:
HOST=x86-win32


A:該makefile是在編譯tornado的host工具時(shí)用到的,這個(gè)判斷是在cygwin的shell中執(zhí)行,意思是如果
該目錄不存在著創(chuàng)建該目錄。注意:tornado的host工具很多是用cygwin的工具編譯的,所以其風(fēng)格是unix
的。
(by bestracer)

2.7 工程

2.7.1 當(dāng)我修改了usrConfig.c后,我的應(yīng)用程序并沒(méi)改變,怎樣能把改變編譯到應(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 <Tornado base>/host/src/hutils/configGen.tcl <Project>.wpj
  這個(gè)命令也可以被Tornado使用。當(dāng)配置改變時(shí),這個(gè)命令可以作為build的第一個(gè)執(zhí)行命令。
  對(duì)downloadable工程,沒(méi)有標(biāo)準(zhǔn)命令。一個(gè)修改過(guò)的configGen也可以被使用,文件名為makeGen.tcl
(連接#http://www./~borkhuis/vxworks/makeGen.tcl#),把這個(gè)文件拷貝到../host/src/hutils
目錄。Makefile文件可用如下命令生成:
wtxtcl <Tornado base>/host/src/hutils/makeGen.tcl <Project>.wpj
  請(qǐng)確認(rèn)你使用了<Project>.wpj的完整路徑。

2.7.3 當(dāng)我生成依賴(lài)關(guān)系時(shí),一些依賴(lài)關(guān)系丟失了。它們不在Tornado樹(shù)中,但include目錄用-I包含和使用
   VPATH宏?
A:我們以前也碰到同樣的問(wèn)題,你可以把#include "xxx\\xxx\\xxx.h"改成#include "xxx/xxx/xxx.h",
然后在試試。(From: ellin_lin@263.net)

2.8 目標(biāo)機(jī)服務(wù)器

2.8.1 怎樣不用Tornado啟動(dòng)target server?
A:首先創(chuàng)建一個(gè)DOS窗口的快捷方式,然后在Tornado里配置你的target server,使得它能正常啟動(dòng),并把
配置窗口里的配置文本拷貝到DOS快捷方式的屬性里。即可。
(From: John Finley, john@kivala.com)

2.8.2 我的程序正常裝載需要幾秒鐘,但現(xiàn)在裝載一個(gè)小的應(yīng)用程序卻需要很長(zhǎng)時(shí)間。我怎樣加速下載過(guò)程?
A:增加你target server的Cache容量,缺省是1M,增加容量將減少下載時(shí)間。
(From: Wade Oram, oram_w_t@ifrinternational.co.uk)

2.8.3 當(dāng)我啟動(dòng)target server時(shí),碰到WTX錯(cuò)誤,告訴同步停止,我怎么修正它?
A:一個(gè)解決問(wèn)題的辦法是使用遠(yuǎn)程registry,即使你在你本機(jī)上運(yùn)行target server,這可以通過(guò)使用真實(shí)IP
設(shè)置遠(yuǎn)程registry解決。
  基本上"localhost"得到存儲(chǔ)在Windows registry中的運(yùn)行registry的機(jī)器名。主機(jī)上的WTX工具把
localhost解析成127.0.0.1,并把它傳給目標(biāo)機(jī),然后目標(biāo)機(jī)嘗試與127.0.0.1通信,以便符號(hào)表的同步和結(jié)
束只與自己聯(lián)系而不與主機(jī)聯(lián)系。很好的特性。
  如果你的Windows主機(jī)有多個(gè)網(wǎng)口,并且目標(biāo)機(jī)連在一個(gè)次要接口上,這還不足夠。機(jī)器名被解析成IP地
址,否則目標(biāo)機(jī)不知道。在連接目標(biāo)機(jī)進(jìn)行符號(hào)表同步前,你需要在目標(biāo)機(jī)上使用routeNetAdd命令。
(From: Markus Mitterer, markus.mitterer@sbu1.storkgroup.com and lori@rti.com)

2.8.4 當(dāng)我在SHELL里輸入一個(gè)命令時(shí),出現(xiàn)"The target system is not initialized yet. Can\‘t roceed."
A:當(dāng)你在目標(biāo)機(jī)配置項(xiàng)里的"Core filea"指定一個(gè)"vxWorks"文件作為核心文件(core file),該問(wèn)題將解決。
我指定了"vxWorks_rom"文件,并選擇了"synchronize host/target symbol table"項(xiàng),它工作的很好。

2.9 Target Shell

2.9.1 當(dāng)我從我的工程里移除shell組件時(shí),我碰到一個(gè)dosFsDevInit執(zhí)行錯(cuò)誤,怎樣能不包含shell而包含
DOSFS組件?
A:首先它看起來(lái)可能是wierd,后來(lái)我想起來(lái)老的dosFsLib使用在RAM中的文件名數(shù)據(jù)庫(kù)(使用HASH表),
所以如果你移除任何可能連接到hashLib中的符號(hào)表,就可能不能初始化。
一個(gè)可能的原因就是沒(méi)有人注意到它,因?yàn)橥ǔ6及?INCLUDE_STAT_SYM_TBL (也是一種符號(hào)表)。所以
你應(yīng)該增加 INCLUDE_STAT_SYM_TBL 或簡(jiǎn)單的在dosFsInit前調(diào)用hashLibInit() 。
(From: Leonid Rosenboim, leonid@bitband.com)

2.9.2 在啟動(dòng)windshell時(shí),一般是通過(guò)執(zhí)行 windsh.tcl來(lái)實(shí)現(xiàn)的,我在.wind目錄下創(chuàng)建了這個(gè)文件,但它
沒(méi)執(zhí)行,我什么地方做錯(cuò)了?
A:沒(méi)有,這是windshell的一個(gè)bug,它不去搜索Tornado的安裝目錄,只搜索C:上的,所以你應(yīng)該把你的
windsh.tcl移動(dòng)到c:\\.wind目錄下,它將執(zhí)行。

2.9.3 當(dāng)我ping 我的"myHost"時(shí),shell好象丟掉許多內(nèi)存,為什么?
A:目標(biāo)機(jī)上的shell為字符串分配內(nèi)存(字符串的地址被傳送給函數(shù))。shell不能決定何時(shí)可以安全的釋放
內(nèi)存,所以它就把它留在那里,那塊內(nèi)存也不能重新使用。所以下次ping的時(shí)候,它又會(huì)分配內(nèi)存。
你可以試試使用一個(gè)變量:
pingaddress = "myHost"
memShow
ping pingaddress
memShow
(From: Urban Lindberg, urbanl@my-deja.com)

2.9.4 怎樣重復(fù)使用一個(gè)不斷增加的參數(shù)的命令?
A:你可以寫(xiě)一個(gè)擴(kuò)展的重復(fù)命令。在/target/src/usr/usrLib.c 文件里有repeat的源碼,應(yīng)該是很簡(jiǎn)單的。
(From: Werner Schiendl,ws-news@gmx.at)

2.9.5 怎樣使用"lkup"列出2個(gè)字符的符號(hào)?
A:lkup "^[a-z][a-z]$",如果需要3個(gè)或更多,lkup "^[a-z][a-z][a-z]$"
(From: p_lavarre@my-deja.com)

2.9.6 怎樣增加SHELL的最大行長(zhǎng)(128字符)?
A:我也碰到同樣的問(wèn)題,我把一些更長(zhǎng)的字符串放到變量里,然后在命令行里使用該命令,這樣可以突破
128個(gè)字符。可能通過(guò)設(shè)置環(huán)境變量也可以實(shí)現(xiàn),但第一個(gè)方法更簡(jiǎn)單。
(From: Don Small, dmsmall@sandia.gov)

2.9.7 怎樣能讓我的程序去SHELL正在使用的端口上讀數(shù)據(jù)?
A:我發(fā)現(xiàn)不用SHELL接口,掃描用戶(hù)輸入。唯一的方法是先刪除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./~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:我寫(xiě)了一個(gè)函數(shù)來(lái)實(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)


--  作者:lxlong
--  發(fā)布時(shí)間:2005-6-25 13:11:47

--  

2.10 Telnet
參看5.7
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.1.1 問(wèn)題關(guān)于MPC860BSP(新手上路):在讀前輩程序的時(shí)候遇到這樣一些語(yǔ)句:
lis r3, 0x0090
ori r3, r3, 0x0000 #plp=9, 50M clk
stw r3, PLPRCR(r4) #PLPRCR
不知道LIS、ORI、STW是什么語(yǔ)言?望指教!謝謝
A:是PowerPC匯編,
lis r3, 0x0090 ;放數(shù)據(jù)0x0090到r3
Rejoicer:應(yīng)該將立即數(shù)附給r3,然后左移位,注意,低位就為0
ori r3, r3, 0x0000 #plp=9, 50M clk ;后兩數(shù)之間取"或"放入前面r3
Rejoicer:r3低位或0x00(立即數(shù))
stw r3, PLPRCR(r4) #PLPRCR ;PLPRCR(r4)按位右移#PLPRCR,放入r3
Rejoicer: 將r3的內(nèi)容寫(xiě)到 地址 r4 + PLPRCR 指向的寄存器(PLPRCR寄存器)中,(估計(jì)r4放的IMMR值)

3.2.1.2 如果要在mpc860上加一個(gè)硬盤(pán),用什么方法呢? 謝謝!
A:你加一個(gè)網(wǎng)絡(luò)文件系統(tǒng),然后通過(guò)網(wǎng)絡(luò)文件系統(tǒng)可以訪問(wèn)你機(jī)器的硬盤(pán)

3.2.1.3 mpc860在下載中遇到的問(wèn)題,我用veisionice仿真器下載程序的時(shí)候,發(fā)現(xiàn)程序老是下不下去。
在檢查中,我發(fā)現(xiàn)CLKOUT只有1。25M。我用的是外圍5M晶體振蕩器,MODCK [1-2] 設(shè)置為10。[MF+1]為8。
我的主頻是40M。應(yīng)當(dāng)說(shuō)在沒(méi)有程序運(yùn)行的情況下,CLKOUT應(yīng)該為5M。這是怎么回事?請(qǐng)大家指教。
A:clkout的輸出(輸入CLK的分頻系數(shù))也是通過(guò)860的一個(gè)寄存器配置來(lái)得到的,你可以查一下860的相關(guān)
的寄存器看一下。

3.2.1.4 860中的程序調(diào)用,在860的BSP文件 romInit.s中,在程序末尾有條指令是跳轉(zhuǎn)到 romStart(),
在這之前有個(gè)計(jì)算 romstart() 入口地址的公式.
romstart入口地址= romstart - romInit + ROM_TEXT_ADRS
我對(duì)這個(gè)公式的理解不是很明白,誰(shuí)能解釋一下,在匯編里調(diào)用某個(gè)C函數(shù),那該怎么來(lái)實(shí)現(xiàn)或\\
計(jì)算跳轉(zhuǎn)地址.單獨(dú)在一個(gè)匯編程序里,我可以理解,但一個(gè)匯編調(diào)用一個(gè)C程序我糊涂了
who can help me ? thanks
A:可以這樣理解ROM_TEXT_ADRS=romInit,這樣則romstart=romstart,上述些方式為了防止ROM_TEXT_ADRS
不等于romInit情況下,還能得到正確的romstart地址. 這里不涉及C程序還是匯編程序.只是傳了一個(gè)
地址.romstart已在前面聲明為一個(gè)外部函數(shù). 原標(biāo)號(hào)只是相對(duì)地址,不信你自己跟一下,或查看一下生成
的bootrom.bin文件,分析一下機(jī)器碼你所提到的三個(gè)地址:romInit,romStart,ROM_TEXT_ADRS,其實(shí)只有
第三個(gè)是絕對(duì)地址,前兩個(gè)都只是標(biāo)號(hào),也即相對(duì)地址.在romIinit.s中由于取指令還得從NVRAM中取,
所以必須用絕對(duì)地址,那么romStart的絕對(duì)地址在哪里呢?只有算一算了,我們只知道romInit肯定是在
ROM_TEXT_ADRS所標(biāo)識(shí)的地址,而且肯定是bootRom目標(biāo)程序中的最低地址,所以romStart的絕對(duì)地址是
(romStart - romInit) + ROM_TEXT_ADRS

3.2.1.5 vxworks下,是否有api可以獲取網(wǎng)卡mac地址呢?
A1:如果是MPC860,可以試一下這個(gè)函數(shù)
char macBuffer[8]; // MAC地址
sysCpmEnetAddrGet(0, macBuffer);
或直接讀網(wǎng)卡MAC地址的寄存器.
A2:為什么一定要用api呢,
不管是860 scc 口,還是8260 Fcc口,都可以讀參數(shù)區(qū)的PADDR1_H,-M -L得到嘛,
如果你是做BSP的,一般都會(huì)從利用這個(gè)變量unsigned char sysFccEnetAddr [6]
syslib.c
A3:vxworks操作系統(tǒng)是通過(guò)BSP來(lái)了解自己的網(wǎng)口地址的,具體說(shuō)是通過(guò)系統(tǒng)函數(shù)sysCpmEnetAddrGet(),
這個(gè)函數(shù)屬于BSP的范疇,它的函數(shù)實(shí)現(xiàn)是可以修改的。


3.2.2 I960
3.2.3 MIPS
3.2.4 ARM
3.2.5 x86
3.2.4.1 請(qǐng)問(wèn)在Vxworks for x86下怎么讀取BIOS的信息,請(qǐng)教各位大俠,
在Vxworks for x86下怎么讀取目標(biāo)機(jī)BIOS的信息?我現(xiàn)在想得到目標(biāo)機(jī)的工作狀態(tài),
如目標(biāo)機(jī)CPU的溫度,以及風(fēng)扇的轉(zhuǎn)速,看門(mén)狗等。我采用的目標(biāo)機(jī)是ADLINK公司的NuPP0-760,
在系統(tǒng)啟動(dòng)時(shí),加入BIOS可以看到這些信息,但是請(qǐng)問(wèn)我如何在我自己編寫(xiě)的程序中動(dòng)態(tài)得到這些參數(shù)值?
多謝各位大俠了?。?
A:似乎比較困難。
關(guān)鍵是BIOS運(yùn)行在實(shí)模式下,而VxWorks運(yùn)行在保護(hù)模式下;并且VxWorks起來(lái)后,BIOS就不存在了。
另外我們買(mǎi)主板的時(shí)候,似乎都不帶什么主板編程手冊(cè)之類(lèi)的東西,否則直接讀寫(xiě)主板上的寄存器應(yīng)該就
可以了。(by vxfree)
我曾經(jīng)用sysinbyte()和sysoutbyte()讀BIOS中的內(nèi)容,用0X70和0X71,相關(guān)的地址你可以參考硬件手冊(cè).
(by dongdd)

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
3.7.1 關(guān)于PCIPCI總線(xiàn)上的設(shè)備怎么查找?是用pciFindDevice()函數(shù)嗎?如何映射PCI內(nèi)存?如何讀
PCI設(shè)備內(nèi)存中的內(nèi)容?謝謝
A:使用pciFindDevice查找設(shè)備;使用pciConfigInByte/Word/Long, pciConfigOutByte/Word/Long讀寫(xiě)配置
空間;修改sysLib.c::sysPhysMemDesc[]映射地址空間;使用pciIntConnect連接PCI中斷(也可以使
用intConnect)。

4.文件系統(tǒng) FAQ
4.1 Dos文件系統(tǒng)

4.1.100 如何從dos的root directory讀出的32字節(jié)中算出文件建立時(shí)間?
我現(xiàn)在用的是fat16,并可以從root directory中讀出文件最后一次修該時(shí)間的16進(jìn)制數(shù),
但是如何從這個(gè)16位的數(shù)中算出文件最后一次修改的時(shí)間,我怎么都弄不明白,
還請(qǐng)高手指教,或者相關(guān)資料去那里找?
A:32字節(jié)中,偏移量為16H的代碼意義(2字節(jié)):時(shí)間=小時(shí)*2048+分鐘*32+秒+2
偏移量為18H的代碼意義(2字節(jié)):日期=(年份-1980)*512+月份*32+日
(by zongj)

4.2 Flash文件系統(tǒng)
4.3 Floppy-disk文件系統(tǒng)
4.4 RAM-disk文件系統(tǒng)
4.5 基本文件系統(tǒng)問(wèn)題


5.網(wǎng)絡(luò) FAQ
5.1 配置問(wèn)題
5.100 如何在VxWorks下配置雙網(wǎng)卡?
A:以NE2000雙網(wǎng)卡為例
NE2000(5,0X320)和NE2000(9,0X300)
BSP如下配置:
bsp\\config.h:
    #define IO_ADRS_ENE           0x320
    #define INT_LVL_ENE           0x05

    #define IO_ADRS_ENE1          0x300
    #define INT_LVL_ENE1          0x9
    #define INT_VEC_ENE1          (INT_VEC_GET (INT_LVL_ENE1))

bsp\\confignet.h:
    #ifdef INCLUDE_ENE_END
    {0,END_ENE_LOAD_FUNC,END_ENE_LOAD_STRING,END_ENE_BUFF_LOAN, NULL, FALSE},
    {1, END_ENE_LOAD_FUNC,END_ENE_LOAD_STRING, END_ENE_BUFF_LOAN, NULL, FALSE},
    #endif /* INCLUDE_ENE_END */

bsp\\sysNe2000End.c
     if (pParamStr[0] == \‘0\‘)
         sprintf (cp, ne2000ParamTemplate,
                          IO_ADRS_ENE,
                          INT_VEC_ENE,
                          INT_LVL_ENE,
                          ENE_BYTE_ACCESS,
                          ENE_USE_ENET_PROM,
                          ENE_OFFSET);
     else if (pParamStr[0] == \‘1\‘)
         sprintf (cp, ne2000ParamTemplate,
                          IO_ADRS_ENE1,
                          INT_VEC_ENE1,
                          INT_LVL_ENE1,
                          ENE_BYTE_ACCESS,
                          ENE_USE_ENET_PROM,
                          ENE_OFFSET);

     printf ("ne2000EndLoad: %s.\\n", paramStr);
     if ((pEnd = ne2000EndLoad (paramStr)) == (END_OBJ *)ERROR)
     {
      printf ("Error: NE2000 device failed ne2000EndLoad routine.\\n");
     }

In the Project Menu, find the object name IP_MAX_UNITS, change it to 2. and build it .

使用ipAttach和usrNetIfConfig setup the second network cards.


--  作者:lxlong
--  發(fā)布時(shí)間:2005-6-25 13:12:05

--  

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.8.1 利用snmp協(xié)議開(kāi)發(fā)網(wǎng)絡(luò)管理軟件,誰(shuí)能幫忙說(shuō)一下利用snmp協(xié)議開(kāi)發(fā)網(wǎng)絡(luò)管理軟件的流程。mib這個(gè)庫(kù)
還需要自己寫(xiě)程序維護(hù)嗎?另外,是不是做網(wǎng)絡(luò)管理軟件只需要開(kāi)發(fā)一個(gè)client把網(wǎng)絡(luò)單元所有的信息收集
起來(lái)進(jìn)行分析就可以了?本人是這方面的新手。望指教!
A:MIB庫(kù)是嵌在硬件設(shè)備里的,由OEM提供,不需要自己寫(xiě)程序維護(hù),SNMP軟件開(kāi)發(fā)主要是安SNMP協(xié)議的定義編
程對(duì)硬件設(shè)備參數(shù)進(jìn)行設(shè)置(IP等),信息查詢(xún)(工作狀態(tài)..),信息接收(出錯(cuò)...)等.
一般不需要對(duì)這些信息分析,只是顯示出來(lái)即可.如一個(gè)用戶(hù)要用打印機(jī)打印,查詢(xún)打印狀態(tài),會(huì)知道該打印機(jī)
是否繁忙.如打印機(jī)不工作,會(huì)給客戶(hù)端顯示原因(塞紙等).可以為打印機(jī)設(shè)置IP,語(yǔ)言支持等.

再問(wèn):由誰(shuí)能否為我解釋一下SNMP中的OID是如何定義的?我如何得到相關(guān)的信息?
A:
OID是MIB樹(shù)上面的節(jié)點(diǎn),形如1.3.6.1.2.1.....每個(gè)數(shù)字表示MIB樹(shù)的一層,向下遞推.
MIB分兩種,一種是標(biāo)準(zhǔn)MIB,是有國(guó)際標(biāo)準(zhǔn)的MIB-1,MIB-2,可查看RFC文檔,另一種是私有MIB,有設(shè)備生產(chǎn)商定
義提供.

5.9 其它網(wǎng)絡(luò)相關(guān)問(wèn)題

5.9.100 VxWorks下ping局域網(wǎng)為何不通?
我使用Tornado2 prototyper for NT,在NT4的環(huán)境調(diào)試。已按要求安裝了ULIP,地址"90.0.0.254".建立一
個(gè)bootable Imag project,并加載了網(wǎng)絡(luò)組件,包括PING。
在shell下調(diào)試,ping "90.0.0.254",4,0      ping "90.0.0.1",4,0  均正常,但ping我的局域網(wǎng)就是不
通,沒(méi)有應(yīng)答。哪位同志幫幫我,謝謝了!  
A: ping的時(shí)候,因?yàn)樗枰猆LIP轉(zhuǎn)發(fā),要在兩邊的機(jī)器上用ROUTE ADD增加路由表,以對(duì)方的網(wǎng)卡做路由,并將
IP FORWARDING選中.(by besea)

講講我的具體設(shè)置
在TCP/IP屬性里
  我的物理網(wǎng)卡地址:168.8.8.6,子網(wǎng)掩碼:255.255.0.0     網(wǎng)關(guān)地址:168.8.8.66。
  ULIP虛擬適配器地址:90.0.0.254,子網(wǎng)掩碼:255.255.255.0 網(wǎng)關(guān)地址:168.8.8.6。(本機(jī))

在VxWork下,ping 168.8.8.66,用Sniffer抓包看到:
  source address: 90.0.0.1
destination address:      168.8.8.66
  
我試了一下,只能發(fā)包不能收包,收不到ECHO REPLAY
請(qǐng)大家?guī)兔獯鹨幌?,謝謝!(by explore)


6.VxWorks操作系統(tǒng) FAQ
6.1 C++ issues

6.1.100 請(qǐng)教Vxworks中類(lèi)的用法:
我的程序中包含如下內(nèi)容,編譯時(shí)全通過(guò),但下載時(shí)顯示
Errors while downloading D:/Tornado/target/proj/simtest/SIMNTgnu/simfun.out:
___6mytest
__$_6mytest
請(qǐng)問(wèn)各位高人如何處理.

extern"C" {
class mytest
{
public:
mytest();
~mytest();
int add(int x,int y)
{
return (x+y);
}

};
mytest tmyt;
}

A:一看你的文件名后綴是否為cpp(必須為小寫(xiě)) 去掉語(yǔ)句extern"C" ,文件后綴名改為.cpp!

6.1.101 請(qǐng)教幫主c and c++,tornado支持c and c++ ,但當(dāng)我用c++寫(xiě)好程序test.cpp,然后想在
srAppinit.c中調(diào)用我寫(xiě)好的myFuc();時(shí),不能編譯通過(guò)。但我把test.cpp改成test.c后則可以通過(guò)。這是
為什么?
A:文件后綴為.cpp時(shí)編譯器會(huì)認(rèn)為是C++文件,這樣有些定義類(lèi)型為C的函數(shù)在編譯或下載時(shí)不被認(rèn)可。
解決方法是把這些不被認(rèn)可的C類(lèi)型函數(shù)用語(yǔ)句extern "C"說(shuō)明一下為C函數(shù)就行了.


6.2 Communication problems


6.2.100 關(guān)于消息隊(duì)列(Message Queues)
我知道用msgQReseive()從隊(duì)列中接受信息,用msgQSend()向隊(duì)列發(fā)送信息。但有兩個(gè)問(wèn)題:
  1. 接收到的和發(fā)出的是什么信息?
  2. 如何接收,如何發(fā)送?  
A:使用隊(duì)列接收和發(fā)送消息前,要先創(chuàng)建一個(gè)隊(duì)列,這個(gè)隊(duì)列實(shí)際上是一個(gè)FIFO的管道。發(fā)送任務(wù)從管道的
一端發(fā)送消息,需要取得消息的任務(wù)從另一端接收消息。其中msgQReceive是一個(gè)阻塞的系統(tǒng)調(diào)用,當(dāng)隊(duì)列
中有消息時(shí),函數(shù)調(diào)用取的消息。如果沒(méi)有消息,則該任務(wù)處于等待消息的狀態(tài),直到接收到消息,才繼續(xù)
執(zhí)行。(by bruin)


6.3 中斷(Interrupt)
6.3.1 VxWorks是如何調(diào)用ISR的?
能否具體描述一下當(dāng)VxWorks收到外部中斷信號(hào)時(shí)是怎么調(diào)用中斷服務(wù)程序的?據(jù)說(shuō)是在MUX層實(shí)現(xiàn)的,正
確否?

不同的cpu處理不一定相同,你是不是說(shuō)網(wǎng)絡(luò)設(shè)備的中斷處理?(by superme )

是這樣的,比如對(duì)于一個(gè)網(wǎng)絡(luò)設(shè)備,物理層和MAC層分別由不同的CPU處理,兩個(gè)CPU之間的通信機(jī)制是靠
共享內(nèi)存,當(dāng)物理層的消息要發(fā)往MAC層的時(shí)候就先給MAC發(fā)一個(gè)中斷,MAC的CPU收到中斷后就要調(diào)用相應(yīng)
的ISR,可我現(xiàn)在只能看到MAC的ISR是在intConnect()函數(shù)里被調(diào)用,然后就看不到什么了,(我沒(méi)有物理
層的程序,只有MAC層的程序)我就是想知道當(dāng)一個(gè)外部中斷來(lái)了以后VxWorks是如何處理的,如何調(diào)用ISR
的。據(jù)說(shuō)是在MUX層里把中斷號(hào)跟ISR捆綁在一起的,可我又沒(méi)找到確切證據(jù)。哪位大俠給指點(diǎn)一下?
不勝感激!(by moonlight )

終于有個(gè)大俠給我回復(fù)了這個(gè)問(wèn)題,我將之貼出來(lái)與大家共享:

外部中斷產(chǎn)生時(shí),處理流程是:
>1。根據(jù)CPU內(nèi)部寄存器的中斷允許位決定是否響應(yīng);
>2。x86CPU根據(jù)總線(xiàn)上的中斷號(hào)查找中斷向量表,得到中斷向量;
> PowerPC只有一個(gè)外部中斷0x500,跳到0x500處執(zhí)行;
>3。CPU進(jìn)入中斷處理,執(zhí)行的是操作系統(tǒng)預(yù)先安裝的一個(gè)stub程序,
> stub負(fù)責(zé)保存中斷現(xiàn)場(chǎng)等工作,然后調(diào)用intConnect()時(shí)所
> 安裝的ISR;對(duì)于PowerPC,stub調(diào)用的是BSP中斷控制器驅(qū)動(dòng)程序的
> 一個(gè)函數(shù),這個(gè)函數(shù)查詢(xún)中斷控制器的寄存器,得到中斷號(hào),
> 再去查找中斷向量,得到的中斷向量就是intConnect()安裝的
> 函數(shù);
>4。調(diào)用ISR。返回后,stub繼續(xù)執(zhí)行,恢復(fù)中斷現(xiàn)場(chǎng)。結(jié)束中斷。
>
>對(duì)于END driver,它有函數(shù)xxEndLoad()和xxEndStart()。
>MUX則有函數(shù)muxDevLoad()和muxDevStart()。系統(tǒng)(BSP)在
>初始化的時(shí)候調(diào)用過(guò)程是:
> muxLibInit();
> muxDevLoad(xxEndLoad,...);
> muxDevStart(pXxEndObj);
>
>在muxDevLoad()時(shí),會(huì)調(diào)用到xxEndLoad,并通過(guò)字符串傳遞參數(shù),
>xxEndLoad初始化一個(gè)END設(shè)備;
>在muxDevStart()時(shí),會(huì)調(diào)用到xxEndStart,在xxEndStart里會(huì)
>進(jìn)行intConnect, intEnable等工作。
>
>過(guò)程是這樣的。嚴(yán)格來(lái)說(shuō),并不是在mux層的代碼里鏈接中斷,而是
>在END driver中完成的。mux并不和任何硬件直接聯(lián)系。
(by moonlight )

6.3.2 請(qǐng)教中斷問(wèn)題,偶用ADS測(cè)試ARM中斷式,當(dāng)有IRQ中斷產(chǎn)生時(shí),程序轉(zhuǎn)到中斷入口0x18處
0x00000018: B IRQ_Handler卻不跳轉(zhuǎn)到中斷服務(wù)程序IRQ_Handler處,可能是什么原因請(qǐng)大俠指點(diǎn)!
注:中斷已經(jīng)enable
A:這很有可能是中斷和中斷程序沒(méi)有綁定在一起
再問(wèn):
偶程序里有一個(gè)Install_Handler不知道算不算是綁定,偶是菜鳥(niǎo),請(qǐng)多多指點(diǎn)。謝謝!
unsigned Install_Handler (unsigned routine, unsigned *vector)

{ unsigned vec, oldvec;
vec = ((routine - (unsigned)vector-0x8)>>2);
if (vec & 0xff000000)
{
printf ("Installation of Handler failed");
exit(1);
}
vec = 0xea000000 | vec;
oldvec = *vector;
*vector = vec;
return (oldvec);
}
A:用下面方法查一下
1)確定一下是否中斷發(fā)生,在中斷發(fā)生時(shí),查中斷標(biāo)志寄存器INTST1中相應(yīng)的IRQ為是否置1,
或用示波器量該IRQ管腳。有中斷產(chǎn)生且中斷enable,就應(yīng)該執(zhí)行相應(yīng)的ISR。
2)如上面沒(méi)有問(wèn)題,仍不執(zhí)行,再查一下是否有比該IRQ等級(jí)更高的中斷持續(xù)發(fā)生屏蔽了該IRQ中斷。
特別要注意一些FIQ中斷,在ARM中FIQ中斷永遠(yuǎn)高于IRQ,可能會(huì)導(dǎo)致IRQ中斷不被執(zhí)行。
在中斷屏蔽寄存器INTMR1中屏蔽所有優(yōu)先級(jí)高于該IRQ的FIQ,會(huì)disable這些FIQ.


--  作者:lxlong
--  發(fā)布時(shí)間:2005-6-25 13:12:45

--  

希望這些對(duì)你有所幫助
6.4 LoadModule problems
6.5 pthreads
6.6 Reboot
6.7 Semaphores
6.8 Simulator
6.8.1 在simulator環(huán)境里如何模擬中斷??
我想在simulator環(huán)境下,寫(xiě)一個(gè)ISR程序,但是無(wú)法模擬中斷的產(chǎn)生。不知有何解決辦法。
TIA (by wys205)
A:vxworks下的ISR程序:
參考我寫(xiě)的一個(gè)程序,另外需要另一個(gè)程序向simulator窗口發(fā)消息。
如果需要這個(gè)程序,請(qǐng)發(fā)mail。

#include "vxWorks.h"
#include "intLib.h"
#include "iv.h"
#include "taskLib.h"
#include "logLib.h"
#include "stdio.h"
#include "semLib.h"

void myISR(int);
void myTask();

SEM_ID myBinary;

#define MY_INUM 0xC011 /* Windows message, in fact */

/*-----------------------------------------------------------------------*/
void vxmain()
{
printf("inum = 0x%x, ivec = 0x%x\\n", MY_INUM, INUM_TO_IVEC(MY_INUM));

myBinary = semBCreate(SEM_Q_FIFO, SEM_EMPTY);

taskSpawn("tMyTask", 80, 0, 20000, (FUNCPTR)myTask,
0,0,0,0,0,0,0,0,0,0);

if (intConnect((VOIDFUNCPTR *)INUM_TO_IVEC(MY_INUM),
(VOIDFUNCPTR)myISR, 0) != OK)
perror("intConnect()");
}

/*-----------------------------------------------------------------------*/
void myISR(int param)
{
logMsg("task is %s\\n", (int)taskName((int)taskIdCurrent), 0, 0, 0, 0, 0);

semGive(myBinary);
}

void myTask()
{
int count = 0;

while (1) {
semTake(myBinary, WAIT_FOREVER);
printf("myTask: semaphore taken, count = %d\\n\\n", count++);
}
}

(by vxfree)

向simulator發(fā)送消息的程序:
哈哈,我已經(jīng)試成功了,原來(lái)向simulator發(fā)送消息如此簡(jiǎn)單,請(qǐng)vxfree指正。
void CAboutDlg::OnButton1()
{
// TOD Add your control notification handler code here
HWND hwnd ;
hwnd= ::FindWindow(NULL,"VxWorks Simulator for Windows");

if(hwnd!=NULL)
::SendMessage (hwnd,0xC011,0,0);

}

(by wys205)
6.8.2 vxworks中文件操作異常區(qū)區(qū)最近正學(xué)vxworks,編譯一例子,通過(guò),在tornado下仿真運(yùn)行,系統(tǒng)
提示異常發(fā)生。文件如下,哪位兄臺(tái)可以提示一下?謝謝

.......
int teststdio()
{
char buffer[10];
char *tn = "tmpxxx"; //是不是這里的問(wèn)題?
FILE *pf = NULL;
int result = 0;
/*fpos_t fp1;
long off;*/

/* opening a file for both reading and writing */
result += ASSERT((pf = fopen(tn, "w+")) != NULL);

/* closing the file */
result += ASSERT(fclose(pf) == 0);

/* reopening the file and attaching the standard input stream to the file */
result += ASSERT(freopen(tn, "r", stdin) == stdin);
.....
/


A:char *tn = "tmpxxx"; //是不是這里的問(wèn)題?
你沒(méi)指定文件所在的設(shè)備,
simNT環(huán)境里,一般設(shè)備為"host:"
所以格式為char *tn="host:/myFile";
(by wys205)

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.13.100 問(wèn)一下在vxworks里面如何看ErrNo的解釋, 謝謝
A:
-> printErrno(0x0001)
0x1 = S_errno_EPERM
value = 0 = 0x0
-> malloc(0x7fffffff)
value = 0 = 0x0
-> printErrno
0x110001 = S_memLib_NOT_ENOUGH_MEMORY
value = 0 = 0x0
(by vxfree)

6.14 VxWorks AE issues


6.15 I/O 操作
6.15.1 查看serial device的狀態(tài),又是異常!
文件如下,注釋有它的說(shuō)明,編譯后,在shell輸入:
-> pDevHdr = iosDevFind ("/tyCo/0",0)
Exception number 0: Task: 0x4bbc8e8 (t1)

General Protection Fault
Program Counter: 0x0041eba5
Status Register: 0x00010202

還是想得到各位兄臺(tái)的指點(diǎn),謝謝!
......
void tyShow
(
TY_DEV * pTyDev
)
{
/* read - ring buffer and semaphores */
printf ("Address of pTyDev->rdBuf = 0x%08x.\\n", &pTyDev->rdBuf);
printf ("Address of pTyDev->rdSyncSem = 0x%08x.\\n", &pTyDev->rdSyncSem);
printf ("Address of pTyDev->mutexSem = 0x%08x.\\n\\n", &pTyDev->mutexSem);

/* rdState */
printf ("pTyDev->rdState.xoff = 0x%02x.\\n", pTyDev->rdState.xoff);
printf ("pTyDev->rdState.pending = 0x%02x.\\n", pTyDev->rdState.pending);
printf ("pTyDev->rdState.canceled = 0x%02x.\\n", pTyDev->rdState.canceled);
printf ("pTyDev->rdState.canceled = 0x%02x.\\n", pTyDev->rdState.canceled);

/* write - ring buffer and semaphores */
printf ("Address of pTyDev->wrtBuf = 0x%08x.\\n", &pTyDev->wrtBuf);
printf ("Address of pTyDev->wrtSyncSem = 0x%08x.\\n\\n", &pTyDev->wrtSyncSem);

.....

A:
->buf=malloc(100)
->pDevHdr=iosDevFind("/tyCo/0", buf)
(by vxfree)


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


--  作者:lxlong
--  發(fā)布時(shí)間:2005-6-25 13:13:38

--  

7.10 其它
7.10.1 VxWorks下編程的幾個(gè)誤區(qū)。(by vxfree)
1)Tornado使用標(biāo)準(zhǔn)C語(yǔ)言嗎?為什么沒(méi)有提供inb(), outb()等函數(shù)?
  Tornado缺省使用GNU編譯器,支持ANSI/ISO C, C++,以及AT&T語(yǔ)法匯編(非Intel)。由于C++很龐大,
而且在不斷發(fā)展,所以有些標(biāo)準(zhǔn)C++的特征可能GNU不支持(基本沒(méi)有編譯器支持所有C++特征)。程序員一
般只要掌握常用部分就能編出不賴(lài)的程序了。inb(),outb()是Turbor C/DOS下的,不屬于標(biāo)準(zhǔn)C。Tornado在
BSP中提供了相應(yīng)的sysInByte(),sysOutByte()等函數(shù),參考BSP下的sysALib.s。
(我看到前兩年的2級(jí)C語(yǔ)言還在考DOS操作。sigh 我擔(dān)心B.Gate會(huì)考滿(mǎn)分,而D.Ritchie不及格)

2) VxWorks下怎么訪問(wèn)A:盤(pán),C:盤(pán)(PC機(jī)環(huán)境)?
A:,C:是M$對(duì)PC機(jī)設(shè)備的命名方式,目的是讓傻瓜用戶(hù)方便理解。 VxWorks下叫/fd0和/ata0。

3)目標(biāo)機(jī)沒(méi)有鍵盤(pán)和顯示器,printf()打印到哪里去了?
  打印到標(biāo)準(zhǔn)輸出設(shè)備上了。至于標(biāo)準(zhǔn)設(shè)備是什么,如果你用PC終端,就到屏幕上;否則到系統(tǒng)中第一個(gè)串
口去;還有可能被重定向到別的設(shè)備上了,比如磁盤(pán)文件或telnet端口。如果什么都沒(méi)有,打印的字符串被
丟棄。
  C語(yǔ)言中,3個(gè)標(biāo)準(zhǔn)設(shè)備的文件描述符為STD_IN, STD_OUT, STD_ERR;文件指針為stdin, stdout, stderr;
C++中有cin, cout, cerr對(duì)象。

4) 怎么在VxWorks下用(段:偏移地址)方式訪問(wèn)端口?
VxWorks for X86工作在保護(hù)模式下,應(yīng)用程序不用關(guān)心段的存在。直接用線(xiàn)性地址訪問(wèn)即可,例如:
*(unsigned short *)0xb8000 = 0xAA55; 可以訪問(wèn)Video RAM。
(8086,DOS真是害人的玩藝兒,是不是現(xiàn)在大學(xué)里還在教)

5) 在中斷服務(wù)程序(ISR)中調(diào)用printf()打印調(diào)試信息。
程序死機(jī)是正常的,沒(méi)有燒壞硬件算幸運(yùn)的了。VPG里規(guī)定了哪些函數(shù)是可以調(diào)用的。關(guān)鍵是printf()會(huì)引
起任務(wù)阻塞,而中斷不是任務(wù)。可以用logMsg()。

6)不用I/O函數(shù),寫(xiě)匯編直接訪問(wèn)串口。
最好使用open()/close(),read()/write()訪問(wèn)串口。這樣程序不依賴(lài)于硬件,好移植。有人對(duì)移植性不以
為然,實(shí)際上老板們都希望以前的程序不用改就能重用,尤其是老程序已經(jīng)通過(guò)嚴(yán)格測(cè)試,并經(jīng)過(guò)了實(shí)踐檢
驗(yàn)。
如果你的程序沒(méi)有移植性需求,可能的原因有:
     - 程序太爛,不值得移植,不如重寫(xiě);
     - 程序太亂,且缺少文檔,沒(méi)辦法移植;(可以讓老板不敢炒你魷魚(yú);))
     - 產(chǎn)品在市場(chǎng)上慘敗,公司已決定不再開(kāi)發(fā)類(lèi)似產(chǎn)品,可能要大規(guī)模裁員。

有人認(rèn)為自己寫(xiě)專(zhuān)用驅(qū)動(dòng)效率高,靈活。錯(cuò)了!
效率高是因?yàn)楣δ苋酢榱俗岒?qū)動(dòng)和APP交換數(shù)據(jù),你必須設(shè)計(jì)類(lèi)似ring-buffer的數(shù)據(jù)結(jié)構(gòu)并使用信號(hào)量機(jī)
制;為了支持同時(shí)監(jiān)視多個(gè)串口,必須設(shè)計(jì)類(lèi)似select的機(jī)制;必須管理所有串口的細(xì)節(jié)。最后發(fā)現(xiàn),你不
過(guò)是在從頭發(fā)明輪子。
串口是一種古老而緩慢的通信方式,指望在它身上擠出一點(diǎn)效率,我看不出有什么實(shí)際意義。如果速度實(shí)在
不夠,也許你應(yīng)該選用USB。
open()/close()函數(shù)是C程序員都應(yīng)該會(huì)用的,而專(zhuān)用驅(qū)動(dòng)接口只有你自己會(huì)用。不要因?yàn)椴粫?huì)使用I/O函數(shù),
就犧牲多數(shù)人的靈活性以換取少數(shù)人的靈活性??赡苣銓?duì)8250或SCC很熟,但別指望每個(gè)人都是。有可能在
另外一種硬件環(huán)境下的串口你也不懂。

7)分不清fopen(),fread()和open(),read()的區(qū)別。
fwrite等是帶緩沖的,最好別用在串口或音頻等設(shè)備上。寫(xiě)串口的意思是希望串口立即把數(shù)據(jù)發(fā)送出去,而
不是放在緩沖區(qū)中。另外,工作在LINE_MODE下的串口驅(qū)動(dòng)本身就具有緩沖能力。

8)反復(fù)查詢(xún)標(biāo)志變量以確定等待的事件或超時(shí)發(fā)生。
最沒(méi)有效率的做法。盡量使用信號(hào)量、select()或watchdog。只有在特殊情況下,例如硬件不支持中斷,或
延遲一小段時(shí)間,才有理由這樣做。

9)在程序中頻繁調(diào)用malloc()/free()。
   桌面系統(tǒng)和嵌入式系統(tǒng)的一個(gè)很大區(qū)別是,桌面系統(tǒng)的user是人,人對(duì)系統(tǒng)實(shí)時(shí)性,穩(wěn)定性要求相對(duì)并不
高。程序死機(jī)時(shí),大不了結(jié)束進(jìn)程或重新關(guān)機(jī)開(kāi)機(jī)。嵌入式系統(tǒng)的user基本上是大系統(tǒng)中的其它部分,實(shí)時(shí)
性或穩(wěn)定性不好會(huì)導(dǎo)致重要數(shù)據(jù)丟失,甚至發(fā)生重大事故。衛(wèi)星在天上飛時(shí),如果系統(tǒng)癱瘓,遙控系統(tǒng)都失
靈了,你總不能親自爬上去關(guān)機(jī)開(kāi)機(jī)吧。(不過(guò)象這種系統(tǒng)都有備份,出錯(cuò)時(shí)可以啟動(dòng)備份系統(tǒng))。
  VxWorks是實(shí)時(shí)操作系統(tǒng),并不表示你寫(xiě)的程序就一定是實(shí)時(shí)的。malloc()/free()非常靈活,但它每次需
要進(jìn)行搜索算法,需要的時(shí)間是不確定的。另外它導(dǎo)致內(nèi)存碎片,導(dǎo)致性能下降或內(nèi)存不足,寫(xiě)得差的程序
還可能發(fā)生內(nèi)存泄漏或懸空指針。
  實(shí)時(shí)性要求高的應(yīng)用,或多或少都會(huì)采用靜態(tài)分配,即在程序中事先定義好可能需要的全部變量,或者在
程序啟動(dòng)時(shí)一次分配好,以后就不再分配/釋放了,或者是寫(xiě)專(zhuān)用的內(nèi)存管理函數(shù)。利用率和靈活性是差了些
,得到的是性能。
  在風(fēng)河公司的另一款基于OSEK/VDX的操作系統(tǒng)OSEKWorks中,你甚至不能在程序中創(chuàng)建任務(wù),分配資源。所
有都在編譯前靜態(tài)指定。OSEKWorks主要用于汽車(chē)工業(yè)。試想malloc()返回NULL的情況,你還能怎么辦呢?
方向盤(pán)附近有個(gè)顯示面板,倒可以在上面打印:
"內(nèi)存不足,請(qǐng)關(guān)閉部分任務(wù)或稍后再試!"可能開(kāi)車(chē)子的還沒(méi)有看到這個(gè)提示就已經(jīng)車(chē)毀人亡了。

7.10.2 各位大俠: 我的程序?qū)懞昧?,系統(tǒng)如何啟動(dòng)我的應(yīng)用程序。tornado 2 幫助里有這一段:
Linking the application with VxWorks is really a two-step process. You must add an entry point
to the application in usrConfig.c, and you must modify the makefile to link the application
statically with VxWorks.

To start your application during system initialization, add code to the usrRoot( ) routine in
usrConfig.c. You can call application initialization routines, create additional I/O devices,
spawn application tasks, and so on, just as you do from the Tornado shell during development.
An example is provided in usrConfig.c. This file includes and initializes a simple demo if the
preprocessor constant INCLUDE_DEMO is defined in one of the configuration files. In that
situation, usrRoot( ) spawns usrDemo( ) as a task as the last step in booting the system. You
can simply insert the appropriate initialization of your application after the conditional
code to start the demo. For example:

/* spawn demo if selected */
#if defined(INCLUDE_DEMO)
taskSpawn ("demo", 20, 0, 2000, (FUNCPTR)usrDemo, 0,0,0,0,0,0,0,0,0,0);
#endif
taskSpawn ("myMod", 100, 0, 20000, (FUNCPTR)myModEntryPt,
0,0,0,0,0,0,0,0,0,0);
To include your application modules in the bootable system image, add the names of the
application object modules (with the .o suffix) to MACH_EXTRA in Makefile. For example, to
link the module myMod.o, add a line like the following:

MACH_EXTRA = myMod.o
...
Building the system image with the application linked in is the final part of this step. In
the target directory, execute the following command:

make vxWorks

  按上面的步驟,我用tornado 2的rebuild All命令生成vxWorks,考到硬盤(pán)里通過(guò)bootrom.sys
啟動(dòng)vxWorks;vxWorks啟動(dòng)了,可我的應(yīng)用沒(méi)有。各位大俠,如何啟動(dòng)應(yīng)用程序呢? 請(qǐng)指點(diǎn)。
小弟非常感謝!
※ 作 者: zhangjiaxue 02-8-21 18:09:18 ※

Re:哪位大俠做過(guò)把應(yīng)用綁定到vxWorks系統(tǒng)去 <--- 〖回復(fù)該帖子〗

1).在啟動(dòng)系統(tǒng)時(shí)啟動(dòng)用戶(hù)定制的任務(wù)
  假設(shè)有一個(gè)MultiTask.c的程序,該程序使用消息隊(duì)列來(lái)傳遞不同task之間的消息,其中:主task為Init,
負(fù)責(zé)建立兩個(gè)從task,監(jiān)控和傳遞推出消息,并釋放從進(jìn)程需要的資源。
  將此文件加入到制作vxworks的工程中(注意這里的MultiTask.c同樣不能放在帶空格的路徑下),
修改usrAppInit.c,在開(kāi)頭加入:
extern void Init(void);
在函數(shù)結(jié)束前加入:
Init();
重新編譯生成vxworks,重啟目標(biāo)機(jī),可以看到任務(wù)自動(dòng)執(zhí)行。

2).關(guān)于usrconfig.c
  有些幫助文件中提到可以修改c:\\tornado\\target\\config\\all\\usrconfig.c中的usrRoot函數(shù)來(lái)改變啟動(dòng)
畫(huà)面和啟動(dòng)用戶(hù)任務(wù)。但在vxworks的faq中提到:"Tornado2.0不使用usrconfig.c,而是用
target\\config\\comps下的 configulettes,如果需要使用usrconfig,必須"make"
c:\\tornado\\target\\config\\pentiumpro下的makefile文件。事實(shí)上,在幫助文件里大量地提到了修改
usrconfig,例如在不通過(guò)網(wǎng)絡(luò)而是從rom啟動(dòng)vxworks,使用flash ram等。
實(shí)際上就tornado2.0來(lái)說(shuō),分為兩種情況:
<1>用戶(hù)自己建立的bootable image
這時(shí)不使用usrconfig,用戶(hù)通過(guò)對(duì)工程可視化的修改,就可以裁減內(nèi)核。如果在project里面去掉了默認(rèn)
的dependence,可以看到target\\config\\comps下的一些*.c,*.h文件其實(shí)是被引用的。通過(guò)對(duì)它們的修改,
可以起到類(lèi)似于修改usrconfig.c的作用,編譯時(shí)使用的是系統(tǒng)自動(dòng)在工程所在目錄下產(chǎn)生的makefile,
對(duì)這個(gè)makefile的修改將不會(huì)產(chǎn)生作用。
<2>系統(tǒng)默認(rèn)的bootable image
這時(shí)使用安裝時(shí)自帶usrconfig。用于通過(guò)對(duì)configAll.h和config.h中define或undef宏INCLUDE_XXX來(lái)
裁減內(nèi)核。這時(shí)對(duì)啟動(dòng)化面的修改是通過(guò)對(duì)usrconfig.c的修改實(shí)現(xiàn)的。用戶(hù)定制任務(wù)如下實(shí)現(xiàn)。: 在
#else
#if defined(INCLUDE_DEMO) /* create demo w/o shell */
taskSpawn ("demo", 20, 0, 2000, (FUNCPTR)usrDemo, 0,0,0,0,0,0,0,0,0,0);
#endif /* mips cpp no elif */
#endif /* INCLUDE_SHELL */
后面添加
taskSpawn("tInit", 1, 0, 10000, (FUNCPTR)Init, 0,0,0,0,0,0,0,0,0,0);
這里使用的是c:\\tornado\\target\\config\\bspname下的makefile。
定制任務(wù)還需要在makefile里添加:
MACH_EXTRA = MultiTask.o
  這個(gè)MultiTask.o是在另外一個(gè)downloadable application project里編譯產(chǎn)生的。這個(gè)project里僅含有
一個(gè)MultiTask.c,將MultiTask.o拷貝到c:\\tornado\\target\\config\\bspname下供makefile使用??梢詤?br>照下面vxWorks.st_rom的產(chǎn)生方法產(chǎn)生一個(gè)可以standalone的vxWorks.st,也可以在tornado集成環(huán)境中選
擇toolsèoptionsèprojectèshow Tornado1.0.1 menu items(如果安裝時(shí)選擇使用tornado1.0,則這個(gè)選項(xiàng)
默認(rèn)被選中),然后選擇builtèstandard bsp buildsèpcPentiumPro、vxWorks.st,這兩種方法生成的
vxWorks.st都在c:\\tornado\\target\\config\\bspname目錄下。

附錄A.一些有用的連接

中文:
http://bbs./
http://www./
http://drew.diy.163.com/    drew大蝦的個(gè)人主頁(yè)


英文:
http://www./~borkhuis/vxworks/vxworks.html  
(Johan Borkhuis的個(gè)人主頁(yè),本文中的FAQ大部分來(lái)自于該站點(diǎn))
http://groups.google.com/groups?hl=zh-CN&lr=&ie=UTF-8&group=comp.os.vxworks
(VxWorks最熱的新聞組)
Electronic Engineers\‘ Toolbox http://www./real/vxworks.htm
BGSH: A VxWorks Shell With Command Line Editing http://www./~bgeer/bgsh.html
Dave Korns page about updating GCC for the PPC http://www.newgcc4vxworks4ppc./
Embry-Riddle VxWorks 5.3(Tornado) Real-Time Laboratory Experiments
http://www.rt.db./experiments/vx/toc/TableOfContents.html
Introduction into realtime systems http://www./RealtimeMantra/default.htm
Unofficial VxWorks FAQ, by Hwa Jin Bae, http://www./~borkhuis/vxworks/vxfaq.html
VxWorks Exploder mailing list http://www-csg./vxworks/
WindRiver Systems http://www./
Development examples of some realtime systems. http://www./ThoughtProjects
Instructions on how to build the ACE library for VxWorks:
http://www./it/download_documents.htm
Article on memory testing http://www./Articles/MemoryTesting/
Building NTP for VxWorks http://chard.tuc./mpg/ntp/ntp.to.vxworks.html
VxWorks Under Linux http://chard.tuc./mpg/vxworks/linuxHostingVx.html


附錄B.維護(hù)

wys205 wys205@sina.com  SuccessIT Co..Ltd
vxfree vxfree@sina.com 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多