共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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |