决定开始学习嵌入式后,最先做的事情就是要熟悉ARM指令及其伪指令伪操作。ARM指令的助记符其实都是其具体功能的单次缩写,所以学习的过程中最好利用网络,从一些文献或书籍中找到ARM指令助记符的全称,这样方便记忆, 接下来的学习过程中,比较难以理解的是ARM的中断过程和存储系统。ARM中断的实现有些书上看一两遍也不见得能够完全理解,当然可能只对于像我一样跨专业的朋友来说存在这个问题。这次只谈中断。由于是初学者,难免会出错,敬请各位指正。
当一个程序正常执行过程中,CPU可能检测到有某个中断源发出中断请求,这时ARM硬件实现了程序强制跳转,在这之前保存了相关信息,以便程序正常返回。如果是发生了Reset中断,程序实现系统初始化设置。
开始比较难以理解的是中断产生后,程序都进行了哪些操作。我就从跟踪PC作为分析的主线。以发生FIQ中断为例。(只以ROM起始地址为0为例,不为0的情况参照存储地址映射)
最简单的是中断发生后,PC=0x08,在此地址处存放一个跳转指令,跳转到相关处理程序。当然多数情况中断处理程序可能比较复杂,并且要处理多种中断的情况下,采用一步映射两步跳转(我自己起的名字,不一定妥当)。
一步映射指,在RAM地址中建立一个中断向量表,图中该表起始地址为0x400000,在该表中存放的是中断处理函数的入口地址。两步跳转是指,当中断发生时,由于系统硬件强制程序跳转到了0x08处,在该地址处是一个跳转指令,跳转到中断函数地址解析程序IRQ_Handler,完成一步跳转。解析程序(IRQ_Handler)的作用无非是把中断向量表内中断处理函数(SystemIrqHandler)的入口地址赋值给 PC,如图所示PC=0x003000280,完成第二步跳转,开始处理中断。在中断处理函数的最后,恢复中断开始时保存的相关寄存器的值,完成中断。 下面以一个实例来具体说明中断建立及实现的过程。 首先通过伪指令建立一个中断向量表,用于存放中断程序的入口地址