历史上的今天
返回首页

历史上的今天

今天是:2024年09月30日(星期一)

正在发生

2021年09月30日 | s3c2440——swi异常

2021-09-30 来源:eefocus

系统复位的时候,从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。

推荐阅读

史海拾趣

乔光电子(FTR)公司的发展小趣事

Futaba Electric Co., Ltd. 的五个发展故事

故事一:从真空管到VFD的转型

Futaba Electric Co., Ltd.(原名双叶电子)成立于1948年,最初以生产收音机收讯真空管起家。然而,随着技术的飞速发展和市场需求的变迁,公司在1970年做出了关键的战略调整,决定放弃真空管业务,转而专注于萤光表示管(VFD)的研发与生产。这一决定极具前瞻性,因为VFD以其高清晰度、广视角和出色亮度等独特优势,迅速赢得了市场的青睐。Futaba凭借在VFD领域的持续创新和卓越品质,逐渐确立了其在全球市场的领先地位,市场份额超过60%,成为行业内的佼佼者。

故事二:无线电控制技术的突破

进入1960年代,Futaba在电子领域不断拓宽其技术边界。1962年,公司推出了无线电控制设备和冲压金属模用部件,旨在提升工业生产的品质和效率。这一创新不仅解决了工业控制领域中长期存在的供应商品质和交货期问题,还引领了模具制造行业的标准提升。Futaba的无线电控制技术逐渐在模具制造、工业自动化等领域得到广泛应用,为公司后续在无线遥控领域的深入发展奠定了坚实基础。

故事三:无线遥控技术的领导者

随着技术的不断积累和市场的日益扩大,Futaba在无线遥控领域取得了显著成就。特别是在1990年,公司成功研发出高频无线展频通讯技术,该技术以其高可靠性和抗干扰性,在卫星通讯、工业用机器人和工业控制设备等领域展现出巨大潜力。Futaba的无线遥控产品如遥控飞机、车、船等,在休闲娱乐市场也广受欢迎,进一步巩固了公司在无线遥控技术领域的领先地位。

故事四:VFD在汽车行业的广泛应用

Futaba的VFD产品凭借其卓越的性能和稳定的品质,赢得了众多汽车制造商的信赖。自1983年Futaba的VFD产品被福特汽车公司采用以来,其在美国三大汽车厂的市场占有率迅速攀升至100%。这一成就不仅证明了Futaba产品在汽车行业的广泛应用和市场认可度,也为其在高端消费性电子设备市场的进一步拓展提供了有力支持。

故事五:中国市场的深入布局

为了更好地服务于中国市场,Futaba成立了双叶电子科技开发(北京)有限公司,专营日本双叶(Futaba)的全线产品。这家公司在北京设立,不仅负责Futaba真空荧光显示管及模组、RC遥控器等产品的生产和销售,还积极开拓中国市场,参与行业交流和合作。双叶电子科技开发(北京)有限公司的成立,标志着Futaba在全球化战略中对中国市场的高度重视和深入布局。通过不断提升产品质量和服务水平,Futaba在中国市场也取得了显著成绩,为公司的持续发展注入了新的动力。

EBK Kruger GmbH & Co KG公司的发展小趣事

随着全球环保意识的提高,EBK Kruger积极响应绿色生产的号召。公司投入大量资金研发环保型电子产品,并优化生产流程以减少能源消耗和废弃物排放。通过这些努力,EBK Kruger不仅降低了生产成本,还提升了企业的社会责任感,赢得了更多客户的支持和信任。

Engineered Components Co公司的发展小趣事

随着市场竞争的加剧,ECC意识到只有不断创新才能保持领先地位。因此,公司加大了对研发的投入,引进了一批先进的研发设备和人才。经过数年的努力,ECC成功研发出了具有更高精度、更好性能的电子连接器,并推出了一系列新型电子元件。这些新产品不仅满足了客户日益增长的需求,还为公司带来了更多的市场份额。

Eutech公司的发展小趣事

EUtech公司注重品牌塑造和市场拓展。他们通过参加国际展会、举办技术研讨会等方式提高品牌知名度。同时,公司积极拓展海外市场,产品已出口到新加坡、香港、韩国等国家和地区。凭借优异的产品质量和良好的市场口碑,EUtech公司逐渐在国际市场上树立起了品牌形象。

EWC Controls公司的发展小趣事

EWC Controls公司非常重视人才培养和团队建设。公司建立了一套完善的人才培养体系,通过内部培训、外部引进等方式吸引和培养了一批高素质的人才。同时,公司还注重团队合作和文化建设,鼓励员工之间的交流和合作,营造了积极向上的工作氛围。这种人才培养和团队建设的策略为公司的发展提供了有力的保障。

Control Sciences Inc公司的发展小趣事

Control Sciences Inc公司在电子行业的初期,就以其技术创新而闻名。公司团队不断研发新的控制技术,成功打破了当时行业的局限。他们推出的首款智能控制系统,不仅提高了生产效率,还大大降低了能源消耗,为电子行业带来了巨大的经济效益。这一创新成果使得Control Sciences Inc在业界崭露头角,赢得了众多客户的青睐。

问答坊 | AI 解惑

LED驱动mos推荐

尚晶推荐LED驱动用MOS 管 DTS2306;DTS3400…

查看全部问答>

电子方面的困惑

想问下,举个例子吧,像那个遥控器,modem,还有收音机这些个电子产品,我该如何去学习啊,我现在对这个比较感兴趣, ,看了好些个论坛什么的,都说学电路分析,还有模拟电路,数字电路,单片机等等。我也看过,但是总是感觉一点都没有学会。 想 ...…

查看全部问答>

wince 挂起后, 闹铃

现在是想在 wince 挂起后,待机后, 自已写的闹铃程序不受影响,到达设定的时候时,还能正常响铃... 大家帮忙..谢谢..…

查看全部问答>

windows ce如何与WINDOWS xp联网

  我是刚接触使用WINDOWS ce的新手,我的要求是XP如何与WINDOWS CE通过交换机连接,我现在可以在XP的电脑上PING通WINDOWS CE电脑上的IP,我需要怎么做才可以看到WINDOWS CE上的数据.因为我太需要WINDOWS ce上的数据文件,   麻烦 ...…

查看全部问答>

基于AD9288/DSP的数字图像采集处理

首先谢谢EEWORLD,ADI,也特别谢谢SOSO姐 。 之前提交的方案,系统比较复杂,时间有限到目前为止完成了部分功能,还没有完全做完,先汇报下一些硬件原理一些相关的。采用双CIS(Contact image sensor)采集的模拟信号经过运放放大到AD的采样的合适 ...…

查看全部问答>

【设计工具】ISE 设计套件 11.1 应用问答

ISE 设计套件 11.1 应用问答。     [ 本帖最后由 GONGHCU 于 2012-2-21 03:15 编辑 ]…

查看全部问答>

C2000定点和浮点处理器的乘/除法,FFT性能比较

性能比较表如下:  算法 F2812 (周期) F28335 (周期) 除法 70 24 均方根 60 27 正弦、余弦 90 44 FFT (256点) 大约27000 大约11000…

查看全部问答>

【求助】如何修改MSP430 xcl文件

如何修改MSP430 xcl文件 让程序在用户自定义的FLASH段运行及进行其他操作、 …

查看全部问答>

msp430运用定时器A和比较器A测电阻。不知道问题出在哪里

#include \"msp430x14x.h\" #define REF_O (P1DIR |= BIT3) #define MEA_O (P1DIR |= BIT4) #define REF_I (P1DIR |= BIT3) #define MEA_I (P1DIR |= BIT4) #define REF_H (P1OUT |= BIT3) #define REF_L (P1OUT &= ~BIT3) #define MEA_H (P ...…

查看全部问答>