当前位置 博文首页 > _und异常模示程序示例_cumtchw:S3C2440裸机------异常与中断

    _und异常模示程序示例_cumtchw:S3C2440裸机------异常与中断

    作者:[db:作者] 时间:2021-07-12 18:39

    1.异常向量表

    我们先看一下芯片手册里面的异常向量表,

    ?2.代码

    我们在重定位的第10个程序的基础上进行修改。

    2.1 start.S

    我们要在start.S的前面增加跳转到相应异常向量表的代码,并且要增加代码,当发生未定义指令异常时候跳转到该代码块进行保存现场、处理未定义异常以及恢复现场的工作,然后在下面故意写一条不能被识别的指令。

    这里处理未定义异常的的工作我们通过编写一个C函数实现,我们新建一个exception.c,在里面编写我们的处理函数,exception.c内容如下:

    #include "uart.h"
    
    void printException(unsigned int cpsr, char *str)
    {
    	puts("Exception! cpsr = ");
    	printHex(cpsr);
    	puts(" ");
    	puts(str);
    	puts("\n\r");
    }
    
    

    这个函数由两个参数,所以我们在start.S中调用这个函数时要传给他两个参数,在汇编代码中定义字符串可以使用.ascii和.string,他们两个的区别在于,用.ascii定义的字符串变量不会再末尾自动加上结束符\0.

    设置栈:进入异常模式之后,使用的异常模式下的栈,所以我们要在处理异常之前设置一下异常模式的栈,我们随便找一块没有用到的内存就可以了,这里我们让他指向SDRAM的最高地址。

    保存现场: 由于r0-r12都有可能被修改,因为我们要把r0-r12都保存一下,另外当发生异常时,当前被中断的地址回报存在LR寄存器里面,所以我们也要把LR寄存器保存一下。

    恢复现场:把r0-r12的值从栈中读出来,并且并原来保存在LR寄存器中的值赋值给PC,

    cs
    下一篇:没有了