向各位专家请教个定时器调度的问题
时间:2008-05-26 11:10:10
来源:论坛整理 作者: 编辑:chinaitzhe
fooA();
fooB();
fooC();
fooD();
在fooB中申请60ms定时器, 然后继续执行到fooC.
一旦60ms到时, 调用fooA.
现在正好执行到fooC时, 60ms就到了, 请问, 这时会调用fooA吗? 也就是自己把自己抢占了.
请注重, 是单个任务中连续调用这四个函数哦.
网友回复:一个也看不懂!!
期待高手来看看!
网友回复:假如你在调用fooB()时在用户进程,那么当定时器到期后将会马上调用fooA()(假如此时就只有定时器中断一个外部事件)。
至于你说正好执行到fooC(),那么要看中断发生在执行call指令前还是后。假如正好在执行call指令时发生的,那么中断一般将会在call指令完成后触发。
还有,一般说抢占是指一个高优先级任务抢占一个低优先级任务;或者是高优先级中断服务例程抢占低优先级的中断服务例程。而对于一个用户任务与中断事件之间没有“抢占”这一说法,而是说中断事件“打断”当前的执行任务。
网友回复:主管说, 任务不会把自己抢占了.
可我认为, 定时器是中断触发, 假如把任务X的入口, 安装成中断处理程序, 那么它非得把自己给抢占了不可.
主管很牛, 极可能他是对的, 但还是想向这里的高手们请教请教.
网友回复:中断与抢占. zenny_chen一语点醒小弟啊.
既然话匣打开, 那么我再问一下: CPU执行到fooC中, 中断发生, 调用到fooA, 那么当前的环境怎么处理啊, 比如我在fooC中申请了内存什么的, 会有什么后果?
谢谢.
网友回复:楼主还是没有搞清任务抢占的概念。
所谓一个任务抢占另一个任务是指操作系统的调度器利用中断将当前执行的任务打断,将其上下文环境保存起来,然后再调度当前合适的任务进行执行。当然,假如当前合适的任务仍然是刚才所运行的任务,它会继续执行。
而假如说在一个任务运行时,来了一个中断事件,将当前运行任务打断,这只是产生了一个异步中断处理事件。假如这一事件引起了调度器进行任务调度的话,那么可以说后面被调度的任务抢占了当前执行的任务;假如中断处理后返回到当前执行的任务,那么这个中断事件只是做暂时性的处理,而不能说当前任务抢占了当前任务。
所以说没有“自己抢占自己”的这一说法。
网友回复:To 楼主:
刚才在5楼的回答主要针对3楼的提问。
而对于你在4楼的提问其实也已经讲到了一些。不过上面所讲的是任务调度时的情况。
那么在执行一个任务时忽然发生了中断,这时,我们也需要保护当前上下文。但是这个上下文的保护比任务切换时对任务的上下文保护要轻很多。
在一般嵌入式开发情况下,假如一个中断服务例程由你自己编写的话,开销会非常小。你只需要把在中断服务例程中所有用到的寄存器保存起来即可,然后在中断返回前恢复它们。假如在附有操作系统的情况下,或是利用编译器的一些特性的话,那么在写一个中断例程时,编译器会在中断函数开头自动产生保存所有寄存器的指令,在中断返回前自动添加寄存器恢复指令。而在PC上做应用程序的话,那么也不需要关心那么多了。因为所有事件的中断函数都由操作系统治理,应用程序中,只需要将自己要回调的用户例程做相应的注册即可。
而对于你在fooC()中动态分配了内存,这些基于内存治理的话由操作系统控制,它们一般不会被破坏。假如是在多核或多处理器的场合下那么才需要考虑一些库函数调用的并发机制。不过一般这些也都是做好的。
网友回复:定时器应该不需要保存当有上下文,和线程是不同的,定时器也不会中断当前正在执行的任务,它是一种优先级很低的消息
网友回复:产生的是一个随机值,不能确定会调用哪个!
网友回复:单线程,就是顺序执行的。系统处理消息是要一个一个来的,假如fooc没有执行完毕,是不会执行WM_TIMER消息的。
网友回复:
呵呵,楼主很会恶搞,不错的。
这确实也是一种情况。也就是任务例程本身又是一个中断处理例程。这样一来确实看上去是自己“抢占”自己了。我先不讨论这种做法好不好,不过也要分几种情况考虑:
1、当执行任务X时处于用户模式(没有任何中断请求位未决),而此时发生了定时中断,这时由于中断向量被设置成了任务例程X的入口,因此将会打断当前X的执行,然后重新从X的入口处开始执行。楼主可以把这个例程看作为一个实体的两种不同概念:在作为用户任务执行时,将它视为任务;在中断发生后进行执行时,将它视为ISR。这个现象就类似于Unix/Linux中的fork()函数调用后的现象——此时执行后面代码的很有可能就是子进程,它与父进程共享统一代码段和栈段,直到对父进程的栈段等数据段进行写操作时才通过写时复制为其开辟自己的数据空间。在次之前子进程使用了父进程相同的代码和数据。
这也非常类似。所以,为了澄清概念,个人认为将它门区别对待更好一些。所以我还是想用“定时中断事件X打断任务X的执行”,而不是用“任务X自己抢占自己”。
2、当X处于中断处理状态(此时定时中断位未决),对于大多数硬件系统不答应相同优先级的中断相互打断,但是像Blackfin53x/561 DSP却有这个设置,通过设置SYS_CFG寄存器可以答应相同优先级的中断处理进行打断。那么这种情况是属于中断处理与中断处理之间的打断关系。
最后想提出几个需要注重的地方:
1、假如楼主这么做了就应当保证例程X是可重入的,也就是在执行X到某一点被打断后又从头开始对它执行不会对刚才的执行结果有任何副作用,像某些数据、状态被改变等。
2、在例程X开头应当对相应的寄存器进行保护,这种保护的级别应当时中断例程级别的(因为它本身就是中断处理例程)。当定时器中断来了以后,仍然按照处理一般中断例程的方法,无需对X的上下文作任务级的保护,其保护实际上就是在X的开头做的(寄存器保护)。假如X被其它高优先级任务打断时,那么操作系统会将X作为一个任务对它的上下文进行保护。假如此时在执行其它任务时发生中断,那么中断处理例程X的上下文可以是当前任务的上下文(使用当前任务的栈段),当然也可以使用系统栈。我自己做的基于Blackfin561 dual-core DSP的操作系统中专门为中断处理开辟了一个存储空间,作为系统栈段,对这段存储空间的访问速度非常快,基本等同于访问寄存器所消耗的时间。
关键字:专家,请教,定时器,调度,问题,
上一篇:没有理解的问题
下一篇:下面没有链接了











文章评论
共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面