嵌入式:BSP的理解
BSP概念总结
- BSP定义
- BSP的特点
- BSP的主要工作
- BSP在嵌入式系统和Windowsx系统中的不同
- BSP和PC机主板上的BIOS区别
- BSP与 HAL关系
嵌入式计算机系统主要由 硬件层,中间层,系统软件层和应用软件层四层组成。
- 硬件层:包含CPU,存储器(SDRAM,ROM,Flash等),通用设备接口和I/O接口(A/D、D/A、I/O),其中操作系统和应用程序都可以固话在ROM中。
- 中间层:硬件层与软件层之间称为中间层,可以称为硬件抽象层(Hardware Abstract Layer , HAL)或板级支持包BSP(Board Support Package)
- 系统软件层:系统软件层由操作系统(RTOS,Linux,VxWindows),文件系统,网络系统及通用组件模块组成。
- 应用软件层:应用软件层是由操作系统开发的应用软件程序组成,用来实现某种功能或者业务。
BSP定义
硬件层与软件层之间为中间层,也称为硬件抽象层(Hardware Abstract Layer HAL)或板级支持包(Board Support Package BSP) ,它将系统上层与底层硬件分类开来,使系统的底层驱动程序与硬件无关,上次软件开发人员无需关心底层硬件的具体情况,根据BSP层体用的接口即可进行开发,该层一般包含相关底层硬件的初始化,数据的输入,输出操作和硬件的配置功能。
应该说是属于操作系统的一部分,主要目的是为了支持操作系统,使之能够更好的运行于硬件主板。
BSP是相对于操作系统而言的,不同的操作系统对应于不同定义形式的BSP。
🚀🚀🚀如下图所示 BSP定义。

BSP的特点
- 硬件相关性 : 因为嵌入式实时系统的硬件环境具有应用相关性,而作为上层软件与硬件平台之间的接口,BSP需要为操作系统提供操作和控制具体硬件的方法。
- 操作系统相关性:不同的操作系统具有各自的软件层次结构,因此,不同的操作系统具有特定的硬件接口形式,实际上,BSP是一个介于操作系统和底层硬件之间的软件层次,包括了系统中大部分与硬件联系紧密的软件模块。
BSP的主要工作
设计一个完整的BSP需要完成两部分工作,嵌入式系统的硬件初始化以及设计硬件相关的设备驱动程序。
🚀1. 嵌入式系统硬件初始化
从硬件到权健的次序,可以将硬件初始化分为3个部分,分别为片级初始化,板级初始化和系统级初始化。
片级初始化:主要工作是完成嵌入式微处理的初始化,即 RAM,PowerPC等CPU初始化工作,包括设置 微处理的核心寄存器和控制寄存器,微处理器核心工作模式和微处理的局部总线模式等。片级初始化把微处理器从上电时的默认状态逐步设置成系统所要求的工作状态,这是一个纯一年的初始化过程。
板级初始化: 主要工作是完成嵌入式微处理器以外的其他硬件设备的初始化,即外围电路的初始化,另外,还需设置某些软件的数据结构和参数,为随后的系统级初始化和应用程序的运行建立硬件好软件环境,这是一个同时包含软硬件两部分在内的初始化过程。
系统级初始化:主要工作是进行操作系统的初始化,BSP将对嵌入式微处理的控制权转交给嵌入式操作系统,由操作系统完成余下的初始化操作,包含加载和初始化与硬件无关的设备驱动程序,建立系统内存区,加载并初始化其他系统软件模块,如:网络系统,文件系统等。最后,操作系统创建应用程序环境,并见控制权交给应用程序的入口。
🚀 2. 设计硬件相关的设备驱动程序
BSP的另一个主要功能是硬件相关的设备驱动,硬件相关的设备驱动程序的初始化通常是一个从 高到低的过程,尽管BSP中包含硬件相关的设备驱动程序,但是这些设备驱动程序通常不直接由于 BSP使用,而是在系统初始化过程中由BSP将他们与操作系统中通用的设备驱动程序关联起来,并在随后的应用中由通用的设备驱动程序调用,实现对硬件设备的操作,与硬件相关的驱动程序 是BSP设计与开发中另一个非常重要的环节

BSP在嵌入式系统和Windowsx系统中的不同
🚀在日常生活使用的PC机上(WIndows或Linux)也是有 BSP的,只是PC机均采用的 CPU架构为统一的 x86体系架构,因此操作系统的 BSP相对于 x86架构是单一确定的,不需要做任何修改就可以很统支持操作系统在 x86上正常运行,所以在PC机上谈论 x86这个概念就显得没什么意思了。
🚀 但是在嵌入式系统则完全不同,目前市场上存在多种架构的嵌入式 CPU(ARM,MIPS,RISC-V等),同时外围设备也会根据需求有不同的选择和定义,一个嵌入式操作系统针对不同的CPU,就会有不同的 BSP,即使用一种CPU,由于外设的差异,其BSP也会部分不一样,所以根据硬件设计编写和修改BSP,保证系统正常的运行工作是非常重要的。
BSP和PC机主板上的BIOS区别
🚀BSP和PC机主板上的BIOS区别很大,BIOS主要是负责在电脑开启时检测,初始化系统设备(设置栈指针,中断分配,内存初始化等),装入操作系统并调度操作系统向硬件发出的指令,它的 Firmware代码是在芯片生成过程中固话的,一般来说用户是无法修改的,其实就是为下载运行操作系统做的准备,把操作系统由硬盘加载到内存中,并传递一些硬件接口设置给系统。
🚀 在操作系统运行正常后,BIOS的作用基本上也就完成了,这就是为什么更改BIOS一定要关机重启。PC机BIOS的作用更像嵌入式系统中的 Bootloader(最底层的引导软件,初始化主板的基本设置,为接收外部程序做硬件上的准备),与Bootloader 不同的是 BIOS在装载 OS系统的同时,还传递一些参数设置(中断端口定义等),而 Bootloader 只是简单的装载系统。
🚀 BSP和操作系统绑在一起运行在主板上,尽管BSP的开始部分和 BIOS所做的工作类似,可是大部分和BIOS不同,作用也完全不同,此外BSP还包含和系统有关的基本驱动(串口,网口等),此外程序员还可以编程修改 BSP, 在BSP中任意添加一些和系统无关的驱动或者程序,慎重可以把上次开发的软件放到 BSP中,而 BIOS程序用户是不能修改的。
BSP与 HAL关系
硬件的变动将会对 BSP造成大规模的改动,这无疑对 BSP的维护是一种巨大的负担。
🚀 引入HAL(硬件抽象层)的概念,由HAL库 对BSP库进一步的封装,形成统一的标准,而下次再改动硬件电路部分时,只需要改动 BSP库的具体功能函数,而不需要对上层进行任何的修改。

相关文章:
嵌入式:BSP的理解
BSP概念总结BSP定义BSP的特点BSP的主要工作BSP在嵌入式系统和Windowsx系统中的不同BSP和PC机主板上的BIOS区别BSP与 HAL关系嵌入式计算机系统主要由 硬件层,中间层,系统软件层和应用软件层四层组成。硬件层:包含CPU,存储器(SDRAM&…...
Linux主机Tcpdump使用-centos实例
1、安装前系统信息 ifconfig查看系统网络接口情况。这里可以看到3个interface,ens160是正常使用的网口,lo是主机的loopback地址127.0.0.1。另外,由于centos安装在虚拟主机上,virbr0是KVM默认创建的一个Bridge,其作用是为连接其上的…...
线性DP——AcWing 898. 数字三角形、AcWing 895. 最长上升子序列
AcWing 898. 数字三角形 1.题目 898. 数字三角形 2.思路 DP问题首先考虑状态转移方程,定义一个集合f ( i , j) ,表示从第一个数字(1,1)走到第 i行,第 j列(i , j)的所有方案的集合,…...
SpringMVC
SpringMVC配置 引入Maven依赖 (springmvc)web.xml配置DispatcherServlet配置 applicationContext 的 MVC 标记开发Controller控制器 几点注意事项: 在web.xml中 配置<load-on-startup> 0 </load-on-startup> 会自动创建Spring…...
C++模板基础(二)
函数模板(二) ● 模板实参的类型推导 – 如果函数模板在实例化时没有显式指定模板实参,那么系统会尝试进行推导 template<typename T> void fun(T input, T input2) {std::cout << input << \t << input2 << …...
什么是linux内核态、用户态?
目录标题为什么需要区分内核空间与用户空间内核态与用户态如何从用户空间进入内核空间整体结构为什么需要区分内核空间与用户空间 在 CPU 的所有指令中,有些指令是非常危险的,如果错用,将导致系统崩溃,比如清内存、设置时钟等。如…...
day8—选择题
文章目录1.Test.main() 函数执行后的输出是(D)2. JUnit主要用来完成什么(D)3.下列选项中关于Java中super关键字的说法正确的是(A)1.Test.main() 函数执行后的输出是(D) public clas…...
ngx错误日志error_log配置
ngx之error_log 日志配置格式: 常见的错误日志级别 错误日志可配置位置 关闭error_log配置 设置debug 日志级别的前提: ngx之error_log 日志配置格式: error_log 存放路径 日志级别 例: error_log /usr/local/log…...
1.11、自动化
自动化 一、java 手机自动化 首先new DesertCapabilities(这是一个类) setCapability – 设置信息 获取appium的驱动对象 new AppiumDriver – 本机IP地址:端口号/wd/hub,前面的设置值信息 driver.findElementById() – 通过id找位置 click() – 点击 &…...
函数的定义与使用及七段数码管绘制
函数的定义 函数是一段代码的表示 函数是一段具有特定功能的、可重用的语句组 函数是一种功能的抽象,一般函数表达特定功能 两个作用:降低编程难度 和 代码复用 求一个阶乘 fact就是 函数名 n就是参数 return就是输出部分即返回值 而函数的调用就是…...
怎么压缩pdf文件大小?pdf文件太大如何压缩?
喜爱看小说的小伙伴们都会在网上下载很多的pdf格式电子书以方便随时阅览,但是pdf的电子书一般都过于的冗长,下载后的储存也是一个问题,怎么pdf压缩大小呢?可以试试今天介绍的这款pdf在线压缩工具来进行pdf压缩(https:/…...
阿里云Linux服务器登录名ecs-user和root选择问题
阿里云服务器Linux系统登录名可以选择root或ecs-user,root具有操作系统的最高权限,但是root会导致的安全风险比较大,ecs-user比较安全,但是如果系统后续依赖root权限就会比较麻烦,从安全的角度,建议选择ecs…...
【云原生】 初体验阿里云Serverless应用引擎SAE(三),挂载配置文件使应用的配置和运行的镜像解耦
目录 一、前言二、SAE配置1、创建配置项2、配置SAE Nginx服务效果1、【云原生】 初体验阿里云Serverless应用引擎SAE(一),部署Nginx服务 2、【云原生】 初体验阿里云Serverless应用引擎SAE(二),前端Nginx静态文件持久化到对象存储OSS 本篇 3、【云原生】 初体验阿里云Se…...
Oracle用户密码过期,修改永不过期
修改密码有效过期时间,可以通过以下四步设置,如果再第一步发现本身的密码过期时间为无限期的,那就请各位小伙伴绕过,如果发现不是无期限的,那么必须设置第四步,才会生效。 目录 第一步:查询密码…...
welearn 视听说1-4
词汇题(55道) 1. You should carefully think over_____ the manager said at the meeting. A. that B. which C. what D. whose 1.选C,考察宾语从句连接词,主句谓语动词think over后面缺宾语,后面的宾语从句谓语动…...
【git】将本地项目同步到远程
前提:git已经安装,并与账号完成密钥绑定 在github上创建一个新仓库 在项目文件夹下,右击选择git bash here ,打开一个终端对话框 git init (在项目目录下出现隐藏的.git文件夹,目的是把该项目文件夹变成git可管理…...
10-链表练习-LeetCode82删除排序链表中的重复元素II
题目 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回已排序的链表 。 示例 1: 输入:head [1,2,3,3,4,4,5] 输出:[1,2,5] 示例 2: 输入:head …...
贯穿设计模式第五话--接口隔离原则
🥳🥳🥳 茫茫人海千千万万,感谢这一刻你看到了我的文章,感谢观赏,大家好呀,我是最爱吃鱼罐头,大家可以叫鱼罐头呦~🥳🥳🥳 从今天开始,将…...
C语言计算机二级/C语言期末考试 刷题(四)
在空闲时间整理了一些C语言计算机二级和C语言期末考试题库 整理不易,大家点赞收藏支持一下 祝大家计算机二级和期末考试都高分过 系列文章: C语言计算机二级/C语言期末考试 刷题(一) C语言计算机二级/C语言期末考试 刷题&#x…...
JDK8中Stream接口的常用方法
参考答案 Stream 接口中的方法分为中间操作和终端操作,具体如下。 中间操作: filter:过滤元素map:映射,将元素转换成其他形式或提取信息flatMap:扁平化流映射limit:截断流,使其元…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...
文件上传漏洞防御全攻略
要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...
Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...
