评论

收藏

[C++] Cotex-A处理器学习笔记

编程语言 编程语言 发布于:2021-07-05 13:41 | 阅读数:509 | 评论:0

  

  • 对于 Cortex-A 芯片来讲,大部分芯片在上电以后 C 语言环境还没准备好,所以第一行程序
    肯定是汇编的,至于要写多少汇编程序,那就看你能在哪一步把 C 语言环境准备好。所谓的 C
    语言环境就是保证 C 语言能够正常运行。C 语言中的函数调用涉及到出栈入栈,出栈入栈就要
    对堆栈进行操作,所谓的堆栈其实就是一段内存,这段内存比较特殊,由 SP 指针访问,SP 指
    针指向栈顶。芯片一上电 SP 指针还没有初始化,所以 C 语言没法运行,对于有些芯片还需要
    初始化 DDR,因为芯片本身没有 RAM,或者内部 RAM 不开放给用户使用,用户代码需要在
    DDR 中运行,因此一开始要用汇编来初始化 DDR 控制器。
    GNU汇编:
  • DSC0000.png
  • 用户可以使用.section 伪操作来定义一个段,汇编系统预定义了一些段名:
    .text 表示代码段。
    .data 初始化的数据段。
    .bss 未初始化的数据段。
    .rodata 只读数据段。
    我们当然可以自己使用.section 来定义一个段,每个段以段名开始,以下一段名或者文件结
    尾结束
  • DSC0001.png
    GNU 汇编还有其它的伪操作,但是最常见的就是上面这些,如果想详细的了解全部的伪操
    作,可以参考《ARM Cortex-A(armV7)编程手册 V4.0.pdf》的 57 页。《ARM
    ArchitectureReference Manual ARMv7-A and ARMv7-R edition.pdf》
  • DSC0002.png
    MRS 指令用于将特殊寄存器(如 CPSR 和 SPSR)中的数据传递给通用寄存器,要读取特殊
    寄存器的数据只能使用 MRS 指令!使用示例如下:
    MRS R0, CPSR  @将特殊寄存器 CPSR 里面的数据传递给 R0,即 R0=CPSR
    DSC0003.png
  • DSC0004.png
  • DSC0005.png
  • DSC0006.png
  • 因此我们现在需要做的就是确定一下本试验最终的可执行文件其运行起始地址,也就是
    链接地址。这里我们要区分“存储地址”和“运行地址”这两个概念,“存储地址”就是可执
    行文件存储在哪里,可执行文件的存储地址可以随意选择。“运行地址”就是代码运行的时候
    所处的地址,这个我们在链接的时候就已经确定好了,代码要运行,那就必须处于运行地址
    处,否则代码肯定运行出错。比如 I.MX6U 支持 SD 卡、EMMC、NAND 启动,因此代码可以
    存储到 SD 卡、EMMC 或者 NAND 中,但是要运行的话就必须将代码从 SD 卡、EMMC 或者
    NAND 中拷贝到其运行地址(链接地址)处,“存储地址”和“运行地址”可以一样,比如
    STM32 的存储起始地址和运行起始地址都是 0X08000000。
  • DSC0007.png
  • DSC0008.png
  • DSC0009.png
  • DSC00010.png
  • 为大端格式,也就是高字节保存在低内存中。
    DSC00011.png
  • DSC00012.png

    • 所以,led.bin前面加的头信息,就是为了提前初始化处理器的,比如DDR(内存使用配置)等。所以,C语言的main函数(led.bin中)运行前,要先运行启动文件(led.bin中),在这之前还运行了处理器初始化的bootRom(I.MX6U内部的自带程序)进行CPU最初初的初始化参数配置(load.mix的头部),这里会初始化DDR,CPU主频。而其它CPU(S3C2440等处理器)的DDR初始化是在led.bin的启动文件里(即用户自己写的程序中)。
    • DSC00013.png
    • DSC00014.png
    • 链接地址是可以修改的,而且可以自己任意去指定,通过自己编写xx.lds脚本,然后给编译器作为链接脚本一起编译即可。比直接通过编译器的编译命令仅指定Ttext地址更强大。
      DSC00015.png



  
关注下面的标签,发现更多相似文章