硬件抽象设计层实现之BSP板级支持包构建

BSP工程师负责嵌入式设备的系统初始化和设备驱动开发,包括点亮板子、使能所有设备和开发应用程序。初始化涉及片级、板级和系统级三个层次,设备驱动则需要与操作系统接口配合。BSP开发通常参考经典BSP或使用操作系统提供的模板。设计方法的改进方向是开发图形化BSP设计向导,以简化开发流程和提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

那么BSP工程师的具体工作有哪些呢?

        我们首先从嵌入式设备谈起,前面我们谈到了很多的嵌入式设备,从系统角度来讲这些设备有些是跑操作系统的,有些没有跑。对于不跑操作系统的设备来讲,其功能相对简单一点,使用的主控芯片一般也比较简单,比如风靡一时的51系列单片机、stm系列的单片机。对于这些简单系统来讲,它对软件开发人员要求相对比较低,当然也就没有我前面所说的分工那么详细,有时候甚至从画板、点亮、开发都是由一个人来完成的。

        对于跑操作系统来讲的设备,就不一样了。一般来讲,跑操作系统的设备其软件开发分三个阶段:

1. 点亮板子

        第一批板子出厂时是不包含任何软件的。BSP工程师需要结合硬件原理图修改从芯片厂商拿到的参考代码,调试板子,使板子上的操作系统能够正常稳定工作,从而提供一个稳定的开发调试环境,这个过程叫做点亮板子,行话叫做Bringup。这属于BSP工程师最具有价值含量的工作之一,因为它对BSP工程师所掌握的知识的广度和深度都有一定要求。其中会涉及到计算机原理、操作系统,处理器架构等,还包括硬件方面的一些知识。综合起来其最核心的工作就是对内核的移植、裁剪。

2. 使能板子上所有设备

        上个阶段中,板子的CPU和基本的器件已经能正常工作,这个阶段中将使能所有的外设,并为后面要开发的应用程序提供对应的软件控制接口。这个过程的实质是对应的操作系统下驱动开发的过程,需要掌握硬件工作的原理,操作系统的相关知识。

3. 为板子开发应用程序

        如前文所述,嵌入式系统是一个具有专一功能的系统,其上所有的硬件,软件都应该为这一功能服务。第二个阶段结束的时候,板子上所有的设备都已经可以正常使用了。这个阶段的任务就是开发应用程序来实现某种特定的功能,应用程序中会使用第二阶段提供的软件接口控制板子上的设备来完成这一功能。

BSP工程师应具备的能力

        上述前两个阶段属于BSP开发的内容,第三个阶段属于嵌入式应用软件开发的过程。综上所述,BSP工程师主要应该具备的能力主要有:

掌握计算机原理方面的知识;

掌握操作系统的相关知识,深入研究某种操作系统,目前来讲,研究linux操作系统应该是大部分人的选择;

精湛的C语言功底和一定的C++/汇编的知识。

掌握一定的硬件和电路原理方面的知识;

熟悉常见的接口协议,如I2C, SPI, UART, USB等。

当然作为一个软件开发人员也必须掌握一些通用的软件,比如:代码管理软件,常见的如git等;

代码阅读软件,这个就因个人喜好而不同了,比如:opengrok,source insight,vim下ctags/cscope插件组合等。

一 BSP的设计与实现

        为实现上述两部分功能,设计一个完整的BSP需要完成两部分工作:
        (1)设计初始化过程,完成嵌入式系统的初始化;
        (2)设计硬件相关的设备驱动,完成操作系统及应用程序对具体硬件的操作。

1、 嵌入式系统初始化以及BSP的功能

        嵌入式系统的初始化过程是一个同时包括硬件初始化和软件(主要是操作系统及系统软件模块)初始化的过程;而操作系统启动以前的初始化操作是BSP的主要功能之一。由于嵌入式系统不仅具有硬件环境的多样性,同时具有软件的可配置性,因此,不同的嵌入式系统初始化所涉及的内容各不相同,复杂程度也不尽相同。 但是初始化过程总是可以抽象为三个主要环节,按照自底向上、从硬件到软件的次序依次为:片级初始化、板级初始化和系统级初始化。
(1)片级初始化:主要完成CPU的初始化,包括设置CPU的核心寄存器和控制寄存器,CPU核心工作模式以及CPU的局部总线模式等。片级初始化把CPU从上电时的缺省状态逐步设置成为系统所要求的工作状态。这是一个纯硬件的初始化过程。
(2)板级初始化:完成CPU以外的其他硬件设备的初始化。除此之外,还要设置某些软件的数据结构和参数,为随后的系统级初始化和应用程序的运行建立硬件和软件环境。这是一个同时包含软硬件两部分在内的初始化过程。
(3)系统级初始化:这是一个以软件初始化为主的过程,主要进行操作系统初始化。BSP将控制转交给操作系统,由操作系统进行余下的初始化操作。包括加载和初始化与硬件无关的设备驱动程序,建立系统内存区,加载并初始化其他系统软件模块,比如网络系统、文件系统等;最后,操作系统创建应用程序环境并将控制转交给应用程序的入口
经过以上三个层次的操作,嵌入式系统运行所需要的硬件和软件环境已经进行了正确设置,从这里开始,高层的实时应用程序可以运行了。
需要指出:系统级初始化不是BSP的工作。但是,系统级初始化成功与否的关键在于BSP的前两个初始化过程中所进行的软件和硬件的正确设置,而且系统级初始化也是由BSP发起的。因此,设计BSP中初始化功能的重点主要集中在前两个环节。图3显示了嵌入式系统的初始化过程。

2 、硬件相关的设备驱动程序


       另一个主要功能是硬件相关的设备驱动。与初始化过程相反,硬件相关的设备驱动程序的初始化和使用通常是一个从高层到底层的过程。
        尽管BSP包含硬件相关的设备驱动程序,但是这些设备驱动程序通常不直接由BSP使用,而是在系统初始化过程中由BSP把它们与操作系统中通用的设备驱动程序关联起来,并在随后的应用中由通用的设备驱动程序调用,实现对硬件设备的操作

        设计与硬件相关的驱动程序是BSP设计中另一个关键环节。图4显示 了调用设备驱动程序时系统各个层次之间的关系。

二、设计实现BSP的方法

由于设计实现的复杂性,在设计特定BSP时很少从零开始,而是采用以下两种快捷方法

方法一:以经典BSP为参考

        在设计BSP时,首先选择与应用硬件环境最为相似的参考设计,例如Motorola的ADS系列评估板等。针对这些评估板,不同的操作系统都会提供完整 的BSP,这些BSP是学习和开发自己BSP的最佳参考。针对具体应用的特定环境对参考设计的BSP进行必要的修改和增加,就可以完成简单的BSP设计。
        下面以设计pSOS操作系统的BSP初始化过程为例。pSOS系统初始化的层次非常清晰,与初始化过程相对应的是以下三个文件:
        1)init.s :对应于片级初始化;完成CPU的初始化操作,设置CPU的工作状态;
        2)board.c :对应于板级初始化;继续CPU初始化,并设置CPU以外的硬件设备;
        3)sysinit.c :对应于系统级初始化;完成操作系统的初始化,并启动应用程序。
        以参考BSP为切入点,针对初始化过程的具体环节,在对应的文件中进行某些参数的修改及功能的增加就可以实现BSP的系统初始化功能。

        因为BSP具有操作系统相关性,因此,不同的操作系统会使用不同的文件完成类似的初始化操作。BSP中硬件相关的设备驱动程序随操作系统的不同而具有比较大的差异,设计过程中应参照操作系统相应的接口规范。


方法二:使用操作系统提供的BSP模板

        除了提供某些评估板的BSP以外,很多操作系统还提供相应的BSP模板(一组需要编写的文件),根据模板的提示也可以逐步完成特定BSP的设计。
        相比较而言,第一种方法最为简单快捷。因此,在实际的设计过程中,通常以第一种方法为主,同时结合使用第二种方法。
        在设计实现BSP两部分功能时应采用以下两种不同方法:
        (1)“自底向上”地实现BSP中的初始化操作:从片级初始化开始到系统级初始化;
        (2)“自顶向下”地设计硬件相关的驱动程序:从API开始,到操作系统内部的通用设备驱动程序,再到BSP内部的硬件相关的设备驱动程序,最后到底层具体的硬件设备。

2 BSP设计方法的不足与改进

        从以上介绍的两种设计方法可以看出:目前BSP的设计与实现主要是针对某些特定的文件进行修改。这种方法比较原始,它不仅要求设计人员了解BSP的各个组成部分及所对应的文件和相关参数的具体含义,还要求具备比较全面的软硬件知识。直接修改相关文件容易造成代码的不一致性,增加软件设计上的隐形错误,从而增加系统调试和代码维护的难度。随着底层硬件功能的日益复杂,开发BSP所涉及的内容也越来越多。这种原始方法的不足之处也越来越突出。进行BSP设计方法和工具的创新成为一个日益突出的问题。
        解决这个问题的一个可行办法是:设计实现一种具有图形界面的BSP开发设计向导,由该向导指 导设计者逐步完成BSP的设计和开发,并最终由向导生成相应的BSP文件,而不再由设计人员直接对源文件进行修改。这样不仅可以大大缩短BSP的开发周期,减少代码不一致性,而且系统排错、调试以及维护都很简单。因此,这种方法是目前嵌入式领域中BSP设计的一个趋势和研究方向。但是,由于嵌入式系统硬件环境的多样性,设计向导的实现仍需解决若干关键问题。

rt-thread: RT-Thread是一个来自中国的开源物联网操作系统,它提供了非常强的可伸缩能力:从一个可以运行在ARM Cortex-M0芯片上的极小内核,到中等的ARM Cortex-M3/4/7系统,甚至是多核,64位的ARM Cortex-A,MIPS32/64处理器的功能丰富系统 - Gitee.com

【嵌入式系统】板级支持包BSP和硬件抽象层HAL的区别和关联

驱动介绍 (rt-thread.org)

 bsp/stm32/docs/STM32系列BSP制作教程.md · RT-Thread/rt-thread - Gitee.com

 bsp工程师和驱动工程师_嵌入式软件工程师杂谈之一 ----- BSP工程师

芯片组件->固件(驱动与应用软件)->BSP->内核驱动

关于驱动程序与BSP的区别_bsp开发和驱动开发的区别

嵌入式系统HAL原理与BSP的实现方法

HAL_Q-Stark的博客-优快云博客

HAL学习笔记-5 硬件抽象设计层实现之BSP板级支持包构建

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值