0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

當(dāng)單片機(jī)遇到多個(gè)模塊的數(shù)據(jù)需要處理,應(yīng)該怎么辦?

貿(mào)澤電子設(shè)計(jì)圈 ? 來(lái)源:未知 ? 作者:李倩 ? 2018-03-09 13:51 ? 次閱讀

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

這篇文章我不是想說(shuō)編程的規(guī)范性的東西,如果你想讓自己的程序文件最起碼直觀的看起來(lái)美觀、可讀性強(qiáng),推薦找華為的“C語(yǔ)言編程規(guī)范”。

我只想說(shuō)一說(shuō)當(dāng)我們的單片機(jī)遇到多個(gè)模塊的數(shù)據(jù)需要處理,類(lèi)似于“多任務(wù)”時(shí)我們應(yīng)該怎么辦?

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

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

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

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

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

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

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

他犯了幾個(gè)我們?cè)诔绦蜷_(kāi)發(fā)過(guò)程中最忌諱的幾個(gè)問(wèn)題:

1、 delay(死等)這類(lèi)函數(shù)只在應(yīng)該實(shí)驗(yàn)室驗(yàn)證某個(gè)功能過(guò)程中用到,在實(shí)際的產(chǎn)品開(kāi)發(fā)時(shí)無(wú)論是主循環(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,如果程序開(kāi)發(fā)時(shí)將A做成B事件的必要條件,B事件的觸發(fā)就必須等待A事件的發(fā)生。反之,如果A事件作為B事件處理的一個(gè)特殊情況,那么程序開(kāi)發(fā)起來(lái)就變得靈活很多。

3、 沒(méi)有考慮到單片機(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ì)于這樣的問(wèn)題,或者是遇到類(lèi)似的項(xiàng)目我們應(yīng)該如何處理呢?

幾條建議:

1、將硬件系統(tǒng)區(qū)分為獨(dú)立單元單獨(dú)做成底層驅(qū)動(dòng)函數(shù)和應(yīng)用函數(shù),并且函數(shù)正常應(yīng)該有參數(shù)和返回值,其中返回值是必要的。如何衡量這類(lèi)函數(shù)呢?這類(lèi)函數(shù)可移植性強(qiáng),只要一個(gè).h文件和一個(gè).c文件就可以隨意放到任何工程中。例如:語(yǔ)音播放、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è)處理過(guò)程,但是絕不依賴(lài)于任意事件的必要處理過(guò)程。這樣就將問(wèn)題2中提到的事件間的邏輯關(guān)系弱化了,處理起來(lái)變得十分靈活,使得各個(gè)關(guān)系不在相互必要。

4、為了保證前面內(nèi)容的正常實(shí)施還需要針對(duì)各類(lèi)事件的周期,建立一個(gè)必要的時(shí)間管理函數(shù),時(shí)間函數(shù)的基礎(chǔ)一般情況下由一個(gè)內(nèi)部定時(shí)器的中斷來(lái)完成,中斷的周期一般我們考慮5-10ms。按照實(shí)際需求將N個(gè)定時(shí)器中斷定義為一個(gè)事件處理的周期TT,這個(gè)周期應(yīng)該保證處理完最?lèi)毫忧闆r可能發(fā)生的所有t,且保證TT < T。

5、 這其中也有例外,一些實(shí)時(shí)性要求高的事件應(yīng)當(dāng)用中斷完成。其中中斷處理函數(shù)的處理事件應(yīng)盡量短,時(shí)間要求參見(jiàn)2。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6026

    文章

    44460

    瀏覽量

    631216
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10781

    瀏覽量

    210523

原文標(biāo)題:當(dāng)單片機(jī)遇到多個(gè)模塊的數(shù)據(jù)需要處理,應(yīng)該怎么辦?

文章出處:【微信號(hào):Mouser-Community,微信公眾號(hào):貿(mào)澤電子設(shè)計(jì)圈】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    52單片機(jī)測(cè)控轉(zhuǎn)速怎么辦?

    52單片機(jī)測(cè)控轉(zhuǎn)速怎么辦?程序怎么寫(xiě)?上位機(jī)采用MODBUS協(xié)議數(shù)值設(shè)置速度,經(jīng)驗(yàn)數(shù)據(jù)控制轉(zhuǎn)速。。。怎么辦?。?/div>
    發(fā)表于 06-25 23:35

    如何利用單片機(jī)高效地并行處理多個(gè)外設(shè)通信?

    現(xiàn)在寫(xiě)代碼一直會(huì)遇到這樣的問(wèn)題:單片機(jī)處理某一個(gè)外設(shè)請(qǐng)求的時(shí)候,如何兼顧到其他的外設(shè)請(qǐng)求,簡(jiǎn)而言之就是單片機(jī)如何能高效地并行處理
    發(fā)表于 10-14 22:10

    NRF24L01模塊無(wú)法實(shí)現(xiàn)電腦向單片機(jī)數(shù)據(jù)怎么解決?

    有兩塊NRF24L01模塊,一塊是轉(zhuǎn)USB串口,另一塊是插在開(kāi)發(fā)板上的,目前可以實(shí)現(xiàn)單片機(jī)向電腦傳數(shù)據(jù),無(wú)法實(shí)現(xiàn)電腦向單片機(jī)數(shù)據(jù)。
    發(fā)表于 06-10 09:25

    一個(gè)系統(tǒng)中需要用到多個(gè)按鍵的時(shí)候怎么辦

    需要用到多個(gè)按鍵的時(shí)候怎么辦呢?就像數(shù)碼管一樣,該如何解決多個(gè)按鍵輸入問(wèn)題?這里就引入矩陣鍵盤(pán)的概念:鍵盤(pán)中按鍵數(shù)量較多時(shí),為了減少I(mǎi)/O口的占用,通常將按鍵排列成矩陣形式。在矩陣式
    發(fā)表于 01-21 07:49

    DMA有何功能?當(dāng)多個(gè)DMA請(qǐng)求一起來(lái)怎么辦

    DMA有哪些功能呢?與DMA相關(guān)庫(kù)函數(shù)有哪些呢?DMA有何功能?當(dāng)多個(gè)DMA請(qǐng)求一起來(lái)怎么辦?
    發(fā)表于 01-27 07:11

    請(qǐng)問(wèn)單片機(jī)串口不夠用怎么辦?

    做一個(gè)設(shè)計(jì)用的STC12C5A60S2單片機(jī),有三個(gè)模塊需要用RXD和TXD串口,但是單片機(jī)只有兩個(gè)串口怎么辦?三個(gè)
    發(fā)表于 09-20 06:49

    51單片機(jī)不能識(shí)別紅外循跡模塊發(fā)出的的高電平怎么辦?

    51單片機(jī)不能識(shí)別紅外循跡模塊發(fā)出的的高電平怎么辦
    發(fā)表于 10-18 06:09

    51單片機(jī)不能識(shí)別紅外循跡模塊發(fā)出的的高電平怎么辦?

    51單片機(jī)不能識(shí)別紅外循跡模塊發(fā)出的的高電平怎么辦
    發(fā)表于 10-23 07:02

    主板壞了怎么辦

    主板壞了怎么辦? 大家用組裝機(jī)的朋友,常遇到主板壞了,不懂的常不知如何處理,其實(shí)有些故障是很容易排除的,現(xiàn)在這個(gè)時(shí)代,將主板拿出去
    發(fā)表于 05-22 08:54 ?1.2w次閱讀

    單片機(jī)的程序開(kāi)發(fā)經(jīng)常會(huì)出現(xiàn)那些錯(cuò)誤

    的東西,如果你想讓自己的程序文件最起碼直觀的看起來(lái)美觀、可讀性強(qiáng),推薦找華為的“C語(yǔ)言編程規(guī)范”。我只想說(shuō)一說(shuō)當(dāng)我們的單片機(jī)遇到多個(gè)模塊數(shù)據(jù)需要
    的頭像 發(fā)表于 01-09 10:41 ?4864次閱讀

    當(dāng)單片機(jī)遇到狀態(tài)機(jī) 入門(mén)QP

    當(dāng)單片機(jī)遇到狀態(tài)機(jī)前言前些日子在微信上看到李肖遙的公眾號(hào),里面系統(tǒng)講述了QP框架,我很有感觸。我用QP框架很多年了,一開(kāi)始是使用QM和QPC++,到后來(lái)拋棄了QM,直接使用QPC裸寫(xiě)程序,到后來(lái)
    發(fā)表于 01-17 12:03 ?9次下載
    <b class='flag-5'>當(dāng)</b><b class='flag-5'>單片機(jī)遇到</b>狀態(tài)機(jī) 入門(mén)QP

    當(dāng)單片機(jī)遇到多個(gè)模塊數(shù)據(jù)需要處理,應(yīng)該怎么辦?

    這篇文章我不是想說(shuō)編程的規(guī)范性的東西,如果你想讓自己的程序文件最起碼直觀的看起來(lái)美觀、可讀性強(qiáng),推薦找華為的“C語(yǔ)言編程規(guī)范”。我只想說(shuō)一說(shuō)當(dāng)我們的單片機(jī)遇到多個(gè)模塊數(shù)據(jù)
    發(fā)表于 02-09 10:44 ?2次下載
    <b class='flag-5'>當(dāng)</b><b class='flag-5'>單片機(jī)遇到</b><b class='flag-5'>多個(gè)</b><b class='flag-5'>模塊</b>的<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>需要</b><b class='flag-5'>處理</b>,<b class='flag-5'>應(yīng)該</b><b class='flag-5'>怎么辦</b>?

    當(dāng)器件的工作頻率較高時(shí)怎么辦?

    當(dāng)器件的工作頻率較高時(shí)怎么辦 隨著科技的不斷進(jìn)步,許多電子器件需要工作在較高頻率下以滿(mǎn)足越來(lái)越復(fù)雜的應(yīng)用需求。然而,較高的工作頻率也意味著器件面臨著更多的挑戰(zhàn)和問(wèn)題。因此,當(dāng)器件的工作
    的頭像 發(fā)表于 08-29 16:25 ?717次閱讀

    單片機(jī)沒(méi)有DAC外設(shè)功能怎么辦

    在消費(fèi)電子行業(yè),難免有時(shí)為了省成本而出現(xiàn)需要用到DAC而單片機(jī)沒(méi)有DAC外設(shè)的情況,那么遇到這種情況怎么辦呢?
    的頭像 發(fā)表于 09-14 16:46 ?1604次閱讀
    <b class='flag-5'>單片機(jī)</b>沒(méi)有DAC外設(shè)功能<b class='flag-5'>怎么辦</b>

    linux用gdb調(diào)試遇到函數(shù)調(diào)用怎么辦?

    linux用gdb調(diào)試遇到函數(shù)調(diào)用怎么辦? 在Linux上使用GDB調(diào)試時(shí),遇到函數(shù)調(diào)用是一個(gè)常見(jiàn)的情況。函數(shù)調(diào)用可能涉及到多個(gè)函數(shù)、多個(gè)
    的頭像 發(fā)表于 01-31 10:33 ?646次閱讀