历史上的今天
返回首页

历史上的今天

今天是:2025年03月06日(星期四)

正在发生

2020年03月06日 | 【ARM裸板】软件中断分析及示例

2020-03-06 来源:eefocus

1.APP如何切换模式

APP一般运行于User Mode下,受到限制(例如不可访问硬件)

如果APP想要访问硬件,必须切换模式

如何切换?发生异常即可:

软中断,swi #val

中断

未定义指令异常

2.SWI中软处理过程

执行异常处理函数之前,硬件会处理的事情:

 1.lr_svc保存有被中断模式中的下一条即将执行的指令的地址

 2.SPSR_svc保存被中断模式CPSR

 3.CPSR的[M4:M0]=[11011],进入到svc模式

 4.跳到0x08的模式执行程序,即跳到b do_svc这一指令

/*====================================异常向量表===========================================*/

_start:

b reset    //vector 0: reset(0地址对应reset)

  ldr pc, und_addr //vector 4: und  (发生未定义指令异常,则进入“处理未定义异常函数”)绝对跳转,跳转至sdram中

  ldr pc, swi_addr //vector 8: swi


und_addr:

.word do_und //存放地址,确保这一地址存放在内存的前4K中


swi_addr:

.word do_swi


 /*=================================处理软中断异常=========================================*/

 do_swi:


/*执行到这里之前:

*1.lr_svc保存有被中断模式中的下一条即将执行的指令的地址

*2.SPSR_svc保存被中断模式CPSR

*3.CPSR的[M4:M0]=[10011],进入到svc模式

*4.跳到0x08的模式执行程序,即跳到`b do_swi`这一指令

*/

    /* 1.sp_svc 设置栈,因为后面函数需要栈 */

    ldr sp, =0x33E00000


    /* 2.保存现场 */

    /* lr是异常处理完后的返回地址,也需要保存 */

    stmdb sp!, {r0-r12,lr} //在swi异常处理函数总有可能需要用到r0~r12,因此先保存下来


    mov r4,lr //将lr存放在r4中,调用c函数不会破坏r4

    /* 3.处理swi异常 */

    mrs r0,cpsr //把cpsr的值放入r0

    ldr r1, =swi_string

    bl printException


    sub r0,r4,#4

    bl printSWIVal


    /* 4.恢复现场 */

    ldmia sp,{r0-r12,pc}^ //将lr的值赋给pc ,`^`会把spsr的值恢复到cpsr中


swi_string:

.string "swi exception"

.align 4  //确保4字节对齐


2.1设置栈

sp_svc 设置栈,因为后面有函数需要用到栈

ldr sp, =0x33E00000


2.2 保存现场

stmdb:stm(m为many),即写多个内存,db预先减少(Decrement Before),即先减后写

r是异常处理完后的返回地址,也需要保存

stmdb sp!, {r0-r12,lr}` //在swi异常处理函数总有可能需要用到r0~r12,因此先保存下来


2.3 处理swi异常

打印提示发生未定义异常,并调用打印函数显示CPSR的值

mrs r0,cpsr //把cpsr的值放入r0


、预先增加(Increment Before)、过后减少(Decrement After)、。


2.4 恢复现场

ldmia:ldm(m为many)即读多个内存,ia(Increment After)过后增加,即先读后加

将lr的值赋给pc ,^会把spsr的值恢复到cpsr中

ldmia sp,{r0-r12,pc}^ 


3.取出SWI指令中的值

在swi异常处理函数中,先将lr的值保存在r4中,因为执行完swi指令后,发生异常,lr会保存下一条指令的地址,因此lr-4即是swi指令的地址

用r0 = r4-4

传给打印函数

    sub r0,r4,#4

    bl printSWIVal


由下表可知,swi中断指令高8位可以忽略,即取后24位即可

void printSWIVal(unsigned int *pSWI)

{

unsigned int val = *pSWI & (~0xff000000);

printf("SWI val = %xrn",val);

}

在这里插入图片描述

推荐阅读

史海拾趣

Deutsch公司的发展小趣事

人才是企业发展的核心驱动力。Deutsch公司非常重视人才引进和培养工作。公司积极招聘具有丰富经验和专业技能的人才,并为他们提供广阔的发展空间和良好的职业前景。同时,公司还注重内部人才的培养和晋升,通过培训、交流等方式提升员工的综合素质和业务能力。这些措施使得Deutsch公司拥有一支高素质、高效率的团队,为公司的持续发展提供了有力保障。

Aavid Thermalloy公司的发展小趣事

为了进一步扩大市场份额,Deutsch公司开始积极寻求国际合作和市场扩张的机会。公司首先通过市场调研,确定了目标市场,并制定了详细的市场拓展计划。随后,通过与当地合作伙伴建立合作关系,Deutsch公司成功进入了新兴市场。在国际市场上,公司凭借其高品质的产品和优质的客户服务,赢得了客户的信任和认可。这些努力使得Deutsch公司的市场份额逐年上升,成为电子行业的领军企业之一。

淩志比高公司的发展小趣事

随着市场的不断变化和客户需求的日益多样化,淩志比高公司意识到技术创新的重要性。公司投入大量研发资源,不断推陈出新,成功研发出一系列具有竞争力的新产品。这些产品的推出不仅提升了公司的市场份额,也进一步巩固了公司在电子行业中的地位。

ZTE高新兴(Gosuncn)公司的发展小趣事

随着市场的不断变化和客户需求的日益多样化,淩志比高公司意识到技术创新的重要性。公司投入大量研发资源,不断推陈出新,成功研发出一系列具有竞争力的新产品。这些产品的推出不仅提升了公司的市场份额,也进一步巩固了公司在电子行业中的地位。

EMC Technology RF Labs公司的发展小趣事

随着产品质量的不断提升和技术的不断创新,RF Labs开始积极拓展市场。他们不仅在国内市场上取得了良好的销售业绩,还成功进入了国际市场。RF Labs与多家国际知名电子企业建立了合作关系,共同研发新产品、开拓新市场。这些合作不仅为RF Labs带来了更多的商业机会,也进一步提升了公司的国际影响力。

Daco Semiconductor Co Ltd公司的发展小趣事

在快速发展的同时,Daco也始终关注环保和可持续发展。公司采用了环保的生产工艺和材料,确保生产过程中的废弃物和排放物符合环保要求。同时,Daco也积极参与环保公益活动,推动半导体行业的绿色发展。这种关注环保和可持续发展的做法,不仅提升了Daco的品牌形象,也为公司的长远发展奠定了坚实的基础。

问答坊 | AI 解惑

智能车资料下载

本帖最后由 paulhyde 于 2014-9-15 09:15 编辑 顶顶!!!  …

查看全部问答>

s3c2410触摸屏程序中对外接晶体管控制的问题

《ARM Linux入门与实践》一书当中,关于触摸屏的那一节有几个地方不理解。 该程序的说明是:“代码并没有使用S3C2410A中的触摸屏控制器,而是通过直接控制FPIO的4个晶体管的导通和截止” P220: void Wait_Touch(void) {     XMON_O ...…

查看全部问答>

请问vc6编译的程序能在wince4.2上用吗?

如何调试呢?平台已经有人做了,我需要在上面做应用程序,请问能用vc6写吗?是不是编译成release版本直接下进去呢?还是可以编译成debug然后调试呢? …

查看全部问答>

请问能否仅通过430的串口往里面烧写程序?

请问能否仅通过430的串口往里面烧写程序? 谢谢! 搜了一下,有很多卖BSL的,除了需要TXD、RXD外,还需要一些别的脚。 有没有这么一种软件?当430的串口与计算机串口通过MAX232之类的芯片一接,在电脑上运行这个软件,直接就把程序烧进去了。…

查看全部问答>

自己做的分享下

刚做完的两路DS18B20,分享下…

查看全部问答>

12864中文显示乱码!!!

是这样的,我是用串行方式写的代码,上电后发现显示中文字符会乱码。英文和数字则显示正常,不知道怎么回事 [ 本帖最后由 冷板凳 于 2012-9-25 15:50 编辑 ]…

查看全部问答>

【晒心得】TI EZ430-CHRONOS-433 无线手表

昨天收到手表,今天戴了一整天,现在说说我的体验心得。(写的比较乱,跟大家交流分享)     这么大一个联邦快递,同事都说这个快递费都要好贵,再加上整个套件不单单只有一个手表,还有个MSP-eZ430仿真器(该仿真器只支持二线仿真)和 ...…

查看全部问答>

PCB设计中如何防静电释放?

在PCB里面静电是有的,不过很少会伤到PCB,跟做PCB的附产业贴片不一样。电子原计件就非常注重这一块。 主要采取的方法有,一:配戴防静电手套。                      &n ...…

查看全部问答>

这个LCD是什么型号?

拆了个建行的U盾: 想用其LCD,但又不知道型号、引脚分配。 哪位知道,高额悬赏! 回复有奖! …

查看全部问答>