Task之errno

原创
2019/06/03 15:12
阅读数 199

Host/Kernel Shell里,用的最多的命令应该就是i了。


它可以看到每个Task的基本信息,其中有一列叫做ERRNO


很多人在看到某个TaskERRNO不为0时,会担心哪里出了问题。其实单独的ERRNO并没什么事儿,一般都不用管它。好了,可以拉到最后点赞了。


如果非要深究的话,咱们打开源码


可以看到,VxWorks定义了一个全局变量errno,用来记录中断里的error状态

另外,每个Task也可以通过errno来访问自己TCB里的一个成员errorStatus

那这个errno有什么用呢?

Kernel里有些函数的返回值是个整型数,执行失败时,就可以表示多种错误情况;但是有些函数的返回值是个指针,那出现错误时,只能返回NULL。这个时候,就可以使用errno来表示不同的错误分支了。当然了,返回值是整型数的函数,也可以操作这个errno,毕竟每个Task都有自己的TCB

因此,我们可以通过errno的值,来查看Task/Interrupt最后的一次错误情况。不过Kernel函数已经对errno做了处理(但很可能不清除它),只要Task的状态没有问题,我们App就不用额外担心它们了。

那怎么查看errno呢?不建议直接访问变量errnoTCB成员errorStatus。而是调用函数errnoGet()


或者包含组件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源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部