女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

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

如何寫出穩(wěn)定的單片機(jī)代碼

無際單片機(jī)編程 ? 來源:無際單片機(jī)編程 ? 2024-11-15 16:40 ? 次閱讀

這篇文章分享怎么寫出穩(wěn)定的單片機(jī)代碼。

我對優(yōu)秀代碼的理解,大體分為兩個部分:高效和穩(wěn)定。 兩者都能做到很好的,如果靠自己摸索,沒有刻意去練習(xí),可能需要花10年,甚至更久。

對于單片機(jī)產(chǎn)品來說,高效可能不是剛需。

高效寫法和低效寫法,在很多功能上看不出區(qū)別,代碼執(zhí)行效率快個納秒、微秒、甚至是毫秒的時間差,對功能本身并無影響。

所以在高效和穩(wěn)定之間,我建議先提升怎么把程序?qū)懛€(wěn)定,再進(jìn)一步優(yōu)化程序效率。

如果當(dāng)下覺得自己寫的代碼比較爛,也沒關(guān)系,先多寫,再多學(xué)習(xí)高手寫的代碼,你就能看出其中的精華。

經(jīng)驗不足的時候,哪怕別人直接給你答案,你也不知道他為什么要這樣做。

我很多代碼思維和技巧,都是學(xué)習(xí)同事的代碼,我看到他們的代碼時,和無際項目特訓(xùn)營老鐵看我們代碼的感覺是一樣的,先是一臉懵逼,有些工作后,接觸項目多了,才領(lǐng)悟其中的精髓。

剛開始我也不能理解他們的代碼,感覺寫的很復(fù)雜,搞不懂明明可以寫的很簡單,為什么要繞一個彎。

不過我把他們的代碼保存起來了。

后面跳槽又做了幾年,有次,領(lǐng)導(dǎo)安排了一個復(fù)雜點的新項目,需要自己獨立從頭到尾去做。

很多功能沒做過,不知道怎么下手,摸著石頭過河,用最笨的辦法,先把功能實現(xiàn)。

后面把代碼組織在一起的時候,又發(fā)現(xiàn)整個邏輯異常混亂和沖突。

舉個簡單的例子,一個LED燈指示設(shè)備聯(lián)網(wǎng)狀態(tài),未接連上時,每200ms閃一次,連接上wifi時,每400ms閃一次,連接上路由器時,每600ms閃一次,連接上服務(wù)器時,常亮。

固定的閃爍效果,簡單,但要考慮到通用性和擴(kuò)展性,就難很多了。

為什么我要專門給點燈,寫一個程序架構(gòu)?

是因為LED需求太多了,LED大多數(shù)產(chǎn)品都有,而且每個產(chǎn)品LED數(shù)量,需要的閃爍效果都不同,每次重復(fù)去寫,費時費力。

所以我把LED閃爍,設(shè)計成獨立的功能模塊,并考慮到了擴(kuò)展性和移植性。

需要修改LED數(shù)量,直接修改枚舉量就好了,需要增加LED閃爍效果,直接添加一個波形數(shù)組就好了,后續(xù)算法會根據(jù)數(shù)組的值,自動輸出相應(yīng)的波形。

架構(gòu)定好,下次類似產(chǎn)品功能的需求,我改一下,只需要幾分鐘。

所以,程序?qū)懙恼樱皇强创a寫得多漂亮,或者用了什么高級語法,而是看是否精準(zhǔn)解決需求。

除此以外,所有花里胡哨的技巧,都是脫褲子放屁。

代碼穩(wěn)定性,主要體現(xiàn)在一些復(fù)雜的項目上,一些簡單的項目,沒多少功能,硬調(diào)也能調(diào)出來。

所以,我覺得,想把代碼寫穩(wěn)定,最主要的就是程序架構(gòu)的設(shè)計。

如果架構(gòu)設(shè)計不好,會導(dǎo)致代碼難以維護(hù)、容易出錯、功能擴(kuò)展困難、穩(wěn)定性差、調(diào)試?yán)щy、硬件兼容性差等問題。

好的程序架構(gòu),我覺得核心是要把控兩點:

一、程序"地基"也就是整個項目,所有功能的"管理者"。比如RTOS,就是充當(dāng)這樣的角色。

很多復(fù)雜的單片機(jī)項目,都會上RTOS,就是保證地基是穩(wěn)定,降低對工程師的技能要求。

寫一個系統(tǒng),和移植一個系統(tǒng)用,完全不是一個難度級別。

不過,我還是比較喜歡用"裸機(jī)"寫程序,然后采用自己設(shè)計的輕量任務(wù)調(diào)度系統(tǒng)。

08e4ed92-907a-11ef-a511-92fbcf53809c.png

這是一個簡單的輪詢式任務(wù)調(diào)度系統(tǒng),通過一個定時器中斷來觸發(fā)任務(wù)調(diào)度。相對RTOS來說,有以下優(yōu)勢:

①簡單,資源占用少不需要復(fù)雜的任務(wù)管理數(shù)據(jù)結(jié)構(gòu)和調(diào)度算法,因此占用的內(nèi)存和CPU資源較少,特別適合資源受限的單片機(jī),之前這個架構(gòu)多次用于51單片機(jī)的項目。

②能完全掌控代碼都是自己寫的,相對移植RTOS來說,更能掌控,減少由于對系統(tǒng)不熟,給產(chǎn)品埋雷的風(fēng)險。任務(wù)也是按順序執(zhí)行的,沒有復(fù)雜的任務(wù)切換,調(diào)試時更容易跟蹤和分析問題。 ③任務(wù)分離通過任務(wù)創(chuàng)建函數(shù)OS_CreatTask,將不同的功能分配給不同的任務(wù)。這種分離確保了每個任務(wù)只關(guān)注一件事情,提高了代碼的可讀性和可維護(hù)性。

④靈活性創(chuàng)建任務(wù)時,可以為每個任務(wù)分配不同執(zhí)行頻率,從而調(diào)整任務(wù)執(zhí)行順序,可以很靈活地控制任務(wù)執(zhí)行,也非常適合周期性的任務(wù)。

⑤減少CPU占用,響應(yīng)更快雖然在這個架構(gòu)中沒有明確的任務(wù)優(yōu)先級,但可以通過調(diào)整任務(wù)的執(zhí)行頻率或順序,來間接實現(xiàn)優(yōu)先級控制。

傳統(tǒng)while(1)死循環(huán)的用法,CPU一直在忙碌地執(zhí)行某個代碼塊,而輪詢式架構(gòu)可以讓CPU在沒有任務(wù)執(zhí)行時,處于空閑狀態(tài),一旦任務(wù)準(zhǔn)備好執(zhí)行,它可以立即開始運行,減少響應(yīng)時間。 不過有一點,需要人為控制每個任務(wù)的代碼效率,盡量不要有延時高的代碼。 ⑤擴(kuò)展性強(qiáng)雖然架構(gòu)簡單,但通過增加任務(wù)和調(diào)整調(diào)度邏輯,系統(tǒng)仍然可以擴(kuò)展以支持更多的功能,比如增加現(xiàn)場切換功能和任務(wù)優(yōu)先級管理,即是最精簡的RTOS系統(tǒng)。 這種輪詢式任務(wù)調(diào)度系統(tǒng),雖然不支持真正的并發(fā)執(zhí)行,但以更簡單,高效的方式來管理多個任務(wù),對于大多數(shù)的單片機(jī)項目來說,其實也夠了。至少我還沒碰到過,非要上RTOS才能完成的產(chǎn)品。

這個架構(gòu)也有配套的開源視頻,是我2018年錄著玩的,不過代碼已申請版權(quán),非學(xué)員不能直接用于自己項目,可以學(xué)習(xí)這種編程思維,要的找我安排。

0908968e-907a-11ef-a511-92fbcf53809c.png

二、功能模塊化如果是項目功能比較多,一定要采用模塊化的方式,以便于后期的代碼維護(hù)和移植。 拿我們無際特訓(xùn)營項目6的代碼舉例,創(chuàng)建了3個任務(wù),分別管理硬件層、中間層、應(yīng)用層的功能。

092258bc-907a-11ef-a511-92fbcf53809c.png

1.硬件層主要是單片機(jī)外設(shè),以及一些外圍芯片的驅(qū)動程序,比如定時器、LED、語音輸出、按鍵、串口、ADC、EEPROM

0944ae76-907a-11ef-a511-92fbcf53809c.png

然后不同的硬件驅(qū)動程序也是相互獨立的。

0967c7da-907a-11ef-a511-92fbcf53809c.png

2.中間層主要是一些協(xié)議的解析,比如mqtt、lora4G等,還有就是一些硬件層的應(yīng)用程序,比如屏顯示圖案,電池電量檢測邏輯,外電檢測邏輯等。

097537c6-907a-11ef-a511-92fbcf53809c.png

不同的功能程序也是相互獨立的。

0999d27a-907a-11ef-a511-92fbcf53809c.png

3.應(yīng)用層就是具體的產(chǎn)品邏輯功能實現(xiàn)代碼,比如菜單系統(tǒng),防盜報警模式邏輯等等。

09a701f2-907a-11ef-a511-92fbcf53809c.png

我們在做功能的時候,也要有架構(gòu)的思維,需要考慮到后續(xù)功能的擴(kuò)展和移植。

比如我們做菜單的時候,會考慮到后期如果項目需要增加或刪減界面,怎么設(shè)計比較方便靈活。

我們目前的做法是通過結(jié)構(gòu)體數(shù)組來管理每個界面,然后通過雙向鏈表讓各界面建立聯(lián)系。

09c88174-907a-11ef-a511-92fbcf53809c.png

類似的還有很多,比如說LED,按鍵這種,基本也是每個產(chǎn)品的剛需。

三、怎么去鍛煉架構(gòu)思維和能力?一般的工程師,會在工作了3,4年左右,才能意識到程序架構(gòu)的必要性,也取決于你什么時候能有機(jī)會獨立完成復(fù)雜的項目,這個時候你會發(fā)現(xiàn),原來的知識體系不夠用。

心態(tài)上不用太著急和焦慮,按照正確的方向努力,很快就能具備架構(gòu)設(shè)計能力。

一般流程是這樣的。1.先實現(xiàn)功能先不要考慮架構(gòu),先把功能實現(xiàn)出來,再從功能里面找規(guī)律。

比如一個按鍵檢測代碼,和10個按鍵,其實也就是加個for循環(huán),代碼就能復(fù)用。

比如LED燈的特效,其本質(zhì)就是輸出的高低電平波形持續(xù)的時間不一樣,我們是否能用一個數(shù)組來存儲波形數(shù)據(jù),通過定時器配合小算法來輸出波形呢? 這些代碼,都是要一步步迭代的,可能修改10次,就比較完美了,不要要求一寫就接近完美,容易自閉。 還有就是多接觸優(yōu)秀的工程師和項目,沒條件的可以看看STM32固件庫代碼,看看藍(lán)牙協(xié)議棧,看看RTOS,這些都是開源的產(chǎn)品級代碼。

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

    關(guān)注

    6063

    文章

    44915

    瀏覽量

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

    關(guān)注

    30

    文章

    4886

    瀏覽量

    70253

原文標(biāo)題:如何編寫穩(wěn)定的單片機(jī)代碼?

文章出處:【微信號:nanshuqg,微信公眾號:無際單片機(jī)編程】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    晶振受到電磁干擾對單片機(jī)的影響

    單片機(jī)可以正常運行的一個因素就是晶振的穩(wěn)定性。在工作過程中,晶振可能會受到電磁干擾的影響,導(dǎo)致單片機(jī)發(fā)生故障,甚至出現(xiàn)死機(jī)的情況。
    的頭像 發(fā)表于 03-20 18:01 ?531次閱讀

    基于瑞薩RA8單片機(jī)的智能小車項目方案 附源代碼

    基于瑞薩RA8單片機(jī),e2studio開發(fā)環(huán)境,給大家講述一下智能小車項目的方案,并附上主要的源代碼
    的頭像 發(fā)表于 03-07 14:36 ?1256次閱讀
    基于瑞薩RA8<b class='flag-5'>單片機(jī)</b>的智能小車項目方案 附源<b class='flag-5'>代碼</b>

    單片機(jī)學(xué)習(xí)—C51源代碼和Proteus仿真文件

    單片機(jī)學(xué)習(xí)—C51源代碼和Proteus仿真文件.zip, 有各種例子
    發(fā)表于 02-10 13:46 ?1次下載

    怎么提升單片機(jī)代碼執(zhí)行效率

    ? 提升單片機(jī)代碼執(zhí)行效率需要從多個方面入手,包括代碼優(yōu)化、硬件資源利用、編譯器設(shè)置、中斷處理優(yōu)化以及其他技巧等。在實際應(yīng)用中,需要根據(jù)具體需求和硬件條件綜合考慮這些因素,以實現(xiàn)最佳的性能表現(xiàn)。 ?
    的頭像 發(fā)表于 01-10 11:06 ?479次閱讀

    單片機(jī)Debug工具性能對比 單片機(jī)調(diào)試常用命令

    單片機(jī)(Microcontroller Unit, MCU)調(diào)試是嵌入式開發(fā)中的一個重要環(huán)節(jié),它幫助開發(fā)者發(fā)現(xiàn)和修復(fù)代碼中的錯誤,優(yōu)化程序性能。不同的單片機(jī)和開發(fā)環(huán)境可能使用不同的調(diào)試工具和命令
    的頭像 發(fā)表于 12-19 09:56 ?1220次閱讀

    單片機(jī)Debug與仿真區(qū)別

    單片機(jī)的開發(fā)是一個復(fù)雜的過程,涉及到硬件設(shè)計、軟件開發(fā)和測試等多個環(huán)節(jié)。為了確保單片機(jī)能夠按照預(yù)期工作,開發(fā)者需要使用Debug和仿真技術(shù)來檢測和修正代碼中的錯誤。 Debug(調(diào)試) Debug
    的頭像 發(fā)表于 12-19 09:47 ?808次閱讀

    單片機(jī)代碼性能起飛的七大技巧

    單片機(jī)的程序比軟開少一些,真正想編寫出高效的代碼,還是要積累很多年的。? ? ? ? ?? 在做研發(fā)工程師的10年里,我經(jīng)歷過幾個公司,看過很多工程師寫的代碼,但真正能讓我跪著看完的,
    的頭像 發(fā)表于 11-16 10:21 ?1057次閱讀
    讓<b class='flag-5'>單片機(jī)</b><b class='flag-5'>代碼</b>性能起飛的七大技巧

    單片機(jī)燒錄程序用什么軟件

    單片機(jī)燒錄程序是單片機(jī)開發(fā)過程中的一個重要環(huán)節(jié),涉及到將編寫好的程序代碼通過燒錄器寫入單片機(jī)的ROM中,以實現(xiàn)對單片機(jī)的控制。 燒錄器的類型
    的頭像 發(fā)表于 09-02 10:05 ?3037次閱讀

    單片機(jī)燒錄程序的線比單片機(jī)上的少還能燒錄嗎

    單片機(jī)燒錄原理 單片機(jī)燒錄是指將編寫好的程序代碼通過一定的方式傳輸?shù)?b class='flag-5'>單片機(jī)的存儲器中,使其能夠按照程序的指令運行。這個過程通常需要使用燒錄器或者編程器等設(shè)備,通過一定的接口與
    的頭像 發(fā)表于 09-02 09:54 ?958次閱讀

    單片機(jī)燒錄程序的基本步驟是什么

    單片機(jī)燒錄程序是單片機(jī)開發(fā)過程中非常重要的一步,它涉及到將編寫好的程序代碼通過一定的方式傳輸?shù)?b class='flag-5'>單片機(jī)內(nèi)部的存儲器中,使單片機(jī)能夠按照預(yù)定的邏
    的頭像 發(fā)表于 09-02 09:47 ?2448次閱讀

    單片機(jī)程序燒錄成功為什么不運行

    燒錄問題 : 確保燒錄過程沒有中斷或錯誤。 檢查燒錄器和連接線是否工作正常。 確認(rèn)燒錄器設(shè)置(如電壓、波特率等)與單片機(jī)兼容。 電源問題 : 檢查單片機(jī)是否獲得了正確的電源電壓。 確保電源穩(wěn)定,沒有
    的頭像 發(fā)表于 09-02 09:45 ?4448次閱讀

    基于51單片機(jī)無線溫度傳輸控制設(shè)計

    本資源內(nèi)容概要:? ? ? ?這是基于51單片機(jī)無線溫度傳輸控制設(shè)計包含了電路圖源文件(Altiumdesigner軟件打開)、C語言程序源代碼(keil軟件打開)、元件清單(excel表格打開
    發(fā)表于 06-26 10:50 ?0次下載

    基于51單片機(jī)數(shù)字時鐘數(shù)碼管顯示設(shè)計

    本資源內(nèi)容概要:? ? ? ?這是基于51單片機(jī)數(shù)字時鐘數(shù)碼管顯示設(shè)計包含了電路圖源文件(Altiumdesigner軟件打開)、C語言程序源代碼(keil軟件打開)、元件清單(excel表格打開
    發(fā)表于 06-25 10:42 ?1次下載

    基于51單片機(jī)數(shù)字時鐘鬧鐘設(shè)計

    本資源內(nèi)容概要:? ? ? ?這是基于51單片機(jī)數(shù)字時鐘鬧鐘設(shè)計包含了PDF版本電路圖、C語言程序源代碼(keil軟件打開)、proteus仿真。本資源適合人群:? ? ? 單片機(jī)愛好者、電子
    發(fā)表于 06-25 10:17 ?0次下載

    第二講:單片機(jī)STC89C52+RA8889驅(qū)動控制彩屏 代碼移植介紹

    介紹51單片機(jī)如何移植RA8889的代碼進(jìn)行彩屏驅(qū)動與控制
    的頭像 發(fā)表于 06-04 10:36 ?1464次閱讀
    第二講:<b class='flag-5'>單片機(jī)</b>STC89C52+RA8889驅(qū)動控制彩屏 <b class='flag-5'>代碼</b>移植介紹