8 个解决方案
#1
一个线程还没从自己100ms的时间片中退出来,且没有调试的时机(如 Sleep(0)之类,是不太可能调试让高级先级的线程来执行的。
极端情况:如低优先级线程 while(1) 死循环了,这样就算有高优先级的线程也无法运行的。
极端情况:如低优先级线程 while(1) 死循环了,这样就算有高优先级的线程也无法运行的。
#2
这个主要看你如何应用,如果需要线程1立即执行,在中断里手动调用一次线程调度即可。
另外,类似的应用可能各操作系统处理不一样(wince不了解),但在rt thread系统中释放一个信号量时,会自动唤醒挂在该信号量上的优先级最高的线程。
另外,类似的应用可能各操作系统处理不一样(wince不了解),但在rt thread系统中释放一个信号量时,会自动唤醒挂在该信号量上的优先级最高的线程。
#3
版主你好,谢谢您的回答,还有就是中断到来时打断了一个一般优先级的工作线程2,比如说(线程2 )100毫秒时间片只运行到了50ms的地方中断到来,中断中setenvent触发等待中的高优先级线程1,问题是这时是线程2接着跑完50毫秒的时间片,才把时间让给更高优先级的线程1,还是在中断过后直接把时间分给高优先级的线程2,wince有没有这样的机制,就是想让中断到来时线程1能立刻工作起来完成自己的工作,时间上不受其它工作线程的影响,在极端情况下中断触发到线程切换时间控制在10ms以内,谢谢啊!
#4
建议 LZ 自己写两个线程,做一下实验。
#5
WINCE下不是1MS做一次调度吗?低优先级即使while(1)循环也是会被打断的吧?
#6
wince 默认调度时间是100ms
#define DEFAULT_THREAD_QUANTUM 100
不过他采用的是优先抢占轮转调度算法,高优先级的线程是可以抢占低优先级的线程的。
被抢占时剩余的时间保留在dwQuantLeft,并没有清零。
LZ如果想深入研究不妨看看WINCE600\PRIVATE\WINCEOS\COREOS\NK下的代码。
kernel目录有关键线程调度的代码,oemglobal.c有OEMGLOBAL结构体的设置。
#7
版主你好,谢谢您的回答,还有就是中断到来时打断了一个一般优先级的工作线程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
2. while (1) 有可能會造成 CPU 不 fetch 指令, 所以 CPU 連 H/W interrupt 皆無法處理, 這種死法可能無解.
Paul, Chao @ Techware
#1
一个线程还没从自己100ms的时间片中退出来,且没有调试的时机(如 Sleep(0)之类,是不太可能调试让高级先级的线程来执行的。
极端情况:如低优先级线程 while(1) 死循环了,这样就算有高优先级的线程也无法运行的。
极端情况:如低优先级线程 while(1) 死循环了,这样就算有高优先级的线程也无法运行的。
#2
这个主要看你如何应用,如果需要线程1立即执行,在中断里手动调用一次线程调度即可。
另外,类似的应用可能各操作系统处理不一样(wince不了解),但在rt thread系统中释放一个信号量时,会自动唤醒挂在该信号量上的优先级最高的线程。
另外,类似的应用可能各操作系统处理不一样(wince不了解),但在rt thread系统中释放一个信号量时,会自动唤醒挂在该信号量上的优先级最高的线程。
#3
版主你好,谢谢您的回答,还有就是中断到来时打断了一个一般优先级的工作线程2,比如说(线程2 )100毫秒时间片只运行到了50ms的地方中断到来,中断中setenvent触发等待中的高优先级线程1,问题是这时是线程2接着跑完50毫秒的时间片,才把时间让给更高优先级的线程1,还是在中断过后直接把时间分给高优先级的线程2,wince有没有这样的机制,就是想让中断到来时线程1能立刻工作起来完成自己的工作,时间上不受其它工作线程的影响,在极端情况下中断触发到线程切换时间控制在10ms以内,谢谢啊!
#4
建议 LZ 自己写两个线程,做一下实验。
#5
一个线程还没从自己100ms的时间片中退出来,且没有调试的时机(如 Sleep(0)之类,是不太可能调试让高级先级的线程来执行的。
极端情况:如低优先级线程 while(1) 死循环了,这样就算有高优先级的线程也无法运行的。
WINCE下不是1MS做一次调度吗?低优先级即使while(1)循环也是会被打断的吧?
#6
一个线程还没从自己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
版主你好,谢谢您的回答,还有就是中断到来时打断了一个一般优先级的工作线程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
2. while (1) 有可能會造成 CPU 不 fetch 指令, 所以 CPU 連 H/W interrupt 皆無法處理, 這種死法可能無解.
Paul, Chao @ Techware