学习ARM开发22-23

 /***********************************
 *作者:蔡军生
 *出处:http://blog.csdn.net/caimouse/
 ************************************/
  学习ARM开发(22)
关闭中断与打开中断

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

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

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

它占有这个资源。在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的话,关中断并不能防止这种情况。

 学习ARM开发(23)
三个任务准备与运行结果

 

下来看看创建任务和任运的栈空间怎么样的,以及运行输出。

Made in china by UCSDN(caijunsheng)

 

Lichee 1.0.0 (Mar 12 2006 - 20:51:12)

 

Lichee RTOS code: 0C100000 -> 0C1021EC  BSS: -> 0C102228

上面这句说明执行代码开始位置和结束位置,以及全局数据的结束位置。

 

Init Finish!

这里就是初始化任务完成。

pTask=C102234

这里就分配第一个IDLE任务内存位置。

pTask->pStackStart=C10225C

这个是任务的栈底的位置。

pTask->pStackTop=C10229C

这个是任务的栈顶位置。

pTask->pStackTop=C10225C

这里压入16个寄存器后栈位置。

 

Head

这里添加到双向链表头。

TaskIdle Finish

IDLE任务初始化完成。

以下是任务一初始化:

pTask=C1022A8

pTask->pStackStart=C1022D0

pTask->pStackTop=C102310

pTask->pStackTop=C1022D0


Tail

TaskTest1 Finish

 

以下是任务二初始化:

pTask=C10231C

pTask->pStackStart=C102344

pTask->pStackTop=C102384

pTask->pStackTop=C102344


Tail

TaskTest2 Finish

所有任务创建完成。

Task Create Finish

从第一个任务开始运行。

g_pCurrentTask = C102234

以后是运行任务输出:

TaskIdle
TaskTest1
TaskTest2
TaskTest1
TaskTest2
TaskTest1
TaskTest2
TaskTest1
TaskTest2
TaskTest1
TaskTest2 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值