乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      vxworks FAQ(中文)

       skywood 2006-11-03

      前言(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ù)你的需要選擇閱讀某一部
      分。
          為了保持本文檔的開放性和可擴(kuò)充性,歡迎大家把自己曾經(jīng)碰到過的問題及其解決辦法按分類加到文檔
      里來。在修改本文檔時,請把修改記錄加到歷史記錄里。
          歡迎任何人指出文檔中的錯誤之處,請把錯誤之處發(fā)到附錄B里的任一個EMAIL里,在此對那些問題的提
      出者、回答者以及文檔的維護(hù)者一并表示感謝!  


      當(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 主機(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)問題


      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.維護(hù)



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


      1.1.2 如何學(xué)習(xí)VXWORK,PSOS入門?
      A:初次上站,感覺大家水平一般,入門級選手較多,實時多任務(wù)操作系統(tǒng)和以前大家使用的低端產(chǎn)品,如51
      機(jī)在原理上是不同的,因此大家最好先學(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里。看代碼還是用Source Insight
      (by vxfree)



      2.Tornado工具FAQ


      2.1 編譯器和鏈接器
      2.1.1 當(dāng)我把多個目標(biāo)文件鏈接成一個時,出現(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./


      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)
      標(biāo)準(zhǔn),main函數(shù)必須調(diào)用__eabi函數(shù),該函數(shù)為運(yùn)行你的程序設(shè)置必要的運(yùn)行環(huán)境。
          由于這個原因GNU編譯器在main函數(shù)里插入 __eabi函數(shù)。
          Tornado不提供該函數(shù),因為在實時環(huán)境下,你不必寫main函數(shù)。VxWorks在應(yīng)用程序運(yùn)行前已經(jīng)設(shè)置
      好運(yùn)行環(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下運(yùn)行。
      (我也重新構(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 新引進(jìn)的。-- 但是GNU手冊里提示"You don\‘t want to know about this brain-damage..."
      使用-ansi或-trigraphs開關(guān),或更好的辦法消除任何包含三字符序列\(zhòng)‘??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沒有對符號過濾進(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ā)布時間:2005-6-25 13:11:03

      --  

      2.1.13 怎樣把一個段裝載到特定的絕對地址?
      A: 我曾包含一個腳本做這些工作,最方便得到這個腳本的方法是使用--verbose開關(guān)運(yù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)試我的目標(biāo)機(jī),而不用Tornado?
      A:gdb compiles \‘out of the box\‘ for vxworks.
      去cygnus(sourceware.cygnus.com)下載最新的\‘insight\‘軟件,該軟件是gdb + cygnus的UI(譯者:可能是用
      戶接口)運(yùn)行 "configure --target=mips-wrs-vxworks". 把mips改成你的處理器,然后運(yùn)行make.
      這樣就可以在安裝了cygwin的win32平臺上運(yùn)行了,在UNIX系統(tǒng)平臺上也類似。
      RDB是windriver以前的調(diào)試協(xié)議,現(xiàn)在變成WDB了。好象沒公布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)建一個任務(wù)后停止它,以使得我能從開始對它進(jìn)行調(diào)試?
      A: 菜單tools->options,選擇debugger頁,選擇always halt after attaching a task和Auto Attach to
      task -> Always
      現(xiàn)在輸入一個全局?jǐn)帱c(Shift F9),在它碰到斷點后,它將從mainTask中分離。
      (From: Chacha Hindustani, Gurudev@mediaone.net)

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

      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ù)使用提供了許多參考。我的機(jī)器上沒設(shè)置WIND_REGISTRY,所有的Tornado工具都可以不使用它而正
      常工作。我的工具不能發(fā)現(xiàn)注冊,設(shè)置它并關(guān)閉它(Set it and poof)!注冊發(fā)現(xiàn)了,工具可以工作。
      確信起調(diào)用了wtxProbe()去檢查注冊(并且變量被設(shè)置),它可以避免許多痛苦。
      我也修改那個工具例子代碼。代碼在此#代碼連接#http://www./~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 <yourTclFile>
      (From: DrDiags, drdiags@flashcom.net)

      2.4.4 我試圖在windows NT4.0 SP5環(huán)境下運(yù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窗口下運(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)為你有超過2^32加密密碼)。我能
      用鋼筆和紙來把它做反變換。
      你也可以使用loginEncryptInstall()安裝自己的加密算法,對一個強(qiáng)密碼[1],加密知道使用密碼作為KEY。
      UNIX傳統(tǒng)使用DES,但需要適當(dāng)?shù)拇a。我使用TEA參看http://vader.,因為它是不受妨礙的。

      [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或它的補(bǔ)丁后,我所有的C文件類型都被移除了,而使用Tornado作為打開該文件
      的工具。我怎樣能恢復(fù)到原來的編輯器?
      A:Tornado覆蓋注冊表中的實體。你可以用下面的.reg恢復(fù)。
      警告:在使用這個文件前必須小心!首先讀一下該文件,如果你不理解它就不要使用它。
      警告:我在windows95和NT下測試過,如果有時間我會在別的的平臺測試的。如果你在98、2000下使用后可
      以工作,請告訴我。
      首先下載該文件,仔細(xì)閱讀它,修改它,使她執(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.查詢更多信息)。
      文件: c-files.reg#文件連接#http://www./~borkhuis/vxworks/c-files.reg

      2.5.3 當(dāng)我每次雙擊一個文件,都打開一個Tornado.我想所有的文件都用一個Tornado打開,怎么做?
      A:是的,這是可能。下面的注冊文件將完成這個工作。
      警告:在使用這個文件前必須小心!首先讀一下該文件,如果你不理解它就不要使用它。
      編輯該文件,修改Tornado的安裝路徑為你機(jī)器上的安裝路徑。
      文件: TornadoFileTypes.reg#文件連接#http://www./~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<dir>選項增加目錄,現(xiàn)在在build屬性里包含如下內(nèi)容:
      宏名稱:VPATH
      值:$(filter-out -I.,$(filter -I%,$(CFLAGS)))
      在修改了include目錄后需要更新編譯器選項,VPATH自動被上面規(guī)則更新。
      在選項改變保存到工作區(qū)并確認(rèn)改變生效后,重新生成依賴關(guān)系和開始編譯器。
      Bob Baker (Bob@dskti.com)曾寫過他關(guān)于這個問題的經(jīng)驗:
      我們在使用Tornado 2編譯一個應(yīng)用程序時碰到了很多問題,如\‘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上是不兼容的。

      簡單拷貝包含整個應(yīng)用和工程的整個目錄結(jié)構(gòu)到NT,可以解決問題,并生成一個完整的build??截惖搅硪?br>個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目錄里的,該目錄里放置了許多標(biāo)準(zhǔn)文件。

      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輸出文件--<Project>.link。在這個文件名字映射為原始.o文件而不是
      partialImage.o。如果文件使用最終的連接命令生成,它會生成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。文件名用空格分開。確定在同一目錄有目標(biāo)文件。它也可能把文件放到你
      的源文件目錄里。在宏里你應(yīng)該使用../<object files name>格式。這樣做的優(yōu)點是你能make clean或
      rebuild所有文件而沒有松散你的目標(biāo)文件。


      --  作者: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 <Tornado base>/host/src/hutils/configGen.tcl <Project>.wpj
        這個命令也可以被Tornado使用。當(dāng)配置改變時,這個命令可以作為build的第一個執(zhí)行命令。
        對downloadable工程,沒有標(biāo)準(zhǔn)命令。一個修改過的configGen也可以被使用,文件名為makeGen.tcl
      (連接#http://www./~borkhuis/vxworks/makeGen.tcl#),把這個文件拷貝到../host/src/hutils
      目錄。Makefile文件可用如下命令生成:
      wtxtcl <Tornado base>/host/src/hutils/makeGen.tcl <Project>.wpj
        請確認(rèn)你使用了<Project>.wpj的完整路徑。

      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 目標(biāo)機(jī)服務(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:一個解決問題的辦法是使用遠(yuǎn)程registry,即使你在你本機(jī)上運(yùn)行target server,這可以通過使用真實IP
      設(shè)置遠(yuǎn)程registry解決。
        基本上"localhost"得到存儲在Windows registry中的運(yùn)行registry的機(jī)器名。主機(jī)上的WTX工具把
      localhost解析成127.0.0.1,并把它傳給目標(biāo)機(jī),然后目標(biāo)機(jī)嘗試與127.0.0.1通信,以便符號表的同步和結(jié)
      束只與自己聯(lián)系而不與主機(jī)聯(lián)系。很好的特性。
        如果你的Windows主機(jī)有多個網(wǎng)口,并且目標(biāo)機(jī)連在一個次要接口上,這還不足夠。機(jī)器名被解析成IP地
      址,否則目標(biāo)機(jī)不知道。在連接目標(biāo)機(jī)進(jìn)行符號表同步前,你需要在目標(biāo)機(jī)上使用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)你在目標(biāo)機(jī)配置項里的"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:目標(biāo)機(jī)上的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:你可以寫一個擴(kuò)展的重復(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./~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)


      --  作者:lxlong
      --  發(fā)布時間: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 問題關(guān)于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 ;放數(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)容寫到 地址 r4 + PLPRCR 指向的寄存器(PLPRCR寄存器)中,(估計r4放的IMMR值)

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

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

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

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


      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下怎么讀取目標(biāo)機(jī)BIOS的信息?我現(xiàn)在想得到目標(biāo)機(jī)的工作狀態(tài),
      如目標(biāo)機(jī)CPU的溫度,以及風(fēng)扇的轉(zhuǎn)速,看門狗等。我采用的目標(biāo)機(jī)是ADLINK公司的NuPP0-760,
      在系統(tǒng)啟動時,加入BIOS可以看到這些信息,但是請問我如何在我自己編寫的程序中動態(tài)得到這些參數(shù)值?
      多謝各位大俠了?。?
      A:似乎比較困難。
      關(guān)鍵是BIOS運(yùn)行在實模式下,而VxWorks運(yùn)行在保護(hù)模式下;并且VxWorks起來后,BIOS就不存在了。
      另外我們買主板的時候,似乎都不帶什么主板編程手冊之類的東西,否則直接讀寫主板上的寄存器應(yīng)該就
      可以了。(by vxfree)
      我曾經(jīng)用sysinbyte()和sysoutbyte()讀BIOS中的內(nèi)容,用0X70和0X71,相關(guān)的地址你可以參考硬件手冊.
      (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總線上的設(shè)備怎么查找?是用pciFindDevice()函數(shù)嗎?如何映射PCI內(nèi)存?如何讀
      PCI設(shè)備內(nèi)存中的內(nèi)容?謝謝
      A:使用pciFindDevice查找設(shè)備;使用pciConfigInByte/Word/Long, pciConfigOutByte/Word/Long讀寫配置
      空間;修改sysLib.c::sysPhysMemDesc[]映射地址空間;使用pciIntConnect連接PCI中斷(也可以使
      用intConnect)。

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

      4.1.100 如何從dos的root directory讀出的32字節(jié)中算出文件建立時間?
      我現(xiàn)在用的是fat16,并可以從root directory中讀出文件最后一次修該時間的16進(jìn)制數(shù),
      但是如何從這個16位的數(shù)中算出文件最后一次修改的時間,我怎么都弄不明白,
      還請高手指教,或者相關(guān)資料去那里找?
      A:32字節(jié)中,偏移量為16H的代碼意義(2字節(jié)):時間=小時*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)問題


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

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

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

      5.9.100 VxWorks下ping局域網(wǎng)為何不通?
      我使用Tornado2 prototyper for NT,在NT4的環(huán)境調(diào)試。已按要求安裝了ULIP,地址"90.0.0.254".建立一
      個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)就是不
      通,沒有應(yīng)答。哪位同志幫幫我,謝謝了!  
      A: ping的時候,因為它需要ULIP轉(zhuǎn)發(fā),要在兩邊的機(jī)器上用ROUTE ADD增加路由表,以對方的網(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
      請大家?guī)兔獯鹨幌?,謝謝!(by explore)


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

      6.1.100 請教Vxworks中類的用法:
      我的程序中包含如下內(nèi)容,編譯時全通過,但下載時顯示
      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.1.101 請教幫主c and c++,tornado支持c and c++ ,但當(dāng)我用c++寫好程序test.cpp,然后想在
      srAppinit.c中調(diào)用我寫好的myFuc();時,不能編譯通過。但我把test.cpp改成test.c后則可以通過。這是
      為什么?
      A:文件后綴為.cpp時編譯器會認(rèn)為是C++文件,這樣有些定義類型為C的函數(shù)在編譯或下載時不被認(rèn)可。
      解決方法是把這些不被認(rèn)可的C類型函數(shù)用語句extern "C"說明一下為C函數(shù)就行了.


      6.2 Communication problems


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


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

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

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

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

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

      6.3.2 請教中斷問題,偶用ADS測試ARM中斷式,當(dāng)有IRQ中斷產(chǎn)生時,程序轉(zhuǎn)到中斷入口0x18處
      0x00000018: B IRQ_Handler卻不跳轉(zhuǎn)到中斷服務(wù)程序IRQ_Handler處,可能是什么原因請大俠指點!
      注:中斷已經(jīng)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)確定一下是否中斷發(fā)生,在中斷發(fā)生時,查中斷標(biāo)志寄存器INTST1中相應(yīng)的IRQ為是否置1,
      或用示波器量該IRQ管腳。有中斷產(chǎn)生且中斷enable,就應(yīng)該執(zhí)行相應(yīng)的ISR。
      2)如上面沒有問題,仍不執(zhí)行,再查一下是否有比該IRQ等級更高的中斷持續(xù)發(fā)生屏蔽了該IRQ中斷。
      特別要注意一些FIQ中斷,在ARM中FIQ中斷永遠(yuǎn)高于IRQ,可能會導(dǎo)致IRQ中斷不被執(zhí)行。
      在中斷屏蔽寄存器INTMR1中屏蔽所有優(yōu)先級高于該IRQ的FIQ,會disable這些FIQ.


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

      --  

      希望這些對你有所幫助
      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)境下,寫一個ISR程序,但是無法模擬中斷的產(chǎn)生。不知有何解決辦法。
      TIA (by wys205)
      A:vxworks下的ISR程序:
      參考我寫的一個程序,另外需要另一個程序向simulator窗口發(fā)消息。
      如果需要這個程序,請發(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)試成功了,原來向simulator發(fā)送消息如此簡單,請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,編譯一例子,通過,在tornado下仿真運(yùn)行,系統(tǒng)
      提示異常發(fā)生。文件如下,哪位兄臺可以提示一下?謝謝

      .......
      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"; //是不是這里的問題?
      你沒指定文件所在的設(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 問一下在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),又是異常!
      文件如下,注釋有它的說明,編譯后,在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 = 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ā)布時間:2005-6-25 13:13:38

      --  

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

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

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

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

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

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

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

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

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

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

      7.10.2 各位大俠: 我的程序?qū)懞昧?,系統(tǒ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,考到硬盤里通過bootrom.sys
      啟動vxWorks;vxWorks啟動了,可我的應(yīng)用沒有。各位大俠,如何啟動應(yīng)用程序呢? 請指點。
      小弟非常感謝!
      ※ 作 者: zhangjiaxue 02-8-21 18:09:18 ※

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

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

      2).關(guān)于usrconfig.c
        有些幫助文件中提到可以修改c:\\tornado\\target\\config\\all\\usrconfig.c中的usrRoot函數(shù)來改變啟動
      畫面和啟動用戶任務(wù)。但在vxworks的faq中提到:"Tornado2.0不使用usrconfig.c,而是用
      target\\config\\comps下的 configulettes,如果需要使用usrconfig,必須"make"
      c:\\tornado\\target\\config\\pentiumpro下的makefile文件。事實上,在幫助文件里大量地提到了修改
      usrconfig,例如在不通過網(wǎng)絡(luò)而是從rom啟動vxworks,使用flash ram等。
      實際上就tornado2.0來說,分為兩種情況:
      <1>用戶自己建立的bootable image
      這時不使用usrconfig,用戶通過對工程可視化的修改,就可以裁減內(nèi)核。如果在project里面去掉了默認(rèn)
      的dependence,可以看到target\\config\\comps下的一些*.c,*.h文件其實是被引用的。通過對它們的修改,
      可以起到類似于修改usrconfig.c的作用,編譯時使用的是系統(tǒng)自動在工程所在目錄下產(chǎn)生的makefile,
      對這個makefile的修改將不會產(chǎn)生作用。
      <2>系統(tǒng)默認(rèn)的bootable image
      這時使用安裝時自帶usrconfig。用于通過對configAll.h和config.h中define或undef宏INCLUDE_XXX來
      裁減內(nèi)核。這時對啟動化面的修改是通過對usrconfig.c的修改實現(xiàn)的。用戶定制任務(wù)如下實現(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
        這個MultiTask.o是在另外一個downloadable application project里編譯產(chǎn)生的。這個project里僅含有
      一個MultiTask.c,將MultiTask.o拷貝到c:\\tornado\\target\\config\\bspname下供makefile使用??梢詤?br>照下面vxWorks.st_rom的產(chǎn)生方法產(chǎn)生一個可以standalone的vxWorks.st,也可以在tornado集成環(huán)境中選
      擇toolsèoptionsèprojectèshow Tornado1.0.1 menu items(如果安裝時選擇使用tornado1.0,則這個選項
      默認(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大蝦的個人主頁


      英文:
      http://www./~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./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 

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多