18年ARM笔记

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。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值