打印
[ZLG-ARM]

关于OSSched()的疑惑!

[复制链接]
2743|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
51ucos|  楼主 | 2008-8-11 14:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于OSSched()的疑惑!
在uc/os中的任务调度函数:OSSched(), 在调用之前总是先关中断,执行完之后再开中断,形式如下: 

........... 
关中断; 
OSSched(); 
开中断; 


在OSSched()函数中会执行一个软中断,并且会执行相应的中断服务子程序(ISR),在ISR执行完之后,程序就会跳转到新任务那里,也就是说此时的内核还处于关中断状态(因为OSSched()没有返回,它下面的开中断指令也没有执行),而一般在新任务开始执行的时候是不会去检测中断是否关闭的. 这样会导致很严重的后果,请问一下这到底是怎么回事? 

欢迎各位解答! 

相关帖子

沙发
trio| | 2008-8-12 23:03 | 只看该作者

注意任务的切换是发生在中断返回这一点

在系统调用的软中断结束的时候,也就是OS将控制权交给另外一个任务的时候,是需要将该任务的SPSR恢复的,如果这个任务在此之前是开中断的,那么通过SPSR的恢复,系统会自动打开中断

使用特权

评论回复
板凳
zLgArM| | 2008-8-13 18:50 | 只看该作者

楼主

您好!
  
首先建议看看《uc/os-II微小内核分析与程序设计-基于LPC2300》教程,该书中对LPC2300系列ARM的任务切换有详细的解答。

1 任务级OSSched() 主要做了:关中断,找出进入就绪态且优先级最高的任务,最后宏调用OS_TASK_SW()完成实际上的任务切换。

OS_TASK_SW()任务级的任务切换函数是通过调用TASK_SW来实现的,因此可以说TASK_SW是真正实现任务调度的函数。

TASK_SW的作用是先将当前任务的CPU现场保存到该(当前任务)任务的堆栈中,然后获得最高优先级任务的堆栈指针,从该(最高优先级任务)堆栈指针中恢复此任务的CPU现场,使之继续运行。同时,任务间切换,遵循“从哪儿去,回哪儿来”的原则,当前任务虽然进入临界区没有退回,但当任务再次切换回来时,CPU现场是完好无缺的恢复到进入临界区时的状态,并且会继续执行当前任务后面的程序,也即必然执行该任务的退出临界区代码。

2 当系统刚开始运行时,即第一次从高优先级切换到低优先级时,在切换时会出现将低优先级任务堆栈(用于保存本任务CPU现场)内容恢复到CPU现场,这里加载的是初始化值,初始化值中默认是开了中断的,详见任务堆栈初始化程序OSTaskStkInt()。对LPC23xx来说,是通过指令LDMFD  SP!, {R0-R12, LR, PC }^ 来实现,管理模式下LDMFD指令仅用于恢复现场、中断异常返回并执行新任务,即通过出栈操作将PC、LR(R14_svc)和状态字的值装回CPU的寄存器中。
                                                           

使用特权

评论回复
地板
呆瓜一个| | 2011-1-13 17:33 | 只看该作者
三楼的的确高手!!!

使用特权

评论回复
5
米其林r| | 2011-1-15 21:57 | 只看该作者
3楼是版主吧,版主出马一个顶仨,学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

15

帖子

0

粉丝