嵌入式分层架构的文件夹分析

1. 前言

本文主要介绍创建嵌入式工程时如何高效管理文件夹。随着工程规模的扩大,我逐渐感觉难以理解项目的整体,大多数时间是在回忆之前为什么要这么写,因此学习了一些架构知识,并在此记录,以方便日后查看。

2、架构1.0

参考资料:第一阶段_1周期_3th节_代码架构与分层_哔哩哔哩_bilibili

以下是一个分层架构的示例:
分层架构例子_01

2.1 BSP: 板级支持驱动程序(Board Support Package)

BSP层负责 片上外设板载外设(比如MPU6050)的通信与交互过程。有时根据具体情况分为两种:

  1. 裸机(有限状态机)情况下的驱动程序。
  2. 在操作系统下的驱动程序。

玩各种模块的时候都是把各种驱动移植到这,如MPU6050、IIC。

一个可能的BSP文件夹结构:

  • myProject_BSP_mpu6050.c
  • myProject_BSP_mpu6050.h
  • myProject_BSP_iic.c
  • myProject_BSP_iic.h
  • myProject_BSP_gpio.c
  • myProject_BSP_gpio.h
  • myProject_BSP_spi.c
  • myProject_BSP_spi.h
  • myProject_BSP_uart.c
  • myProject_BSP_uart.h
文件说明:
  • myProject_BSP_mpu6050.cmyProject_BSP_mpu6050.h:MPU6050传感器的驱动程序。
  • myProject_BSP_iic.cmyProject_BSP_iic.h:IIC通信接口的驱动程序。
  • myProject_BSP_gpio.cmyProject_BSP_gpio.h:GPIO控制接口的驱动程序。
  • myProject_BSP_spi.cmyProject_BSP_spi.h:SPI通信接口的驱动程序。
  • myProject_BSP_uart.cmyProject_BSP_uart.h:UART通信接口的驱动程序。

这个文件夹包含了各种外设的驱动程序,以便与MCU进行通信和交互。

注意:这里有片上外设和板载外设,根据需要可以细分。

或许也没必要细分,两种外设没有本质区别,只是集成到了片内所以叫片内外设

片内外设一般芯片厂商会提供驱动程序库,只需要简单调用就能写好BSP层的驱动程序

推荐文件命名为 项目名_层名_模块名,如myProject_BSP_mpu6050.c

2.2 Core

Core层包含面向MCU进行编程的驱动程序,主要负责初始化MCU内部的外设(如时钟、IIC、SPI等)。这个层次通常包含main.c文件

一个可能的Core文件夹结构:

  • main.c
  • stm32f10x.h
  • stm32f10x_conf.h
  • stm32f10x_it.c
  • stm32f10x_it.h

文件说明:

  • main.c:这是主程序文件,通常包含初始化代码、主循环以及其他功能函数的调用。
  • stm32f10x.h:这是包含了针对STM32F10x系列微控制器的寄存器定义和常量声明的头文件。它定义了该系列芯片的寄存器映射及其相应的位掩码,使得开发人员可以方便地编写底层驱动程序。
  • stm32f10x_conf.h:这个头文件通常包含了与工程配置相关的宏定义和配置选项,例如时钟配置、中断向量的选择等。开发者可以根据具体项目需求修改这些配置。
  • stm32f10x_it.c:这是中断服务程序(ISR)的实现文件。它包含了处理各种中断的函数定义,这些函数需要在stm32f10x_it.h中声明。通常,这些函数会在相应的硬件事件(比如定时器溢出、外部中断触发等)发生时被调用。
  • stm32f10x_it.h:这是中断服务程序的头文件,包含了各种中断服务程序函数的声明。

2.3 Drivers

Drivers层包含厂商提供的SDK程序,用来对MCU和其内的CPU及片内外设进行编程。这些驱动库通常由MCU厂商提供。

  • CMSIS(内核驱动)
  • STM32F1xx_HAL_Driver(芯片驱动)

2.4 Middlewares

Middlewares层包含抽象程度较高的中间件,这些中间件能在各个项目中通用,如LVGL、数学库、快速傅里叶变换库等。

  • 与硬件无关(对这里的理解不是很深,如有错误,感谢指出)

2.5 OS

OS层是操作系统层,定义了系统的整体宏,包含对全局系统有影响的参数和文件。

暂时没接触过,就不误导人了

2.6 应用层

应用层实现具体的应用逻辑。

3、架构2.0

发布这篇文章后翻看自己的博客时通过相关推荐看到了这篇文章嵌入式裸机架构的探索与回归_嵌入式裸机编程架构-CSDN博客,意外之喜!

稍稍修改了一下之前学到的架构

这是我随便写的一个传感器采集并发送至串口的项目(甚至不能称之为项目)是为了应付QT大作业写的,因为最近在了解架构所以强行把分层架构安上去后大概长这样,

00_project

存了项目文件,(就是平时创建新项目时的文件夹,这样就不用修改output和listing路径了!默认路径刚刚好)

这个文件夹是从稚晖君的X-bot项目学到的

01_Drivers

存放了内核驱动CMSIS,和stm32最新固件库(由芯片厂商提供)

02_BSP

存放板级支持驱动程序(有了这一层后,想操控这些硬件就是调用函数的事了,无需在想时序等硬件相关的)

ps:说实话我有点搞不清楚HAL(硬件抽象层)BSP层有什么区别,

03_SYSTEM

存放如delay ,sys ,usart(调试用);
ps:暂时还不知道这个算什么,只是仿照stm32传播最广的那些教程放的,目前而言看起来像个杂项,不知道分层架构里它在哪一层,希望了解的小伙伴能解答,万分感谢

04_USER

这个是架构1.0里的core,因为我感觉core容易与内核搞混,就延用正点原子,普中教程里的user了,存放main.c等主要业务逻辑。

system_stm32f10x我考虑要不要放到CMSIS里去,因为它是由内核公司(ARM)提供的,里面好像是一些时钟配置和SystemInit()函数,普中教程刚开始说过程序首先执行的就是这个函数,emmmm有点忘记了,回头再去看看

关于官方提供的文件,这篇文章总结的很好
【stm32】stm32f1代码中core_cm3、system_stm32f10x、stm32f10x_conf、stm32f10x等文件的作用_stm32f10x标准外设库中的cpal层有那些文件,-CSDN博客
其实还有中间件层,操作系统层 ,应用层,但暂时还没用到,需要的时候加上就行

ps:前面的编号基本是按照从底层到高层的顺序编号的

渴望交流ing

4、参考资料

  1. 第一阶段_1周期_3th节_代码架构与分层_哔哩哔哩_bilibili
  2. 片内外设、片上外设和片外外设的区别_片上外设是什么意思-CSDN博客
  3. 嵌入式裸机架构的探索与回归_嵌入式裸机编程架构-CSDN博客
  4. 【stm32】stm32f1代码中core_cm3、system_stm32f10x、stm32f10x_conf、stm32f10x等文件的作用_stm32f10x标准外设库中的cpal层有那些文件,-CSDN博客
Logo

科技之力与好奇之心,共建有温度的智能世界

更多推荐