【BES2500x系列 -- RTX5操作系统】系统启动流程 -- boot loader概念讲解 --(九)

我是夜阑的狗 2024-08-20 10:35:01 阅读 67

请添加图片描述

💌 所属专栏:【BES2500x系列】

😀 作 者:我是夜阑的狗🐶

🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询!

💖 欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信 😘 😘 😘

您的点赞、关注、收藏、评论,是对我最大的激励和支持!!!🤩 🤩 🤩

请添加图片描述

文章目录

前言1 系统启动流程1.1 代码架构1.2 启动流程1.3 BSP1.4 Boot Loader1.5 Boot Loader的启动流程

总结


<<【系列文章索引】>>

前言

大家好,又见面了,我是夜阑的狗🐶,本文是专栏【BES2500x系列】专栏的第9篇文章;

今天开始学习BES2500x系列的一天💖💖💖,开启新的征程,记录最美好的时刻🎉,每天进步一点点。

专栏地址:【BES2500x系列】, 此专栏是我是夜阑的狗对BES2500x系列开发过程的总结,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。

如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。


1 系统启动流程

最近比较忙,刚接触到恒玄平台的SDK源码,靠着公司大佬(这里说明一下:肖爷给予我很大的帮助👍,给我很多文档学习)给文档慢慢夜以继日的啃,自己也亲手操作了一遍,踩了挺多坑的,自己也是新人刚学起步,记录学习过程好让自己温故而知新。注意:从这篇开始才是正常开始学习BES系列,前面几篇都是讲解一些基础的概念,有一定基础的大佬们可以跳过前面几篇。话不多说,让我们开始吧。接下来就来讲解一下代码的框架和模块之间的解耦处理。

请添加图片描述

1.1 代码架构

在讲解系统启动流程之前,我们先来了解一下整个代码架构,当我们打开 <code>bes2500x 系列的 sdk 后,可以发现 BES 采用的是 RTOS (嵌入式实时操作系统),并且使用了 ARM 架构的 CMSIS_RTOS API 接口;

在这里插入图片描述

接下来就检点介绍一下几个重要的目录:

rots目录

打开 <code>rtos 文件后看到是使用的 RTX 系统 (rtos 系统中的一种);

在这里插入图片描述

注意:本篇文章概念涉及比较多一点,所以文字部分会很多,这都是为了讲解系统启动流程前期所需的准备工作。

Apps目录

该目录主要是存放上层应用相关的软件

在这里插入图片描述

Config 目录

该文件夹中存放基础差异化配置。

target.mk 文件中主要是宏定义的开关,包含 DEBUG 信息开关、差分/单端输出、默认音量大小、音乐EQ开关、通话算法的开关等。

<code>tgt_hardware.c 和 tgt_hardware.h 文件中存放基础配置,如按键、LED灯、蓝牙默认信息、音量表、EQ参数、ANC默认参数等。

Out目录

编译成功的输出文件会存放在out目录下的对应工程文件夹下,以.bin的文件形式存放。

工具烧录的时候选中该文件即可。

在这里插入图片描述

Platform 目录

该目录下主要存放一些底层驱动文件,正常情况下不需要修改。

在这里插入图片描述

1.2 启动流程

嵌入式系统的启动代码一般由两部分构成:引导代码和操作系统执行环境的初始化代码。其中引导代码一般也由两部分构成:

请添加图片描述

第一部分是板级、片级初始化代码,主要功能是通过设置寄存器初始化硬件的工作方式,如设置时钟、中断控制寄存器等,完成内存映射、初始化 <code>MMU 等。第二部分是装载程序,将操作系统和应用程序的映像从只读存储器装载或者拷贝到系统的RAM 中并执行。

1.3 BSP

BSP(Board Support Package) 是板级支持包,是介于主板硬件和操作系统之间的一层,主要是为了支持操作系统,使之能够更好的运行于硬件主板。不同的操作系统对应于不同形式的 BSP,例如 WinCEBSPLinuxBSP 相对于某CPU来说尽管实现的功能一样,可是写法和接口定义是完全不同的。所以,BSP 一定要按照该系统 BSP 的定义形式来写,这样才能与上层OS保持正确的接口,良好的支持上层OS。

1.4 Boot Loader

BSP 中有一个重要的组成部分就是 BootLoader ,它是在操作系统内核运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,为调用操作系统内核准备好环境。

一般来说,在嵌入式世界里 BootLoader 是严重地依赖于硬件的,因此想建立一个通用的 BootLoader 几乎是不可能的。不同的 CPU 体系结构有不同的 BootLoader,而且除了依赖于 CPU 的体系结构外,BootLoade r还依赖于具体的嵌入式板级设备的配置。这也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种 CPU 结构而构建的,要想让运行在一块板子上的 BootLoader 程序也能运行在另一块板子上,通常也都需要修改 BootLoader 的源程序。

1.5 Boot Loader的启动流程

大多数 BootLoader 都包含两种不同的操作模式:启动加载模式和下载模式。启动加载模式也称为自主模式,即 BootLoader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。而下载模式则是目标机上的 BootLoader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件。从主机下载的文件通常首先被 Boot Loader 保存到目标机的 RAM 中,然后再被 BootLoader 写到目标机上的 FLASH 类固态存储设备中。这种模式通常在第一次安装内核与根文件系统时被使用,或系统更新时使用。一般嵌入式系统的 Boot Loader 较为常用的是启动加载模式,它的加载流程也是我们要重点讨论的内容。

启动部分

启动部分主要是实现初始化硬件的功能。在参考板的 BootLoader 目录下,会发现一些 .s 文件,可能会是init.s或者是 reset.s 等,这样的文件是CPU加电后最先执行的代码。接着 Oal.exe通过 Startup 函数完成硬件的初始化,StartUp 函数是 Boot Loader 的入口函数。该函数一般是使用汇编语言编写,与CPU关系非常紧密,能完成初始化CPU、内存等核心硬件。

Startup.s 代码与硬件平台的 Bootloader 启动代码共用。如果是热启动,即在该函数调用之前已经启动了 Bootloade r程序,相当基本硬件初始化已经完成,则直接跳转到OALStartUp 函数中;否则需要进行硬件中断屏蔽、内存、系统时钟频率、电源管理等硬件的基本初始化过程。在系统硬件初始化完毕之后,Startup 调用 OALStartUp 函数,OALStartUp 函数主要完成将 OEMAddressTable 表传递给内核,然后调用 KernelStart 函数跳转到内核。因此,这部分工作是 BootLoader 的一大重点。

<<【系列文章索引】>>

请添加图片描述


总结

感谢观看,这里就是系统启动流程 – boot loader概念讲解的基础概念讲解,如果觉得有帮助,请给文章点个赞吧,让更多的人看到。🌹 🌹 🌹

在这里插入图片描述

也欢迎你,关注我。👍 👍 👍

原创不易,还希望各位大佬支持一下,你们的点赞、收藏和留言对我真的很重要!!!💕 💕 💕 最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!下期再见。🎉

更多专栏订阅:

😀 【LeetCode题解(持续更新中)】

🥇 【恒玄BES】

🌼 【鸿蒙系统

💎 【蓝牙协议栈】

🎃 【死机分析】

👑 【Python脚本笔记】

🚝 【Java Web项目构建过程】

💛 【微信小程序开发教程】

⚽ 【JavaScript随手笔记】

🤩 【大数据学习笔记(华为云)】

🦄 【程序错误解决方法(建议收藏)】

🔐 【Git 学习笔记】

🚀 【软件安装教程】

订阅更多,你们将会看到更多的优质内容!!



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。