电子产业一站式赋能平台

PCB联盟网

搜索
查看: 166|回复: 0
收起左侧

有没有适用于STM32的裸机编程架构或思路?

[复制链接]

840

主题

840

帖子

6491

积分

高级会员

Rank: 5Rank: 5

积分
6491
发表于 2024-11-9 08:00:00 | 显示全部楼层 |阅读模式

joq255ahwcf640115515907.gif

joq255ahwcf640115515907.gif

+ g6 N$ B  Z' {* L7 ^点击上方蓝色字体,关注我们! o! B# I( g1 A
裸机编程确实可以减少系统复杂性,提升对资源的掌控能力。
# m) Q1 [0 S4 q) y0 c' M# X5 C4 r+ U7 k- _0 F" c' s. F! ]9 b

qfhnx1y30hd640115516008.png

qfhnx1y30hd640115516008.png
6 |. o+ W1 L7 }- h1 Q, C" M$ ^
在考虑裸机编程的架构时,可以通过以下几个思路构建更加健壮和稳定的系统。6 ?0 B. B$ F+ M. m% N  F
12 S! o; R8 O/ w* i
模块化架构
  H( U. n  L% \! E! r这种架构提高了代码的可读性和复用性,并使问题定位更加方便。模块间的解耦也使得后续功能扩展更加灵活。/ s: J; Q; j4 r" w2 I
  • 硬件抽象层 (HAL):实现底层硬件的访问,包括GPIO、UART、SPI等,所有外设访问都通过HAL接口。这种抽象不仅简化了硬件操作,还便于后续移植到不同的STM32型号。
  • 驱动层:在HAL基础上封装具体外设功能,如传感器驱动、存储器驱动等。每个驱动应尽量独立,遵循单一责任原则。
  • 服务层:提供常用功能的中间层,如定时器服务、事件调度器等。服务层可以帮助处理通用任务,减少应用层的复杂性。
  • 应用层:实现最终的应用逻辑。应用层应专注于业务逻辑,而非硬件细节。
    9 r( [* O% W, G: P6 ]3 R
    $ K. W1 D  M: t7 M
    2' [2 J1 _3 R$ ~1 o9 [9 P' J8 T
    事件驱动架构
    * K" k5 n/ R# z0 q2 h这种方法避免了复杂的中断嵌套,简化了调试过程,并能轻松扩展新的事件处理逻辑。$ J- U* Q9 M5 s! e7 Z% \
  • 使用硬件中断(如定时器、UART接收)产生事件,并将这些事件存储到事件队列中。
  • 在主循环中不断检查事件队列,处理相应的事件。* c5 N) j1 n; h* p, F
    6 S1 N1 C; k1 j! C8 D1 S7 x, O& Y
    由于裸机编程往往缺乏操作系统的调度功能,可以采用事件驱动的架构来模拟任务调度。具体步骤如下:% K$ {( F9 B' R
    [/ol]
    8 d/ P/ J6 |9 E% r3 k
    " t# p1 d+ i$ ?5 i
    基于定时器的调度机制
    & `. B/ a; V1 k
    * c' s2 E( N. t* S使用硬件定时器来模拟简易的调度机制,引入“时间片”概念。
    : Y: w3 r& z( [6 [# Y2 d% C
    # @( @$ H8 z" }2 V0 c设定不同定时器来触发任务,使高优先级任务在更短时间间隔内执行,而低优先级任务则被延后处理。
    $ Z' N( r5 s! g
    ; }: d5 Q" G; H0 s3 V6 A8 @5 v, ~这种机制有助于降低优先级反转的风险,确保系统稳定运行。
    / v. G: c! o9 ]( Z  ][/ol]$ l  }8 C* h# O2 ?1 \: u
    6 ~( _' u) k( L4 u! Z# e; z0 `
    有限状态机 (FSM)
    ( {9 w4 |% [" H) G" Y8 C  z. C
    5 k7 G% B" C2 B6 |% N为每个模块设计独立的状态机,并在主循环中定期轮询状态。; O4 l" c  O+ u, G! p) v. o

    : j3 }. e( O: R状态机方法清晰地描述系统行为和状态转换条件,便于调试和维护。
      [  {. V# ^, b6 B6 M- a  }" l; n: j# T, R
    可以使用状态表或状态图的方式来描述状态及其转换,使得状态管理更加直观。
    : ^& m; m& ], ~+ I7 e[/ol]
    , l) M$ r5 r, `; U

    9 @: t0 e8 R3 \5 c! }# x" ]& J  |  y$ q改进调试方法. Y) R" G: u9 q* V% A  ~7 {$ v

    7 {7 T, N$ O" j) N
  • 周期性心跳检测:通过LED或串口输出定期报告系统状态,有助于实时监控系统运行情况。
  • 监控看门狗:在系统出现异常时,通过看门狗定时复位系统,避免长时间的卡死状态。
  • 启用硬件异常捕获:利用硬件断点、错误向量捕获(如HardFault、MemManage等)来捕捉异常,有助于定位问题。
    ; b2 q! A6 E4 t
    [/ol]2 A+ S6 D! v5 b
    3& u; r5 k4 c6 a! l* I4 o
    常见裸机编程架构推荐$ c* L0 ~; m8 u) E8 F8 u4 d
  • 大循环 + 中断 (Super Loop + Interrupts):适用于功能不复杂、任务较少的场景。中断中仅进行事件标记或简单数据采集,具体任务在主循环中处理。
  • 事件队列架构:事件队列设计提升系统响应性,适用于任务较多或时间要求较高的系统。
  • 时间片轮询架构:适合有多个定时性任务的场景,通过时间片调度不同的任务。
    / w/ d" N3 Z6 C
    4 g8 {7 C) v4 @" |" U: n4 w
    4& v# d) k9 V% k+ ]; p5 u/ X
    实践中的建议& R6 c9 F9 x& S7 O% M
  • 减少全局变量的使用:在裸机环境下,避免全局变量引起的竞争问题,使用局部变量或传递参数的方式。
  • 小心使用中断:控制中断嵌套深度,中断函数应保持简洁快速,尽量避免长时间占用中断。
  • 内存管理:设计好内存管理策略,避免动态内存分配带来的碎片化问题,使用静态分配方式尽量确保内存使用的高效性。
  • 配置和初始化的分离:将外设的配置和初始化代码独立为函数,便于管理和复用。
    + [# a5 U4 a/ \  s
    9 h" |; w1 y9 ~0 M1 F: l( |
    这些建议和思路可以帮助你快速搭建一个稳健的裸机编程框架,通过良好的代码结构和设计习惯减少复杂性,提高系统的稳定性和可维护性。
    2 y* z8 N% c( T+ e6 q3 |: W

    vruegsjwrhy640115516108.jpg

    vruegsjwrhy640115516108.jpg

    - f6 N; J3 e7 f; Z0 Z2 G% R

    kzgqcxuxd1t640115516208.gif

    kzgqcxuxd1t640115516208.gif

    " d' G  k0 A2 |! T7 {  F# P; _* M点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表