- 论坛徽章:
- 2
|
本帖最后由 wLiu2007 于 2015-02-11 23:33 编辑
系统有一个1ms的外部硬件中断送过来,在1ms中断处理函数(上半部)里面去换醒用户态实时进程;即
hw_1ms_isr()
{
其它处理代码;
wake_up_process(AAA);
}
进程AAA的写法:
AAA()
{
while(1)
{
wait_1ms_wakeup(); //这个函数就是系统调用,设置task状态为TASK_INTERRUPTIBLE,执行schedule
处理引用逻辑;
}
}
目前有个问题,当系统负载不高的时候,工作很正常,每个1ms用户态的进程AAA都能够被换醒,被执行;
可当系统负载变高以后,hw_1ms_isr调用了wake up process函数,但是用户进程AAA存在周期性的不能被换醒;周期是1s时间,每1s时间会有连续的20~50个无法换醒;
这个问题比较奇怪,进程AAA是一个实时任务,调度测试为SCHEDULE_FIFO,优先级是所有任务中最高的,按说hw_1ms_isr上半部处理完了,然后再处理softirq之后,进程应该能够马上被换醒,为什么会无法换醒?而且周期还是1s时间
想请教下各位:
1.中断里面调用了wake up,但是进程无法换醒,这段时间cpu在做什么事情,用什么trace工具可以分析,LTTng 还是 Ftrace,没有用过这2个工具,两个工具有什么区别?
2,内核里面有什么周期是1s的事情吗,而且处理啊时间需要几十个ms的? |
|