ucos在s3c2410上运行过程整体剖析-从main函数到UCOS初始化完毕(6)
- UID
- 1029342
- 性别
- 男
|
ucos在s3c2410上运行过程整体剖析-从main函数到UCOS初始化完毕(6)
下面分析中断嵌套是怎么实现的:
先看两个宏的定义:
#define OS_ENTER_CRITICAL() { cpu_sr = INTS_OFF(); }
#define OS_EXIT_CRITICAL() { if(cpu_sr == 0) INTS_ON(); }
再看INTS_OFF()这个函数的内容:
INTS_OFF
mrs r0, cpsr ; current CSR//读取当前CPSR的值
mov r1, r0 ; make a copy for masking//把CPSR的值复制给r1
orr r1, r1, #0xC0 ; mask off int bits //屏蔽中断
msr CPSR_cxsf, r1 ; disable ints (IRQ and FIQ)//把屏蔽中断后的内容重新写会CPSR
and r0, r0, #0x80 ; return IRQ bit from original CSR//返回CPSR中原来的CPSR中I位的状态,由前面的ATPCS知识我们知道,函数的返回值在R0中
mov pc,lr ; return
这个关中断的函数执行完毕后有两个作用,一:实现了关闭中断。二:记忆CPSR中原来的I位的状态,并将其保存在cpu_sr变量中。
开中断的代码中INTS_ON()这个函数的内容就不多说了,很简单,就是读取CPSR的值改写后重新写回CPSR中。开中断的宏定义的代码中if(cpu_sr == 0) INTS_ON();,首先判断cpu_sr的值,若其值为0,开中断,否则并不开中断。其值为0说明你调用OS_ENTER_CRITICAL()这个关闭中断之前CPSR是开中断的,即你只关闭了一次中断。若你嵌套关闭中断,在里层的开中断并不执行。例如:
你在你的应用程序里定义了一个变量cpu_sr1用来存放你关中断时返回的值。
Ucos内核定义的变量是cpu_sr,用来存放你关中断的返回值。
其代码如下:
cpu_sr1 = INTS_OFF();//你的应用程序要关闭中断,如果这是第一次关闭中断,那cpu_sr1的值是0
OS_ENTER_CRITICAL();//ucos内核又关闭了一次中断,这时cpu_sr的值肯定是1
OS_EXIT_CRITICAL();// 由于cpu_sr的值肯定是1,开中断不执行
其他用户代码
if(cpu_sr1 == 0) INTS_ON();//开中断 |
|
|
|
|
|