[ZLG-ARM] 关于OSSched()的疑惑!

[复制链接]
 楼主| 51ucos 发表于 2008-8-11 14:02 | 显示全部楼层 |阅读模式
关于OSSched()的疑惑!<br />在uc/os中的任务调度函数:OSSched(),&nbsp;在调用之前总是先关中断,执行完之后再开中断,形式如下:&nbsp;<br />{&nbsp;<br />...........&nbsp;<br />关中断;&nbsp;<br />OSSched();&nbsp;<br />开中断;&nbsp;<br />}&nbsp;<br /><br />在OSSched()函数中会执行一个软中断,并且会执行相应的中断服务子程序(ISR),在ISR执行完之后,程序就会跳转到新任务那里,也就是说此时的内核还处于关中断状态(因为OSSched()没有返回,它下面的开中断指令也没有执行),而一般在新任务开始执行的时候是不会去检测中断是否关闭的. 这样会导致很严重的后果,请问一下这到底是怎么回事?&nbsp;<br /><br />欢迎各位解答!&nbsp;
trio 发表于 2008-8-12 23:03 | 显示全部楼层

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

在系统调用的软中断结束的时候,也就是OS将控制权交给另外一个任务的时候,是需要将该任务的SPSR恢复的,如果这个任务在此之前是开中断的,那么通过SPSR的恢复,系统会自动打开中断
zLgArM 发表于 2008-8-13 18:50 | 显示全部楼层

楼主

您好!<br />&nbsp;&nbsp;<br />首先建议看看《uc/os-II微小内核分析与程序设计-基于LPC2300》教程,该书中对LPC2300系列ARM的任务切换有详细的解答。<br /><br />1&nbsp;任务级OSSched()&nbsp;主要做了:关中断,找出进入就绪态且优先级最高的任务,最后宏调用OS_TASK_SW()完成实际上的任务切换。<br /><br />OS_TASK_SW()任务级的任务切换函数是通过调用TASK_SW来实现的,因此可以说TASK_SW是真正实现任务调度的函数。<br /><br />TASK_SW的作用是先将当前任务的CPU现场保存到该(当前任务)任务的堆栈中,然后获得最高优先级任务的堆栈指针,从该(最高优先级任务)堆栈指针中恢复此任务的CPU现场,使之继续运行。同时,任务间切换,遵循“从哪儿去,回哪儿来”的原则,当前任务虽然进入临界区没有退回,但当任务再次切换回来时,CPU现场是完好无缺的恢复到进入临界区时的状态,并且会继续执行当前任务后面的程序,也即必然执行该任务的退出临界区代码。<br /><br />2&nbsp;当系统刚开始运行时,即第一次从高优先级切换到低优先级时,在切换时会出现将低优先级任务堆栈(用于保存本任务CPU现场)内容恢复到CPU现场,这里加载的是初始化值,初始化值中默认是开了中断的,详见任务堆栈初始化程序OSTaskStkInt()。对LPC23xx来说,是通过指令LDMFD&nbsp;&nbsp;SP!,&nbsp;{R0-R12,&nbsp;LR,&nbsp;PC&nbsp;}^&nbsp;来实现,管理模式下LDMFD指令仅用于恢复现场、中断异常返回并执行新任务,即通过出栈操作将PC、LR(R14_svc)和状态字的值装回CPU的寄存器中。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
呆瓜一个 发表于 2011-1-13 17:33 | 显示全部楼层
三楼的的确高手!!!
米其林r 发表于 2011-1-15 21:57 | 显示全部楼层
3楼是版主吧,版主出马一个顶仨,学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

15

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部