SylixOS 无Uboot版BSP

来源:互联网 发布:知乎怎么粘贴 编辑:程序博客网 时间:2024/06/16 18:59


     1. 函数栈

   1.1物理内存分布

    介绍函数栈之前,先介绍SylixOS Lite版本ARM平台的内存分布,根据BSP工程的连接脚本SylixOSBSP.ld可知,SylixOS的物理内存主要分为五段:

            1.TEXT段又称代码段,主要存放执行代码,有执行权限;

            2.DATA段又称数据段,主要放已经初始化好的全局变量;

      3.BSS段主要存放未初始化的全局变量;

      4.栈又称堆栈,可存放函数的局部临时变量(不包括static声明的变量,static放在在数据段中)。在函数被调用时,其参数也可能会被压入栈中,并且待到调用结束后,函数的返回值也会被存放到栈中,可以说栈就是为了函数而存在的;堆是用于存放进程运行中被动态分配的内存段。

    SylixOS lite版的物理内存分布方式,如图 1.1所示。

    1.1内存分布图

    1.2 函数栈的使用方式

    函数栈的运作方式可以在互联网上查到很多介绍,在这里笔者通过流程图简单的介绍一下,如图 1.2所示。

    1.2函数栈的运作流程图

    2 Cortex-M7的启动流程

    2.1Cortex-M7的启动

    STM32F767是基于Cortex-M7内核,与传统的ARM架构不同,Cortex-M7在上电后从片上Flash读取前两个地址的值:

    第一个地址的值:是MSP主堆栈指针;

    第二个地址的值:是PC的初始值,该值为可设置为第一个执行的函数的地址。

    如图 2.1、图 2.2所示。

    2.1复位序列

    2.2 MSPPC的初始化范例

    2.2 Cortex-M7的SylixOS启动流程分析

    2.2.1 异常向量表

    1.根据第2.1节,SylixOS把异常向量表链接到代码段首位,异常向量表的第一项为主堆栈指针,第二项是archRSTIntHandle函数地址,如图 2.3所示。

    2.3异常向量表

    2.SylixOS通过链接脚本文件把异常向量表链接到代码段的首地址,如图 2.4所示。

    2.4 SylixOSBSP.ld

    2.2.2 archRSTIntHandle函数

    1.archRSTIntHandle函数的作用相当于其他ARM平台的startup.S的reset,如图 2.5所示。

    2.5函数archRSTIntHandle

    2.根据图 2.5可知,archRSTIntHandle函数流程主要分为四步

      1.把初始化数据从片上Flash复制到DATA段;

      2.初始化BSS段的数据为0

      3.板卡必须的初始化;

      4.调用bspinit,开始启动SylixOS内核。

    3片外内存的使用

    根据第一节函数堆栈和第二节Cortex-M7的SylixOS启动流程可知,想要让无Uboot版本的SylixOS使用片外内存需要有三步:

       1.把RAM地址空间映射到外部存储空间,如图 3.1、图 3.2所示。

    3.1 config.h

    3.2 config.lds

       2.把异常向量表的第一个值设为可用的内存地址,以便可以执行archRSTIntHandle函数。在没有初始化片外内存之前,有512K的片上内存可用,片上内存的开始地址固定,大小固定,直接可用,此时可以把主堆栈指针指向片上内存如图 3.3所示。

    3.3指定栈底地址

       3.在系统初始化DATA段之前初始化片外内存,如图 3.4所示。

    3.4初始化片外内存

    4参考资料

阅读全文
0 0
原创粉丝点击