以串口接口为例介绍关于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 (相关文章:
以串口接口为例介绍关于BSP底层架构开发的迭代过程
以串口接口为例介绍关于BSP底层架构开发的迭代过程 文章目录 以串口接口为例介绍关于BSP底层架构开发的迭代过程架构概述初代BSP二代BSP:三代BSP:四代BSP:架构概述 单片机开发有四个阶段: 阶段一:单一单片机的功能实现阶段 此阶段你开始熟悉STM32F1系列的单片机,并利用…...
Label-Studio ML利用yolov8模型实现自动标注
引言 Label Studio ML 后端是一个 SDK,用于包装您的机器学习代码并将其转换为 Web 服务器。Web 服务器可以连接到正在运行的 Label Studio 实例,以自动执行标记任务。我们提供了一个示例模型库,您可以在自己的工作流程中使用这些模型&#x…...
【PostgreSQL】实战篇——用户管理、角色和权限控制的高级用法及技巧
数据库中用户管理、角色和权限控制不仅仅是基础的安全措施,更是实现复杂应用需求和优化数据库性能的重要手段。 通过深入理解这些概念,数据库管理员可以更有效地管理用户访问、确保数据安全,并优化系统性能。以下是对这些概念的详细介绍以及…...
Leetcode: 0011-0020题速览
Leetcode: 0011-0020题速览 本文材料来自于LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解 遵从开源协议为知识共享 版权归属-相同方式…...
Hive数仓操作(七)
一、 Hive动态分区表 1. 动态分区与静态分区的区别 分区定义: 静态分区:在插入数据时,需要手动指定分区字段的值。动态分区:分区字段的值是根据数据中的某个字段自动生成的,用户只需指定分区字段的类型。 数据加载方…...
Redis进阶篇 - 缓存穿透、缓存击穿、缓存雪崩问题及其解决方案
文章目录 1 文章概述2 缓存穿透2.1 什么是缓存穿透?2.2 缓存穿透的解决方法2.2.1 做好参数校验2.2.2 缓存无效Key2.2.3 使用布隆过滤器2.2.4 接口限流 3 缓存击穿3.1 什么是缓存击穿?3.2 缓存击穿的解决方法3.2.1 调整热点数据过期时间3.2.2 热点数据预热…...
一天认识一个硬件之电源
无论是台式机还是笔记本,都离不开电源,台式机和笔记本电脑的电源都承担着将交流电转换为直流电,并为电脑内部各个部件提供稳定电力供应的重要任务。今天就来分享一下台式机和笔记本的电源区别 设计和功率 台式机电源:设计为内置…...
关于BSV区块链覆盖网络的常见问题解答(上篇)
发表时间:2024年9月20日 在BSV区块链上的覆盖网络服务为寻求可扩展、安全、高效交易处理解决方案的开发者和企业家开辟了新的视野。 作为开创性的曼达拉升级的一部分,覆盖网络服务提供了一个强大的框架,用于管理特定类型的交易和数据访问…...
VUE 开发——Node.js学习(一)
一、认识Node.js Node.js是一个跨平台JavaScript运行环境,使开发者可以搭建服务器端的JavaScript应用程序 使用Node.js编写服务器端程序——编写数据接口、前端工程化; Node.js环境没有BOM和DOM; Node.js安装:下载node-v16.19…...
角膜移植难题现,传统方式缺陷显,创新水凝胶破局
大家好!今天来了解一篇天然聚合物衍生光固化生物粘附水凝胶研究——《Natural polymer-derived photocurable bioadhesive hydrogels for sutureless keratoplasty》发表于《Bioactive Materials》。本文介绍了一种用于无缝合角膜移植术的天然聚合物衍生光固化生物粘…...
探索Spring Boot:实现“衣依”服装电商平台
1系统概述 1.1 研究背景 如今互联网高速发展,网络遍布全球,通过互联网发布的消息能快而方便的传播到世界每个角落,并且互联网上能传播的信息也很广,比如文字、图片、声音、视频等。从而,这种种好处使得互联网成了信息传…...
使用 cron 来设置定时任务
使用 cron 来设置定时任务,以便定期运行这个脚本。 在 Linux 系统中设置定时任务的步骤: 1. 编辑 cron 任务 打开终端并输入以下命令以编辑 crontab 文件: crontab -e2. 设置每天 8 点运行脚本 在 crontab 文件的最后,添加以下…...
C# Blazor Server 调用海康H5Player播放摄像头画面
目标 调用海康综合安防平台api,通过摄像头的cameraIndexCode调用【获取监控点预览取流URLv2】api,得到websocket 的url,然后在blazor server中使用htplayer.js播放摄像头实时画面。 步骤 根据摄像头名字,调用【查询监控点列表v2…...
CSS实现服务卡片
CSS实现服务卡片 效果展示 CSS 知识点 回顾整体CSS知识点灵活运用CSS知识点 页面整体布局 <div class"container"><div class"card"><div class"box"><div class"icon"><ion-icon name"color-pal…...
问:如何判断系统环境是大端/小端存储?
大端存储(Big Endian)和小端存储(Little Endian)是两种不同的字节序(即字节顺序)规则,用于在计算机中存储和表示多字节数据类型(例如整数)。 概念解释 大端存储&#x…...
使用NumPy进行线性代数的快速指南
介绍 NumPy 是 Python 中用于数值计算的基础包。它提供了处理数组和矩阵的高效操作,这对于数据分析和科学计算至关重要。在本指南中,我们将探讨 NumPy 中可用的一些基本线性代数操作,展示如何通过运算符重载和内置函数执行这些操作。 元素级…...
uni-app之旅-day02-分类页面
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言创建cate分支4.1 渲染分类页面的基本结构4.2 获取分类数据4.3 动态渲染左侧的一级分类列表4.4 动态渲染右侧的二级分类列表4.5 动态渲染右侧的三级分类列表4.6 …...
鸿蒙harmonyos next flutter通信之BasicMessageChannel获取app版本号
本文将通过BasicMessageChannel获取app版本号,以此来演练BasicMessageChannel用法。 建立channel flutter代码: //建立通道 BasicMessageChannel basicMessageChannel BasicMessageChannel("com.xmg.basicMessageChannel",StringCodec());…...
【文件增量备份系统】MySQL百万量级数据量分页查询性能优化
🎯 导读:本文针对大数据量下的分页查询性能问题进行了深入探讨与优化,最初查询耗时长达12秒,通过避免全表计数及利用缓存保存总数的方式显著提升了浅分页查询速度。面对深分页时依然存在的延迟,采用先查询倒数第N条记录…...
音视频入门基础:FLV专题(12)——FFmpeg源码中,解析DOUBLE类型的ScriptDataValue的实现
一、引言 从《音视频入门基础:FLV专题(9)——Script Tag简介》中可以知道,根据《video_file_format_spec_v10_1.pdf》第80到81页,SCRIPTDATAVALUE类型由一个8位(1字节)的Type和一个ScriptDataV…...
OpenClaw+Qwen3.5-9B:法律文档审查助手实战
OpenClawQwen3.5-9B:法律文档审查助手实战 1. 为什么需要AI法律文档助手? 去年接手一个跨境合作项目时,我曾在72小时内手动审阅了137页的英文合同草案。那段经历让我意识到:传统人工审查不仅效率低下,还容易因疲劳遗…...
OpenClaw跨平台控制:Kimi-VL-A3B-Thinking远程执行多模态任务方案
OpenClaw跨平台控制:Kimi-VL-A3B-Thinking远程执行多模态任务方案 1. 为什么需要跨平台远程控制? 上周五晚上11点,我正躺在沙发上刷手机,突然想起有个紧急的竞品分析报告需要处理。电脑在书房,实在懒得起身。这时我意…...
家庭知识库中心:OpenClaw+Qwen3.5-9B管理个人数字资产
家庭知识库中心:OpenClawQwen3.5-9B管理个人数字资产 1. 为什么需要家庭知识库 去年搬家时,我在整理纸质文件的过程中发现一个严重问题:孩子的疫苗接种记录、房产合同、医疗报告等重要文档分散在多个文件夹中,紧急情况下根本找不…...
深入解析RPN(区域生成网络):从原理到Faster RCNN的实战应用
1. RPN的前世今生:从Selective Search到神经网络革命 第一次接触物体检测时,我对着Selective Search算法输出的杂乱无章的建议框直挠头。这个传统方法就像在图片上撒豆子,不仅速度慢(CPU处理单张图要2秒),…...
网安工程师好就业吗?零基础转行如何操作?
“ 就业是好就业的,但是太卷了,因为它本身就是个门槛低,技术高的工作。如果决定要走这条路,那么一定要下定决心好好学,学出来了这下半辈子就不用愁了。” 网络安全,这个在现代社会愈发受到重视的领域&#…...
2026届必备的六大AI论文助手实测分析
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 此刻,针对学术写作情形的AI辅助网站已然构建起多元化生态,这类平台一…...
MCP23009 I²C GPIO扩展芯片驱动设计与实战
1. MCP23009通用I/O扩展芯片驱动库深度解析与工程实践MCP23009是Microchip公司推出的8位IC总线可编程通用输入/输出(GPIO)扩展器,专为资源受限的嵌入式系统设计。该芯片通过标准IC接口(支持标准模式100 kHz和快速模式400 kHz&…...
Phantom Stealer 凭证窃取机制分析与防御体系研究
摘要 Phantom Stealer 作为 2025 年下半年出现的新型多功能信息窃取木马,以多阶段感染、无文件驻留、强反检测与全维度凭证窃取为核心特征,通过伪装合法软件、脚本混淆、进程注入、 Heaven’s Gate 技术规避等手段,精准窃取浏览器密码、Cooki…...
收藏备用!AI大模型自学路线(小白/程序员专属),从入门到实战少走90%弯路
当下AI大模型已成技术领域的核心热点,无论是零基础小白,还是想转型进阶的程序员,都纷纷投身其中。但自学过程中,多数人都会陷入“找不到方向、学了不会用、越学越迷茫”的困境。今天就为大家整理一份系统、可落地、无冗余的AI大模…...
日结零工市场的权益保障困境与系统性治理路径
一、现象审视:弱势单元的权益真空日结零工作为弹性用工体系中最灵活、最底层的用工形态,其劳动者长期处于权益保障的真空地带。本文基于对B市线上日结零工市场的田野研究发现,日结零工劳动者面临三重结构性弱势:第一,法…...
