ARM:ARM体系结构与编程、ARM指令流水线、ARM编程模型基础

1、读取g-sensor重力传感器的重力加速度值
    cmd.c // 结构体中添加指令与对应函数 mmaxyz, mma8653_get_xyz
    mma8653.c // 补充函数:mma8653_get_xyz ( )
    // mma8653_active ( ); mma8653_write ( ); show_acc ( );

补充:
        <<  逻辑左移(空出的低位补0)
        >>  算术右移(最高位补符号位 - '保证负数不被改变')
        补码 = 反码 + 1

' 操作IIC接口设备驱动时遇到的问题 - 【可体现到简历】
    /* · 操作过I2C接口设备驱动 */
遇到的过的问题总结:
    1. start slave_addr << 1 | w  收不到ack?
        a. 确认从设备地址是否有误...
        b. 借助使用示波器抓波形,时序是否满足I2C协议的需求...
        c. 换块板子试试...
        d. 找硬件工程师帮忙...


-----------------------------------------------------------

《ARM体系结构与编程、ARM指令流水线、ARM编程模型基础》
// ARM体系结构与编程(优势:汇编).pdf - 找一下这本书
// ARM嵌入式系统开发:软件设计与优化.pdf

www.arm.com      // DDI0500D_cortex_a53_r0p2_trm.pdf

RSIC:精简指令集 - arm  (汇编指令条数少)
CSIC:复杂指令集 - x86

ARM指令集版本   ARMV4T   ARMV5             ARMV6   ARMV7/V8
          ARM架构   ARM7       ARM9               ARM11   Coretex-ARM
           相关产品   s3c44b0    s3c2410/2440   s3c6410   s5pv210/6818

cortex-a:高大上的领域,手机、PAD、PC,大量的音/视频处理
                s5p6818 - a53(最高目前是a73)
                华为 - 麒麟960 - a73 - mate9 - 2.8GHz
cortex-r:强实时性控制领域
cortex-m:以单片机的价格实现32bit处理器性能
                stm32:有中文数据手册
                            中文官方论坛
                            底层硬件驱动库函数 - '关注一下,主要是纯C语言'
                            // 资料全不全,是否有案例,网上m系列视频教程
1. 流水线
// F - Fetch  D - Decode  E - Execute
// M - Memory  W - Writeback  S - Stall
    三级流水线:
        取指令    解码指令    执行指令
        Fetch     Decode      Execute
    最佳流水线:
        例如6个时钟周期执行了6条指令,所有操作都在寄存器中单周期执行,指令周期数(CPI) = 1。
        for (i = 0; i < 10; i++) {  
            for (j = 0; j < 100000; j++) {
            }
        }  // 此种写法效率更高一些,破坏最佳流水线的次数少一些
        for (j = 0; j < 100000; j++) {
            for (i = 0; i < 10; i++) {
            }
        }
    LDR流水线:
        冯诺依曼架构:取数据和取指令,用的是同一套总线。
               // ARM7 采用的就是冯诺依曼架构。
        哈佛架构:取数据和取指令,用的是分别对应一套总线。
               // ARM9及更高的版本采用的都是哈佛架构。 - 5 级流水线。

2. ARM编程模型     
2.1 工作模式: '7 中基本的模式'。
    // 代码在执行时CPU的状态:内核态、用户态
    'SVC'(管理模式) - 系统复位,执行了软中断指令后进入【内核态】
    'FIQ'(快速中断模式) - 高优先级中断时进入,即收到FIQ信号时
    'IRQ'(中断模式) - 低优先级中断时进入,即收到IRQ信号时
    'Abort'(终止模式abt) - 用于处理非正常的存储器访问
    'Undef'(未定义模式und) - 用于处理未定义指令
    'System'(系统模式) - 与用户模式共用寄存器的特权模式
    'User'(用户模式) - 多数应用和系统任务运行在该模式【用户态】
    // 前五种分为异常模式,前六种分为特权模式。

2.2 工作状态:
    'ARM状态':当执行ARM指令时 - 32bit指令。
    'THUMB状态':当执行THUMB指令时 - 16bit指令。
    两种工作状态可以相互切换(软件编程过程中可实现切换)。
    当执行异常处理过程中,必须处于ARM状态。

2.3 寄存器组织结构:
    '寄存器与特殊功能寄存器的区别':
    1)'所在的位置不同'
        特殊功能寄存器是IC公司(三星)设计的,位于SOC内部。
        寄存器是ARM设计的,位于ARM core内。
        // s5p6818→SOC(system on chip)→片上系统
    2)'访问方式不同'
        特殊功能寄存器都有物理地址,可以通过地址访问('指针');
        寄存器没有地址,只有名称,C语言很难直接访问到。
  【 37 个 32-bit 寄存器】
    其中' 31 个通用寄存器,名称为r0  r1  r2 ... r15 '
          实际编程过程中,以下三个寄存器人为赋予特定含义:
          r0-r7 未备份寄存器;r8-r14 备份寄存器;r15 程序计数器。
          // r13:sp,栈指针寄存器 - Stack point Register
          // r14:lr,保存函数的返回地址 - Link Regiser
          // r15:pc,保存取指令的地址 - Program Counter程序计数器

    其余' 6 个状态寄存器,名称为cpsr  spsr '
          // 1个cpsr,程序状态寄存器 - Current Program Status
          [ 4 : 0 ]bit:存储当前处理器的工作模式(支持2^5=32种模式)
          [ 5 ]bit:T位,T=1,代表THUMB工作状态
                               T=0,代表ARM工作状态
          [ 6 ]bit:F位,F=1/0,屏蔽/使能FIQ异常
          [ 7 ]bit:I位,I=1/0,屏蔽/使能IRQ异常
          [27: 8 ]bit:保留 - 只关注共性,不关注特性。(忽略)
          [31:28]bit: 31-N位,运算结果为负数N=1,反之N=0
                            30-Z位,运算结果为零Z=1,反之Z=0
                            29-C位,运算过程中是否有进位或借位
                            28-V位,有符号运算时,是否溢出(忽略)

          // 5个spsr,是cpsr的备份寄存器 - Saved Program Status
    '每种工作模式下只能访问37个寄存器的一个子集'。

2.4 异常与异常向量表
支持7种异常:
    'reset':按下复位键 → SVC
    'undefine':当执行到CPU不认识的指令 → undef
    'soft interrupt':当CPU执行到 swi/svc → SVC
    'pretch abort':当取指令时访问了不能访问的地址 → ABORT
    'data abort':取数据时访问了不能访问的地址 → ABORT
    'irq':当按键按下时,可以规定为IRQ → IRQ
    'fiq':当按键按下时,可以规定为FIQ → FIQ

'当异常产生时,硬件会自动完成':
    1)备份cpsr寄存器的内容到spsr
    2)设置cpsr bit

        a. 切换到异常模式
            cpsr [ 4 : 0 ] 自动被赋值切换对应工作模式
        b. 切换ARM状态
          cpsr [ 5 ] T=0,切换为ARM工作状态
        c. 禁止中断
            cpsr [ 6 ] F=1
            cpsr [ 7 ] I=1
    3)存储返回地址到LR_<mode>(LR寄存器)
    4)根据异常不同给PC赋不同的值,即设置PC为相应异常的入口地址

         '异常向量表' <Vector Table> Base Address: 0xFFFF0000
         fiq:                   PC=0x1c
         irq:                   PC=0x18
         //(reserved)    PC=0x14
         data abort:       PC=0x10   // PC = Base Address + 0x10
         pretch abort:    PC=0x0c
         soft interrupt:   PC=0x08
         undefine:          PC=0x04
         reset:                PC=0x00

'当异常处理结束后,需要软件必须完成的工作':
    1)恢复cpsr
            cpsr = spsr_<mode>
    2)恢复PC
            PC = LR_<mode>

2.5 ARM支持的数据类型
    byte              字节8bit   (1个字节)
    half word      半字16bit (2个字节)
    word             字32bit    (4个字节)
    double word  双字64bit(8个字节)

2.6 对齐方式
    int a; // 如果4字节对齐,地址的末位0/4/8/c(12)
eg:
    struct test {
        int a;
        char b;
        char d;
        int c;
    };
    sizeof (struct test) = 16 byte;
2.7 大小端问题
    ARM 处理器既支持大端模式,也支持小端模式,'软件可配置'。
    现用的s5p6818开发板是大端模式,还是小端模式。
    int a = 0x12345678;  // 12...是高位,...78是低位
     地址        大端     小端
    0x100        12        78
    0x101        34        56
    0x102        56        34
    0x103        78        12
    权重值大的存放在低地址就是大端模式;
    权重值小的存放在低地址就是小端模式。
    // 编程判断当前处理器是大端还是小端模式? - 开发板ARM
    int / short / double 多字节数据类型都涉及大小端的问题。
    思路一:
        int a = 0x12345678;
        if (*((char*)&a) == 0x78) {  小端   }   else {  大端  }
    思路二:
        union {
            int a;
            char c[4];
        } test;
        test.a = 1; // 0x0000001
        if (c[0]) {  小端  }    else {  大端  }
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姜源Jerry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值