学习ARM开发22-23
2007-05-24 13:02
381 查看
/***********************************
*作者:蔡军生
*出处: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
*作者:蔡军生
*出处: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
相关文章推荐
- 学习ARM开发(23)
- 学习ARM开发(23)
- 学习ARM开发(22)
- 学习ARM开发(22)
- arm嵌入式开发关于寻址、内存重映射和启动之间的关系(ARM学习1)
- 【ARM-Linux开发】【CUDA开发】【深度学习与神经网络】Jetson Tx2安装相关之二
- 【ARM-Linux开发】【CUDA开发】【深度学习与神经网络】Jetson Tx2安装相关之三
- 学习ARM开发(18)
- 学习ARM开发(20)
- 学习ARM开发(21)
- 学习ARM开发(6)
- 学习ARM开发(14)
- 【ARM-Linux开发】DRM学习(一)
- 学习ARM开发10-19
- 30本pdf完整版的经典Linux学习和开发教程和资料下载 android arm java 资料大全
- 学习ARM开发(14)
- 学习ARM开发(2)
- 学习ARM开发(7)
- 学习ARM开发(11)
- 新手一定要看的学习笔记 -ARM开发