Task之errno

Host/Kernel Shell裏,用的最多的命令應該就是i了。微信


它能夠看到每一個Task的基本信息,其中有一列叫作ERRNO函數


不少人在看到某個TaskERRNO不爲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呢?不建議直接訪問變量errnoTCB成員errorStatus。而是調用函數errnoGet()get


或者包含組件INCLUDE_STAT_SYM_TBL


而後在Shell裏調用printErrno()


它能夠打印errno表明的含義


接下來看看errno值的組成:errno是一個32bits的數,高16位表示module,低16位表示該module內的錯誤編號。module 0預留給了Unix errnoVxWorks使用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()看看


果真是信號量IDNULL


這時候就能夠用errno


也能夠在代碼中就把errno打印出來

而後看一下semOpen()的函數定義


原來這個errno是由於mode設置的不對,加上它吧


此次正常了


Task成功阻塞到二進制信號量上了

 

這正是:

函數返回值有限,Error NO.來擴展。

錯誤不能單一看,任務狀態更關鍵。

 

我是泰山,專一VX 14(+10個月)

歡迎關注VxWorks567

一塊兒學習,共同進步!


本文分享自微信公衆號 - 這裏只有VxWorks(VxWorks567)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索