CORTEX-A学习笔记(一)

Cortex-A汇编:

《Cortex-A7 Technical ReferenceManua.pdf》
《ARM Cortex-A(armV7)编程手册 V4.0.pdf》
这两个是ARM官方手册,介绍A7架构和ARMv7-A指令集。
Cortex-A7 MPCore支持1~4核心和大核组成big.LITTLE架构
CORTEX-A学习笔记(一)_第1张图片
SCU窥探控制单元功能是:
1、在Cortex-A7处理器之间维护数据Cache的一致性
2、初始化L2存储器访问
3、在请求L2访问的Cortex-A7处理器之间仲裁
4、管理ACP【译者注:加速器一致性端口】访问。
A7中的优势特点:
SIMDv2、ARM VFPv4、支持大物理扩展LPAE,支持40bit存储地址,1TB内存,支持硬件虚拟化、支持Generic Interrupt Controller(GIC)V2.0、支持NEON优化编解码器。

寄存器组
(R0-14)通用数据存储寄存器。R15是程序计数器PC用于保存将要执行的指令。程序状态寄存器CPSR和一个备份程序状态寄存器SPSR。
CORTEX-A学习笔记(一)_第2张图片

  • 需要用汇编初始化SOC的外设
  • 使用汇编初始化DDR、imx6u不需要
  • 设置sp指针,一般是指向DDR,设置好C语言运行环境。

stm32 I/O初始化流程分析

  • 使能GPIO时钟
  • 设置IO复用
  • 配置GPIO电气特性
  • 设置GPIO
  • 输出电平

CORTEX-A IO管脚设置分析

  • 使能时钟 CCGR0-CCGR6七个寄存器控制所有外设时钟的使能(时钟使能)
  • IO复用寄存器IO03,设置MUX_MODE 为gpio模式(设置复用)
  • 将寄存器IO03设置PAD电气属性
    + 压摆率
    + 驱动能力
    + 开漏
    + 上下拉
  • 配置GPIO功能,设置输入输出
    + 设置DR寄存器bit3为1,输出模式
    GPIO结构图
    CORTEX-A学习笔记(一)_第3张图片

汇编编程

意义:Cortex-a芯片初始没有C语言环境,需要汇编设置堆栈也就是SP指针。c语言需要函数调用需要出入栈,要初始化DDR,设置好SP。其实stm32也需要汇编,但是ST的官方已经写好了一个.s文件,以至于很多人都不了解,也没有深入研究。
实现:保护现场,需要SP寄存器,堆栈就是一段内存,芯片上电SP是不会初始化的,有些芯片需要初始化DDR。

一、GNU汇编语法

标号: 指令 @ 注释
默认__start开始运行
.text表示代码段
.data初始化的数据段
.bss未初始化的数据段
.rodata只读数据段
.global表示全局变量
CORTEX-A学习笔记(一)_第4张图片
ARM不能直接访问RAM,但是可以借助R0~12
在这里插入图片描述
读寄存器值
在这里插入图片描述
写寄存器值
在这里插入图片描述
压栈和出栈
保存R0~R15寄存器的值就叫保护现场(入栈)
恢复R0~R15寄存器的值就叫恢复现场(出栈)
在这里插入图片描述
PUSH {R0~R3, R12} @将 R0~R3 和 R12 压栈
CORTEX-A学习笔记(一)_第5张图片
跳转指令
CORTEX-A学习笔记(一)_第6张图片
b指令是不需要回跳的,下面代码是汇编设置好c语言运行环境后,使用b指令跳转到c程序的main函数中取执行。
CORTEX-A学习笔记(一)_第7张图片
算术运算指令
CORTEX-A学习笔记(一)_第8张图片
逻辑运算指令
CORTEX-A学习笔记(一)_第9张图片
int a,b;a=b;
在汇编中就是存储器访问指令,LDR和STR指令
LDR R0 , =0X30
LDR R1,[R0]
LDR R0,=0X20
STR R1,[R0]


Cortex-A架构

CORTEX-A学习笔记(一)_第10张图片
a7加入了TrustZone安全扩展,所以新增了一种运行模式:Monitor
加入虚拟化扩展的模式:Hyp
Hyp(HYP)模式:是一个超级的监视者,它比超级管理员要稍微低一点,它主要是用来做一些虚拟化的扩展。CORTEX-A学习笔记(一)_第11张图片
R0-7是未备份寄存器,R8-14是备份寄存器,程序计数器PC即R15
R14是LR寄存器,一般用于子函数返回地址,
MOV PC, LR
或者是
PUSH {LR}@将LR寄存器压入栈
POP {PC} @出栈

CPSR
在这里插入图片描述

  • N 运算结果的正负数表示
  • Z 表示运算结果是否为0,CMP指令表示连个数大小是否相等
  • C 表示进位
  • V 表示算术溢出位
  • Q 表示饱和状态
  • IT 作为IF-THEN指令执行状态
  • J 和 T 组合确定处理器的工作状态
  • GE 屋顶SIMD指令有效
  • E 大小端控制位
  • A 禁止异步中断位
  • I 使能或关闭IRQ
  • F 使能或关闭FIQ
  • M 处理器模式控制位

编译

1.编译程序

  • 将.c .s文件编译成.o文件
  • 将所有的.o文件链接成elf格式的可执行文件文件
  • elf文件是带可调试信息的文件,相对bin文件带了信息
  • 将elf文件转化为bin文件
  • 将elf文件转化为汇编程序

2.arm-linux-gcc -g -c led.s -o led.o

  • -g带上编译信息
  • -c选项编译文件但是不链接

3.arm-linux-ld -Ttext 0x87800000 led.o -o led.elf
链接就是将所有的.o文件链接在一起,并且链接在起始地址。本实验链接的时候就是要指定链接起始地址。链接其实地址就是代码运行的起始地址。对于cortexa来说,链接地址应该指向RAM地址,RAM分为内部RAM和外部RAM也就是DDR,这个片子的内部RAM地址范围是0X900000~0X91FFFF,也可以放到DDR中。对于芯片来说,bin文件不能直接运行,需要加一个头部,这个头部包含了一个DDR的初始化参数,芯片内部boot rom会从sd卡emmc等外置存储器中读取头部信息,然后初始化ddr,并且将bin文件拷贝到指定的地方。
bin的运行地址一定要和链接起始地址一致。位置无关代码除外。
4.arm-linux-objcopy -O binary -S -g led.elf led.bin
生成bin文件
5.arm-linux-objdump -D led.elf > led.dis
反汇编,对于以后c语言开发的项目中可以通过反汇编来分析代码。


烧写bin文件

stm32是烧写到内部FLASH
芯片支持SD卡、emmc、nand、nor、spi flash等等启动。裸机程序选择烧写到SD卡上面去。
在linux下向SD卡烧写,将bin文件烧写到sd的绝对地址。对于芯片需要bin文件前面添加头部。sd卡挂载在/dev/sd*。
dd命令也可以烧录


芯片启动分析

1.启动方式选择

  • 修改BOOT_MODE[1:0]高低电平
  • 串行下载模式,可以将代码下载到内部SD/EMMC、NAND中
  • 内部boot模式可以执行内部的bootROM代码,这段bootROM代码会进行硬件初始化(一部分外设),然后从设备(SD/eMMC、NAND)中将代码拷贝出来复制到指定的RAM中,一般是DDR。
    • bootROM代码会先执行初始化时钟

2.boot rom工作内容

  • 设置内核时钟为396MHZ,使能MMU和Cache
    使能L1cache和L2cache,目的是加速启动。
    从boot_cfg设置的外置存储中,读取image,然后做相应的处理。

3.IVT和boot data数据

  • Image vector table,简称 IVT,IVT 里面包含了一系列的地址信息,这些地址信息在ROM 中按照固定的地址存放着。
  • Boot data,启动数据,包含了镜像要拷贝到哪个地址,拷贝的大小是多少等等。
  • Device configuration data,简称 DCD,设备配置信息,重点是 DDR3 的初始化配置。
  • 以 SD/EMMC 为例,IVT 偏移为 1Kbyte,IVT+Boot data+DCD 的总大小为 4KByte-1KByte=3KByte
  • 用户代码可执行文件,比如 led.bin。
  • bin文件前面要加头部信息。可以得到,我们烧写到sd卡中的load.imx文件在SD卡中的起始地址是0x400,也就是1024。
    winHEX可以看.imx文件的信息
    头部信息大小3kb,偏移大小1kb,一共是4kb,因此在sd卡中bin文件的起始地址是4096
    0x87FF400是load.imx在DDR中的起始地址,接下来依次存放IVT、Boot Data、DCD。IVT加上Boot Data=32+12=44=0x2C.
    IVT大小为32B/4=8条
    CORTEX-A学习笔记(一)_第12张图片
    CORTEX-A学习笔记(一)_第13张图片
    DCD(Device Config Data)其实是对芯片寄存器地址和对应配置信息的集合,比如开启某些外设的时钟、初始化 DDR 等等。DCD 区域不能超过 1768Byte。
    CORTEX-A学习笔记(一)_第14张图片
    CORTEX-A学习笔记(一)_第15张图片
    CORTEX-A学习笔记(一)_第16张图片
    DCD初始化包含三个部分:
  • 设置 CCGR0~CCGR6 这 7 个外设时钟使能寄存器,默认打开所有的外设时钟。
  • 配置 DDR3 所用的所有 IO。
  • 配置 MMDC 控制器,初始化 DDR3。

CORTEX-A学习笔记(一)_第17张图片
CORTEX-A学习笔记(一)_第18张图片

你可能感兴趣的:(嵌入式系统)