在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何寫出穩定的單片機代碼

無際單片機編程 ? 來源:無際單片機編程 ? 2024-11-15 16:40 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

這篇文章分享怎么寫出穩定的單片機代碼。

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

對于單片機產品來說,高效可能不是剛需。

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

所以在高效和穩定之間,我建議先提升怎么把程序寫穩定,再進一步優化程序效率。

如果當下覺得自己寫的代碼比較爛,也沒關系,先多寫,再多學習高手寫的代碼,你就能看出其中的精華。

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

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

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

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

后面跳槽又做了幾年,有次,領導安排了一個復雜點的新項目,需要自己獨立從頭到尾去做。

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

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

舉個簡單的例子,一個LED燈指示設備聯網狀態,未接連上時,每200ms閃一次,連接上wifi時,每400ms閃一次,連接上路由器時,每600ms閃一次,連接上服務器時,常亮。

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

為什么我要專門給點燈,寫一個程序架構?

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

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

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

架構定好,下次類似產品功能的需求,我改一下,只需要幾分鐘。

所以,程序寫的咋樣,不是看代碼寫得多漂亮,或者用了什么高級語法,而是看是否精準解決需求。

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

代碼穩定性,主要體現在一些復雜的項目上,一些簡單的項目,沒多少功能,硬調也能調出來。

所以,我覺得,想把代碼寫穩定,最主要的就是程序架構的設計。

如果架構設計不好,會導致代碼難以維護、容易出錯、功能擴展困難、穩定性差、調試困難、硬件兼容性差等問題。

好的程序架構,我覺得核心是要把控兩點:

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

很多復雜的單片機項目,都會上RTOS,就是保證地基是穩定,降低對工程師的技能要求。

寫一個系統,和移植一個系統用,完全不是一個難度級別。

不過,我還是比較喜歡用"裸機"寫程序,然后采用自己設計的輕量任務調度系統。

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

這是一個簡單的輪詢式任務調度系統,通過一個定時器中斷來觸發任務調度。相對RTOS來說,有以下優勢:

①簡單,資源占用少不需要復雜的任務管理數據結構和調度算法,因此占用的內存和CPU資源較少,特別適合資源受限的單片機,之前這個架構多次用于51單片機的項目。

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

④靈活性創建任務時,可以為每個任務分配不同執行頻率,從而調整任務執行順序,可以很靈活地控制任務執行,也非常適合周期性的任務。

⑤減少CPU占用,響應更快雖然在這個架構中沒有明確的任務優先級,但可以通過調整任務的執行頻率或順序,來間接實現優先級控制。

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

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

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

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

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

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

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

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

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

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

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

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

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

3.應用層就是具體的產品邏輯功能實現代碼,比如菜單系統,防盜報警模式邏輯等等。

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

我們在做功能的時候,也要有架構的思維,需要考慮到后續功能的擴展和移植。

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

我們目前的做法是通過結構體數組來管理每個界面,然后通過雙向鏈表讓各界面建立聯系。

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

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

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

心態上不用太著急和焦慮,按照正確的方向努力,很快就能具備架構設計能力。

一般流程是這樣的。1.先實現功能先不要考慮架構,先把功能實現出來,再從功能里面找規律。

比如一個按鍵檢測代碼,和10個按鍵,其實也就是加個for循環,代碼就能復用。

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6067

    文章

    44962

    瀏覽量

    648991
  • 代碼
    +關注

    關注

    30

    文章

    4894

    瀏覽量

    70472

原文標題:如何編寫穩定的單片機代碼?

文章出處:【微信號:nanshuqg,微信公眾號:無際單片機編程】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    晶振受到電磁干擾對單片機的影響

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

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

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

    單片機學習—C51源代碼和Proteus仿真文件

    單片機學習—C51源代碼和Proteus仿真文件.zip, 有各種例子
    發表于 02-10 13:46 ?1次下載

    怎么提升單片機代碼執行效率

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

    單片機Debug工具性能對比 單片機調試常用命令

    單片機(Microcontroller Unit, MCU)調試是嵌入式開發中的一個重要環節,它幫助開發者發現和修復代碼中的錯誤,優化程序性能。不同的單片機和開發環境可能使用不同的調試工具和命令
    的頭像 發表于 12-19 09:56 ?1367次閱讀

    單片機Debug與仿真區別

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

    單片機代碼性能起飛的七大技巧

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

    單片機的中斷機制

    單片機的中斷機制是一種重要的處理方式,它允許單片機在執行主程序的過程中,能夠暫停當前任務,轉而處理外部或內部緊急事件。這種機制極大地提高了系統的響應速度和處理能力,使得單片機在各種應用領域中得到廣泛應用。以下是對
    的頭像 發表于 10-17 18:03 ?1908次閱讀

    單片機WiFi模塊怎樣連接手機APP

    連接 :將WiFi模塊與單片機物理連接。 編程單片機 :編寫代碼使單片機能通過WiFi模塊與互聯網通信。 創建服務器 :在單片機上創建一個小
    的頭像 發表于 09-10 15:31 ?3469次閱讀

    keil可以讀出單片機的程序嗎

    表述存在一定的誤解,因為Keil主要是用于編寫、編譯和調試單片機程序的工具,而不是直接從單片機中讀取已編程代碼的工具。 一、Keil的主要功能 編程開發 :Keil允許用戶使用C語言或匯編語言編寫
    的頭像 發表于 09-02 10:32 ?2093次閱讀

    單片機燒錄程序用什么軟件

    單片機燒錄程序是單片機開發過程中的一個重要環節,涉及到將編寫好的程序代碼通過燒錄器寫入單片機的ROM中,以實現對單片機的控制。 燒錄器的類型
    的頭像 發表于 09-02 10:05 ?3286次閱讀

    單片機燒錄程序可以重新燒嗎

    好的程序代碼通過特定的方式寫入單片機的存儲器中,使其能夠按照預定的邏輯執行任務。單片機燒錄程序可以重新燒錄,這是單片機編程和開發過程中的一個常見操作。
    的頭像 發表于 09-02 10:04 ?3014次閱讀

    單片機燒錄程序的線比單片機上的少還能燒錄嗎

    單片機燒錄原理 單片機燒錄是指將編寫好的程序代碼通過一定的方式傳輸到單片機的存儲器中,使其能夠按照程序的指令運行。這個過程通常需要使用燒錄器或者編程器等設備,通過一定的接口與
    的頭像 發表于 09-02 09:54 ?1032次閱讀

    單片機燒錄程序的基本步驟是什么

    單片機燒錄程序是單片機開發過程中非常重要的一步,它涉及到將編寫好的程序代碼通過一定的方式傳輸到單片機內部的存儲器中,使單片機能夠按照預定的邏
    的頭像 發表于 09-02 09:47 ?2647次閱讀

    單片機程序燒錄成功為什么不運行

    燒錄問題 : 確保燒錄過程沒有中斷或錯誤。 檢查燒錄器和連接線是否工作正常。 確認燒錄器設置(如電壓、波特率等)與單片機兼容。 電源問題 : 檢查單片機是否獲得了正確的電源電壓。 確保電源穩定,沒有
    的頭像 發表于 09-02 09:45 ?4801次閱讀
    主站蜘蛛池模板: 日日草夜夜草 | 野外啪啪抽搐一进一出 | 国产未成女年一区二区 | 最新激情网 | 资源在线www天堂 | 亚洲第一区视频 | 欲色网站 | 黄色网址播放 | 最刺激黄a大片免费网站 | 多男一女一级淫片免费播放口 | 色多多视频在线播放 | 巨尻在线观看 | 天堂中文在线www | 日韩a一级欧美一级 | 岛国毛片一级一级特级毛片 | 天天爽夜夜爽人人爽免费 | 色老头成人免费综合视频 | 亚洲天堂.com | 久久99色 | 色婷婷久久综合中文久久蜜桃 | 日本一区免费看 | 久久免费精品国产72精品剧情 | freesexvideo性欧美医生护士 | 男人天堂综合网 | 精品国产一区二区三区成人 | 久久综合九色综合97婷婷群聊 | 丁香激情五月 | 在线视频亚洲欧美 | 亚洲精品免费视频 | 亚洲国产色婷婷精品综合在线观看 | 亚洲性天堂 | 韩国男女无遮挡高清性视频 | 禁漫画羞羞动漫入口 | 久久久噜噜噜 | 久久亚洲国产精品五月天 | 天天视频国产精品 | 一色屋成人免费精品网站 | 永久免费的拍拍拍网站 | 天天草天天爽 | 人人草人人爱 | 精品少妇一区二区三区视频 |