单片机学习小组
直播中

曹利娟

7年用户 960经验值
私信 关注

ARM有哪几种工作模式呢

ARM有哪几种工作模式呢?
寄存器与特殊功能寄存器的区别在哪?

回帖(1)

陈博朴

2022-2-11 09:50:24
RISC,精简指令集    ARM
ISC,complex 复杂指令集    X86
  
   指令集       ARM核        SOC
   ARMV4      ARM7        s3c44b0
   ARMV5      ARM9        s3c2410/s3c2440
   ARMV6      ARM11      s3c6410
   ARMV7
   ARMV8      cortx-A:     sp56818 (cortex-A53)
                          高大尚领域 多媒体数据处理 例如手机 PC
                      cortx-R:
                          real time 高实时性领域
                      cortx-M:
                          以单片机的价格实现32bit处理器能力
                           stm32
1、流水线
     三级流水线:取指令 解码指令 执行指令
     for(i=0; i<1000000; i++)
     {
         for(j=0; j<100; j++)
         {
             ...
         }
     }      
     
     for(j=0; j<100; j++)    //这种方式代码执行效率高(外层循环次数越少效率越高)
     {
         for(i=0; i<1000000; i++)
         {
              ...
         }
     }
  经典书籍:ARM体系结构与编程.pdf
                    ARM嵌入式系统开发:软件设计与优化.pdf
     
2、工作模式
    ARM有7种工作模式
       1、SVC:  管理模式              系统上电  (内核态)
       2、FIQ:  快速中断模式        产生了高优先级中断
       3、IRQ:  中断模式               产生了低优先级中断
       4、Abort:终止模式            产生了非法的存储器访问
       5、Undef:未定义模式       执行到非法的指令
       6、System:系统模式
       7、User:用户模式         (用户态)
    前5种称为异常模式,前6种称为特权模式
3、工作状态
    arm状态, 执行32bit机器指令时
    thumb状态, 执行16bit机器指令时
    这种两种工作状态软件可以控制自由切换
    当处理异常代码时,异常代码必须是ARM指令
4、寄存器组织结构
     寄存器与特殊功能寄存器的区别:
        1)存在位置不同
           寄存器在ARM 核内
           特殊功能寄存器在ARM 核外
        2)访问方式不同
           寄存器只有名字没有地址,C语言很难访问到
           特殊功能寄存器都有特定的物理地址,可以通过指针访问
        3)功能不同
           特殊功能寄存器是驱动硬件的媒介
     
     ARM核中有37个32bit的寄存器
     其中有31个通用寄存器,被命名为r0 r1 r2 ... r15
               r13(sp, 栈指针寄存器)
               r14(lr, 保存函数的返回地址)
               r15(pc, 取指令的地址)
     
     有6个状态寄存器      
           1个CPSR寄存器
              [4:0]  MODE,工作模式
              [5]     T =0 处于ARM工作状态,T =1 处于thumb工作状态
              [6]     F  0/1 使能/禁止 FIQ异常
              [7]     I  0/1 使能/禁止 IRQ异常
              [28]   V  overflow 有符号数据运算是否溢出 (忽略)
              [29]   C  CARRAY 最高位(第31bit)是否有进位或者借位
                               例如 0xfffffffc + 8 该运算会使C=1,0xfc +8  C=0
              [30]   Z  zero 运算结果是否为0,为0 Z=1,反之 Z=0
              [31]   N  negative 负数
    5个SPSR寄存器,它是CPSR的备份寄存器,每种工作模式下只能访问其中的一个子集  
   
5、异常与异常向量表
     ARM 支持7种异常
        Reset                          按下复位键                                             SVC
        Undef                          执行到不认识的机器指令                       Undef
        SWI                             软中断汇编指令swi的执行                      SVC
        PRETCH ABORT        取指令时产生了非法的存储器访问         Abort
        DATA ABORT              取数据时产生了非法的存储器访问         Abort
        IRQ                              产生了低优先级的中断                           IRQ
        FIQ                              产生了高优先级的中断                           FIQ
        
     ARM收到异常信号后,硬件会自动做4件事
        1)备份CPSR
               SPSR_=CPSR
        2) 修改CPSR
               mode
               T = 0//切换为ARM工作状态
               F = 1 //屏蔽FIQ异常
               I =1  //屏蔽IRQ异常
        3) 保存返回地址到LR_
        4) 给PC赋值
             reset     pc = vec_base + 0x00
             undef   pc = vec_base + 0x04
             swi       pc = vec_base + 0x08
             pre ab  pc = vec_base + 0x0c
             dat ab  pc = vec_base + 0x10
             irq        pc = vec_base + 0x18
             fiq        pc = vec_base + 0x1c
     异常处理结束后 软件必须完成的工作
         1)恢复CPSR
            CPSR=SPSR_
         2) 给PC赋值      
            PC = LR_
6、对齐方式
      struct test
      {
          int a;
          char c;
          short n;
          char x;
          long m;
      }test1;(32位机器)
      sizeof(test1) = 4+4+4 +4 = 16
      4字节对齐:起始地址可以被4整除
7、ARM支持的数据类型
      byte               8bit(1个字节)
      half word       16bit(2个字节)
      word              32bit(4个字节)
      double word  64bit(8个字节)
8、大小端问题
       int x = 0x12345678;   
       地址         大    小
       0x100     12    78
       0x101     34    56
       0x102     56    34
       0x103     78    12
      
       高位放在低地址就是大端模式
       低位放在低地址就是小端模式
         union
       {
          int a;
          char c[4];
       }test;
       test.a=1;
       if(test.c[0]==1)
           小端
       ---------------------------------
       int x= 0x12345678;
       *((char *)&x)==0x78
            小端   
  
       ARM 既支持大端模式 也支持小端模式
举报

更多回帖

发帖
×
20
完善资料,
赚取积分