菜鸟请教

请教众位高手:

我如何让我的程序从开始到结束,我程序的线程们一直着占用CPU(多个)?通过设置优

先级的话,我具体又应该怎么设置呢?比如"具体设置成多少"之类。

要想你的程序一直占住CPU,1)是你的程序必须有绝对高的优先级,2)是你的程序不能做任何阻塞自己的操作,严谨地说还有3)关掉中断。

1)优先级在线程创建前可以用pthread_attr_setschedparam()来设好attr,然后pthread_create(),也可以在线程创建后再用pthread_setschedparam()来修改。最高优先级是255 (root用户)

2) 在QNX上一个程序基本上很难不做阻塞操作的,除非你很清楚你在做什么,或是你的程序只是做些无用的死循环。

3) 关不关中断取决与具体你要做什么

最后,你要确保你的程序会结束,如果你的程序在最高优先级上占住CPU不放的话,你就没有别的机会来杀死你的程序了。如果你的程序死循环,那么你再也不能access整个系统了,只能按reset键。

是这样。

(1)我按照您说的将某个小程序的优先级设置为255,然后再将其优先级设置为

1,为了比较在执行有限次循环之后,其花费的时间能有比较大的差距,但

是结果是基本没有什么变化,请问这是为什么啊?

(2)请问,主线程的调度策略以及优先级我能改吗?

(3)您说的关中断我可能做不到,因为我需要计时,所以一个类似于时钟中断,

但是优先级高于时钟中断的中断恐怕是必须存在的。我在想,QNX帮助里说

,它用1.1931816MHz通过计数器8254,再将速度放慢了11931倍,得到了

10ms的时钟中断频率,那么这个”11931倍“是怎么来的呢?我能不能不

除以11931,而直接把1.1931816MHz接在8259的其他端口,作为一个级别

较高的中断源呢?

(4)请问,除了时钟中断,还有什么中断我需要注意的呢?比如因为进入了某个

中断的ISR使得我的实时缺乏保障?

1)时间差距不大需要具体看你的程序。你在循环中做了些什么。还有可能就是你的系统其实相对是静止的,别的进程基本上都没有在运行。这样,不管在什么优先级上你都能获得CPU。

2)pthread_setschedparam()可以用来修改正在运行的线程的优先级。其实你也可以用QNX提供的“on -p 15 "来迫使程序在优先级15上运行。

  1. 8254的问题,我的理解是有一个数被写入到芯片里,芯片自动按这个数来生成中断。QNX有专门函数可以修改这个值,但如果这个值太小,会导致系统负荷过高,所以不建议修改这个值。

4)中断本身就是实时性的一个部份。QNX支持中断优先级,如果你确实需要的话,可以设法用高优先级中断来触发你的操作。具体还是那句话,取决于你要做什么。

xtang,我有了一个想法,请您帮我看看:

如果我把系统所有的中断全部屏蔽,包括鼠标键盘什么的,只保留我自己设定计时的中断。

而该中断的ISR我定义为使计时线程做出操作,然后继续等待下一次中断。这样是否就能去

除上下文切换上花费的时间?假设不考虑微内核调用的话,延迟时间是否就是中断延时

+ISR的处理时间?上次您说中断延时可能大于5us,那么这两个加起来大约能有多少呢?

计时并不一定需要中断的。你先说说你具体想干什么或者实现什么吧。

哦,我想要实现的是实时仿真,仿真步长是50us-100us之间,也就是说我必须在这一个步

长内完成应当完成的计算,然后等待一个步长,比如100us的到来,再做下一步的计算。

在这个过程中,我需要每一步计算都占用CPU,并且用各种并行算法加快计算过程,从而在

一个步长,比如100us内计算完,然后挂起线程,等待下一步的到来。 这是我就需要一个

精度比较高的计时器,一个能一直占用CPU直到程序运行结束的线程。

其实你并不是要每一步计算都完全占有CPU,只要每一步计算都在步长内完成,是吧?

换句话说,假设步长是100us,计算只花了50us的话,你还是允许别的程序、中断使用50us CPU的是吗?

不过,100us是个比较短的时间,看你主频与计算量才能知道能不能在一个步长内完成。

如果确实需要的话,你说的方法是可行的,关所有中断(网卡、PCI、…),然后用ClockPeriod()来改变系统时钟,然后你的程序挂时钟中断,在时钟中断中执行仿真计算。这样做的缺点是你的仿真运算无法进行任何系统操作(内核调用)。但应该是延时最少的了。

不过,因为你改了系统时钟,每个时钟中断系统(内核)也会响应占用CPU时间的,具体占多少,跟硬件关系很大,你需要用System Profiler来具体测一下。

没,我并没有想要在中断服务程序里完成仿真,而且我没有想要用中断,我是想在自己做出

一个100us一次的中断,当程序接收到这个中断时,才进行下一步仿真,这样我为什么不能

进行系统调用呢(虽然我系统调用肯定不会多)?

我是说我没想要用时钟中断

你的做法也可以,还是取决于时间。

你的做法,那么每十次仿真运算,就会砬到一次系统时钟中断,看看时间够不够了。

谢谢xtang了!!

还有两个问题,1.请问是只要遇到中断系统就会重新调度线程吗?

2.我的仿真程序在windows下使用intel编译器编译的,现在已经

改为GCC版本的了,想要在QNX下运行一下。现在的问题就是

文件路径总是不对。比如在Debug文件夹下的有一个a.dat文件

以及可执行文件,我想要从中读取数据,于是我用C++中的文

件流命令:

ifstream f;f.open(“a.dat”);可是总是打不开,请问这是为什么

啊?

中断的“优先级”永远高于任何用户态线程。也就是说不论你的线程的优先级有多高,系统一定会跳去做中断处理。处理结束后,是返回到你的程序,还是重新调度另一个线程,取决于中断处理的结果。

至于文件打开出错问题,先要看出错码确认是不是路径问题,路径的话,最可靠的是用全路径。“/where/ever/my/directory/a.dat"