首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ucos在s3c2410上运行过程整体剖析-从main函数到UCOS初始化完毕(6)

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();//开中断
继承事业,薪火相传
返回列表