历史上的今天
今天是: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。
史海拾趣
|
我是刚接触使用WINDOWS ce的新手,我的要求是XP如何与WINDOWS CE通过交换机连接,我现在可以在XP的电脑上PING通WINDOWS CE电脑上的IP,我需要怎么做才可以看到WINDOWS CE上的数据.因为我太需要WINDOWS ce上的数据文件, 麻烦 ...… 查看全部问答> |
|
首先谢谢EEWORLD,ADI,也特别谢谢SOSO姐 。 之前提交的方案,系统比较复杂,时间有限到目前为止完成了部分功能,还没有完全做完,先汇报下一些硬件原理一些相关的。采用双CIS(Contact image sensor)采集的模拟信号经过运放放大到AD的采样的合适 ...… 查看全部问答> |
|
性能比较表如下: 算法 F2812 (周期) F28335 (周期) 除法 70 24 均方根 60 27 正弦、余弦 90 44 FFT (256点) 大约27000 大约11000… 查看全部问答> |
|
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 ...… 查看全部问答> |




