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

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

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

MCU軟件工程師如何改變些沒(méi)有軟件設(shè)計(jì)思想?

Q4MP_gh_c472c21 ? 來(lái)源:最后一個(gè)bug ? 作者:handong ? 2021-03-17 09:47 ? 次閱讀

今天分享的文章,主要給那些沒(méi)有軟件設(shè)計(jì)思想的MCU軟件工程師看的!隨著目前MCU的各方面性能顯著提升,一些以MCU為控制中心嵌入式系統(tǒng)也是越來(lái)越復(fù)雜,毫無(wú)軟件設(shè)計(jì)理念的代碼真的是拖累單片機(jī),所以對(duì)每個(gè)MCU軟件工程師在軟件設(shè)計(jì)等方面的要求也將越來(lái)越高!

這里利用一個(gè)實(shí)際發(fā)生的例子,對(duì)入行的初級(jí)軟件工程師提一些軟件設(shè)計(jì)上的建議,并分享了一些經(jīng)常走的彎路,希望可以幫到大家。這篇文章我沒(méi)有談編程的規(guī)范性的東西,如果你想讓自己的程序文件代碼更加直觀、看起來(lái)美觀、可讀性強(qiáng),推薦學(xué)習(xí)一下全面的編程規(guī)范,比如網(wǎng)絡(luò)上廣為流傳的,華為“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è)版本,很多的bug,總算第二年6月把充電樁立起來(lái)了。當(dāng)然此過(guò)程我并沒(méi)有過(guò)多的干涉,系統(tǒng)也沒(méi)有經(jīng)過(guò)非常嚴(yán)格的測(cè)試,結(jié)果發(fā)現(xiàn)讀卡的時(shí)候不能處理觸摸屏,播放語(yǔ)音的時(shí)候不能處理讀卡,語(yǔ)音播放不能打斷或者跳躍,反正就是所有事件必須一個(gè)一個(gè)按部就班的來(lái),一旦操作錯(cuò)誤就需要多次執(zhí)行、等待、甚至重新來(lái)過(guò)。一個(gè)工作3年多的工程師怎么會(huì)把產(chǎn)品做成這樣呢?思來(lái)想去不應(yīng)該呀,是不是程序哪里出了問(wèn)題 ? 解決問(wèn)題的最好辦法就是評(píng)審代碼,來(lái)review代碼瞧瞧。不看不知道,一看嚇一跳!整個(gè)的程序是沒(méi)有邏輯的,一條線就往下寫(xiě),這不正是當(dāng)年在學(xué)校剛做第一個(gè)項(xiàng)目的代碼嗎 ? ……

//主循環(huán)

while(1)

{

//上電進(jìn)入主程序 或 觸發(fā)觸摸屏

Function1();//播放提示語(yǔ)音

Delay();//等待播放完畢

//讀取M1卡信息

Function2();

Delay();//等待讀卡數(shù)據(jù)返回

//播放提示語(yǔ)音

Function3();

Delay();//等待播放完畢

//M1卡數(shù)據(jù)交互,判定下一步操作及提示

Function4();

Delay();//等待數(shù)據(jù)處理完畢

……

……

}

從代碼上可以看出這個(gè)工程師基本上對(duì)于自己設(shè)計(jì)的產(chǎn)品沒(méi)有任何軟件上的設(shè)計(jì)可言,也很少去吸收一些優(yōu)秀的代碼和思想,對(duì)自己開(kāi)發(fā)的程序在產(chǎn)品上的具體表現(xiàn)也不敏感,更被說(shuō)對(duì)RTOS的學(xué)習(xí)和理解了。

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

1、 delay(死等)這類(lèi)函數(shù)應(yīng)該只在實(shí)驗(yàn)室驗(yàn)證某個(gè)功能過(guò)程中用到,或許是在一些初始化時(shí)序使用到,而不會(huì)用來(lái)控制整個(gè)的程序運(yùn)行架構(gòu),在實(shí)際的產(chǎn)品開(kāi)發(fā)時(shí)無(wú)論是主循環(huán)while中,還是其調(diào)用的函數(shù)中,亦或是中斷服務(wù)程序中幾乎是不可能看到的。

2、 產(chǎn)品設(shè)計(jì)的各個(gè)相對(duì)比較獨(dú)立的子模塊之間的邏輯關(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è)特殊情況,也就是說(shuō)我不執(zhí)行A也有可能執(zhí)行B,那么程序開(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)該如何處理呢?這里提一下我的建議和想法,首先他這里是裸機(jī)開(kāi)發(fā),所以就不談RTOS方面的設(shè)計(jì)建議了,僅僅只是針對(duì)前后臺(tái)架構(gòu)。

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è)或多個(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ù),也就是核心任務(wù)調(diào)度處理函數(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)系不在相互必要。bug菌記得有一本書(shū)籍叫《時(shí)間觸發(fā)型調(diào)度系統(tǒng)》,大伙可以看看,大體思想與這里的觀點(diǎ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。bug菌覺(jué)得,不管你所做的項(xiàng)目有沒(méi)有用到RTOS,平時(shí)都需要玩玩RTOS,對(duì)該觀點(diǎn)的理解會(huì)有幫助。

原文標(biāo)題:3年的MCU工程師就寫(xiě)出這樣的代碼?

文章出處:【微信公眾號(hào):嵌入式ARM】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

責(zé)任編輯:haq

聲明:本文內(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)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16927

    瀏覽量

    350010
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4730

    瀏覽量

    68259

原文標(biāo)題:3年的MCU工程師就寫(xiě)出這樣的代碼?

文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    軟件設(shè)計(jì)哲學(xué) 于延保代碼改造中的實(shí)踐

    》的影響,它將軟件設(shè)計(jì)稱(chēng)為“哲學(xué)”,而哲學(xué)本身沒(méi)有嚴(yán)格的定論,同樣地,我覺(jué)得軟件設(shè)計(jì)是每個(gè)開(kāi)發(fā)者的理念,相同功能的迭代,往往會(huì)有不同的看法或思想,也所謂每個(gè)人的代碼風(fēng)格,所以本次分享不
    的頭像 發(fā)表于 10-11 14:44 ?177次閱讀
    <b class='flag-5'>軟件設(shè)計(jì)</b>哲學(xué) 于延保代碼改造中的實(shí)踐

    BQ79616-Q1軟件設(shè)計(jì)參考

    電子發(fā)燒友網(wǎng)站提供《BQ79616-Q1軟件設(shè)計(jì)參考.pdf》資料免費(fèi)下載
    發(fā)表于 09-03 10:37 ?5次下載
    BQ79616-Q1<b class='flag-5'>軟件設(shè)計(jì)</b>參考

    嵌入式軟件開(kāi)發(fā)招聘

    本帖最后由 jf_19082533 于 2024-7-26 13:56 編輯 尋求:嵌入式軟件工程師 要求:3年以上開(kāi)發(fā)經(jīng)驗(yàn),音視頻領(lǐng)域應(yīng)用層開(kāi)發(fā) 地址:北京市昌平區(qū) 郵箱:1017933921@qq.com 歡迎廣大感興趣的朋友約聊。
    發(fā)表于 07-26 13:44

    嵌入式軟件工程師如何提升自己?

    嵌入式軟件工程師如何提升自己? 作為一名嵌入式軟件工程師,在這個(gè)充滿(mǎn)機(jī)遇和挑戰(zhàn)的領(lǐng)域里,如何提升自己顯得非常重要,它決定了你未來(lái)的發(fā)展方向和成就。接下來(lái),我們一起探討一下。 1.奠定扎實(shí)
    發(fā)表于 06-12 11:20

    索尼誠(chéng)邀軟件工程師參與PS免費(fèi)手游平臺(tái)設(shè)計(jì)

    據(jù)悉,近日,澳大利亞知名媒體TweakTown發(fā)現(xiàn),索尼互動(dòng)娛樂(lè)正在為其旗下的PlayStation Studios Mobile招募一名資深的軟件工程師,負(fù)責(zé)設(shè)計(jì)PlayStation的免費(fèi)手機(jī)游戲平臺(tái)。
    的頭像 發(fā)表于 05-23 17:08 ?685次閱讀

    嵌入式軟件工程師和硬件工程師的區(qū)別?

    嵌入式軟件工程師和硬件工程師的區(qū)別? 嵌入式軟件工程師 嵌入式軟件工程師軟件開(kāi)發(fā)領(lǐng)域中的一種專(zhuān)業(yè)工程師
    發(fā)表于 05-16 11:00

    Cognition發(fā)布首款A(yù)I軟件工程師Devin

    據(jù)報(bào)道,Cognition公司今日公布了其首款人工智能軟件工程師——Devin,掀起了打造軟件模式變革的序幕。該產(chǎn)品在SWE-bench代碼測(cè)驗(yàn)中展現(xiàn)出卓越表現(xiàn),甚至超過(guò)了部分頂級(jí)人類(lèi)工程師的水準(zhǔn)。
    的頭像 發(fā)表于 03-13 10:57 ?583次閱讀

    優(yōu)秀電源工程師需要哪些必備技能?

    隨著電源市場(chǎng)的不斷擴(kuò)張,開(kāi)關(guān)電源行業(yè)飛速發(fā)展,企業(yè)對(duì)電源工程師的需求日益增加,對(duì)電源工程師的技能要求也日漸提高,相信沒(méi)有一位電源工程師會(huì)錯(cuò)過(guò)讓自己變得更優(yōu)秀的機(jī)會(huì)。作為一名數(shù)字電源從業(yè)
    發(fā)表于 01-29 11:29

    如何構(gòu)建linux開(kāi)發(fā)環(huán)境和編譯軟件工程、應(yīng)用程序

    前文介紹了如何使用官方提供的鏡像文件啟動(dòng)開(kāi)發(fā)板,本文將說(shuō)明如何構(gòu)建linux開(kāi)發(fā)環(huán)境和編譯軟件工程、應(yīng)用程序。
    的頭像 發(fā)表于 01-03 12:31 ?1882次閱讀
    如何構(gòu)建linux開(kāi)發(fā)環(huán)境和編譯<b class='flag-5'>軟件工程</b>、應(yīng)用程序

    嵌入式軟件工程師常用的

    最近我換工作了,看見(jiàn)不同嵌入式軟件工程師用的平臺(tái)都不一樣,所以我整理了一下。PlatformIO:多平臺(tái)支持:PlatformIO支持多種嵌入式平臺(tái),包括Arduino、ESP8266、ESP32
    的頭像 發(fā)表于 12-24 08:00 ?618次閱讀
    嵌入式<b class='flag-5'>軟件工程師</b>常用的

    沒(méi)有誰(shuí)做過(guò)DSP、微型逆變器/微逆變/大型工業(yè)逆變器、嵌入式軟件的軟硬件高級(jí)工程師?

    急需 DSP、微型逆變器/微逆變/大型工業(yè)逆變器、嵌入式軟件等豐富經(jīng)驗(yàn)的軟件高級(jí)工程師、硬件高級(jí)工程師,深圳,面議面議,自薦/推薦請(qǐng)聯(lián)系我。歡迎來(lái)詢(xún)zsrfwk@163.com
    發(fā)表于 12-14 17:32

    嵌入式硬件和軟件哪個(gè)好?

    ,如復(fù)位電路、常用濾波器電路、功放電路、高速信號(hào)傳輸線的匹配電路等;故障定位、解決問(wèn)題的能力;設(shè)計(jì)文檔的組織編寫(xiě)技能! 那對(duì)于嵌入式軟件工程師來(lái)說(shuō): 嵌入式軟件工程師領(lǐng)域較新,他的發(fā)展也是很快的,像
    發(fā)表于 12-05 15:17

    【熱招】蘇州,單片機(jī)工程師

    【單片機(jī)工程師】 3年及以上經(jīng)驗(yàn),要求有智能產(chǎn)品經(jīng)驗(yàn)。 崗位職責(zé): 1、根據(jù)MRD,與產(chǎn)品部等部門(mén)的需求,負(fù)責(zé)對(duì)新開(kāi)發(fā)的產(chǎn)品進(jìn)行可行性分析,主要負(fù)責(zé)分析產(chǎn)品的軟件可實(shí)現(xiàn)性; 2、根據(jù)產(chǎn)品需求,完成
    發(fā)表于 11-28 14:02

    工程師說(shuō) | RX系列軟件的歷史和今后的展望 #6

    的歷史和今后的展望 #4 工程師說(shuō) | RX系列軟件的歷史和今后的展望 #5 本篇將為大家介紹如何在RX產(chǎn)品家族典型的100MHz級(jí)MCU中搭載網(wǎng)絡(luò)軟件。 Hiroki Ishigur
    的頭像 發(fā)表于 11-16 18:15 ?659次閱讀
    <b class='flag-5'>工程師</b>說(shuō) | RX系列<b class='flag-5'>軟件</b>的歷史和今后的展望 #6