單片機程序開(kāi)發(fā)時(shí),初級工程師常犯的一個(gè)錯誤

發(fā)布時(shí)間:2015-6-10 13:11    發(fā)布者:designapp
這里利用一個(gè)實(shí)際發(fā)生的例子,針對初級工程師經(jīng)常犯的一個(gè)小錯誤,或者經(jīng)常要走的一個(gè)彎路,做了針對性的糾正。希望可以幫到大家,文筆不好文章中有敘述不清的地方大家多多指教。

這篇文章我不是想說(shuō)編程的規范性的東西,如果你想讓自己的程序文件最起碼直觀(guān)的看起來(lái)美觀(guān)、可讀性強,推薦找華為的“C語(yǔ)言編程規范”。我只想說(shuō)一說(shuō)當我們的單片機遇到多個(gè)模塊的數據需要處理,類(lèi)似于“多任務(wù)”時(shí)我們應該怎么辦?

背景是這樣的,去年9月份開(kāi)始安排一個(gè)工程師開(kāi)始做電動(dòng)汽車(chē)交流充電樁,機械設計部分由公司機械結構部門(mén)負責。充電樁的電子部分總體上分為X個(gè)部分(用到的資源),電阻觸摸屏(RS232),M1卡讀寫(xiě)(RS232),電能計量表(RS485),語(yǔ)音提示(SPI),電力開(kāi)關(guān)(繼電器IO),通訊接口(RS485、CAN)。

工程師做的過(guò)程非常勤奮,期間也是困難重重,改了很多個(gè)版本,總算今年6月把充電樁立起來(lái)了。

咱們來(lái)驗收一下吧,結果發(fā)現讀卡的時(shí)候不能處理觸摸屏,播放語(yǔ)音的時(shí)候不能處理讀卡,語(yǔ)音播放不能打斷或者跳躍,反正就是所有事件必須一個(gè)一個(gè)按部就班的來(lái),一旦操作錯誤就需要多次執行、等待、甚至重新來(lái)過(guò)。

一個(gè)工作3年多的工程師怎么會(huì )把產(chǎn)品做成這樣呢?看看程序吧!

一看不要緊,嚇一跳!整個(gè)的程序是沒(méi)有邏輯的,一條線(xiàn)就往下寫(xiě)……

While(1)
{
       //上電進(jìn)入主程序 或 觸發(fā)觸摸屏
       //播放提示語(yǔ)音
       Delay();//等待播放完畢
       //讀取M1卡信息
       Delay();//等待讀卡數據返回
       //播放提示語(yǔ)音
       Delay();//等待播放完畢
       //M1卡數據交互,判定下一步操作及提示
       Delay();//等待數據處理完畢
       ……
       ……
}

這里說(shuō)這個(gè)工程師基本上對于自己設計的產(chǎn)品沒(méi)有任何的整體概念,或者說(shuō)對自己開(kāi)發(fā)的程序用到設計上會(huì )有怎樣的實(shí)際效果根本就不清楚。

他犯了幾個(gè)我們在程序開(kāi)發(fā)過(guò)程中最忌諱的幾個(gè)問(wèn)題:

1、 delay(死等)這類(lèi)函數只在應該實(shí)驗室驗證某個(gè)功能過(guò)程中用到,在實(shí)際的產(chǎn)品開(kāi)發(fā)時(shí)無(wú)論是主循環(huán)while中,還是其調用的函數中,亦或是中斷服務(wù)程序中絕對不可以用到。

2、 產(chǎn)品設計的各個(gè)子模塊之間的邏輯關(guān)系太強,例如:必須等待播音完畢才能讀卡進(jìn)入下一步操作等。

我們講,產(chǎn)品設計中只有各個(gè)事件處理模塊間的邏輯關(guān)系弱化,才能更加靈活的進(jìn)行處理。例如:兩個(gè)事件A和B,如果程序開(kāi)發(fā)時(shí)將A做成B事件的必要條件,B事件的觸發(fā)就必須等待A事件的發(fā)生。反之如果A事件作為B事件處理的一個(gè)特殊情況,那么程序開(kāi)發(fā)起來(lái)就變得靈活很多。

3、 沒(méi)有考慮到單片機本身是一個(gè)單核單任務(wù)的架構,每一個(gè)事件都會(huì )獨占CPU內核,當多個(gè)任務(wù)模塊同時(shí)存在時(shí)我們應該對各個(gè)事件進(jìn)行區分,我們應當分情況、分事件實(shí)時(shí)性要求等區分對待。

那么針對于這樣的問(wèn)題,或者是遇到類(lèi)似的項目我們應該如何處理呢?

我提幾條建議:

1、將硬件系統區分為獨立單元單獨做成底層驅動(dòng)函數和應用函數,并且函數正常應該有參數和返回值,其中返回值是必要的。如何衡量這類(lèi)函數呢?這類(lèi)函數可移植性強,只要一個(gè).h文件和一個(gè).c文件就可以隨意放到任何工程中。例如:語(yǔ)音播放、M1讀卡、485處理等等。

2、將1中的所有函數進(jìn)行時(shí)間評估,評估點(diǎn)有兩個(gè)。一個(gè)是函數的執行時(shí)間t,第二個(gè)是函數的周期性發(fā)生的時(shí)間T,一個(gè)最基本的條件是t < T,理想情況應該是t << T。
  
3、建立一個(gè)集中邏輯處理函數,在這個(gè)函數中對1中的各個(gè)函數進(jìn)行調度。這個(gè)函數發(fā)揮的作用相當于嵌入式系統中的系統調度。這種調度是整個(gè)硬件邏輯中所有事件處理的調度,它的目的是完成一個(gè)處理過(guò)程,但是絕不依賴(lài)于任意事件的必要處理過(guò)程。這樣就將問(wèn)題2中提到的事件間的邏輯關(guān)系弱化了,處理起來(lái)變得十分靈活,使得各個(gè)關(guān)系不在相互必要。
  
4、為了保證前面內容的正常實(shí)施還需要針對各類(lèi)事件的周期,建立一個(gè)必要的時(shí)間管理函數,時(shí)間函數的基礎一般情況下由一個(gè)內部定時(shí)器的中斷來(lái)完成,中斷的周期一般我們考慮5-10ms。按照實(shí)際需求將N個(gè)定時(shí)器中斷定義為一個(gè)事件處理的周期TT,這個(gè)周期應該保證處理完最?lèi)毫忧闆r可能發(fā)生的所有t,且保證TT < T。
  
5、 這其中也有例外,一些實(shí)時(shí)性要求高的事件應當用中斷完成。其中中斷處理函數的處理事件應盡量短,時(shí)間要求參見(jiàn)2。
本文地址:http://selenalain.com/thread-150406-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
sinican 發(fā)表于 2015-6-13 12:06:20
有道理,學(xué)習~~
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页