上电之后,程序会进行reset,这时会进入svc模式,这是一种特权模式。
APP运行于usr mode,在该模式下APP访问硬件时,必须切换mode为svc mode,否则会受限。
那么,怎么切换mode呢?我们知道,当发生异常时,比如中断和未定义指令异常,CPU会进入对应的特权模式,在这些模式下可以进入svc mode,但是这些异常都不稳定。所以,我们使用的是swi(software interrupt)异常,通过指令swi #val(使用软中断)来进入svc模式,同时还可以根据#val来判断需要进行什么样的处理。
先从svc模式切换到usr模式:
然后再通过一条swi指令进入svc模式:
退出异常时,将lr_svc直接赋给PC即可,所以存lr_svc时直接存就行。
然后,在svc异常的处理程序中,输出cpsr的值和表示进入swi异常的字符串。这些部分与未定义指令异常的处理没有什么不同。
除了上述这些,还要找到swi指令的val值。我们知道进入svc异常时,lr_svc保存的是cpu下一条要处理的指令的地址,也就是ldr pc, =main的地址。该地址减去4,就是swi 0x123的地址。
所以我们先将lr的值保存到r4,这是由于中间的printException会进行子程序调用,保存到r4可以保证不会被破坏。然后把r4 - 4得到swi 0x123的地址,赋给r0,然后跳到printSWIVal子程序中去,在这个子程序中再取出#val并输出。
根据下图,我们知道swi的后24位被处理器忽略,这应该就是#val。
最终的结果如下图:cpsr的[M4:M0]为0b10011,进入了svc模式,输入的#val也正确。
当运行与Thumb指令集时,swi指令为16位,这时他的#val只有八位,也就是最后八位。
上一篇:mount nfs常见出错信息总结
下一篇:1.5.5_按键中断程序示例_概述与初始化
推荐阅读最新更新时间:2024-11-01 16:17
设计资源 培训 开发板 精华推荐
- 单片机延时计算小程序
- 适用于工业应用的 C8051F523A MCU 的 C8051F530ADK、8051 开发系统
- 用于照明的 16-LED 调光 LED 驱动器
- LTC2946HDE-1 电源、电荷和能量监视器在 -48V 恶劣环境中的典型应用,使用 INTVCC 并联稳压器来耐受 200V 瞬态
- 立创面板打印丨 STM32F103模块开发板
- TC2185 的典型应用是具有关断和参考旁路的 50 mA、100 mA、150 mA CMOS LDO
- SMARTPSE24-KIT、24 端口电源管理器参考设计和评估套件
- 使用 Cypress Semiconductor 的 AG12232D 的参考设计
- LTC3859AEUHF 高效率、宽输入范围、双通道 3.3V/8.5V 同步降压/升压转换器的典型应用电路
- 使用CANFD和MC33772C的HVBMS电池接线盒(BJB)
- 瑞萨电子边缘AI 技术研讨会——深圳站, 火热报名中,参会有好礼!
- 9月24日 直播|Microchip mSiC™产品及其在电动出行中的典型应用方案
- 有奖直播:助力AI算力,下一代GPU服务器中卡缘高速互连解决方案哪里找?
- 专为高性能存储而优化的FPGA芯片, 英特尔®Agilex™ M 系列火热发布!
- “玄铁杯”第三届RISC-V应用创新大赛—国产高性能RISC-V Linux开发板LicheePi 4A报名专场,万元奖金,邀您奔赴开源设计盛宴
- 课随你变 票选你选型觉得最困难的元器件,干货越多礼品越大!
- 泰克WiFi预一致性测量方案介绍会 填问卷 赢好礼
- 新思科技技术日:硬件加速验证解决方案专场 火热报名中!
- 直播:您的安全保护做到了吗?TI毫米波雷达直播给您答案