STM32 嵌入式系统开发分层设计思想简谈

2023-05-16

简介

开始之前自我介绍一下,我在大学学的是物联网工程专业,可惜的是发现嵌入式并不好找工作。于是后面自学了前端,并到美团从事了1年相关的开发工作,但是发现嵌入式才是真爱,于是又转到嵌入式开发。

前端作为目前发展最快的互联网方向,其中非常多的思想值得发扬到嵌入式上,我将其中的精华部分总结出来,欢迎大家指正。

嵌入式系统作为最基础的系统,通常一个系统的开发会涉及到数个、数十个外设的使用。然而使用这些外设充满了不确定性:

  • 外设开启关闭复杂
  • 外设之间协同
  • 第三方IC外设没有驱动
  • 多线程下对外设的访问

在此基础上,还需要开发对应的业务逻辑。值得庆幸的是,嵌入式的业务逻辑相对简单。
因此,为了使得一个嵌入式系统的架构合理,耦合性低,将上述的外设和业务逻辑区分开是有必要的。
在这里插入图片描述

设计目的:

  • 增加可维护性
  • 降低代码耦合性
  • 提升错误的可追查性

思路:

将整个系统分为3层: 内核层、驱动层、业务层。每层分为任意个模块。
内核层:只包含系统的核心,startup文件、HAL库、RTOS(可选)
驱动层:利用RTOS对HAL进行再次封装,对外提供函数,以符合业务层的需求
业务层:调用驱动层和内核层,完成业务逻辑

设计原则:

层与层内部: 每个模块之间不能相互调用。
层与层之间: 不能反向调用,例如驱动层调用业务层,但可以跨层调用,例如业务层调用内核层。

设计技巧:

内核层:无。
驱动层:

  • 使用static将变量、函数都局域化,只对外暴露一个struct。
  • 统一的命名风格,比如modbus_drv,usb_drv或者其他任何符合你自己的命名习惯
  • 全面的生命周期控制,对外提供包含但不限于init、start、stop、deinit之类的接口
  • 线程安全的考虑
  • 回调函数的设计,通常某些业务逻辑需要业务层提供,举个栗子:现在需要读取usb的5个字节数据,但是受限制于底层usb库,读取只能是一个异步的过程,这个时候就需要提供一个register注册回调函数。
  • 信号量、事件等通知标志位的隐藏。对于某些简单的事件,例如上述的读取usb的5个字节数据,业务层只需要知道读取完成,而不需要拿到数据;这个时候,在业务层维护一个信号量,然后再写一个回调修改这个信号量,显然很麻烦。这个时候可以把信号量维护在驱动层,对外提供一个check_is_read_done函数。

业务层:

  • 在业务层使用看门狗对业务进行监控,可以单独写一个看门狗线程,监测业务层是否按预期时间运行。
  • 如果驱动层没有做线程安全的考虑,则需要业务层自己做,这个时候可以把需要做线程安全的代码单独抽在一个Utils里面,这样的话可以避免锁在各个文件之间传递。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 嵌入式系统开发分层设计思想简谈 的相关文章

随机推荐

  • C++中string::npos的一些用法总结

    一 关于npos的定义 在MSDN中有如下说明 xff1a basic string npos static const size type npos 61 1 定义 The constant is the largest represen
  • CMake:通过target_link_libraries链接第三方库

    sdbusplus 通过new method call同步调用service的method 风静如云的博客 CSDN博客 例子中需要在编译时链接 lsdbusplus lsystemd 这两个第三方库 那么通过cmake怎么指定呢 其实很简
  • 在ubuntu终端打开谷歌浏览器的命令

    安装好谷歌浏览器后 xff0c 用以下命令在终端打开谷歌浏览器 adb shell am start n com android chrome com google android apps chrome Main 之后便出现如下内容 xf
  • PELCO_D通信协议

    1 球机通信接口 xff08 EIA RS 485 xff09 数据传输方式 xff1a 异步半双工串行通讯 通信波特率 xff1a 9600Bps 数据格式 xff1a Start Bit xff1a 1 Bit xff1b Data B
  • C buffer

    这学期在Dartmouth上ENGS20 Introduction to Scientific Computing xff0c 好多东西不记下来就会忘 xff0c 所以开一个笔记 在C语言中 xff0c 输入和输出都是有buffer的 xf
  • 寄存器值的操作方法

    通过这段时间的工作和学习 xff0c 我感觉在嵌入式硬件编程中 xff0c 大多数情况下都是对相应硬件的功能寄存器进行设置和操作 一 寄存器的设置和操作特性 1 xff0c 一个寄存器的每个位有其不同的意义 xff0c 进行不同的设置会使硬
  • UART串口通信(回环测试)

    一 UART串口通信简介 UART xff08 Universal Asynchronous Receiver Transmitter xff09 是采用异步串行通信方式的通用异步收发传输器 xff0c 在发送数据时将并行数据转换为串行数据
  • extern "C"的作用

    extern 34 C 34 的作用 一 前些天 编程序是用到了很久以前写的C程序 想把里面的函数利用起来 连接发现出现了找不到具体函数的错误 以下是假设旧的C程序库 C的头文件 c h ifndef C H define C H exte
  • 输入分钟数,按小时和分钟输出

    copyright C 2014 2015 Lighting Studio Co Ltd File name xff1a Author xff1a Jerey Jobs Version 0 1 Date Description xff1a
  • 输入一个32位的整数a,使用按位异或^运算,生成一个新的32位整数b,使得该整数b的每一位等于原整数a中该位左右两边两个bit位的异或结果

    程序要求 xff1a 输入一个32位的整数a 使用按位异或 运算 生成一个新的32位整数b 使得该整数b的每一位等于原整数a中该位左右两边两个bit位的异或结果 copyright C 2014 2015 Lighting Studio C
  • sqlite回调函数的解释与使用

    gt 在sqlite3的api函数中有一个sqlite3 exec xff0c 用来执行sql语句 xff1a 函数原型 xff1a int sqlite3 exec sqlite3 ppDb An open database const
  • Linux节点理解

    一 inode是什么 xff1f 理解inode xff0c 要从文件储存说起 文件储存在硬盘上 xff0c 硬盘的最小存储单位叫做 扇区 xff08 Sector xff09 每个扇区储存512字节 xff08 相当于0 5KB xff0
  • OSSempend();OSSemPost();函数的解析

    浅析 COS II v2 span class hljs number 85 span 内核OSSemPend 和OSSemPost 函数工作原理 文章来源 http span class hljs comment gliethttp cu
  • 矩阵键盘时钟

    span class hljs preprocessor include lt reg52 h gt span class hljs comment 包含头文件 xff0c 一般情况不需要改动 xff0c 头文件包含特殊功能寄存器的定义 s
  • opencv上gpu版surf特征点与orb特征点提取及匹配实例

    一 前言 本文主要实现了使用opencv里的gpu版surf特征检测器和gpu版orb检测器 xff0c 分别对图片进行特征点提取及匹配 xff0c 并对寻获的特征点进行了距离筛选 xff0c 将匹配较为好的特征点进行展示 二 实现代码 我
  • while(c = getchar() != '\n')和while((c = getchar()) != '\n')区别

    在利用while循环和getchar 读取缓存中的数据时 xff0c 发现了一些问题 在最初 xff0c 我利用while c 61 getchar 61 n 的时候 xff0c 发现总是不能将我想要读取的值正确的赋值给c xff0c 在我
  • C++template模板

    模板 xff08 Template xff09 指C 43 43 程序设计设计语言中采用类型作为参数的程序设计 xff0c 支持通用程序设计 C 43 43 的标准库提供许多有用的函数大多结合了模板的观念 xff0c 如STL以及IO St
  • Linux Ubuntu 14.04平台下安装EDK2

    Linux Ubuntu 14 04平台下安装EDK2 博客是基于https github com tianocore tianocore github io wiki Common instructions和 UEFI原理和编程 完成的
  • ubuntu下安装和使用

    在ubuntu下完善代码的时候 会遇到想要跳转到函数定义处 或者跳转到其他相关文件的情况下 此时要借助linux下的ctags工具 在这里 xff0c 我会尽我所能细致地讲清楚如何把vim变成source insight 然而你仍然需要积极
  • STM32 嵌入式系统开发分层设计思想简谈

    简介 开始之前自我介绍一下 xff0c 我在大学学的是物联网工程专业 xff0c 可惜的是发现嵌入式并不好找工作 于是后面自学了前端 xff0c 并到美团从事了1年相关的开发工作 xff0c 但是发现嵌入式才是真爱 xff0c 于是又转到嵌