电子产业一站式赋能平台

PCB联盟网

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

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

[复制链接]

563

主题

563

帖子

3387

积分

四级会员

Rank: 4

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

joq255ahwcf640115515907.gif

joq255ahwcf640115515907.gif
& W+ \! \2 x7 j, I% A4 U
点击上方蓝色字体,关注我们- _+ i) u- f- O+ Q* {5 U( B9 o
裸机编程确实可以减少系统复杂性,提升对资源的掌控能力。
6 ~9 k* t/ f# r4 b! |4 Y
: Q8 S' T; B; V8 B

qfhnx1y30hd640115516008.png

qfhnx1y30hd640115516008.png
4 G0 a- S/ e* j0 H( F
在考虑裸机编程的架构时,可以通过以下几个思路构建更加健壮和稳定的系统。
& w& s) Y; ^' M6 e5 t8 a& q12 y4 C, `3 g  W% v9 z
模块化架构1 ~* u& x% P; m7 d( ^; H
这种架构提高了代码的可读性和复用性,并使问题定位更加方便。模块间的解耦也使得后续功能扩展更加灵活。
  O: J, I2 {* T/ b
  • 硬件抽象层 (HAL):实现底层硬件的访问,包括GPIO、UART、SPI等,所有外设访问都通过HAL接口。这种抽象不仅简化了硬件操作,还便于后续移植到不同的STM32型号。
  • 驱动层:在HAL基础上封装具体外设功能,如传感器驱动、存储器驱动等。每个驱动应尽量独立,遵循单一责任原则。
  • 服务层:提供常用功能的中间层,如定时器服务、事件调度器等。服务层可以帮助处理通用任务,减少应用层的复杂性。
  • 应用层:实现最终的应用逻辑。应用层应专注于业务逻辑,而非硬件细节。
    $ ^# P; T1 J0 j( \$ s8 G1 k
    / w9 Y4 }$ B; x, j. `+ V
    2+ [9 O$ N* b. H  D
    事件驱动架构# X4 X+ c/ M3 @7 |6 V
    这种方法避免了复杂的中断嵌套,简化了调试过程,并能轻松扩展新的事件处理逻辑。* c' C2 D0 }0 T0 _" s! ~3 \
  • 使用硬件中断(如定时器、UART接收)产生事件,并将这些事件存储到事件队列中。
  • 在主循环中不断检查事件队列,处理相应的事件。$ l  \; w  H; q5 h. X& u
    - D$ t8 b6 l: {3 O$ N9 h5 I( a
    由于裸机编程往往缺乏操作系统的调度功能,可以采用事件驱动的架构来模拟任务调度。具体步骤如下:
    ! l# t# P3 ~: M, U/ D" ~0 ?$ c[/ol]
    * @' Z" k- ^: d$ h. q3 |" e

    7 y! L, P8 d3 b; r" L0 }基于定时器的调度机制1 J  o! F4 W5 H: y2 [% ]

    ! _3 a4 u, G! i0 N使用硬件定时器来模拟简易的调度机制,引入“时间片”概念。' r" O7 R$ @+ n1 c& l" X

    " b2 ]- e1 m8 `$ x, [* N设定不同定时器来触发任务,使高优先级任务在更短时间间隔内执行,而低优先级任务则被延后处理。1 v3 R5 z, B7 r$ M( u

    9 e1 j& U: j$ N  J) Q/ O- k& N2 j这种机制有助于降低优先级反转的风险,确保系统稳定运行。
    ! L; ~3 a) g/ a% P[/ol]
    ) I: C5 l. g% j! R: }$ N% z
    4 l7 `% I' d9 r, f- Y& |* y' b+ d( x
    有限状态机 (FSM)+ W8 \$ r( M8 s- U

    1 |3 f$ l3 q0 B, i. D为每个模块设计独立的状态机,并在主循环中定期轮询状态。
      a% [' |9 ^- J6 N2 o
    * \7 A4 {/ l( L) i# w状态机方法清晰地描述系统行为和状态转换条件,便于调试和维护。8 l2 c, v. a3 y: \) T
    8 ]) \! V$ t; n1 n' M% m4 P- \1 \% S
    可以使用状态表或状态图的方式来描述状态及其转换,使得状态管理更加直观。5 v1 B: o* a2 m: G; H2 f
    [/ol]9 k3 m* [% ]; u) f

    * g% m5 P, t9 M" j$ z* r) \7 V改进调试方法
    7 h" M* {/ U8 o5 h3 F4 I+ X6 `/ G3 ?3 W6 Z
  • 周期性心跳检测:通过LED或串口输出定期报告系统状态,有助于实时监控系统运行情况。
  • 监控看门狗:在系统出现异常时,通过看门狗定时复位系统,避免长时间的卡死状态。
  • 启用硬件异常捕获:利用硬件断点、错误向量捕获(如HardFault、MemManage等)来捕捉异常,有助于定位问题。5 [. B0 j; o+ @7 j% V) X
    [/ol]  M1 s! [6 |! V
    3$ r$ ?) \3 r6 }9 e
    常见裸机编程架构推荐. ~' [% [& I; {9 ~5 z' J" W2 e
  • 大循环 + 中断 (Super Loop + Interrupts):适用于功能不复杂、任务较少的场景。中断中仅进行事件标记或简单数据采集,具体任务在主循环中处理。
  • 事件队列架构:事件队列设计提升系统响应性,适用于任务较多或时间要求较高的系统。
  • 时间片轮询架构:适合有多个定时性任务的场景,通过时间片调度不同的任务。
    ! ?& K; _! @) B, t4 X
    # ]" I" |1 c5 f; o) S
    4
    1 ?, A9 x! }3 p, @, O/ }实践中的建议& V; q& p; |7 a8 r& ~% g: H0 V
  • 减少全局变量的使用:在裸机环境下,避免全局变量引起的竞争问题,使用局部变量或传递参数的方式。
  • 小心使用中断:控制中断嵌套深度,中断函数应保持简洁快速,尽量避免长时间占用中断。
  • 内存管理:设计好内存管理策略,避免动态内存分配带来的碎片化问题,使用静态分配方式尽量确保内存使用的高效性。
  • 配置和初始化的分离:将外设的配置和初始化代码独立为函数,便于管理和复用。
    ( @5 L( k( R7 T8 g% R- e
    9 j5 G. k9 f/ U
    这些建议和思路可以帮助你快速搭建一个稳健的裸机编程框架,通过良好的代码结构和设计习惯减少复杂性,提高系统的稳定性和可维护性。
    0 U% h! i8 P  C

    vruegsjwrhy640115516108.jpg

    vruegsjwrhy640115516108.jpg
      c+ O/ n2 Z3 @7 B1 W6 t- q

    kzgqcxuxd1t640115516208.gif

    kzgqcxuxd1t640115516208.gif

    : `9 H/ r, J) ^7 u点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


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