刚接触QNX,请教各位几个问题,先谢了。

1.QNX中是否提供类似于vxworks中保留内存的机制,也就是说,用户可以自己配置一段内存,这段内存系统绝对不会使用,这样我就可以在该内存中记录一些信息,当系统重启后,我可以从该段内存中读出原来记录的信息,从而了解系统上次运行状况,方便分析上次系统运行情况。

2.QNX中是否可记录进程线程的切换轨迹。在<System Analysis Toolkit – User’s Guide1.pdf>中,我看到The Instrumented Kernel有提供类似的功能。请问The Instrumented Kernel是qnx的一个特殊版本吗,还是通常用的qnx版本中就有提供了该功能。该功能应该如何使用呢,是否有人能提供一个使用示例?


刚接触QNX,很多不熟悉,有劳各位帮忙解惑,谢谢。临近中秋,顺祝各位工作愉快,生活幸福!

可以。QNX的启动,大致分三个部份。IPL,这个相当于X86的BIOS部份,或者是厂家开发板上的Rom Monitor。Startup,这个收集了一些内核运行需要的参数,比如内存大小,物理地址分布,中断分布等等。最后才是Kernel。

这样的安排,是为了Kernel可以不必修改。不同的开发板,不同的环境,由startup来抽像。更具体的,可以看这个 http://www.qnx.com/developers/docs/6.3.2/neutrino/building/about.html

所以,你可以修改startup,让它不要向内核报告所有的内存。把一部份内存“藏”起来。这样,内核里的内存管理就不会去分配那些内存。而你的用户程序,则可以通过mmap()来直接map()物理地址,然后读写那段内存。


2.QNX中是否可记录进程线程的切换轨迹。在<System Analysis Toolkit – User’s Guide1.pdf>中,我看到The Instrumented Kernel有提供类似的功能。请问The Instrumented Kernel是qnx的一个特殊版本吗,还是通常用的qnx版本中就有提供了该功能。该功能应该如何使用呢,是否有人能提供一个使用示例?

Instrumented Kernel是一个特殊的内核。当使用这个内核时,内核会生成许多“事件”,收集这些“事件”,可以清楚地知道系统的烃化。(包括线程切换,中断发生,内核调用,CPU间“跳转”)

具体的用法,可以参看IDE的说明。

http://www.qnx.com/developers/docs/6.3.2/ide_en/user_guide/sysprof.html

谢谢tang

再请教下,如果不使用那个特殊的内核,是否有简单方法可以挂接调度钩子?

我们这儿的系统经常跑一段时间后就被看门狗给重启了。我们的喂狗任务是一个62优先级的进程,其他业务都没这么高优先级。
我们希望记录系统运行切换轨迹,了解重启前到底系统处于什么样的情况。因为我们觉得,如果不考虑硬件问题,会导致喂狗任务无法得到调度,有可能是长时间锁中断或者中断处理哪里有问题。但我们看代码,没看出任何问题。tang是否可以针对这个问题,给一些建议?

再次对您的帮助表示谢谢。

不能,同vxworks所有代码在同一空间不同,QNX的内核和用户程序分别在不同的空间运行。所以无法“挂接调度钩子”。

我们这儿的系统经常跑一段时间后就被看门狗给重启了。我们的喂狗任务是一个62优先级的进程,其他业务都没这么高优先级。
我们希望记录系统运行切换轨迹,了解重启前到底系统处于什么样的情况。因为我们觉得,如果不考虑硬件问题,会导致喂狗任务无法得到调度,有可能是长时间锁中断或者中断处理哪里有问题。但我们看代码,没看出任何问题。tang是否可以针对这个问题,给一些建议?

在QNX里,为了防止优先级反转,内核在一定的条件下,会自动调整线程的优先级。最通常的情况是接收消息;或是互斥锁碰撞。这被称做优先级继承。如果你的喂狗程序有可能进行消息传递或是互斥锁操作,那么它的优先级有可能会变化。

别的,如果有线程在同优先级上进行FIFO调度,也可能导致系统重启。

QNX的标准程序,通常不会锁全部中断。如果你自己的程序有InterrupDisable()/InterruptEnable() (Vx移植过来的程序比较容易这样做),你要检查这些代码段看有没有可能占住CPU。

另外,喂狗程序通常可以在中断里做。如果系统时钟(1ms)够的话,可以直接挂时钟断。这样,不论优先级,喂狗总能结束的。

如果你要想确切定点出了什么事情。可以 1) 关掉硬件看门狗; 2)用Instrumented Kernel 3)喂狗程序记时,如果超时,生成用户事件并报警。这样,通过检查内核跟踪事件,可以知道发生了什么事。


首先,喂狗任务是一个单独的进程吗?

是的,喂狗程序就一个单独的进程,操作就一个简单的循环delay->喂狗,所以这个出错的可能性相当小。其他线程无论如何调整优先级,我想,都不会比喂狗程序优先级高。

代码有很少的一部分地方使用了InterrupDisable()/InterruptEnable(),但是,这些代码检查过,处理都很简单,理论不应该会导致狗超时。因为复现不是那么容易,所以注释掉了这些处理代码,没观察到重启也不能就下结论是这儿引起的问题。虽然理论上我们只想到了这儿才可能引起问题(如果不考虑硬件或者QNX内核调度可能存在的问题)。我们先排除软件问题再考虑硬件。

我们试下Instrumented Kernel,刚接触还没怎看文档不懂如何操作,请问这个内核的替换简单吗,能否简单描述下如何操作?一个文档直接看下来数量还是比较多的。

另,“别的,如果有线程在同优先级上进行FIFO调度,也可能导致系统重启。”请问这句话是什么意思?为什么会有这种可能?

谢谢tang的热心帮助。

另顺便问个小问题,像MsgReceive,MsgRead等的实现在哪里呢?我.c和.s文件找下来,都没看到这些函数的实现地方。

QNX下,Kernel和process Manager和打包成一个文件叫Procnto。
要使用工具内核很简单,更换成procnto-instr这个文件就好,在目录/boot/sys下。
如在编译image的时候指定用使用Instrumented Kernel(更改build文件或在IDE下修改属性)。

“别的,如果有线程在同优先级上进行FIFO调度,也可能导致系统重启。”我想XTANG想表达的意思是:同优先级如果有FIFO调度方式的线程,那么它可能一直占用CPU在运行,你的看门狗程序得不到CPU,就有可能超时。

狗需要多少时间喂一次?你的delay又是多少时间?如果系统某个时间有很多中断进来,可能会有影响。或者可以换成用时间中断来做。看看问题是否还存在。

谢谢各位。喂狗和超时时间,进程优先级的设置应该都是没问题的。我们再想办法看一下。