💌 所属专栏:【BES2500x系列】
😀 作 者:我是夜阑的狗🐶
🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询!
💖 欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信 😘 😘 😘
您的点赞、关注、收藏、评论,是对我最大的激励和支持!!!🤩 🤩 🤩
文章目录
- 前言
- 1 系统启动流程
- 1.1 代码架构
- 1.2 启动流程
- 1.3 BSP
- 1.4 Boot Loader
- 1.5 Boot Loader的启动流程
- 总结
前言
大家好,又见面了,我是夜阑的狗🐶,本文是专栏【BES2500x系列】专栏的第9篇文章;
今天开始学习BES2500x系列的一天💖💖💖,开启新的征程,记录最美好的时刻🎉,每天进步一点点。
专栏地址:【BES2500x系列】, 此专栏是我是夜阑的狗对BES2500x系列开发过程的总结,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
1 系统启动流程
最近比较忙,刚接触到恒玄平台的SDK源码,靠着公司大佬(这里说明一下:肖爷给予我很大的帮助👍,给我很多文档学习)给文档慢慢夜以继日的啃,自己也亲手操作了一遍,踩了挺多坑的,自己也是新人刚学起步,记录学习过程好让自己温故而知新。注意:从这篇开始才是正常开始学习BES系列,前面几篇都是讲解一些基础的概念,有一定基础的大佬们可以跳过前面几篇。话不多说,让我们开始吧。接下来就来讲解一下代码的框架和模块之间的解耦处理。
1.1 代码架构
在讲解系统启动流程之前,我们先来了解一下整个代码架构,当我们打开 bes2500x
系列的 sdk 后,可以发现 BES
采用的是 RTOS
(嵌入式实时操作系统),并且使用了 ARM
架构的 CMSIS_RTOS API
接口;
接下来就检点介绍一下几个重要的目录:
- rots目录
打开 rtos
文件后看到是使用的 RTX
系统 (rtos 系统中的一种);
注意:本篇文章概念涉及比较多一点,所以文字部分会很多,这都是为了讲解系统启动流程前期所需的准备工作。
- Apps目录
该目录主要是存放上层应用相关的软件
- Config 目录
该文件夹中存放基础差异化配置。
target.mk 文件中主要是宏定义的开关,包含 DEBUG 信息开关、差分/单端输出、默认音量大小、音乐EQ开关、通话算法的开关等。
tgt_hardware.c
和 tgt_hardware.h
文件中存放基础配置,如按键、LED灯、蓝牙默认信息、音量表、EQ参数、ANC默认参数等。
- Out目录
编译成功的输出文件会存放在out目录下的对应工程文件夹下,以.bin的文件形式存放。
工具烧录的时候选中该文件即可。
- Platform 目录
该目录下主要存放一些底层驱动文件,正常情况下不需要修改。
1.2 启动流程
嵌入式系统的启动代码一般由两部分构成:引导代码和操作系统执行环境的初始化代码。其中引导代码一般也由两部分构成:
- 第一部分是板级、片级初始化代码,主要功能是通过设置寄存器初始化硬件的工作方式,如设置时钟、中断控制寄存器等,完成内存映射、初始化
MMU
等。 - 第二部分是装载程序,将操作系统和应用程序的映像从只读存储器装载或者拷贝到系统的
RAM
中并执行。
1.3 BSP
BSP(Board Support Package)
是板级支持包,是介于主板硬件和操作系统之间的一层,主要是为了支持操作系统,使之能够更好的运行于硬件主板。不同的操作系统对应于不同形式的 BSP
,例如 WinCE
的 BSP
和 Linux
的 BSP
相对于某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 学习笔记】
🚀 【软件安装教程】
订阅更多,你们将会看到更多的优质内容!!