電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 121|回復(fù): 0
收起左側(cè)

有沒有適用于STM32的裸機編程架構(gòu)或思路?

[復(fù)制鏈接]

660

主題

660

帖子

4567

積分

四級會員

Rank: 4

積分
4567
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-11-9 08:00:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
# I: v$ J- O, D- ~3 W/ U% L
點擊上方藍色字體,關(guān)注我們
; X. J( t% h/ {& M! N4 Z6 M裸機編程確實可以減少系統(tǒng)復(fù)雜性,提升對資源的掌控能力。# H( ?6 c) G5 q+ p- O  J' C
0 z9 |* W' n5 J) S

" r- ~, ~5 S& q+ C3 h5 M4 H在考慮裸機編程的架構(gòu)時,可以通過以下幾個思路構(gòu)建更加健壯和穩(wěn)定的系統(tǒng)。0 d* M4 P' Y9 [6 i
1
" q" g' X/ `! `  U( Q% E! @模塊化架構(gòu)
, R& O' ]: t7 @8 p: a+ m這種架構(gòu)提高了代碼的可讀性和復(fù)用性,并使問題定位更加方便。模塊間的解耦也使得后續(xù)功能擴展更加靈活。
" T' V3 i$ ]- T. B( `) [
  • 硬件抽象層 (HAL):實現(xiàn)底層硬件的訪問,包括GPIO、UART、SPI等,所有外設(shè)訪問都通過HAL接口。這種抽象不僅簡化了硬件操作,還便于后續(xù)移植到不同的STM32型號。
  • 驅(qū)動層:在HAL基礎(chǔ)上封裝具體外設(shè)功能,如傳感器驅(qū)動、存儲器驅(qū)動等。每個驅(qū)動應(yīng)盡量獨立,遵循單一責(zé)任原則。
  • 服務(wù)層:提供常用功能的中間層,如定時器服務(wù)、事件調(diào)度器等。服務(wù)層可以幫助處理通用任務(wù),減少應(yīng)用層的復(fù)雜性。
  • 應(yīng)用層:實現(xiàn)最終的應(yīng)用邏輯。應(yīng)用層應(yīng)專注于業(yè)務(wù)邏輯,而非硬件細(xì)節(jié)。
    , ~2 g% d3 p& a9 d: }; l- X, g
    ) m$ e5 ~+ w" Y4 u# V8 V+ A. J
    2
    ! w! ?$ \5 U  G' @: e事件驅(qū)動架構(gòu)
      k: r- h3 l7 @- L# H# P這種方法避免了復(fù)雜的中斷嵌套,簡化了調(diào)試過程,并能輕松擴展新的事件處理邏輯。. R) }+ a1 r" b& }
  • 使用硬件中斷(如定時器、UART接收)產(chǎn)生事件,并將這些事件存儲到事件隊列中。
  • 在主循環(huán)中不斷檢查事件隊列,處理相應(yīng)的事件。
    ; G$ I  H) q4 H7 _
    & ~4 h" A( c% V2 X3 B
    由于裸機編程往往缺乏操作系統(tǒng)的調(diào)度功能,可以采用事件驅(qū)動的架構(gòu)來模擬任務(wù)調(diào)度。具體步驟如下:2 ?. r- g; K8 g7 Y1 ~) |
    [/ol]4 j$ A% Q: w! N, q( I
    - H# f9 ?0 S( W
    基于定時器的調(diào)度機制/ m) A* I& }1 ~4 U
    / r8 ^3 R' O. W$ J  k/ ^
    使用硬件定時器來模擬簡易的調(diào)度機制,引入“時間片”概念。$ n2 T; ^3 W- W2 S0 }- U& o( @

    ! i. s( {* @0 a6 s( Z設(shè)定不同定時器來觸發(fā)任務(wù),使高優(yōu)先級任務(wù)在更短時間間隔內(nèi)執(zhí)行,而低優(yōu)先級任務(wù)則被延后處理。
    ) |* Z; P7 B- ]+ B7 j) |2 q* x+ O8 o0 g, |7 b& O* e
    這種機制有助于降低優(yōu)先級反轉(zhuǎn)的風(fēng)險,確保系統(tǒng)穩(wěn)定運行。1 D" m% ~) n: l9 l
    [/ol]
    8 J& K9 ]6 E6 M
    $ V- C. g  s& U' Y  {
    有限狀態(tài)機 (FSM)" ^( l' Q6 C0 R7 v! \7 s

    8 d, x! ~8 j& K為每個模塊設(shè)計獨立的狀態(tài)機,并在主循環(huán)中定期輪詢狀態(tài)。
    ! X: D; g7 W. t* e
    7 T4 P1 X# D  h* F狀態(tài)機方法清晰地描述系統(tǒng)行為和狀態(tài)轉(zhuǎn)換條件,便于調(diào)試和維護。
    ( ?: w2 A# P! z% I" _/ d* K
    ' A" o" n7 v! D2 |; c' G! I; u  R可以使用狀態(tài)表或狀態(tài)圖的方式來描述狀態(tài)及其轉(zhuǎn)換,使得狀態(tài)管理更加直觀。6 b( \* J* I9 R' K
    [/ol]) F  m' B/ h1 O# ]1 r5 d
    ( o( r3 J8 i2 K1 N: }, G. h2 I6 G
    改進調(diào)試方法( g1 F) \5 E4 y0 _
    4 T5 \# @# p/ [1 R) Q
  • 周期性心跳檢測:通過LED或串口輸出定期報告系統(tǒng)狀態(tài),有助于實時監(jiān)控系統(tǒng)運行情況。
  • 監(jiān)控看門狗:在系統(tǒng)出現(xiàn)異常時,通過看門狗定時復(fù)位系統(tǒng),避免長時間的卡死狀態(tài)。
  • 啟用硬件異常捕獲:利用硬件斷點、錯誤向量捕獲(如HardFault、MemManage等)來捕捉異常,有助于定位問題。
    $ Y- h" z9 g3 t! |* z
    [/ol]+ {$ F9 R: A8 m5 m. v& Q. q
    3
    , g4 N- p/ u+ f, ~常見裸機編程架構(gòu)推薦
    ; ?1 i4 g5 O( s) U' S( e
  • 大循環(huán) + 中斷 (Super Loop + Interrupts):適用于功能不復(fù)雜、任務(wù)較少的場景。中斷中僅進行事件標(biāo)記或簡單數(shù)據(jù)采集,具體任務(wù)在主循環(huán)中處理。
  • 事件隊列架構(gòu):事件隊列設(shè)計提升系統(tǒng)響應(yīng)性,適用于任務(wù)較多或時間要求較高的系統(tǒng)。
  • 時間片輪詢架構(gòu):適合有多個定時性任務(wù)的場景,通過時間片調(diào)度不同的任務(wù)。
    . N$ r, K9 B' @4 _+ U
    # g( g( [! I& {
    4
    & B# Y' _  w) f5 K+ K實踐中的建議
    $ Q7 A, o" G0 D# c
  • 減少全局變量的使用:在裸機環(huán)境下,避免全局變量引起的競爭問題,使用局部變量或傳遞參數(shù)的方式。
  • 小心使用中斷:控制中斷嵌套深度,中斷函數(shù)應(yīng)保持簡潔快速,盡量避免長時間占用中斷。
  • 內(nèi)存管理:設(shè)計好內(nèi)存管理策略,避免動態(tài)內(nèi)存分配帶來的碎片化問題,使用靜態(tài)分配方式盡量確保內(nèi)存使用的高效性。
  • 配置和初始化的分離:將外設(shè)的配置和初始化代碼獨立為函數(shù),便于管理和復(fù)用。5 O% b: s2 r5 Q
    $ k5 p: V+ ]1 t- c
    這些建議和思路可以幫助你快速搭建一個穩(wěn)健的裸機編程框架,通過良好的代碼結(jié)構(gòu)和設(shè)計習(xí)慣減少復(fù)雜性,提高系統(tǒng)的穩(wěn)定性和可維護性。+ N" g  ?% E& c* G0 w1 T- F
    0 Y3 J: F  q1 C% Y% R1 C
    - I2 J1 s0 `* T1 ?% o
    點擊閱讀原文,更精彩~
  • 回復(fù)

    使用道具 舉報

    發(fā)表回復(fù)

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表