学习ARM开发(22)

王朝other·作者佚名  2006-03-10
窄屏简体版  字體: |||超大  

关闭中断与打开中断

中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西

,但程序突然中断了,又让另外一个程序输出打印内容,这样在打印机上就会乱得不得了,

同时有两份以上的文件交错地打印在一张纸上。像不可剥夺的资源,就一定要关闭中断,让

它占有这个资源。在ARM里,没有像x86那样有清除中断指令CLI。那么在ARM里是怎么样实现

关中断和开中断的呢?下面就来看看ARM的关中断和开中断实现。

///////////////////////////////////////////////////////////////////////////////

//函数名称: Lock

//函数功能: 关中断函数。

//输入参数:

//输出参数:

//返 回 值:

//开发人员: 蔡军生

//时 间: 2006/02/13

//修改说明:

//

///////////////////////////////////////////////////////////////////////////////

void Lock(void)

{

//

asm volatile ( "stmdb sp!, {r0}" );

asm volatile ( "mrs r0, cpsr" );

asm volatile ( "orr r0,r0,#0xC0" );

asm volatile ( "msr cpsr_cxsf,r0" );

asm volatile ( "ldmia sp!,{r0}" );

}

上面这段程序是通过设置CPSR的第6,7位来实现的,因为第6,7位是设置为1时,就不再响应

中断。

///////////////////////////////////////////////////////////////////////////////

//函数名称: UnLock

//函数功能: 开中断函数。

//输入参数:

//输出参数:

//返 回 值:

//开发人员: 蔡军生

//时 间: 2006/02/13

//修改说明:

//

///////////////////////////////////////////////////////////////////////////////

void UnLock(void)

{

//

asm volatile ( "stmdb sp!, {r0}" );

asm volatile ( "mrs r0, cpsr" );

asm volatile ( "bic r0,r0,#0xC0" );

asm volatile ( "msr cpsr_cxsf,r0" );

asm volatile ( "ldmia sp!,{r0}" );

}

上面是重新开中断的命令,同样是设置CPSR的第6,7位,但它的值是0,就可接收中断了。

如果在多个任务之间进行共享数据,一般是需要使用关中断和开中断实现数据同步的,其实

中这种关中断和开中断,就是进入临界区和退出临界区。

如果是像PC机那样有多个CPU的话,关中断并不能防止这种情况。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航