歡迎您光臨本站 登入註冊首頁

VxWorks中文FAQ

admin @ 2014-03-25 , reply:0

概述

前言(Surface):   隨著國內使用VxWorks的用戶越來越多,為了方便VxWorkers少走一些彎路,特別推出了中文FAQ,其中很多的FAQ來自comp.os.……

前言(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.3 Bootstrap
3.4 配置你的VxWorks
3.5 VME
3.6 VxWorks環境 environment
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

附錄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.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)

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 into: $(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)

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 context switch 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)

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.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中執行,意思是如果該目錄不存在著創建該目錄。注意:tornado的host工具很多是用cygwin的工具編譯的,所以其風格是unix的。
(by bestracer)


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.1.1 問題關於MPC860BSP(新手上路):在讀前輩程序的時候遇到這樣一些語句:
lis r3, 0x0090
ori r3, r3, 0x0000 #plp=9, 50M clk
stw r3, PLPRCR(r4) #PLPRCR
不知道LIS、ORI、STW是什麼語言?望指教!謝謝
A:是PowerPC彙編,
lis r3, 0x0090 放數據0x0090到r3
Rejoicer:應該將立即數附給r3,然後左移位,注意,低位就為0
ori r3, r3, 0x0000 #plp=9, 50M clk 后兩數之間取"或"放入前面r3
Rejoicer:r3低位或0x00(立即數)
stw r3, PLPRCR(r4) #PLPRCR PLPRCR(r4)按位右移#PLPRCR,放入r3
Rejoicer: 將r3的內容寫到 地址 r4   PLPRCR 指向的寄存器(PLPRCR寄存器)中,(估計r4放的IMMR值)

3.2.1.2 如果要在mpc860上加一個硬碟,用什麼方法呢? 謝謝!
A:你加一個網路文件系統,然後通過網路文件系統可以訪問你機器的硬碟

3.2.1.3 mpc860在下載中遇到的問題,我用veisionice模擬器下載程序的時候,發現程序老是下不下去。
在檢查中,我發現CLKOUT只有1。25M。我用的是外圍5M晶體振蕩器,MODCK [1-2] 設置為10。[MF 1]為8。
我的主頻是40M。應當說在沒有程序運行的情況下,CLKOUT應該為5M。這是怎麼回事?請大家指教。
A:clkout的輸出(輸入CLK的分頻係數)也是通過860的一個寄存器配置來得到的,你可以查一下860的相關的寄存器看一下。

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

3.2.1.5 vxworks下,是否有api可以獲取網卡mac地址呢?
A1:如果是MPC860,可以試一下這個函數
char macBuffer[8]; // MAC地址
sysCpmEnetAddrGet(0, macBuffer);
或直接讀網卡MAC地址的寄存器.
A2:為什麼一定要用api呢,
不管是860 scc 口,還是8260 Fcc口,都可以讀參數區的PADDR1_H,-M -L得到嘛,如果你是做BSP的,一般都會從利用這個變數unsigned char sysFccEnetAddr [6]
syslib.c
A3:vxworks操作系統是通過BSP來了解自己的網口地址的,具體說是通過系統函數sysCpmEnetAddrGet(),這個函數屬於BSP的範疇,它的函數實現是可以修改的。


3.2.2 I960
3.2.3 MIPS
3.2.4 ARM
3.2.5 x86
3.2.4.1 請問在Vxworks for x86下怎麼讀取BIOS的信息,請教各位大俠,
在Vxworks for x86下怎麼讀取目標機BIOS的信息?我現在想得到目標機的工作狀態,如目標機CPU的溫度,以及風扇的轉速,看門狗等。我採用的目標機是ADLINK公司的NuPP0-760,在系統啟動時,加入BIOS可以看到這些信息,但是請問我如何在我自己編寫的程序中動態得到這些參數值?
多謝各位大俠了!!
A:似乎比較困難。
關鍵是BIOS運行在實模式下,而VxWorks運行在保護模式下;並且VxWorks起來后,BIOS就不存在了。
另外我們買主板的時候,似乎都不帶什麼主板編程手冊之類的東西,否則直接讀寫主板上的寄存器應該就可以了。(by vxfree)
我曾經用sysinbyte()和sysoutbyte()讀BIOS中的內容,用0X70和0X71,相關的地址你可以參考硬體手冊.
(by dongdd)

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
3.7.1 關於PCIPCI匯流排上的設備怎麼查找?是用pciFindDevice()函數嗎?如何映射PCI內存?如何讀PCI設備內存中的內容?謝謝
A:使用pciFindDevice查找設備;使用pciConfigInByte/Word/Long, pciConfigOutByte/Word/Long讀寫配置空間;修改sysLib.c::sysPhysMemDesc[]映射地址空間;使用pciIntConnect連接PCI中斷(也可以使用intConnect)。

4.文件系統 FAQ
4.1 Dos文件系統

4.1.100 如何從dos的root directory讀出的32位元組中算出文件建立時間?
我現在用的是fat16,並可以從root directory中讀出文件最後一次修該時間的16進位數,但是如何從這個16位的數中算出文件最後一次修改的時間,我怎麼都弄不明白,還請高手指教,或者相關資料去那裡找?
A:32位元組中,偏移量為16H的代碼意義(2位元組):時間=小時*2048 分鐘*32 秒 2偏移量為18H的代碼意義(2位元組):日期=(年份-1980)*512 月份*32 日
(by zongj)
 

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.8.1 利用snmp協議開發網路管理軟體,誰能幫忙說一下利用snmp協議開發網路管理軟體的流程。mib這個庫還需要自己寫程序維護嗎?另外,是不是做網路管理軟體只需要開發一個client把網路單元所有的信息收集起來進行分析就可以了?本人是這方面的新手。望指教!
A:MIB庫是嵌在硬體設備里的,由OEM提供,不需要自己寫程序維護,SNMP軟體開發主要是安SNMP協議的定義編程對硬體設備參數進行設置(IP等),信息查詢(工作狀態..),信息接收(出錯...)等.
一般不需要對這些信息分析,只是顯示出來即可.如一個用戶要用印表機列印,查詢列印狀態,會知道該印表機是否繁忙.如印表機不工作,會給客戶端顯示原因(塞紙等).可以為印表機設置IP,語言支持等.

再問:由誰能否為我解釋一下SNMP中的OID是如何定義的?我如何得到相關的信息?
A:
OID是MIB樹上面的節點,形如1.3.6.1.2.1.....每個數字錶示MIB樹的一層,向下遞推.
MIB分兩種,一種是標準MIB,是有國際標準的MIB-1,MIB-2,可查看RFC文檔,另一種是私有MIB,有設備生產商定義提供.

5.9 其它網路相關問題

6.VxWorks操作系統 FAQ
6.1 C  issues
6.1.1 請教Vxworks中類的用法:
我的程序中包含如下內容,編譯時全通過,但下載時顯示
Errors while downloading D:/Tornado/target/proj/simtest/SIMNTgnu/simfun.out:
___6mytest
__$_6mytest
請問各位高人如何處理.

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

};
mytest tmyt;
}

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

6.2 Communication problems

6.3 中斷(Interrupt)
6.3.1 VxWorks是如何調用ISR的?
能否具體描述一下當VxWorks收到外部中斷信號時是怎麼調用中斷服務程序的?據說是在MUX層實現的,正確否?

不同的cpu處理不一定相同,你是不是說網路設備的中斷處理?(by superme )

是這樣的,比如對於一個網路設備,物理層和MAC層分別由不同的CPU處理,兩個CPU之間的通信機制是靠共享內存,當物理層的消息要發往MAC層的時候就先給MAC發一個中斷,MAC的CPU收到中斷後就要調用相應的ISR,可我現在只能看到MAC的ISR是在intConnect()函數里被調用,然後就看不到什麼了,(我沒有物理層的程序,只有MAC層的程序)我就是想知道當一個外部中斷來了以後VxWorks是如何處理的,如何調用ISR的。據說是在MUX層里把中斷號跟ISR捆綁在一起的,可我又沒找到確切證據。哪位大俠給指點一下?
不勝感激!(by moonlight )

終於有個大俠給我回復了這個問題,我將之貼出來與大家共享:

外部中斷產生時,處理流程是:
>1。根據CPU內部寄存器的中斷允許位決定是否響應;
>2。x86CPU根據匯流排上的中斷號查找中斷向量表,得到中斷向量;
> PowerPC只有一個外部中斷0x500,跳到0x500處執行;
>3。CPU進入中斷處理,執行的是操作系統預先安裝的一個stub程序,
> stub負責保存中斷現場等工作,然後調用intConnect()時所
> 安裝的ISR;對於PowerPC,stub調用的是BSP中斷控制器驅動程序的
> 一個函數,這個函數查詢中斷控制器的寄存器,得到中斷號,
> 再去查找中斷向量,得到的中斷向量就是intConnect()安裝的
> 函數;
>4。調用ISR。返回后,stub繼續執行,恢復中斷現場。結束中斷。
>
>對於END driver,它有函數xxEndLoad()和xxEndStart()。
>MUX則有函數muxDevLoad()和muxDevStart()。系統(BSP)在
>初始化的時候調用過程是:
> muxLibInit();
> muxDevLoad(xxEndLoad,...);
> muxDevStart(pXxEndObj);
>
>在muxDevLoad()時,會調用到xxEndLoad,並通過字元串傳遞參數,
>xxEndLoad初始化一個END設備;
>在muxDevStart()時,會調用到xxEndStart,在xxEndStart里會
>進行intConnect, intEnable等工作。
>
>過程是這樣的。嚴格來說,並不是在mux層的代碼里鏈接中斷,而是
>在END driver中完成的。mux並不和任何硬體直接聯繫。
(by moonlight )

6.3.2 請教中斷問題,偶用ADS測試ARM中斷式,當有IRQ中斷產生時,程序轉到中斷入口0x18處 0x00000018: B IRQ_Handler卻不跳轉到中斷服務程序IRQ_Handler處,可能是什麼原因請大俠指點!
註:中斷已經enable
A:這很有可能是中斷和中斷程序沒有綁定在一起
再問:
偶程序里有一個Install_Handler不知道算不算是綁定,偶是菜鳥,請多多指點。謝謝!
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)確定一下是否中斷髮生,在中斷髮生時,查中斷標誌寄存器INTST1中相應的IRQ為是否置1,或用示波器量該IRQ管腳。有中斷產生且中斷enable,就應該執行相應的ISR。
2)如上面沒有問題,仍不執行,再查一下是否有比該IRQ等級更高的中斷持續發生屏蔽了該IRQ中斷。特別要注意一些FIQ中斷,在ARM中FIQ中斷永遠高於IRQ,可能會導致IRQ中斷不被執行。 在中斷屏蔽寄存器INTMR1中屏蔽所有優先順序高於該IRQ的FIQ,會disable這些FIQ.

希望這些對你有所幫助
6.4 LoadModule problems
6.5 pthreads
6.6 Reboot
6.7 Semaphores
6.8 Simulator
6.8.1 在simulator環境里如何模擬中斷??
我想在simulator環境下,寫一個ISR程序,但是無法模擬中斷的產生。不知有何解決辦法。
TIA (by wys205)
A:vxworks下的ISR程序:
參考我寫的一個程序,另外需要另一個程序向simulator窗口發消息。
如果需要這個程序,請發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發送消息的程序:
哈哈,我已經試成功了,原來向simulator發送消息如此簡單,請vxfree指正。
void CAboutDlg::OnButton1()
{
// TODO: 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中文件操作異常區區最近正學vxworks,編譯一例子,通過,在tornado下模擬運行,系統提示異常發生。文件如下,哪位兄台可以提示一下?謝謝

.......
int teststdio()
{
char buffer[10];
char *tn = "tmpxxx"; //是不是這裡的問題?
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"; //是不是這裡的問題?
你沒指定文件所在的設備,
simNT環境里,一般設備為"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.14 VxWorks AE issues

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

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

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

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

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

.....

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


7.其它 FAQ
7.1
7.1.1 各位大俠: 我的程序寫好了,系統如何啟動我的應用程序。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,考到硬碟里通過bootrom.sys啟動vxWorks;vxWorks啟動了,可我的應用沒有。各位大俠,如何啟動應用程序呢? 請指點。
小弟非常感謝!

Re:哪位大俠做過把應用綁定到vxWorks系統去
1).在啟動系統時啟動用戶定製的任務
假設有一個MultiTask.c的程序,該程序使用消息隊列來傳遞不同task之間的消息,其中:主task為Init,負責建立兩個從task,監控和傳遞推出消息,並釋放從進程需要的資源。
將此文件加入到製作vxworks的工程中(注意這裡的MultiTask.c同樣不能放在帶空格的路徑下),修改usrAppInit.c,在開頭加入:
extern void Init(void);
在函數結束前加入:
Init();
重新編譯生成vxworks,重啟目標機,可以看到任務自動執行。

2).關於usrconfig.c
有些幫助文件中提到可以修改c:\tornado\target\config\all\usrconfig.c中的usrRoot函數來改變啟動畫面和啟動用戶任務。但在vxworks的faq中提到:"Tornado2.0不使用usrconfig.c,而是用target\config\comps下的 configulettes,如果需要使用usrconfig,必須"make" c:\tornado\target\config\pentiumpro下的makefile文件。事實上,在幫助文件里大量地提到了修改usrconfig,例如在不通過網路而是從rom啟動vxworks,使用flash ram等。
實際上就tornado2.0來說,分為兩種情況:
<1>用戶自己建立的bootable image
這時不使用usrconfig,用戶通過對工程可視化的修改,就可以裁減內核。如果在project裡面去掉了默認的dependence,可以看到target\config\comps下的一些*.c,*.h文件其實是被引用的。通過對它們的修改,可以起到類似於修改usrconfig.c的作用,編譯時使用的是系統自動在工程所在目錄下產生的makefile,對這個makefile的修改將不會產生作用。
<2>系統默認的bootable image
這時使用安裝時自帶usrconfig。用於通過對configAll.h和config.h中define或undef宏INCLUDE_XXX來裁減內核。這時對啟動化面的修改是通過對usrconfig.c的修改實現的。用戶定製任務如下實現。: 在
#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。
定製任務還需要在makefile里添加:
MACH_EXTRA = MultiTask.o
這個MultiTask.o是在另外一個downloadable application project里編譯產生的。這個project里僅含有一個MultiTask.c,將MultiTask.o拷貝到c:\tornado\target\config\bspname下供makefile使用。可以參照下面vxWorks.st_rom的產生方法產生一個可以standalone的vxWorks.st,也可以在tornado集成環境中選擇tools-options-project-show Tornado1.0.1 menu items(如果安裝時選擇使用tornado1.0,則這個選項默認被選中),然後選擇built-standard bsp builds-pcPentiumPro、vxWorks.st,這兩種方法生成的vxWorks.st都在c:\tornado\target\config\bspname目錄下。

7.2
7.2.1 請教幫主c and c ,tornado支持c and c  ,但當我用c 寫好程序test.cpp,然後想在usrAppinit.c中調用我寫好的myFuc();時,不能編譯通過。但我把test.cpp改成test.c后則可以通過。這是為什麼?
A:文件後綴為.cpp時編譯器會認為是C 文件,這樣有些定義類型為C的函數在編譯或下載時不被認可。 解決方法是把這些不被認可的C類型函數用語句extern "C"說明一下為C函數就行了

 

附錄A.一些有用的連接

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


附錄B.維護

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


[admin via 研發互助社區 ] VxWorks中文FAQ已經有8966次圍觀

http://cocdig.com/docs/show-post-42376.html