系统复位的时候,从0地址开始执行,这个时候系统处于svc管理模式。
一般而言,我们的app应用程序是处于用户模式的,但是用户模式不能访问硬件,必须处于特权模式才可以。所以这里我们用swi软中断方式来实验。swi异常会让cpu进入svc模式。
首先,系统复位,执行代码,此刻处于svc模式,然后我们切换模式改变成为用户模式,再使用swi指令,处理软中断。
由于切换了模式,需要重新设置栈,因为我们要调用c函数,而栈我们是在sdram的最高地址往下开辟的。
这里,我们的swi异常发生时,硬件会让程序从地址0x8的地方开始执行,所以我们仿照之前的未定义异常编写软中断处理函数:
do_swi:
/* 执行到这里之前:
* 1. lr_svc保存有被中断模式中的下一条即将执行的指令的地址
* 2. SPSR_svc保存有被中断模式的CPSR
* 3. CPSR中的M4-M0被设置为10011, 进入到svc模式
* 4. 跳到0x08的地方执行程序
*/
/* sp_svc未设置, 先设置它 */
ldr sp, =0x33e00000
/* 保存现场 */
/* 在swi异常处理函数中有可能会修改r0-r12, 所以先保存 */
/* lr是异常处理完后的返回地址, 也要保存 */
stmdb sp!, {r0-r12, lr}
//mov r4, lr
/* 处理swi异常 */
mrs r0, cpsr
ldr r1, =swi_string
bl printException
//sub r0, r4, #4
ldr r0,=my_swi
bl printSWIVal
/* 恢复现场 */
ldmia sp!, {r0-r12, pc}^ /* ^会把spsr的值恢复到cpsr里 */
swi_string:
.string "swi exception"
.align 4
韦老大的代码通过swi异常保存lr的方式来达到读取软中断号,这样其实麻烦了,所以我直接在我们的swi 0x123处加上标签(my_swi:),这样直接就知道swi 0x123这条指令的地址,解引用这个地址,就可以得到0x123这个数值,而不用通过保存lr的值之后,再减去4的方式,可读性更高,代码也更简单呀!
这样,当代码运行到swi 0x123是,就会出现我们软中断异常处理,打印消息如下:
先发生未定义异常,然后发生swi异常。
上图是swi异常的打印函数,为什么取地址解引用之后,还要对0xff000000取反相与呢?
我们看看arm指令格式:
我们忽略cond条件(全为1,上篇随笔也有说到),而且紧跟着的4位也都是1,所以高八位都是1,即ff,所以我们要把高八位清零,剩下的就是我们my_swi标签地址内存中正真的数据了。
再说一下切换成usr用户的时候我们使用了 bic指令。
BIC指令的格式为:
BIC{条件}{S} 目的寄存器,操作数1,操作数2
BIC指令用于清除操作数1的某些位,并把结果放置到目的寄存器中。操作数1应是一个寄存器,
操作数2可以是一个寄存器、被移位的寄存器、或一个立即数。操作数2为32位的掩码,如果在
掩码中置了某一位1,则清除这一位。未设置的掩码位保持不变。
eg:
bic r0,r0,#0x1f
0x1f=11111b
其含义:清除r0的bit[4:0]位。
然后:
msr和mrs很像,不要混淆了。
mrs:(r:寄存器 ,s:状态 英文缩写)
将状态寄存器的内容传送至通用寄存器。
msr:(s:状态 ,r:寄存器)
通用寄存器传送至状态寄存器传送指令
msr和mrs这两个指令从右往左看这三个字母,开头都是m就不管了,sr表示r->s(r到s),rs表示s->r(s到r),就是把什么寄存器传到什么寄存器去。
比如我们上面的msr cpsr, r0:表示把通用寄存器r0传送到状态寄存器cpsr。
上一篇:ARM的7种工作模式、37个通用寄存器、CPSR程序状态寄存器
下一篇:TQ2440裸机中断(软中断swi)
推荐阅读
史海拾趣
为了保持技术领先和市场竞争力,晶岳电子一直注重研发团队的建设。目前,公司在上海、深圳及台湾均建有成熟的产品研发团队,核心功率器件及集成电路设计人员均拥有15年以上的设计研发经验。这些优秀的研发人员不仅为公司带来了源源不断的技术创新,也确保了公司在激烈的市场竞争中始终保持领先地位。此外,晶岳电子还积极与高校和研究机构合作,共同开展前沿技术的研发和应用。
CBM_America_Corporation在电子行业的初期,专注于研发具有创新性的半导体技术。通过不懈的努力,公司成功开发出一种高效能、低能耗的芯片,受到了市场的广泛欢迎。这一技术突破为公司带来了大量的订单,也吸引了众多投资者的关注。随着资金的注入,CBM开始扩大生产规模,并进军国际市场,逐步成为了电子行业的领军企业。
芯旺微电子一直将技术创新作为公司发展的核心驱动力。公司拥有一支高素质的研发团队,不断在CPU系统结构、编译器、IDE软件、数模混合设计等领域进行技术创新和突破。这些技术创新的成果不仅提升了芯旺微电子的产品性能和质量,也为其在激烈的市场竞争中赢得了更多的机会和优势。
随着环保意识的日益增强,BREL International Components公司积极响应绿色发展的号召。公司投入大量资源研发环保型电子元件,采用环保材料和节能技术,降低产品对环境的影响。同时,BREL还加强废弃电子元件的回收和处理工作,推动电子行业的可持续发展。这种环保理念不仅提升了BREL的企业形象,也为公司的未来发展奠定了坚实的基础。
请注意,这些故事是基于虚构的,旨在展示电子行业常见的发展路径和策略,而非针对具体公司的描述。如果您需要关于特定公司的故事或信息,建议您直接查阅该公司的官方网站或相关新闻报道。
BREL International Components公司自创立之初,就致力于电子元件的技术创新。在早期阶段,公司研发出一款高性能的集成电路,其稳定性和耐用性远超市场同类产品。这一创新为BREL赢得了众多客户的青睐,公司迅速在电子元件市场占据了一席之地。随着技术的不断进步,BREL持续推出创新产品,如低功耗的芯片和高速传输的连接器,进一步巩固了其在行业内的领先地位。
1934年,Chauvin Arnoux再次引领技术潮流,发明了电流互感器钳形表,这是世界上第一个非接触式电流表。这一发明不仅改变了电流测量的传统方式,而且极大地提高了测量的便捷性和安全性。非接触式电流表的出现,为电气工程师和技术人员提供了更为高效和安全的测量工具,推动了电气行业的发展。
一、印刷线路元件布局结构设计讨论 一台性能优良的仪器,除选择高质量的元器件,合理的电路外,印刷线路板的元件布局和电气连线方向的正确结构设计是决定仪器能否可靠工作的一个关键问题,对同一种元件和参数的电路,由于元件布局设计和电气连线 ...… 查看全部问答∨ |
包括: 单片机实用技术教程 300页 12.3M Word版 精品题库 11份 2.9M Word版 51系列单片机实验系统指导书 80页 1.7M.doc 编程器的使用 2页.doc 开发工具介绍 14页 0.2M.doc 模块系列实验 13页.doc 实验系统的使用 5页.doc 硬件在线仿真 ...… 查看全部问答∨ |
维也纳设计师valentin vodev设计的一个婴儿车非常有趣,他在推车的后轮处增加了一块踏板,边推婴儿车的时候,还可以当滑板一样滑行。为了安全考虑,设计师给婴儿配备了安全带,并在推手处加上了刹车 … 查看全部问答∨ |
有没有人知道跟踪器的主要构成及实现的原理, 实现它应该需要哪方面的知识 啊 ~~~~~ 急求,在线等............也可以加我Q:920035498… 查看全部问答∨ |
各位达人好,俺最近搞一个LPC2378+ISP1161的USB主机项目,遇到几个问题请教各位达人: 1,在批量传输数据的时候经常出现这样的情况(但不是每次都出现):命令阶段正常,数据阶段正常,可到了状态阶段出现了问题,单步跟踪后发现是状态阶段收到的P ...… 查看全部问答∨ |
|
-精C++,嵌入式编程,Unix, MFC, Vxworks -工作经验2年以上 -学历要求本科以上 -英语听说读写熟练 工作环境宽松,薪资丰厚,有意者请尽快联系MSN;linxin710@hotmail.com … 查看全部问答∨ |
|
PCB制板时,可能大家都有个体会,如果元器件封装有误时,轻则焊接不正常,或者飞线,严重者则PCB报废。正确的元件封对于刚接触布板者尤为重要。 由此想到,如果大家都把元器件的封装、特别是经过验证的封装贡献出来,相互交流,对大家都有 ...… 查看全部问答∨ |