|
joq255ahwcf640115515907.gif (60.41 KB, 下載次數(shù): 6)
下載附件
保存到相冊
joq255ahwcf640115515907.gif
2024-11-9 22:03 上傳
! `. G) K6 y/ B$ m. I, `9 I
點(diǎn)擊上方藍(lán)色字體,關(guān)注我們& H: U3 A) k) B/ w
裸機(jī)編程確實(shí)可以減少系統(tǒng)復(fù)雜性,提升對資源的掌控能力。
/ w q# B8 U/ ~# D
% Z! {4 j0 O+ ?+ x: N/ V& v* P
qfhnx1y30hd640115516008.png (746.77 KB, 下載次數(shù): 3)
下載附件
保存到相冊
qfhnx1y30hd640115516008.png
2024-11-9 22:03 上傳
$ V# M: Q$ p! i0 B2 O( y
在考慮裸機(jī)編程的架構(gòu)時,可以通過以下幾個思路構(gòu)建更加健壯和穩(wěn)定的系統(tǒng)。
9 q4 ~6 W) m' {5 _1) R) L$ q) }. G: Y. \% r2 g) j
模塊化架構(gòu) v5 j; d+ `/ \
這種架構(gòu)提高了代碼的可讀性和復(fù)用性,并使問題定位更加方便。模塊間的解耦也使得后續(xù)功能擴(kuò)展更加靈活。
8 ^- q/ J8 q. ~& @! K* I硬件抽象層 (HAL):實(shí)現(xiàn)底層硬件的訪問,包括GPIO、UART、SPI等,所有外設(shè)訪問都通過HAL接口。這種抽象不僅簡化了硬件操作,還便于后續(xù)移植到不同的STM32型號。驅(qū)動層:在HAL基礎(chǔ)上封裝具體外設(shè)功能,如傳感器驅(qū)動、存儲器驅(qū)動等。每個驅(qū)動應(yīng)盡量獨(dú)立,遵循單一責(zé)任原則。服務(wù)層:提供常用功能的中間層,如定時器服務(wù)、事件調(diào)度器等。服務(wù)層可以幫助處理通用任務(wù),減少應(yīng)用層的復(fù)雜性。應(yīng)用層:實(shí)現(xiàn)最終的應(yīng)用邏輯。應(yīng)用層應(yīng)專注于業(yè)務(wù)邏輯,而非硬件細(xì)節(jié)。
) m* ]' k0 k1 I) B( L$ W# v9 K
, [2 k0 u, n3 t% _, o2
; I( W I: `: G( l- d/ N; i事件驅(qū)動架構(gòu)4 K. ~ l! K. \! W& g3 W
這種方法避免了復(fù)雜的中斷嵌套,簡化了調(diào)試過程,并能輕松擴(kuò)展新的事件處理邏輯。
3 [/ C+ A5 f8 f5 z/ ~8 U4 f9 Q使用硬件中斷(如定時器、UART接收)產(chǎn)生事件,并將這些事件存儲到事件隊(duì)列中。在主循環(huán)中不斷檢查事件隊(duì)列,處理相應(yīng)的事件。 K* d4 V+ c# q2 c0 `) O" k
' _8 ?/ i9 F" i8 z0 P+ F8 q由于裸機(jī)編程往往缺乏操作系統(tǒng)的調(diào)度功能,可以采用事件驅(qū)動的架構(gòu)來模擬任務(wù)調(diào)度。具體步驟如下:; `1 S- C, {! ~0 H$ d( C$ ~4 o
[/ol]
. z9 d' g0 w4 P8 k8 o% K% m m0 Z( U" B# ]
基于定時器的調(diào)度機(jī)制
9 m2 `# E9 y% _% _4 b3 r
& |, m, E$ {- Z, O% v使用硬件定時器來模擬簡易的調(diào)度機(jī)制,引入“時間片”概念。0 c5 ]5 n2 W$ p+ ]0 `9 j
& F0 w% u" k, Q4 B* }% H. G
設(shè)定不同定時器來觸發(fā)任務(wù),使高優(yōu)先級任務(wù)在更短時間間隔內(nèi)執(zhí)行,而低優(yōu)先級任務(wù)則被延后處理。: z! m2 i! Y/ B& D+ }) |. @0 b
( H' c2 J4 W( O這種機(jī)制有助于降低優(yōu)先級反轉(zhuǎn)的風(fēng)險(xiǎn),確保系統(tǒng)穩(wěn)定運(yùn)行。! b: }5 h" v2 O. w9 R
[/ol]0 U% h/ f# x' r# l; f
, x+ w: N+ H8 t7 j9 g0 O
有限狀態(tài)機(jī) (FSM)
8 J9 z1 C4 L. N) p! f' r( K5 p# w. a
9 C0 T6 z; f1 M! _為每個模塊設(shè)計(jì)獨(dú)立的狀態(tài)機(jī),并在主循環(huán)中定期輪詢狀態(tài)。
' T! i5 J% N7 o+ R2 u7 b4 ^
! |5 J, V0 Q6 E$ u; w( E狀態(tài)機(jī)方法清晰地描述系統(tǒng)行為和狀態(tài)轉(zhuǎn)換條件,便于調(diào)試和維護(hù)。0 t7 e- X& d/ W5 K
# g! ~9 {. S# W/ k5 z可以使用狀態(tài)表或狀態(tài)圖的方式來描述狀態(tài)及其轉(zhuǎn)換,使得狀態(tài)管理更加直觀。7 y6 P* N& `& c5 k
[/ol]% k6 l$ L( C7 [
- g1 a, G3 `0 ?5 c5 z' H" ?改進(jìn)調(diào)試方法2 A/ W- ?% S( o4 r. J7 _
% g R- w* k" a/ e6 Y C# ]
周期性心跳檢測:通過LED或串口輸出定期報(bào)告系統(tǒng)狀態(tài),有助于實(shí)時監(jiān)控系統(tǒng)運(yùn)行情況。監(jiān)控看門狗:在系統(tǒng)出現(xiàn)異常時,通過看門狗定時復(fù)位系統(tǒng),避免長時間的卡死狀態(tài)。啟用硬件異常捕獲:利用硬件斷點(diǎn)、錯誤向量捕獲(如HardFault、MemManage等)來捕捉異常,有助于定位問題。9 m# @! V( _8 B- r
[/ol]
( e( x; A' o, v- i- ~3# H$ {* d2 I( E" Q4 N3 J
常見裸機(jī)編程架構(gòu)推薦0 L3 ^; |2 I, w/ Y- {+ G5 v
大循環(huán) + 中斷 (Super Loop + Interrupts):適用于功能不復(fù)雜、任務(wù)較少的場景。中斷中僅進(jìn)行事件標(biāo)記或簡單數(shù)據(jù)采集,具體任務(wù)在主循環(huán)中處理。事件隊(duì)列架構(gòu):事件隊(duì)列設(shè)計(jì)提升系統(tǒng)響應(yīng)性,適用于任務(wù)較多或時間要求較高的系統(tǒng)。時間片輪詢架構(gòu):適合有多個定時性任務(wù)的場景,通過時間片調(diào)度不同的任務(wù)。: L( Q; Q* Q: A6 [9 p" Z
: R6 F2 U1 W4 k( O/ n" j0 I44 T* j& v- F0 I) \& @5 {
實(shí)踐中的建議 b" |* G6 g# w- a) X6 K/ a
減少全局變量的使用:在裸機(jī)環(huán)境下,避免全局變量引起的競爭問題,使用局部變量或傳遞參數(shù)的方式。小心使用中斷:控制中斷嵌套深度,中斷函數(shù)應(yīng)保持簡潔快速,盡量避免長時間占用中斷。內(nèi)存管理:設(shè)計(jì)好內(nèi)存管理策略,避免動態(tài)內(nèi)存分配帶來的碎片化問題,使用靜態(tài)分配方式盡量確保內(nèi)存使用的高效性。配置和初始化的分離:將外設(shè)的配置和初始化代碼獨(dú)立為函數(shù),便于管理和復(fù)用。
! Z" q' }- K9 v0 s. A) E9 p) X0 D5 ]6 ]5 W
這些建議和思路可以幫助你快速搭建一個穩(wěn)健的裸機(jī)編程框架,通過良好的代碼結(jié)構(gòu)和設(shè)計(jì)習(xí)慣減少復(fù)雜性,提高系統(tǒng)的穩(wěn)定性和可維護(hù)性。5 E# t V7 t7 i0 g) _0 M
vruegsjwrhy640115516108.jpg (71.14 KB, 下載次數(shù): 6)
下載附件
保存到相冊
vruegsjwrhy640115516108.jpg
2024-11-9 22:03 上傳
6 v8 v/ n# d( w! y! o3 V1 ]. u( T1 ?4 M/ {
kzgqcxuxd1t640115516208.gif (45.46 KB, 下載次數(shù): 5)
下載附件
保存到相冊
kzgqcxuxd1t640115516208.gif
2024-11-9 22:03 上傳
2 n/ V" N# j' s" J
點(diǎn)擊閱讀原文,更精彩~ |
|