2377
- 收藏
- 点赞
- 分享
- 举报
RealviewMDK中编译器对中断处理的过程详解
RealviewMDK中编译器对中断处理的过程详解
在ARM程序的开发过程中,对中断的处理是很普遍的、也是相当重要的。RealviewMDK使用的RVCT编译器提供了__irq关键字,用此关键字修饰的函数被作为中断出来函数编译,即在编译的过程中,编译器会自动添加中断处理过程中现场保护和恢复的代码,减小程序的开发难度,加快软件的开发过程。
在理解__irq关键字的作用之前,先看一下ARM核对异常的处理过程。当产生异常时,ARM核拷贝CPSR寄存器的内容SPSR_寄存器中,同时设置适当的CPSR 位、改变处理器状态进入ARM态和处理器模式,从而进入相应的异常模式。在设置中断禁止位禁止相应中断(如果需要)后,ARM核保存返回地址到LR_,同时设置PC为相应的异常向量。当异常返回时, 异常处理需要从SPSR_寄存器中恢复CPSR的值,同时从LR_恢复PC,具体的异常返回指令如下:
� 从SWI和Undef异常返回时使用:
movspc,,LR;
� 从FIQ、IRQ和预取终止返回时使用:
SUBSPC,,LR,#4;
� 从数据异常返回时使用:
SUBSPC,,LR,#8
在使用上述指令异常返回时,如果LR之前被压栈的话使用LDM“∧”, 例如:
LDMFDSP!!,{PC}}∧
LDMFDSP!!,{PC}}
理解了ARM异常处理的过程以后,RealviewMDK中__irq关键字的作用就容易理解了。下面的函数为一个中断处理函数,其前面加了__irq关键字。
__irq void pwm0_irq_handler(void)
{
//Deassert PWM0 interrupt signal
unsigned int i=AT91F_PWMC_GetInterruptStatus(AT91C_BASE_PWMC);
// Clear the LED's. On theBoard we must applya "1" to turn off LEDs
AT91F_PIO_SetOutput(AT91C_BASE_PIOA,led_mask[0]);
AT91F_PWMC_StopChannel(AT91C_BASE_PWMC,AT91C_PWMC_CHID1);
AT91F_AIC_ClearIt(AT91C_BASE_AIC,AT91C_ID_PWMC);
AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
}
当编译器器编译这个函数时,除了保存ATPCS规则规定的寄存器以外,还保存了CPSR及PC的值。在函数的返回时,还自动添加了SUBSPC,LR,#4和从SPSR寄存器恢复CPSR寄存器值的指令。用这种方式处理以后,中断处理函数可以和普通函数一样的使用。
注意:中断处理都是在ARM模式下进行的,当源程序欲编译成Thumb指令时,这时,用__irq关键字修饰的函数仍然会被编译成ARM指令。如果源程序编译成在CORTEXM3上运行的指令时,关键字__irq对函数的编译没有任何影响,即编译器不会自动保存CPSR及PC的值,也不会添加SUBSPC,LR,#4和从SPSR寄存器恢复CPSR寄存器值的指令,因为CORTEXM3处理器硬件会自动处理这些问题,无需软件开发人员关心。
-1-
在ARM程序的开发过程中,对中断的处理是很普遍的、也是相当重要的。RealviewMDK使用的RVCT编译器提供了__irq关键字,用此关键字修饰的函数被作为中断出来函数编译,即在编译的过程中,编译器会自动添加中断处理过程中现场保护和恢复的代码,减小程序的开发难度,加快软件的开发过程。
在理解__irq关键字的作用之前,先看一下ARM核对异常的处理过程。当产生异常时,ARM核拷贝CPSR寄存器的内容SPSR_
� 从SWI和Undef异常返回时使用:
movspc,,LR;
� 从FIQ、IRQ和预取终止返回时使用:
SUBSPC,,LR,#4;
� 从数据异常返回时使用:
SUBSPC,,LR,#8
在使用上述指令异常返回时,如果LR之前被压栈的话使用LDM“∧”, 例如:
LDMFDSP!!,{PC}}∧
LDMFDSP!!,{PC}}
理解了ARM异常处理的过程以后,RealviewMDK中__irq关键字的作用就容易理解了。下面的函数为一个中断处理函数,其前面加了__irq关键字。
__irq void pwm0_irq_handler(void)
{
//Deassert PWM0 interrupt signal
unsigned int i=AT91F_PWMC_GetInterruptStatus(AT91C_BASE_PWMC);
// Clear the LED's. On theBoard we must applya "1" to turn off LEDs
AT91F_PIO_SetOutput(AT91C_BASE_PIOA,led_mask[0]);
AT91F_PWMC_StopChannel(AT91C_BASE_PWMC,AT91C_PWMC_CHID1);
AT91F_AIC_ClearIt(AT91C_BASE_AIC,AT91C_ID_PWMC);
AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
}
当编译器器编译这个函数时,除了保存ATPCS规则规定的寄存器以外,还保存了CPSR及PC的值。在函数的返回时,还自动添加了SUBSPC,LR,#4和从SPSR寄存器恢复CPSR寄存器值的指令。用这种方式处理以后,中断处理函数可以和普通函数一样的使用。
注意:中断处理都是在ARM模式下进行的,当源程序欲编译成Thumb指令时,这时,用__irq关键字修饰的函数仍然会被编译成ARM指令。如果源程序编译成在CORTEXM3上运行的指令时,关键字__irq对函数的编译没有任何影响,即编译器不会自动保存CPSR及PC的值,也不会添加SUBSPC,LR,#4和从SPSR寄存器恢复CPSR寄存器值的指令,因为CORTEXM3处理器硬件会自动处理这些问题,无需软件开发人员关心。
-1-
我来回答
回答0个
时间排序
认可量排序
暂无数据
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
22020-03-02 15:29:13
-
2012-12-04 13:50:20
-
2012-12-24 14:27:48
-
72015-01-26 14:09:34
-
22024-02-20 20:46:07
-
2021-01-11 16:30:01
-
2015-06-03 09:54:19
-
2012-12-05 13:29:58
-
2013-12-02 15:58:08
-
2020-10-13 09:37:53
-
2015-11-10 10:04:38
-
2016-01-30 17:05:43
-
2016-10-11 16:41:50
-
2020-03-17 10:22:56
-
2012-12-24 14:34:51
-
2012-12-04 11:53:25
-
2022-12-22 10:32:45
-
2018-10-30 16:38:46
-
2023-12-12 16:55:43
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认