历史上的今天
今天是: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);
}
史海拾趣
|
《ARM Linux入门与实践》一书当中,关于触摸屏的那一节有几个地方不理解。 该程序的说明是:“代码并没有使用S3C2410A中的触摸屏控制器,而是通过直接控制FPIO的4个晶体管的导通和截止” P220: void Wait_Touch(void) { XMON_O ...… 查看全部问答> |
|
如何调试呢?平台已经有人做了,我需要在上面做应用程序,请问能用vc6写吗?是不是编译成release版本直接下进去呢?还是可以编译成debug然后调试呢? … 查看全部问答> |
|
请问能否仅通过430的串口往里面烧写程序? 谢谢! 搜了一下,有很多卖BSL的,除了需要TXD、RXD外,还需要一些别的脚。 有没有这么一种软件?当430的串口与计算机串口通过MAX232之类的芯片一接,在电脑上运行这个软件,直接就把程序烧进去了。… 查看全部问答> |
|
是这样的,我是用串行方式写的代码,上电后发现显示中文字符会乱码。英文和数字则显示正常,不知道怎么回事 [ 本帖最后由 冷板凳 于 2012-9-25 15:50 编辑 ]… 查看全部问答> |
|
【晒心得】TI EZ430-CHRONOS-433 无线手表 昨天收到手表,今天戴了一整天,现在说说我的体验心得。(写的比较乱,跟大家交流分享) 这么大一个联邦快递,同事都说这个快递费都要好贵,再加上整个套件不单单只有一个手表,还有个MSP-eZ430仿真器(该仿真器只支持二线仿真)和 ...… 查看全部问答> |
|
在PCB里面静电是有的,不过很少会伤到PCB,跟做PCB的附产业贴片不一样。电子原计件就非常注重这一块。 主要采取的方法有,一:配戴防静电手套。 &n ...… 查看全部问答> |




