共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电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
分享汽车通信和多媒体总线结构被打赏20分 | |
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
NUCLEO-U083RC学习历程38+串口通过队列的方式输出两个字符串被打赏20分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
分享电控悬架的结构与工作原理(一)被打赏20分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 |