学习笔记--韦东山裸板视频之中断

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  是一个中断处理函数

这是韦老师代码里的注册中断的函数

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值