1)MRS R1,CPSR ; 将CPSR状态寄存器读取,保存到R1中
MRS R2,SPSR ; 将SPSR状态寄存器读取,保存到R2中
MSR CPSR, R1 将R1中的值加载到CPSR寄存器中
2)ldr r1, =und_string 含义是将und_string这个变量的地址加载到r1中
3)处理未定义指令的汇编文件,定义一个复位代码段 一个未定义指令中断处理代码段,未定义指令处理代码段:处理中断流程:保存现场,处理中断,恢复现场。赋给堆栈寄存器地址,保存r0-r12以及链接寄存器。保存cpsr寄存器中的相关内容到spsr寄存器中,跳转到处理中断的函数,再恢复现场,
.text
.global _start
_start:
b reset /* vector 0 : reset */
b do_und /* vector 4 : und */
do_und:
ldr sp, =0x34000000
stmdb sp!, {r0-r12, lr}
mrs r0, cpsr
ldr r1, =und_string
bl printException
ldmia sp!, {r0-r12, pc}
und_string:
.string "undefined instruction exception"
4)链接文件里好像不能有注释
5)关于typedef关键字
tyoedef 关键字是在原有数据类型的基础上,给用户定义的一个结构体或变量 或函数起一个别名 方便用户使用 在编译时处理,它建立了一个新的数据类型别名
typedef 与define 还是有一定的差别的 define是在预处理时对代码进行简单的字符串替换处理,不作正确性检查,不管含义是否正确照样替换。
韦老师的代码里有这么一段
typedef void(*irq_func)(int);
irq_func irq_array[32];
个人认为这句话的意思是定义了一个参数为int型的函数指针,用typedef关键字命名为int_func,
第二句是定义了一个数组?!
void register_irq(int irq, irq_func fp) //第二个参数是一个函数 void (*fp)(int)
{
irq_array[irq] = fp; //这个是说把这个函数fp的地址注册进这个数组里面 比如下面的用法
INTMSK &= ~(1<<irq);
}
register_irq(0, key_eint_irq);
register_irq(2, key_eint_irq);
register_irq(5, key_eint_irq); //key_eint_irq 是一个中断处理函数
这是韦老师代码里的注册中断的函数