在Host/Kernel Shell裏,用的最多的命令應該就是i了。微信
它能夠看到每一個Task的基本信息,其中有一列叫作ERRNO。函數
不少人在看到某個Task的ERRNO不爲0時,會擔憂哪裏出了問題。其實單獨的ERRNO並沒什麼事兒,通常都不用管它。好了,能夠拉到最後點讚了。學習
若是非要深究的話,我們打開源碼spa
能夠看到,VxWorks定義了一個全局變量errno,用來記錄中斷裏的error狀態.net
另外,每一個Task也能夠經過宏errno來訪問本身TCB裏的一個成員errorStatus3d
那這個errno有什麼用呢?指針
Kernel裏有些函數的返回值是個整型數,執行失敗時,就能夠表示多種錯誤狀況;可是有些函數的返回值是個指針,那出現錯誤時,只能返回NULL。這個時候,就能夠使用errno來表示不一樣的錯誤分支了。固然了,返回值是整型數的函數,也能夠操做這個errno,畢竟每一個Task都有本身的TCB。調試
所以,咱們能夠經過errno的值,來查看Task/Interrupt最後的一次錯誤狀況。不過Kernel函數已經對errno作了處理(但極可能不清除它),只要Task的狀態沒有問題,咱們App就不用額外擔憂它們了。blog
那怎麼查看errno呢?不建議直接訪問變量errno或TCB成員errorStatus。而是調用函數errnoGet()get
或者包含組件INCLUDE_STAT_SYM_TBL
而後在Shell裏調用printErrno()
它能夠打印errno表明的含義
接下來看看errno值的組成:errno是一個32bits的數,高16位表示module,低16位表示該module內的錯誤編號。module 0預留給了Unix errno。VxWorks使用module 1-500。所以用戶能夠從501開始定義本身的errno,例如
因此剛剛的0x3d0001(0x3d==61)表示module M_objLib裏的第一種錯誤
而0x0001就表示S_objLib_OBJ_ID_ERROR了
tNet0這是個系統任務,不方便調試。我們本身寫個例子,讓它出現errno不爲0的狀況
建立個任務來調用這個test()函數
任務出錯了,用tt命令看看哪裏出的錯
執行到semTake()時,第一個參數爲0,加個printf()看看
果真是信號量ID爲NULL
這時候就能夠用errno了
也能夠在代碼中就把errno打印出來
而後看一下semOpen()的函數定義
原來這個errno是由於mode設置的不對,加上它吧
此次正常了
Task成功阻塞到二進制信號量上了
這正是:
函數返回值有限,Error NO.來擴展。
錯誤不能單一看,任務狀態更關鍵。
我是泰山,專一VX 14年(+10個月)!
歡迎關注VxWorks567,
一塊兒學習,共同進步!
本文分享自微信公衆號 - 這裏只有VxWorks(VxWorks567)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。