SylixOS 无Uboot版BSP
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參考資料
無
轉載于:https://blog.51cto.com/xiaoyaolanyun/1966851
總結
以上是生活随笔為你收集整理的SylixOS 无Uboot版BSP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nginx反代理服务器
- 下一篇: Open***+AD+Google au