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.1 Cortex-M7的启动

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

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

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

如图 2.1、图 2.2所示。

图 2.1复位序列

图 2.2 MSP及PC的初始化范例

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函数

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

图 2.5函数archRSTIntHandle

根据图 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所示。

图 33.指定栈底地址

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

图 3.4初始化片外内存

4参考资料