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