|
发表于 2010-2-14 01:18:39
|
显示全部楼层
第一个原因比较容易明白,就是防止重复入栈(因为进入中断的时候已经入栈了)。邵贝贝教授的书也好像只提到了这一点。对于一些特殊的平台,比如cortex-m3,因为中断系统引入了很多新的特点,比如咬尾巴。所以导致OSCtxSw和OSIntCtxSw已经没有区别了,下面是zlg提供的基于cortex-m3移植范例,可以看出OSCtxSw和OSIntCtxSw的代码是完全一样的。
OSCtxSw
PUSH {R4, R5}
LDR R4, =NVIC_INT_CTRL ; trigger the PendSV exception
; 触发软件中断
LDR R5, =NVIC_PENDSVSET
STR R5, [R4]
POP {R4, R5}
BX LR
;*********************************************************************************************************
;** Function name: OSIntCtxSw
;** Descriptions: called by OSIntExit() when it determines a context switch is needed as the
;** result of an interrupt.
;** 中断级任务切换
;** Input parameters: None 无
;** Output parameters: None 无
;** Returned value: None 无
;** Created by: Steven Zhou 周绍刚
;** Created Date: 2007.01.18
;**-------------------------------------------------------------------------------------------------------
;** Modified by: Ni Likao 倪力考
;** Modified date: 2007.11.02
;**-------------------------------------------------------------------------------------------------------
;*********************************************************************************************************
OSIntCtxSw
PUSH {R4, R5}
LDR R4, =NVIC_INT_CTRL ; trigger the PendSV exception
; 触发软件中断
LDR R5, =NVIC_PENDSVSET
STR R5, [R4]
POP {R4, R5}
BX LR
NOP
第二个原因感觉有点牵强,可能是我没理解透彻,呵呵
“在中断服务子程序中调用OSIntExit()时,将返回地址推入了堆栈”
是不是可以这么理解,因为OSIntExit()是被中断函数调用的,所以编译器根据C语言函数调用的实际情况生成了一个入栈操作,入栈的寄存器会在OSIntExit()函数返回的时候出栈。
引发了一个问题用C语言的写的程序,在函数调用的时候需不需要出入栈操作应该是编译器决定的吧?
感谢各位高手指点一下。
aaa1982 |
|