当前位置: 首页 > news >正文

以串口接口为例介绍关于BSP底层架构开发的迭代过程

以串口接口为例介绍关于BSP底层架构开发的迭代过程

文章目录

  • 以串口接口为例介绍关于BSP底层架构开发的迭代过程
    • 架构概述
    • 初代BSP
    • 二代BSP:
    • 三代BSP:
    • 四代BSP:

架构概述

单片机开发有四个阶段:

阶段一:单一单片机的功能实现阶段

此阶段你开始熟悉STM32F1系列的单片机,并利用其完成相应的功能,比如点了个灯,通过串口发了个”STM32F103 Hello World“,你完成了第一个工程,将其命名为STM32F103_Hello.

此阶段不考虑单片机的移植性,只管实现功能,你可以在一个main函数写上几千行的代码,当你觉得一个main函数的代码太长不好维护时,即开始进入阶段二:

阶段二:单一单片机的模块化实现阶段

此阶段你已经会使用STM32F1系列单片机的各种不同外设,并打算将外设代码进行模块化。

此阶段不考虑单片机的移植性,但需要考虑代码的复用性,你将main函数的几千行代码拆分成一个个的模块,模块间的调用完全随性而为,低内聚,高耦合的代码随处可见,改动一个模块会影响太多其他模块,当你觉得需要对模块进行解耦,以实现标准化模块间的复用时,你就开始进入阶段三:

阶段三:同一厂商不同系列单片机的应用层模块复用实现阶段

此阶段你实现了代码模块化,会通过接口间的数据实现松散耦合调用

此阶段你可以通过调用以前写好的应用层模块,来满足更换同一厂商的不同单片机时,只需改动少量代码的需求,然而对于大量硬件传感器等外设,不可能做到模块复用,因为传感器的模块太过依赖于底层接口的实现,你要初始化它的引脚,就得调用它的时钟使能接口方法,调用它的gpio库初始化方法,要点个灯,就得调用它的gpio拉高拉低方法,而这些接口在同一厂商的不通系列单片机中,居然都会不一致。于是你不能忍,决定自己开发一个接口更加标准化的库。

阶段四:不用厂商不同系列单片机的分层架构实现阶段

此阶段你完成了BSP-SYSTEM-HARDWARE-APP四层架构,各个层次分工明确。BSP负责外设驱动初始化,配置,调用引脚电平拉高拉低等,SYSTEM负责系统精确延时,及时间片的轮询处理,HARDWARE负责调用BSP的统一接口,实现各个传感器或硬件的初始化及数据收发,APP包含各种通信协议处理及控制逻辑处理,不同单片机通过加入不同的BSP,而SYSTEM-HARDWARE-APP都可以做到不变。

类似的,我们的BSP底层架构开发也经历了若干版本。

初代BSP

最初的版本只限于单个单片机使用,底层和应用层完全没有隔离,经常可见在main函数里操作GPIO库函数的情况,这种架构模式的好处是开发简单,不用考虑复杂的移植性,因此耦合度过高,同厂商不同内核的单片机移植,都会改动大量代码。

初版的串口驱动接口是这个样的:

void USART_driverInit(USART_TypeDef* USARTx, uint32_t baudRate, uint8_t preemptionPriority, uint8_t subPriority);void USART_sendByte(USART_TypeDef* USARTx, uint8_t byte);
void USART_sendMsg(USART_TypeDef* USARTx, uint8_t *sendBuf, uint32_t len);void USART1_dmaTxIsr(void);
void USART2_dmaTxIsr(void);
void USART3_dmaTxIsr(void);
void UART4_dmaTxIsr(void);void USART1_recvIsr(void);
void USART2_recvIsr(void);
void USART3_recvIsr(void);
void UART4_RecvIsr(void);

假设某个应用层要引用它,就必须得包含USART_TypeDef*这个定义的文件,如果不同的厂商串口结构定义不是这个怎么办。

在迭代中我们想到用USART_t给USART_TypeDef*取别名

typedef USART_TypeDef* USART_t;

随着gpio口和dma操作的增加,这种取别名的方式,也不能解决问题,有些结构体内部的成员名都不相同。

于是,我们对BSP架构进行了升级,使其可以兼容更多单片机甚至国产化的单片机。

二代BSP:

方法是建立BSP-SYSTEM-HARDWARE-APP四层架构。

其中不同系列的单片机使用不同BSP框架,保留相同命令的接口,SYSTEM-HARDWARE-APP如果需要调用这个接口,只需要引用XXX系列单片机目录下的BSP头文件。

这个版本的串口驱动接口是这个样的:

typedef USART_TypeDef* USART_Type_t;
typedef struct USART_Struct* USART_t;
typedef struct USART_Struct
{USART_Type_t usart;uint32_t baudRate;  uint8_t priority;uint8_t subPriority;uint16_t parity;uint16_t stopBits;uint16_t wordLength;uint32_t RS485Delay;USART_Config_t config; USART_Transport_t *send;USART_Transport_t *receive;uint32_t timeout;uint32_t linkCount;bool isRS485Connected;void (*USART_TypeInit)(USART_t USART);void (*USART_SendByte)(USART_t USART, uint8_t byte);void (

相关文章:

  • 足球预测模型理论:足球数据分析——XGBoost算法实战
  • Navicat数据库管理工具实现Excel、CSV文件导入到MySQL数据库
  • C#中NModbus4中常用的方法
  • 设计模式之装饰模式(Decorator)
  • 解决macOS安装redis以后不支持远程链接的问题
  • 如何注册和使用Disney+?Disney+会员账号可以合租?Disney+会员账号订阅购买使用教程
  • K8S:开源容器编排平台,助力高效稳定的容器化应用管理
  • vue上传预览CAD文件
  • Vue开发前端图片上传给java后端
  • 华为机考练习(golang)
  • 简单的spring缓存 Cacheable学习
  • 小北的JDK1.8下载、安装和环境配置教程——附件资源
  • C# 委托(Delegate)一
  • Spring Boot 学习之路 -- 基础认知
  • 云电脑、指纹浏览器,虚拟机这三者的区别
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • Android 架构优化~MVP 架构改造
  • Apache的基本使用
  • Asm.js的简单介绍
  • C++类的相互关联
  • canvas绘制圆角头像
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • Java 网络编程(2):UDP 的使用
  • LintCode 31. partitionArray 数组划分
  • mongodb--安装和初步使用教程
  • orm2 中文文档 3.1 模型属性
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 阿里云应用高可用服务公测发布
  • 搞机器学习要哪些技能
  • 前端代码风格自动化系列(二)之Commitlint
  • 浅谈web中前端模板引擎的使用
  • 区块链分支循环
  • 通过npm或yarn自动生成vue组件
  • 微信支付JSAPI,实测!终极方案
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 昨天1024程序员节,我故意写了个死循环~
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​secrets --- 生成管理密码的安全随机数​
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • # C++之functional库用法整理
  • # Java NIO(一)FileChannel
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • ${ }的特别功能
  • (¥1011)-(一千零一拾一元整)输出
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (CPU/GPU)粒子继承贴图颜色发射
  • (Java入门)抽象类,接口,内部类
  • (ZT)出版业改革:该死的死,该生的生
  • (超详细)语音信号处理之特征提取
  • (多级缓存)缓存同步
  • (分布式缓存)Redis分片集群
  • (分享)自己整理的一些简单awk实用语句