1.软中断和未定义中断优先级最低,复位(reset)的中断优先级最高。
2.异常/中断发生时,lr寄存器存放的是异常/中断的返回地址。
3.中断控制器用于连接多个外部中断到ARM的两个中断请求之一。复杂的控制器可以通过编程来选择、决定一个外部中断源产生的是IRQ还是FIQ中断。
4.中断延迟:从外部中断请求信号发出到取出对应的中断服务程序(ISR)的第一条指令,这期间的间隔时间。中断延迟依赖软件和硬件的组合,如果中断不能及时的处理,则系统会出现很慢的相应,甚至导致系统的瘫痪。软件方面有2中方式降低中断延迟。第一种是使用中断嵌套,另一种是设置中断优先级。
5.允许和禁止FIQ、IRQ中断/异常:ARM处理器内核进入到SVC(特权模式)模式,修改cpsr,通过手工来允许和禁止中断。具体操作:第一条指令MRS把cpsr的内容复制到r1寄存器;第二条指令清除FIQ、IRQ的屏蔽位;第三条指令把更新过的r1寄存器的内容复制回cpsr,以允许中断请求。
MRS r1, cpsr //将cpsr内容复制到r1
BIC r1, r1, #0x80 //使能IRQ。FIQ是0x40
MSR cpsr, r1 //将修改过的r1内容复制回cpsr
6.ARM编译器支持asm关键字(C++)或__asm关键字(C和C++)引入的一种扩展嵌入式汇编程序语法,比如__asm{nop; nop; nop}。目前ARM编译器只支持ARM汇编。
7.使用__asm和asm关键字时,需要注意:(1).如果同一行中包括多个指令,则必须用分号(;)进行分隔。(2).asm语句必须位于C++函数内。
int f(int x){
int r0;
__asm{
ADD r0, x, 1 //同一行只有一条语句不需要分号结尾
EOR x, r0,x
}
}
8.ARM的每个异常/中断都有自己的sp,即堆栈指针,指向堆栈地址。sp用来保存现场用的,堆栈一般设置在RAM的高地址,然后指针向下生长,用来防止堆栈溢出时对其他段造成破坏。保存现场这里的现场指CPU在中断触发前用到的寄存器,比如cpsr,r0,r1.....pc。保存现场也就是将这些寄存器push入栈,恢复现场也就是pop出栈这些寄存器。其中保存的寄存器中,也包括 lr 的值(因为用 bl 指令进行跳转的话,那么之前的 PC 的值是存在 lr 中的),然后在子程序执行完毕的时候,再把栈中的 lr 的值 pop 出来,赋值给 PC,这样就实现了子函数的正确的返回。
9.Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。子进程永远返回0,而父进程返回子进程的ID。