|
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師
( d( u$ }" @9 r/ `4 k關(guān)注我,一起變得更加優(yōu)秀!
1 [" ]6 I [4 H @$ M在嵌入式開發(fā)軟件中查找和消除潛在的錯(cuò)誤是一項(xiàng)較為艱巨的任務(wù),通常需要比較復(fù)雜的調(diào)試工具,才能從觀察到的錯(cuò)誤現(xiàn)象,追溯到錯(cuò)誤發(fā)生的根本原因。0 L! S9 F( _8 d
在某些情況下,系統(tǒng)看起來仍然可以正常運(yùn)行,或至少在一段時(shí)間內(nèi)似乎仍能正常工作,潛在的錯(cuò)誤原因如果不處理,可能會(huì)破壞系統(tǒng)數(shù)據(jù)或者內(nèi)部的代碼鏡像。
$ S$ `1 z0 O& S, z工程師常常不主動(dòng)發(fā)現(xiàn)一些罕見的異常,這些異常在實(shí)驗(yàn)室中不易復(fù)現(xiàn),一般將其視為用戶錯(cuò)誤或“小故障”,然而,機(jī)器中的這些“鬼魂”仍然存在。這是難以重現(xiàn)錯(cuò)誤最常見的根本原因。" E# m d! {2 _. e* [: w
每當(dāng)您閱讀固件源代碼時(shí),請(qǐng)注意以下兩點(diǎn),并遵循最佳的建議和做法,以防止它們?cè)俅伟l(fā)生在您身上。
; I8 |! a9 s+ g8 {4 l, H注意事項(xiàng)1:競(jìng)爭(zhēng)條件3 A) k6 |, d! L5 f$ j% S
競(jìng)爭(zhēng)條件是指兩個(gè)或多個(gè)執(zhí)行線程(可以是RTOS任務(wù)或main() 和中斷處理程序)的組合結(jié)果根據(jù)交織指令的精確順序而變化的任何情況,每個(gè)都在處理器上執(zhí)行。9 M! f5 A! D2 W7 j4 I; ?# K' U
例如,假設(shè)您有兩個(gè)執(zhí)行線程,其中一個(gè)規(guī)則地遞增一個(gè)全局變量(g_counter + = 1; ),而另一個(gè)偶然將其歸零(g_counter = 0; ),如果不能始終以原子方式(即,在單個(gè)指令周期內(nèi))執(zhí)行增量,則存在競(jìng)爭(zhēng)條件。) z! D6 Q+ h/ I5 w6 t+ E5 J
如圖1所示,將任務(wù)視為汽車接近同一十字路口,計(jì)數(shù)器變量的兩次更新之間的沖突可能永遠(yuǎn)不會(huì)發(fā)生,或者很少會(huì)發(fā)生,但是,這樣做的時(shí)候,計(jì)數(shù)器實(shí)際上不會(huì)在內(nèi)存中清零。其值至少在下一個(gè)清零之前是損壞的。% `% x9 C7 i: Q1 z$ c a* G
這種影響可能會(huì)對(duì)系統(tǒng)造成嚴(yán)重后果,盡管可能要等到實(shí)際碰撞后很長(zhǎng)一段時(shí)間才會(huì)出現(xiàn)。
5 @8 I' ^/ ^3 W) G0 n
fspfposm3ds640718605.png (103.23 KB, 下載次數(shù): 4)
下載附件
保存到相冊(cè)
fspfposm3ds640718605.png
前天 23:19 上傳
+ S2 Q7 Z3 q0 r
最佳實(shí)踐:可以通過適當(dāng)?shù)膿屜认拗菩袨,原子地?zhí)行代碼的關(guān)鍵部分,來避免競(jìng)爭(zhēng)條件。為防止涉及ISR的爭(zhēng)用情況,必須在另一個(gè)代碼的關(guān)鍵部分持續(xù)時(shí)間內(nèi)至少禁止一個(gè)中斷信號(hào)。) _) ?- P3 r+ p! l; U8 A# l
對(duì)于RTOS任務(wù)之間的爭(zhēng)用,最佳實(shí)踐是創(chuàng)建特定于該共享庫(kù)的互斥體,每個(gè)互斥體在進(jìn)入關(guān)鍵部分之前必須獲取該互斥體,請(qǐng)注意,依靠特定CPU的功能來確保原子性不是一個(gè)好主意,
# [3 X- g* n' B2 X+ g/ u. q' m1 A( h共享數(shù)據(jù)和搶占的隨機(jī)時(shí)間是造成競(jìng)爭(zhēng)狀況的元兇,但是錯(cuò)誤可能并不總是會(huì)發(fā)生,這使得從觀察到的癥狀到根本原因的種族狀況跟蹤變得異常困難。( i' Q# L0 @3 C: G
因此,保持警惕以保護(hù)所有共享對(duì)象非常重要。每個(gè)共享對(duì)象都是一個(gè)等待發(fā)生的事故。
0 |$ o3 J. A; Q/ g3 ?/ v- X* _最佳實(shí)踐:命名所有潛在共享的對(duì)象(包括全局變量,堆對(duì)象或外圍寄存器和指向該對(duì)象的指針),以使競(jìng)爭(zhēng)風(fēng)險(xiǎn)對(duì)于所有的代碼閱讀者而言都是顯而易見的,在Netrino嵌入式C編碼標(biāo)準(zhǔn)提倡使用 “g_xxx” 前綴。查找所有可能共享的對(duì)象將是爭(zhēng)用條件代碼審核的第一步。
8 u* [+ z9 c$ U0 D注意事項(xiàng)2:不可重入功能$ L9 G( d' b0 z& M( X& ]7 W; b, y
從技術(shù)上講,不可重入功能的問題是爭(zhēng)用狀況問題的特例,而且由于相關(guān)原因,由不可重入函數(shù)引起的運(yùn)行時(shí)錯(cuò)誤通常不會(huì)以可重現(xiàn)的方式發(fā)生-使它們同樣難以調(diào)試。- _$ v \/ ^' B9 u& @
不幸的是,非重入功能也比其他類型的競(jìng)爭(zhēng)條件更難在代碼審查中發(fā)現(xiàn),圖2 顯示了一個(gè)典型的場(chǎng)景,在這里,要搶占的軟件實(shí)體也是RTOS任務(wù),但是,它們不是通過直接調(diào)用共享對(duì)象而是通過函數(shù)調(diào)用間接操作。
5 B0 M4 s* o$ q3 j3 @* z
jk1ku4yfece640718705.png (87.46 KB, 下載次數(shù): 4)
下載附件
保存到相冊(cè)
jk1ku4yfece640718705.png
前天 23:19 上傳
7 ?4 D6 X1 i ]/ |
例如,假設(shè)任務(wù)A調(diào)用套接字層協(xié)議功能,該套接字功能調(diào)用TCP層協(xié)議功能,調(diào)用IP層協(xié)議功能,該功能調(diào)用以太網(wǎng)驅(qū)動(dòng)程序,為了使系統(tǒng)可靠地運(yùn)行,所有這些功能都必須是可重入的。% e1 R2 M+ C( X* v6 ?/ P/ ]- q
但是,以太網(wǎng)驅(qū)動(dòng)程序的所有功能都以以太網(wǎng)控制器芯片的寄存器形式操作相同的全局對(duì)象。如果在這些寄存器操作期間允許搶占,則任務(wù)B可以在將數(shù)據(jù)包A排隊(duì)之后但在發(fā)送開始之前搶占任務(wù)A。
# I0 c& _ a/ E3 o8 l然后,任務(wù)B調(diào)用套接字層功能,該套接字層功能調(diào)用TCP層功能,再調(diào)用IP層功能,該功能調(diào)用以太網(wǎng)驅(qū)動(dòng)程序,該隊(duì)列將數(shù)據(jù)包B排隊(duì)并傳輸。! ^2 O6 I: O& _% M; s
當(dāng)CPU的控制權(quán)返回到任務(wù)A時(shí),它將請(qǐng)求傳輸。根據(jù)以太網(wǎng)控制器芯片的設(shè)計(jì),這可能會(huì)重傳數(shù)據(jù)包B或產(chǎn)生錯(cuò)誤。數(shù)據(jù)包A丟失,并且不會(huì)發(fā)送到網(wǎng)絡(luò)上。
5 I% z! S1 d! C為了可以同時(shí)從多個(gè)RTOS任務(wù)中調(diào)用此以太網(wǎng)驅(qū)動(dòng)程序的功能,必須使它們可重入。如果它們每個(gè)僅使用堆棧變量,則無事可做。( @& ]5 }- _0 q, D
因此,C 語(yǔ)言函數(shù)最常見的樣式是可重入的,但是除非經(jīng)過精心設(shè)計(jì),否則驅(qū)動(dòng)程序和某些其他功能將是不可重入的,
6 B* ^: o" M9 x9 R: v使函數(shù)可重入的關(guān)鍵是暫停對(duì)外圍設(shè)備寄存器,包括靜態(tài)局部變量,持久堆對(duì)象和共享內(nèi)存區(qū)域在內(nèi)的全局變量的所有訪問的搶占。 _4 O# W# j' `" q3 j9 h6 z
這可以通過禁用一個(gè)或多個(gè)中斷或獲取并釋放互斥鎖來完成。問題的細(xì)節(jié)決定了最佳解決方案。+ F; z6 r/ K: R1 ^! J+ N8 Q
最佳實(shí)踐:在每個(gè)庫(kù)或驅(qū)動(dòng)程序模塊中創(chuàng)建和隱藏一個(gè)互斥量,這些互斥量不是本質(zhì)上可重入的。使獲取此互斥鎖成為操作整個(gè)模塊中使用的任何持久數(shù)據(jù)或共享寄存器的前提。
2 A0 P$ m% x$ U例如,相同的互斥鎖可用于防止涉及以太網(wǎng)控制器寄存器和全局或靜態(tài)本地?cái)?shù)據(jù)包計(jì)數(shù)器的競(jìng)爭(zhēng)情況,在訪問這些數(shù)據(jù)之前,模塊中訪問此數(shù)據(jù)的所有功能必須遵循協(xié)議以獲取互斥量。
, f2 a' W# P) t4 X, p0 Q% z* ]" t, z注意非重入功能可能會(huì)作為第三方中間件,舊版代碼或設(shè)備驅(qū)動(dòng)程序的一部分進(jìn)入您的代碼庫(kù),令人不安的是,不可重入函數(shù)甚至可能是編譯器隨附的標(biāo)準(zhǔn)C或C ++庫(kù)的一部分。+ ]" l% x( o/ j" c' g8 j: o
如果您使用GNU編譯器來構(gòu)建基于RTOS的應(yīng)用程序,請(qǐng)注意您應(yīng)該使用可重入的“ newlib”標(biāo)準(zhǔn)C庫(kù),而不是默認(rèn)庫(kù)。
$ _3 K2 l/ d* w原文:https://blog.csdn.net/weixin_44059661/article/details/107839764
- l+ ~. D$ @7 P3 g- M2 \. l
j3sivagut1v640718806.png (665.93 KB, 下載次數(shù): 3)
下載附件
保存到相冊(cè)
j3sivagut1v640718806.png
前天 23:19 上傳
! Z- A; {4 }9 s
9 Q* O' @, O# k2 }, g5 [$ M, R2 y. y; [6 L5 p& P# j( d6 V
-END-
9 v4 B/ O v2 C% k4 Q+ ]往期推薦:點(diǎn)擊圖片即可跳轉(zhuǎn)閱讀 f$ \) c; E/ |/ M2 `) Z3 H& d
0 N, c* L* b* |
9 Z9 j, `4 [5 b8 f! P 9 C9 C/ x; `6 ]* @6 @+ P" ~+ q- A
l# t l9 t, R( ]4 g9 F , Z. o" ]2 X: U; |7 y2 s6 w
givoffjdvuc640718906.jpg (226.88 KB, 下載次數(shù): 5)
下載附件
保存到相冊(cè)
givoffjdvuc640718906.jpg
前天 23:19 上傳
% l# S$ w5 Z d5 D8 K/ c. y1 c6 ~
8 w. x0 |1 }* Z2 N! n2 D3 o1 @ 讓嵌入式工程師,回歸創(chuàng)造力!
5 u3 L) @- b$ J6 c z3 \8 x( l6 v& t
( I5 q. e& ~8 b8 ^; n$ s
; C1 O- j0 }; m: S
1 {6 o$ m# P& R
, z/ ~6 B! l( H x+ T4 j6 Y5 ^$ H
* m" ?. b9 J' c5 K : r" ]1 i/ v) X& U6 f
% z% L" {5 G0 z% D$ F5 R8 p, M. ]
. R4 T2 w0 f g
xrbw1gulolg640719006.jpg (115.39 KB, 下載次數(shù): 5)
下載附件
保存到相冊(cè)
xrbw1gulolg640719006.jpg
前天 23:19 上傳
0 l+ V |5 a, g [) Y9 h& `
1 ?% N# w) i/ h b 嵌入式軟件使用狀態(tài)機(jī)架構(gòu),一般有什么優(yōu)點(diǎn)?- |) b2 W, c/ e
" p6 ]4 T, U7 |8 h. M0 t: f0 `; u
& \ z8 J3 `' ?: x * G' u9 }/ e3 v1 w
7 N6 ~ ^" ]. s8 O7 x5 d3 u* {1 C
+ L; M' f- B6 H, x0 `
) A& d. G- d* Q& ^4 @4 \
) G3 U6 Z5 Q; u- z$ O) a1 k
4 w8 M4 ]3 X! |( E# r/ ^ ' n) ]" c+ J5 C+ I7 k* x+ U
- b8 C" D1 z- h1 _
tpkip3niupv640719106.jpg (109.8 KB, 下載次數(shù): 5)
下載附件
保存到相冊(cè)
tpkip3niupv640719106.jpg
前天 23:19 上傳
7 y5 I' e0 N2 _; }0 k8 D
1 x! E; n4 }) Q% u' b 嵌入式編程,一些常見的計(jì)算機(jī)術(shù)語(yǔ)。. u+ H" f! B. o0 \1 i% F
' q8 L/ _$ m" L' U9 a* l' i, R& Y K6 u' W# L; q3 g
T* F8 o( i: K. A3 _
; G# o8 [; M) e6 | 1 I' @/ |% ~& s7 B" B5 c" g, l
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師, O3 N6 q' |7 K+ N
關(guān)注我,一起變得更加優(yōu)秀! |
|