线程优先级的问题

线程优先级1——63,是1高呢还是63的优先级高?
如何设置线程优先级,给段代码学习学习,谢谢!

最大255(高优先级),最小0. 默认一般的程序是10.

sched_setparam()
Change the priority of a process

You’ll use the sched_param structure when you get or set the scheduling parameters for a thread or process.

You can use these functions to get the scheduling parameters:
pthread_attr_getschedparam()
pthread_getschedparam()
sched_getparam()
SchedGet()

You can use these functions to set the scheduling parameters:
pthread_attr_setschedparam()
pthread_setschedparam()
sched_setparam()
sched_setscheduler()
SchedSet()
ThreadCreate()

设置实时系统,是否使用sched_rr参数?

中断线程如何设置参数?

中断服务程序和中断线程的执行顺序如何?
中断服务程序就是和中断号帮定的函数,中断线程就是用interruptwait函数等待进行处理的函数,请问是不是系统先执行中断服务程序,在执行线程程序,我将线成的优先级设为了255,是不是不合适?

中断服务程序(由InterruptAttach()挂上去的)比任何线程的优先级都高。中断发生时,不论当前线程的优先级是什么,都会直接跳去中断服务程序。

中断服务线程(由InterruptAttachEvent()挂上去的)则同普通线程一样调度。中断服务线程的优先级,可以自己设(比如用InterrutWait()的情形)。也可以设在InterruptAttachEvent()的事件中。(比如设Pulse的优先级)

最后,优先级总共有1-255级,数字大的优先级高。但64-255必须是root用户才可以设。

谢谢xtang
可是我的系统总是出现问题,我在中断服务程序里用了一个变量,而在等待线程里判断这个标志,应该1毫秒发生,可有时会出现2毫秒不等的现象,下面是部分源码,帮忙看一下
int flag
const struct sigevent *handler0(void *arg, int id)
{
.
.
.
.
.
…;
flag = 1;

}



void cPCI_ISR_0 (void arg)
{
SIGEV_INTR_INIT(&event );
rs = InterruptAttach (card_array[0].irq, handler0, NULL, 0, 0);
if (rs == -1)
{
printf (“IntConnect ERR %d .\n”);
}
ThreadCtl(_NTO_TCTL_IO, 0);
while(1)
{
if (InterruptWait (NULL, NULL)!=-1)
{
do
{

}while (flag==1)
//处理数据

}
}
}

没有共享中断事件,系统偶尔在
do
{

}while (flag==1)
段里执行好长时间(经过clock判断),而失去本应该有的下一次中断事件,不知道说明白没有,我用的是DMA模式,等待flag==1为的是判断DMA是否传输完毕

中断执行顺序是否为
先执行interruptwait
再执行中断服务程序
在执行interruptwait后面的程序

pwindow远程控制线程的优先级是不是很高,每当我用pwindow登陆的时候,DMA传输中断响应就慢半个节拍。

当执行rs = InterruptAttach (card_array[0].irq, handler0, NULL, 0, 0); 后,handler0会被放到kernel空间.当有中断来的时候,kernel帮你运行.


InterruptWait()只是告诉你的线程.如果中断已经来过,就马上返回成功.一般也就是可以跑下面的程序.
如果中断还没有出现.等着(blog),一直到中断到来.handler0执行并返回event来通知InterruptWait返回成功.

所以你的理解的执行顺序也是可能的,但不是唯一.

不过,我猜你程序的问题.其实是中断处理已经完成(你可以简单想像成系统会保证handler0的执行与时间).但
do
{

}while (flag==1)
只是一般的代码.这里执行多久,会被谁抢占.和普通的程序是一样的.这也是为什么你提到用Phindows会慢的原因吧.


一般,我们会把任务紧急的小部份代码放在中断处理函数中.由kernel帮你完成.其它的.就让你自己的线程慢慢做了.

具体做法.只能看你的实际情况了.

如果是handle0是内核程序,先开始运行,执行完再运行wait后面的数据,我flag标识是在handle0中运行的,这样
do
{
}while(flag==0)
应该不再作循环处理的,应该一判断就应该是正确的。