关于嵌入式系统线程调度与优先级的问题,wince或linux

时间:2022-01-19 07:01:03
项目中有一个需求是在中断中触发一个事件,开启一个线程1,这个线程的优先级要比其它的工作线程(NORMAL)高,关于线程调度有一些不明白,因为要考虑到最坏情况,假设另外开启了4个线程,在wince系统中,这几个线程一直处于工作状态,占满各自100ms的时间片。一旦中断到来,要开启这个优先级高的线程1(线程1已处于等待状态),如果这时候刚好有一个线程还没从自己100ms的时间片中退出来,是等到这个100ms执行完后线程1才能分配到时间,还是由于线程1的优先级高,系统会强制结束当前正在运行的这个线程,给线程1分配时间?十万火急,谢谢啦!

8 个解决方案

#1


一个线程还没从自己100ms的时间片中退出来,且没有调试的时机(如 Sleep(0)之类,是不太可能调试让高级先级的线程来执行的。
极端情况:如低优先级线程 while(1) 死循环了,这样就算有高优先级的线程也无法运行的。

#2


这个主要看你如何应用,如果需要线程1立即执行,在中断里手动调用一次线程调度即可。
另外,类似的应用可能各操作系统处理不一样(wince不了解),但在rt thread系统中释放一个信号量时,会自动唤醒挂在该信号量上的优先级最高的线程。

#3


版主你好,谢谢您的回答,还有就是中断到来时打断了一个一般优先级的工作线程2,比如说(线程2 )100毫秒时间片只运行到了50ms的地方中断到来,中断中setenvent触发等待中的高优先级线程1,问题是这时是线程2接着跑完50毫秒的时间片,才把时间让给更高优先级的线程1,还是在中断过后直接把时间分给高优先级的线程2,wince有没有这样的机制,就是想让中断到来时线程1能立刻工作起来完成自己的工作,时间上不受其它工作线程的影响,在极端情况下中断触发到线程切换时间控制在10ms以内,谢谢啊!

#4


建议 LZ 自己写两个线程,做一下实验。

#5


引用 1 楼 91program 的回复:
一个线程还没从自己100ms的时间片中退出来,且没有调试的时机(如 Sleep(0)之类,是不太可能调试让高级先级的线程来执行的。
极端情况:如低优先级线程 while(1) 死循环了,这样就算有高优先级的线程也无法运行的。


WINCE下不是1MS做一次调度吗?低优先级即使while(1)循环也是会被打断的吧?

#6


引用 5 楼 xqhrs232 的回复:
Quote: 引用 1 楼 91program 的回复:

一个线程还没从自己100ms的时间片中退出来,且没有调试的时机(如 Sleep(0)之类,是不太可能调试让高级先级的线程来执行的。
极端情况:如低优先级线程 while(1) 死循环了,这样就算有高优先级的线程也无法运行的。


WINCE下不是1MS做一次调度吗?低优先级即使while(1)循环也是会被打断的吧?


wince 默认调度时间是100ms
#define DEFAULT_THREAD_QUANTUM      100

不过他采用的是优先抢占轮转调度算法,高优先级的线程是可以抢占低优先级的线程的。
被抢占时剩余的时间保留在dwQuantLeft,并没有清零。
LZ如果想深入研究不妨看看WINCE600\PRIVATE\WINCEOS\COREOS\NK下的代码。
kernel目录有关键线程调度的代码,oemglobal.c有OEMGLOBAL结构体的设置。

#7


引用 3 楼 ywq12123 的回复:
版主你好,谢谢您的回答,还有就是中断到来时打断了一个一般优先级的工作线程2,比如说(线程2 )100毫秒时间片只运行到了50ms的地方中断到来,中断中setenvent触发等待中的高优先级线程1,问题是这时是线程2接着跑完50毫秒的时间片,才把时间让给更高优先级的线程1,还是在中断过后直接把时间分给高优先级的线程2,wince有没有这样的机制,就是想让中断到来时线程1能立刻工作起来完成自己的工作,时间上不受其它工作线程的影响,在极端情况下中断触发到线程切换时间控制在10ms以内,谢谢啊!


虽然说线程会优先抢占,但是对于抢占效果就不好说了,LZ你还是按版主的建议做实验来的实际。
注意线程优先级最好用CeSetThreadPriority设置,wince的优先级有256个。

#8


1. WinCE 是 RealTime Preemptive Operating System 所以高優先權的 Thread 會搶佔低優先權的 Thread.
2. while (1) 有可能會造成 CPU 不 fetch 指令, 所以 CPU 連 H/W interrupt 皆無法處理, 這種死法可能無解.

Paul, Chao @ Techware

#1


一个线程还没从自己100ms的时间片中退出来,且没有调试的时机(如 Sleep(0)之类,是不太可能调试让高级先级的线程来执行的。
极端情况:如低优先级线程 while(1) 死循环了,这样就算有高优先级的线程也无法运行的。

#2


这个主要看你如何应用,如果需要线程1立即执行,在中断里手动调用一次线程调度即可。
另外,类似的应用可能各操作系统处理不一样(wince不了解),但在rt thread系统中释放一个信号量时,会自动唤醒挂在该信号量上的优先级最高的线程。

#3


版主你好,谢谢您的回答,还有就是中断到来时打断了一个一般优先级的工作线程2,比如说(线程2 )100毫秒时间片只运行到了50ms的地方中断到来,中断中setenvent触发等待中的高优先级线程1,问题是这时是线程2接着跑完50毫秒的时间片,才把时间让给更高优先级的线程1,还是在中断过后直接把时间分给高优先级的线程2,wince有没有这样的机制,就是想让中断到来时线程1能立刻工作起来完成自己的工作,时间上不受其它工作线程的影响,在极端情况下中断触发到线程切换时间控制在10ms以内,谢谢啊!

#4


建议 LZ 自己写两个线程,做一下实验。

#5


引用 1 楼 91program 的回复:
一个线程还没从自己100ms的时间片中退出来,且没有调试的时机(如 Sleep(0)之类,是不太可能调试让高级先级的线程来执行的。
极端情况:如低优先级线程 while(1) 死循环了,这样就算有高优先级的线程也无法运行的。


WINCE下不是1MS做一次调度吗?低优先级即使while(1)循环也是会被打断的吧?

#6


引用 5 楼 xqhrs232 的回复:
Quote: 引用 1 楼 91program 的回复:

一个线程还没从自己100ms的时间片中退出来,且没有调试的时机(如 Sleep(0)之类,是不太可能调试让高级先级的线程来执行的。
极端情况:如低优先级线程 while(1) 死循环了,这样就算有高优先级的线程也无法运行的。


WINCE下不是1MS做一次调度吗?低优先级即使while(1)循环也是会被打断的吧?


wince 默认调度时间是100ms
#define DEFAULT_THREAD_QUANTUM      100

不过他采用的是优先抢占轮转调度算法,高优先级的线程是可以抢占低优先级的线程的。
被抢占时剩余的时间保留在dwQuantLeft,并没有清零。
LZ如果想深入研究不妨看看WINCE600\PRIVATE\WINCEOS\COREOS\NK下的代码。
kernel目录有关键线程调度的代码,oemglobal.c有OEMGLOBAL结构体的设置。

#7


引用 3 楼 ywq12123 的回复:
版主你好,谢谢您的回答,还有就是中断到来时打断了一个一般优先级的工作线程2,比如说(线程2 )100毫秒时间片只运行到了50ms的地方中断到来,中断中setenvent触发等待中的高优先级线程1,问题是这时是线程2接着跑完50毫秒的时间片,才把时间让给更高优先级的线程1,还是在中断过后直接把时间分给高优先级的线程2,wince有没有这样的机制,就是想让中断到来时线程1能立刻工作起来完成自己的工作,时间上不受其它工作线程的影响,在极端情况下中断触发到线程切换时间控制在10ms以内,谢谢啊!


虽然说线程会优先抢占,但是对于抢占效果就不好说了,LZ你还是按版主的建议做实验来的实际。
注意线程优先级最好用CeSetThreadPriority设置,wince的优先级有256个。

#8


1. WinCE 是 RealTime Preemptive Operating System 所以高優先權的 Thread 會搶佔低優先權的 Thread.
2. while (1) 有可能會造成 CPU 不 fetch 指令, 所以 CPU 連 H/W interrupt 皆無法處理, 這種死法可能無解.

Paul, Chao @ Techware