SylixOS 无Uboot版BSP
1. 函數(shù)棧
1.1物理內(nèi)存分布
介紹函數(shù)棧之前,先介紹SylixOS Lite版本ARM平臺的內(nèi)存分布,根據(jù)BSP工程的連接腳本SylixOSBSP.ld可知,SylixOS的物理內(nèi)存主要分為五段:
???? 1.TEXT段又稱代碼段,主要存放執(zhí)行代碼,有執(zhí)行權(quán)限;
???? 2.DATA段又稱數(shù)據(jù)段,主要放已經(jīng)初始化好的全局變量;
???? 3.BSS段主要存放未初始化的全局變量;
???? 4.棧又稱堆棧,可存放函數(shù)的局部臨時變量(不包括static聲明的變量,static放在在數(shù)據(jù)段中)。在函數(shù)被調(diào)用時,其參數(shù)也可能會被壓入棧中,并且待到調(diào)用結(jié)束后,函數(shù)的返回值也會被存放到棧中,可以說棧就是為了函數(shù)而存在的; 堆是用于存放進程運行中被動態(tài)分配的內(nèi)存段。
SylixOS lite版的物理內(nèi)存分布方式,如圖 1.1所示。
圖 1.1內(nèi)存分布圖
1.2 函數(shù)棧的使用方式
函數(shù)棧的運作方式可以在互聯(lián)網(wǎng)上查到很多介紹,在這里筆者通過流程圖簡單的介紹一下,如圖 1.2所示。
圖 1.2函數(shù)棧的運作流程圖
2 Cortex-M7的啟動流程
2.1 Cortex-M7的啟動
STM32F767是基于Cortex-M7內(nèi)核,與傳統(tǒng)的ARM架構(gòu)不同,Cortex-M7在上電后從片上Flash讀取前兩個地址的值:
第一個地址的值:是MSP主堆棧指針;
第二個地址的值:是PC的初始值,該值為可設置為第一個執(zhí)行的函數(shù)的地址。
如圖 2.1、圖 2.2所示。
圖 2.1復位序列
圖 2.2 MSP及PC的初始化范例
2.2 Cortex-M7的SylixOS啟動流程分析
2.2.1 異常向量表
1.根據(jù)第2.1節(jié),SylixOS把異常向量表鏈接到代碼段首位,異常向量表的第一項為主堆棧指針,第二項是archRSTIntHandle函數(shù)地址,如圖 2.3所示。
圖 2.3異常向量表
2.SylixOS通過鏈接腳本文件把異常向量表鏈接到代碼段的首地址,如圖 2.4所示。
圖 2.4 SylixOSBSP.ld
2.2.2 archRSTIntHandle函數(shù)
archRSTIntHandle函數(shù)的作用相當于其他ARM平臺的startup.S的reset,如圖 2.5所示。
圖 2.5函數(shù)archRSTIntHandle
根據(jù)圖 2.5可知,archRSTIntHandle函數(shù)流程主要分為四步:
???? 1.把初始化數(shù)據(jù)從片上Flash復制到DATA段;
???? 2.初始化BSS段的數(shù)據(jù)為0;
???? 3.板卡必須的初始化;
???? 4.調(diào)用bspinit,開始啟動SylixOS內(nèi)核。
3片外內(nèi)存的使用
根據(jù)第一節(jié)函數(shù)堆棧和第二節(jié)Cortex-M7的SylixOS啟動流程可知,想要讓無Uboot版本的SylixOS使用片外內(nèi)存需要有三步:
?????? 1.把RAM地址空間映射到外部存儲空間,如圖 3.1、圖 3.2所示。
圖 3.1 config.h
圖 3.2 config.lds
????? 2.把異常向量表的第一個值設為可用的內(nèi)存地址,以便可以執(zhí)行archRSTIntHandle函數(shù)。在沒有初始化片外內(nèi)存之前,有512K的片上內(nèi)存可用,片上內(nèi)存的開始地址固定,大小固定,直接可用,此時可以把主堆棧指針指向片上內(nèi)存如圖 3.3所示。
圖 33.指定棧底地址
????? 3.在系統(tǒng)初始化DATA段之前初始化片外內(nèi)存,如圖 3.4所示。
圖 3.4初始化片外內(nèi)存
4參考資料
無
轉(zhuǎn)載于:https://blog.51cto.com/xiaoyaolanyun/1966851
總結(jié)
以上是生活随笔為你收集整理的SylixOS 无Uboot版BSP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nginx反代理服务器
- 下一篇: Open***+AD+Google au