电子产业一站式赋能平台

PCB联盟网

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

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

[复制链接]

1001

主题

1001

帖子

8805

积分

高级会员

Rank: 5Rank: 5

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

joq255ahwcf640115515907.gif

joq255ahwcf640115515907.gif
( e' Z; w: L7 x+ u4 @: G6 x6 U$ ]
点击上方蓝色字体,关注我们
2 r4 H0 p% l6 z裸机编程确实可以减少系统复杂性,提升对资源的掌控能力。3 L1 N2 I' k& J$ V6 [' N  v8 N; x
% E( G) U3 |- I7 P

qfhnx1y30hd640115516008.png

qfhnx1y30hd640115516008.png

! D6 C. f. k7 ~9 |7 p在考虑裸机编程的架构时,可以通过以下几个思路构建更加健壮和稳定的系统。" K$ u" F. e% [0 {% r/ \0 n, P
1
0 Y: d2 m3 v. u! l模块化架构
7 B' Q  B6 s& r这种架构提高了代码的可读性和复用性,并使问题定位更加方便。模块间的解耦也使得后续功能扩展更加灵活。$ ?7 k2 J" |! r, g, L7 M
  • 硬件抽象层 (HAL):实现底层硬件的访问,包括GPIO、UART、SPI等,所有外设访问都通过HAL接口。这种抽象不仅简化了硬件操作,还便于后续移植到不同的STM32型号。
  • 驱动层:在HAL基础上封装具体外设功能,如传感器驱动、存储器驱动等。每个驱动应尽量独立,遵循单一责任原则。
  • 服务层:提供常用功能的中间层,如定时器服务、事件调度器等。服务层可以帮助处理通用任务,减少应用层的复杂性。
  • 应用层:实现最终的应用逻辑。应用层应专注于业务逻辑,而非硬件细节。7 s9 v& F8 `2 E0 A: X9 o9 n
    : X. i' F# W* i9 P
    2
    : O9 _% t. K$ C" g. e( I7 e! [事件驱动架构6 {6 B1 E& M/ ^8 D
    这种方法避免了复杂的中断嵌套,简化了调试过程,并能轻松扩展新的事件处理逻辑。
    & U! r4 Z: p' X4 ?0 j2 L  X
  • 使用硬件中断(如定时器、UART接收)产生事件,并将这些事件存储到事件队列中。
  • 在主循环中不断检查事件队列,处理相应的事件。
    " B, R( Q% G( D( W4 r

    7 v; R4 ?: o# m, J+ A- t1 c8 y" O4 `6 P2 Q由于裸机编程往往缺乏操作系统的调度功能,可以采用事件驱动的架构来模拟任务调度。具体步骤如下:. W, S& R6 x/ M* ^" p
    [/ol]8 ]2 U: f$ G8 l  H  ~
    * h4 c% b2 a; ~4 V6 m: W
    基于定时器的调度机制
    - X$ ?+ K6 v: U( m% |; s8 e4 {4 ]3 ?; e5 c% ~0 ^
    使用硬件定时器来模拟简易的调度机制,引入“时间片”概念。$ L8 l+ L# c# E9 s. m7 N$ }
    $ r- v. ?2 G/ l# g( `1 D+ \
    设定不同定时器来触发任务,使高优先级任务在更短时间间隔内执行,而低优先级任务则被延后处理。. g% F/ B- k7 b, p
    9 Y. O2 M; l3 u' e) M! m
    这种机制有助于降低优先级反转的风险,确保系统稳定运行。! }0 s3 v. C; O: l, u
    [/ol]3 @0 r8 G9 L) m. O

    2 M' {5 k9 H, T* k' [3 b) }有限状态机 (FSM)
    - Y- a. ?; z# q1 j0 P# y
    / h7 O) ]# m/ m9 v6 M. m为每个模块设计独立的状态机,并在主循环中定期轮询状态。! i1 Z/ ]# G$ A0 J9 p3 m
    . I3 x0 `4 E  T( o5 M
    状态机方法清晰地描述系统行为和状态转换条件,便于调试和维护。$ g: ]( p5 l5 J0 T2 L! I
    / k! ^1 t/ K5 |
    可以使用状态表或状态图的方式来描述状态及其转换,使得状态管理更加直观。: ~  l& F9 r' c/ K4 f9 v9 S* k
    [/ol]* @/ x; H+ f$ {% Q& U. w& G/ a8 F

    5 L" F! P. t  q改进调试方法6 {/ j$ h4 B/ W; t2 o

    ( {. g- p+ C: Y( J& c- G
  • 周期性心跳检测:通过LED或串口输出定期报告系统状态,有助于实时监控系统运行情况。
  • 监控看门狗:在系统出现异常时,通过看门狗定时复位系统,避免长时间的卡死状态。
  • 启用硬件异常捕获:利用硬件断点、错误向量捕获(如HardFault、MemManage等)来捕捉异常,有助于定位问题。
    $ e# d$ I/ \3 x6 R) A- ^2 w0 E
    [/ol]
    3 F6 H+ k$ K$ {7 b3* S: {8 L% r. Q: q- L+ _4 U
    常见裸机编程架构推荐
    5 ?4 C, {3 H) K! X
  • 大循环 + 中断 (Super Loop + Interrupts):适用于功能不复杂、任务较少的场景。中断中仅进行事件标记或简单数据采集,具体任务在主循环中处理。
  • 事件队列架构:事件队列设计提升系统响应性,适用于任务较多或时间要求较高的系统。
  • 时间片轮询架构:适合有多个定时性任务的场景,通过时间片调度不同的任务。
    7 Y' I6 c* K4 N" l" x# Q" {! }

    ' L& |: i1 C0 E4! d, v  n0 g& C. L3 Q- S  q- d( K/ B
    实践中的建议6 F8 u# R0 ]7 i  e
  • 减少全局变量的使用:在裸机环境下,避免全局变量引起的竞争问题,使用局部变量或传递参数的方式。
  • 小心使用中断:控制中断嵌套深度,中断函数应保持简洁快速,尽量避免长时间占用中断。
  • 内存管理:设计好内存管理策略,避免动态内存分配带来的碎片化问题,使用静态分配方式尽量确保内存使用的高效性。
  • 配置和初始化的分离:将外设的配置和初始化代码独立为函数,便于管理和复用。
    7 ^3 K% i! |0 |) a7 E3 e8 }
    . `, }  Q5 W% ?) {+ }3 M. K
    这些建议和思路可以帮助你快速搭建一个稳健的裸机编程框架,通过良好的代码结构和设计习惯减少复杂性,提高系统的稳定性和可维护性。
    5 ~, O% a5 ~5 |5 B( @

    vruegsjwrhy640115516108.jpg

    vruegsjwrhy640115516108.jpg

    3 O, I$ W4 R  c

    kzgqcxuxd1t640115516208.gif

    kzgqcxuxd1t640115516208.gif
      S* A: W: F: I) K0 ]( _. P6 s+ ]
    点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


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