經(jīng)驗(yàn)分享:單片機(jī)程序開發(fā)中初級(jí)工程師常犯的錯(cuò)誤
發(fā)布時(shí)間:2015-05-15 責(zé)任編輯:sherry
【導(dǎo)讀】這里利用一個(gè)實(shí)際發(fā)生的例子,針對(duì)初級(jí)工程師經(jīng)常犯的一個(gè)小錯(cuò)誤,或者經(jīng)常要走的一個(gè)彎路,做了針對(duì)性的糾正。希望可以幫到大家,文筆不好文章中有敘述不清的地方大家多多指教。
這篇文章我不是想說編程的規(guī)范性的東西,如果你想讓自己的程序文件最起碼直觀的看起來美觀、可讀性強(qiáng),推薦找華為的“C語言編程規(guī)范”。我只想說一說當(dāng)我們的單片機(jī)遇到多個(gè)模塊的數(shù)據(jù)需要處理,類似于“多任務(wù)”時(shí)我們應(yīng)該怎么辦?
背景是這樣的,去年9月份開始安排一個(gè)工程師開始做電動(dòng)汽車交流充電樁,機(jī)械設(shè)計(jì)部分由公司機(jī)械結(jié)構(gòu)部門負(fù)責(zé)。充電樁的電子部分總體上分為X個(gè)部分(用到的資源),電阻觸摸屏(RS232),M1卡讀寫(RS232),電能計(jì)量表(RS485),語音提示(SPI),電力開關(guān)(繼電器IO),通訊接口(RS485、CAN)。
工程師做的過程非常勤奮,期間也是困難重重,改了很多個(gè)版本,總算今年6月把充電樁立起來了。
咱們來驗(yàn)收一下吧,結(jié)果發(fā)現(xiàn)讀卡的時(shí)候不能處理觸摸屏,播放語音的時(shí)候不能處理讀卡,語音播放不能打斷或者跳躍,反正就是所有事件必須一個(gè)一個(gè)按部就班的來,一旦操作錯(cuò)誤就需要多次執(zhí)行、等待、甚至重新來過。
一個(gè)工作3年多的工程師怎么會(huì)把產(chǎn)品做成這樣呢?看看程序吧!
一看不要緊,嚇一跳!整個(gè)的程序是沒有邏輯的,一條線就往下寫……
While(1)
{
//上電進(jìn)入主程序 或 觸發(fā)觸摸屏
//播放提示語音
Delay();//等待播放完畢
//讀取M1卡信息
Delay();//等待讀卡數(shù)據(jù)返回
//播放提示語音
Delay();//等待播放完畢
//M1卡數(shù)據(jù)交互,判定下一步操作及提示
Delay();//等待數(shù)據(jù)處理完畢
……
……
}
這里說這個(gè)工程師基本上對(duì)于自己設(shè)計(jì)的產(chǎn)品沒有任何的整體概念,或者說對(duì)自己開發(fā)的程序用到設(shè)計(jì)上會(huì)有怎樣的實(shí)際效果根本就不清楚。
他犯了幾個(gè)我們?cè)诔绦蜷_發(fā)過程中最忌諱的幾個(gè)問題:
1、 delay(死等)這類函數(shù)只在應(yīng)該實(shí)驗(yàn)室驗(yàn)證某個(gè)功能過程中用到,在實(shí)際的產(chǎn)品開發(fā)時(shí)無論是主循環(huán)while中,還是其調(diào)用的函數(shù)中,亦或是中斷服務(wù)程序中絕對(duì)不可以用到。
2、 產(chǎn)品設(shè)計(jì)的各個(gè)子模塊之間的邏輯關(guān)系太強(qiáng),例如:必須等待播音完畢才能讀卡進(jìn)入下一步操作等。
我們講,產(chǎn)品設(shè)計(jì)中只有各個(gè)事件處理模塊間的邏輯關(guān)系弱化,才能更加靈活的進(jìn)行處理。例如:兩個(gè)事件A和B,如果程序開發(fā)時(shí)將A做成B事件的必要條件,B事件的觸發(fā)就必須等待A事件的發(fā)生。反之如果A事件作為B事件處理的一個(gè)特殊情況,那么程序開發(fā)起來就變得靈活很多。
3、 沒有考慮到單片機(jī)本身是一個(gè)單核單任務(wù)的架構(gòu),每一個(gè)事件都會(huì)獨(dú)占CPU內(nèi)核,當(dāng)多個(gè)任務(wù)模塊同時(shí)存在時(shí)我們應(yīng)該對(duì)各個(gè)事件進(jìn)行區(qū)分,我們應(yīng)當(dāng)分情況、分事件實(shí)時(shí)性要求等區(qū)分對(duì)待。
那么針對(duì)于這樣的問題,或者是遇到類似的項(xiàng)目我們應(yīng)該如何處理呢?
我提幾條建議:
1、將硬件系統(tǒng)區(qū)分為獨(dú)立單元單獨(dú)做成底層驅(qū)動(dòng)函數(shù)和應(yīng)用函數(shù),并且函數(shù)正常應(yīng)該有參數(shù)和返回值,其中返回值是必要的。如何衡量這類函數(shù)呢?這類函數(shù)可移植性強(qiáng),只要一個(gè).h文件和一個(gè).c文件就可以隨意放到任何工程中。例如:語音播放、M1讀卡、485處理等等。
2、將1中的所有函數(shù)進(jìn)行時(shí)間評(píng)估,評(píng)估點(diǎn)有兩個(gè)。一個(gè)是函數(shù)的執(zhí)行時(shí)間t,第二個(gè)是函數(shù)的周期性發(fā)生的時(shí)間T,一個(gè)最基本的條件是t < T,理想情況應(yīng)該是t << T。
3、建立一個(gè)集中邏輯處理函數(shù),在這個(gè)函數(shù)中對(duì)1中的各個(gè)函數(shù)進(jìn)行調(diào)度。這個(gè)函數(shù)發(fā)揮的作用相當(dāng)于嵌入式系統(tǒng)中的系統(tǒng)調(diào)度。這種調(diào)度是整個(gè)硬件邏輯中所有事件處理的調(diào)度,它的目的是完成一個(gè)處理過程,但是絕不依賴于任意事件的必要處理過程。這樣就將問題2中提到的事件間的邏輯關(guān)系弱化了,處理起來變得十分靈活,使得各個(gè)關(guān)系不在相互必要。
4、為了保證前面內(nèi)容的正常實(shí)施還需要針對(duì)各類事件的周期,建立一個(gè)必要的時(shí)間管理函數(shù),時(shí)間函數(shù)的基礎(chǔ)一般情況下由一個(gè)內(nèi)部定時(shí)器的中斷來完成,中斷的周期一般我們考慮5-10ms。按照實(shí)際需求將N個(gè)定時(shí)器中斷定義為一個(gè)事件處理的周期TT,這個(gè)周期應(yīng)該保證處理完最惡劣情況可能發(fā)生的所有t,且保證TT < T。
5、 這其中也有例外,一些實(shí)時(shí)性要求高的事件應(yīng)當(dāng)用中斷完成。其中中斷處理函數(shù)的處理事件應(yīng)盡量短,時(shí)間要求參見2。
特別推薦
- AMTS 2025展位預(yù)訂正式開啟——體驗(yàn)科技驅(qū)動(dòng)的未來汽車世界,共迎AMTS 20周年!
- 貿(mào)澤電子攜手安森美和Würth Elektronik推出新一代太陽能和儲(chǔ)能解決方案
- 功率器件熱設(shè)計(jì)基礎(chǔ)(六)——瞬態(tài)熱測量
- 貿(mào)澤開售Nordic Semiconductor nRF9151-DK開發(fā)套件
- TDK推出用于可穿戴設(shè)備的薄膜功率電感器
- 日清紡微電子GNSS兩款新的射頻低噪聲放大器 (LNA) 進(jìn)入量產(chǎn)
- 中微半導(dǎo)推出高性價(jià)比觸控 MCU-CMS79FT72xB系列
技術(shù)文章更多>>
- 意法半導(dǎo)體推出首款超低功耗生物傳感器,成為眾多新型應(yīng)用的核心所在
- 是否存在有關(guān) PCB 走線電感的經(jīng)驗(yàn)法則?
- 智能電池傳感器的兩大關(guān)鍵部件: 車規(guī)級(jí)分流器以及匹配的評(píng)估板
- 功率器件熱設(shè)計(jì)基礎(chǔ)(八)——利用瞬態(tài)熱阻計(jì)算二極管浪涌電流
- AHTE 2025展位預(yù)訂正式開啟——促進(jìn)新技術(shù)新理念應(yīng)用,共探多行業(yè)柔性解決方案
技術(shù)白皮書下載更多>>
- 車規(guī)與基于V2X的車輛協(xié)同主動(dòng)避撞技術(shù)展望
- 數(shù)字隔離助力新能源汽車安全隔離的新挑戰(zhàn)
- 汽車模塊拋負(fù)載的解決方案
- 車用連接器的安全創(chuàng)新應(yīng)用
- Melexis Actuators Business Unit
- Position / Current Sensors - Triaxis Hall
熱門搜索
生產(chǎn)測試
聲表諧振器
聲傳感器
濕度傳感器
石英機(jī)械表
石英石危害
時(shí)間繼電器
時(shí)鐘IC
世強(qiáng)電訊
示波器
視頻IC
視頻監(jiān)控
收發(fā)器
手機(jī)開發(fā)
受話器
數(shù)字家庭
數(shù)字家庭
數(shù)字鎖相環(huán)
雙向可控硅
水泥電阻
絲印設(shè)備
伺服電機(jī)
速度傳感器
鎖相環(huán)
胎壓監(jiān)測
太陽能
太陽能電池
泰科源
鉭電容
碳膜電位器