共2条
1/1 1 跳转至页
2114,ucos 在2114上移植ucos
问
如果用汇编写中断服务程序,所有的现场保护都需要用程序实现吗?单片机本身会做哪些工作?
答 1: 我是这样理解的如果用汇编写中断服务程序,进入中断系统会自动切换到相应的模式,保存环境等工作需要有程序实现。但是看了zlg的一个移植程序有点不明白,在irq.s文件中,定义的中断宏处理程序:
SUB LR, LR, #4 ; 计算返回地址
STMFD SP!, {R0-R3, R12, LR} ; 保存任务环境
MRS R3, SPSR ; 保存状态
STMFD SP, {R3, SP, LR}^
1 最后一句中,入栈的sp应该是在irq模式下的当前值吧,用于在退出中断时任务环境参数在栈中的位置,程序注释为用户的“R3,SP,LR”是怎么回事?
2 STMFD SP!,{R0-R3,R12,LR}不是已经保存LR了吗,为什么最后又保存一次? 答 2: 哈哈……这个问题我以前也问过~~~~~~1.用户模式寄存器,是因为后面加了一个^
2.两个LR是不一样的,一个是用户模式的,一个是IRQ的。
请看:http://bbs.21ic.com/club/bbs/list.asp?boardid=39&t=1995510&tp=%u8BF7%u6559%u4EE5%u4E0B%u6C47%u7F16%u5B8F%u5B9A%u4E49%u7684%u4F5C%u7528
答 3: 我看了那个帖子还有些不明白:
$IRQ_Label
SUB LR, LR, #4 ; 计算返回地址
STMFD SP!, {R0-R3, R12, LR} ; 保存任务环境
MRS R3, SPSR ; 保存状态
STMFD SP, {R3, SP, LR}^ ; 保存用户状态的R3,SP,LR,注意不能回写
; 如果回写的是用户的SP,所以后面要调整SP
LDR R2, =OSIntNesting ; OSIntNesting++
LDRB R1, [R2]
ADD R1, R1, #1
STRB R1, [R2]
SUB SP, SP, #4*3
MSR CPSR_c, #(NoInt | SYS32Mode) ; 切换到系统模式
CMP R1, #1
LDREQ SP, =StackUsr
BL $IRQ_Exception_Function ; 调用c语言的中断处理程序
为什么要切换到系统模式呢? 答 4: 切换到系统模式在开中断前切换到系统模式,可以保证发生中断嵌套前处于系统模式,这样在保存环境时统一都是系统模式或用户模式,对否? 答 5: 这样可以实现嵌套,而且系统模式堆栈区最大呀. 答 6: 我上面的理解对吗?另外,在zlg的例程中,他的管理模式堆栈定义怎么没有与别的模式定义放在一起?
答 7: 软件中断和别的还不一样?进入软件中断时,首先调整堆栈指针
(LDR SP, StackSvc)
不是自动转换到管理模式吗?为什么要人为调整?别的中断为什么不用调整SP? 答 8: 在一个资料上找到进入异常ARM微处理器所做工作1 将下一条指令地址存入连接寄存器LR;
2 保存状态寄存器内容到SPSR;
3 设置CPSR为响应模式;
4 强制PC从异常向量地址取下一条指令;
答 1: 我是这样理解的如果用汇编写中断服务程序,进入中断系统会自动切换到相应的模式,保存环境等工作需要有程序实现。但是看了zlg的一个移植程序有点不明白,在irq.s文件中,定义的中断宏处理程序:
SUB LR, LR, #4 ; 计算返回地址
STMFD SP!, {R0-R3, R12, LR} ; 保存任务环境
MRS R3, SPSR ; 保存状态
STMFD SP, {R3, SP, LR}^
1 最后一句中,入栈的sp应该是在irq模式下的当前值吧,用于在退出中断时任务环境参数在栈中的位置,程序注释为用户的“R3,SP,LR”是怎么回事?
2 STMFD SP!,{R0-R3,R12,LR}不是已经保存LR了吗,为什么最后又保存一次? 答 2: 哈哈……这个问题我以前也问过~~~~~~1.用户模式寄存器,是因为后面加了一个^
2.两个LR是不一样的,一个是用户模式的,一个是IRQ的。
请看:http://bbs.21ic.com/club/bbs/list.asp?boardid=39&t=1995510&tp=%u8BF7%u6559%u4EE5%u4E0B%u6C47%u7F16%u5B8F%u5B9A%u4E49%u7684%u4F5C%u7528
答 3: 我看了那个帖子还有些不明白:
$IRQ_Label
SUB LR, LR, #4 ; 计算返回地址
STMFD SP!, {R0-R3, R12, LR} ; 保存任务环境
MRS R3, SPSR ; 保存状态
STMFD SP, {R3, SP, LR}^ ; 保存用户状态的R3,SP,LR,注意不能回写
; 如果回写的是用户的SP,所以后面要调整SP
LDR R2, =OSIntNesting ; OSIntNesting++
LDRB R1, [R2]
ADD R1, R1, #1
STRB R1, [R2]
SUB SP, SP, #4*3
MSR CPSR_c, #(NoInt | SYS32Mode) ; 切换到系统模式
CMP R1, #1
LDREQ SP, =StackUsr
BL $IRQ_Exception_Function ; 调用c语言的中断处理程序
为什么要切换到系统模式呢? 答 4: 切换到系统模式在开中断前切换到系统模式,可以保证发生中断嵌套前处于系统模式,这样在保存环境时统一都是系统模式或用户模式,对否? 答 5: 这样可以实现嵌套,而且系统模式堆栈区最大呀. 答 6: 我上面的理解对吗?另外,在zlg的例程中,他的管理模式堆栈定义怎么没有与别的模式定义放在一起?
答 7: 软件中断和别的还不一样?进入软件中断时,首先调整堆栈指针
(LDR SP, StackSvc)
不是自动转换到管理模式吗?为什么要人为调整?别的中断为什么不用调整SP? 答 8: 在一个资料上找到进入异常ARM微处理器所做工作1 将下一条指令地址存入连接寄存器LR;
2 保存状态寄存器内容到SPSR;
3 设置CPSR为响应模式;
4 强制PC从异常向量地址取下一条指令;
共2条
1/1 1 跳转至页
回复
我要赚赏金打赏帖 |
|
|---|---|
| PCF8574功能模块及其使用被打赏¥20元 | |
| 传感器LSM6DSO及LIS3MDL的功能检测被打赏¥18元 | |
| LPS25HB气压传感器及其检测被打赏¥18元 | |
| HTS221温湿度传感器及其检测被打赏¥18元 | |
| 【S32K3XX】HSE FW 版本更新被打赏¥21元 | |
| 基于ArduinoUNO开发板的AT24C02读写测试被打赏¥16元 | |
| TCS3472S传感器及其色彩检测被打赏¥19元 | |
| 【S32DS】S32K3 RTD7.0.1 HSE 组件配置报错问题解决被打赏¥27元 | |
| 【S32K3XX】MCME 启动 CORE1被打赏¥23元 | |
| AG32VH407下温度大气压传感器及其检测被打赏¥20元 | |
我要赚赏金
