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源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索