电子产业一站式赋能平台

PCB联盟网

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

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

[复制链接]

724

主题

724

帖子

5176

积分

四级会员

Rank: 4

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

joq255ahwcf640115515907.gif

joq255ahwcf640115515907.gif

3 j& T& s! e+ Q' w点击上方蓝色字体,关注我们
0 B7 Z# H7 `2 e1 ?  R' B裸机编程确实可以减少系统复杂性,提升对资源的掌控能力。
7 k  M5 `2 D; l
9 v, ^2 M" J0 r8 M

qfhnx1y30hd640115516008.png

qfhnx1y30hd640115516008.png
: \+ r7 ]/ i7 \. G
在考虑裸机编程的架构时,可以通过以下几个思路构建更加健壮和稳定的系统。
8 [; C( b. ^$ z9 i9 b; K7 X# Q1
- q6 |8 A9 R  ?; ?模块化架构' t3 n% h1 g3 r2 @
这种架构提高了代码的可读性和复用性,并使问题定位更加方便。模块间的解耦也使得后续功能扩展更加灵活。. W- v+ a& r# s# b7 k$ H8 S
  • 硬件抽象层 (HAL):实现底层硬件的访问,包括GPIO、UART、SPI等,所有外设访问都通过HAL接口。这种抽象不仅简化了硬件操作,还便于后续移植到不同的STM32型号。
  • 驱动层:在HAL基础上封装具体外设功能,如传感器驱动、存储器驱动等。每个驱动应尽量独立,遵循单一责任原则。
  • 服务层:提供常用功能的中间层,如定时器服务、事件调度器等。服务层可以帮助处理通用任务,减少应用层的复杂性。
  • 应用层:实现最终的应用逻辑。应用层应专注于业务逻辑,而非硬件细节。
    ; J: @! Y4 G8 n& Q( ?- o/ [  P
    ! U: a) _# B6 e/ }
    2
    * L$ o# Q5 O2 {/ }/ T. _( _事件驱动架构
    9 d5 u; q  h# N5 J5 g; g  [; f# B这种方法避免了复杂的中断嵌套,简化了调试过程,并能轻松扩展新的事件处理逻辑。& J& V' ^- m. x3 J$ ]: `
  • 使用硬件中断(如定时器、UART接收)产生事件,并将这些事件存储到事件队列中。
  • 在主循环中不断检查事件队列,处理相应的事件。2 X$ P) J5 b( t, i5 S
    8 r; D0 x( q* S# ?9 P
    由于裸机编程往往缺乏操作系统的调度功能,可以采用事件驱动的架构来模拟任务调度。具体步骤如下:
    2 a" b$ ~. Q9 h& F% {/ m1 ~[/ol], W9 Q- A+ y6 e  K+ E
    ; u$ C+ y9 n/ `2 L
    基于定时器的调度机制) z1 i9 \: S# ~2 G( J$ I$ r1 O1 r# G5 y

    ; Z) Z5 B- h6 [% A( q8 P使用硬件定时器来模拟简易的调度机制,引入“时间片”概念。
    8 i0 C' b$ t6 ~6 S/ x3 t1 c( V! P3 E; ]0 T' a
    设定不同定时器来触发任务,使高优先级任务在更短时间间隔内执行,而低优先级任务则被延后处理。! D2 s2 M: }% R8 E

    ' H! M( ^, g* |" ~这种机制有助于降低优先级反转的风险,确保系统稳定运行。
    . F5 G) @2 p- d( `' \# L" [[/ol]" {/ D6 J5 O7 O2 X- Q
    " z' Y9 q# y' G1 W! Z
    有限状态机 (FSM)8 u3 X/ y1 v$ W2 d4 i# u
    & ?+ g4 J# N% [5 J& J
    为每个模块设计独立的状态机,并在主循环中定期轮询状态。! E+ q+ R( c# \/ g: B' D6 l, o" }( W

    + |' _" D. f/ @! i& \0 h# M9 p状态机方法清晰地描述系统行为和状态转换条件,便于调试和维护。
      E; i. ?1 e8 o  O) k. {5 H4 ?0 ^" _: ?! p" {9 d* q
    可以使用状态表或状态图的方式来描述状态及其转换,使得状态管理更加直观。5 R, {" |8 M# `- q' e5 a
    [/ol]) K8 F7 y: H5 f/ d0 {, j7 D  ^2 X
    2 \2 f# \9 W; `# L7 Z
    改进调试方法
    ( I; K" G! x. }- r! `' B
    7 Z4 Q) N4 k0 n8 M7 G: `+ m
  • 周期性心跳检测:通过LED或串口输出定期报告系统状态,有助于实时监控系统运行情况。
  • 监控看门狗:在系统出现异常时,通过看门狗定时复位系统,避免长时间的卡死状态。
  • 启用硬件异常捕获:利用硬件断点、错误向量捕获(如HardFault、MemManage等)来捕捉异常,有助于定位问题。* y- t$ j0 \! W+ Z
    [/ol]+ r, B9 K& }$ U) q9 r& ^
    3/ N( E8 \2 f! f% D* p
    常见裸机编程架构推荐# m/ {$ R4 X" k( A
  • 大循环 + 中断 (Super Loop + Interrupts):适用于功能不复杂、任务较少的场景。中断中仅进行事件标记或简单数据采集,具体任务在主循环中处理。
  • 事件队列架构:事件队列设计提升系统响应性,适用于任务较多或时间要求较高的系统。
  • 时间片轮询架构:适合有多个定时性任务的场景,通过时间片调度不同的任务。2 E, i& ]8 E7 q1 d1 |1 ~
    , t# T. Y$ |; Q" B
    42 g2 s; ^" a0 a: Q8 s
    实践中的建议5 _1 d2 L9 N# I' w
  • 减少全局变量的使用:在裸机环境下,避免全局变量引起的竞争问题,使用局部变量或传递参数的方式。
  • 小心使用中断:控制中断嵌套深度,中断函数应保持简洁快速,尽量避免长时间占用中断。
  • 内存管理:设计好内存管理策略,避免动态内存分配带来的碎片化问题,使用静态分配方式尽量确保内存使用的高效性。
  • 配置和初始化的分离:将外设的配置和初始化代码独立为函数,便于管理和复用。' y6 {% G# }; v# A6 q
    ) ]- j7 }1 f% F+ n& K' Y
    这些建议和思路可以帮助你快速搭建一个稳健的裸机编程框架,通过良好的代码结构和设计习惯减少复杂性,提高系统的稳定性和可维护性。
      I0 b& f0 I5 J

    vruegsjwrhy640115516108.jpg

    vruegsjwrhy640115516108.jpg

    8 _( J# P/ {4 _1 J5 {

    kzgqcxuxd1t640115516208.gif

    kzgqcxuxd1t640115516208.gif
    5 {8 \- a5 R; h( c/ X" X$ i
    点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


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