色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

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

3天內不再提示

淺述單片機程序的整體框架設計的思路體會

strongerHuang ? 來源:嵌入式客棧 ? 作者:嵌入式客棧 ? 2021-06-27 11:34 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一些初學單片機的同學,剛剛入手做單片機開發,還沒有涉及到使用RTOS,且剛入手直接上RTOS可能會有些難度,有的使用的相對較老單片機資源還有限,也不適合跑RTOS。

或者使用RTOS,在整體思路上比較迷茫,不知從何入手,所以本文來聊聊我對單片機程序的整體框架設計的一些思路體會。

為啥要討論架構

單片機系統開發人員的目標之一是在編程環境中創建固件,以實現低成本系統、軟件可靠性以及快速的開發迭代時間。實現這種編程環境的最佳方法實踐是使用統一的固件架構體系結構,該體系結構在產品開發過程中充當框架并支持“固件模塊化”,或稱為子系統。

如果不采用統一的設計架構,那么其業務需求耦合關系復雜,不采用先設計-后開發的方法論,想到哪里寫到哪里,則程序后期維護將變得異常艱辛,而引入潛在bug/缺陷的風險也將大大增加,且不具備多人協同開發的可能。

可以結合固件模塊化、可測試性和兼容性的正確組合的設計體系架構結構應用于任何固件開發項目,以最大程度地提高代碼可復用性,加快固件調試速度并提高固件可移植性。

模塊化架構設計?

模塊化編程將程序功能分解為固件模塊/子系統,每個模塊執行一個功能,并包含完成該功能所需的所有源代碼和變量。

模塊化/子系統化有助于協調團隊中許多人的并行工作,管理項目各個部分之間的相互依賴關系,并使設計人員、系統集成人員能夠以可靠的方式組裝復雜的系統。具體來說,它可以幫助設計人員實現和管理復雜性。

隨著應用程序的大小和功能的增長,需要模塊化才能將它們分成單獨的部分(無論是作為“組件”,“模塊”還是“子系統”)。然后,每個這樣分離的部分就成為模塊化體系結構的一個元素。這樣,可以使用定義明確的界面隔離和訪問每個組件。此外,模塊化編程可提高固件的可讀性,同時簡化固件的調試,測試和維護。

即便是一個人獨立開發一個項目,這樣做依然在代碼的調試、可讀性、可移植性方面是最佳實踐的整體策略。如果代碼設計良好,則在其他項目可以輕松應用。而且模塊經過上一項目的測試驗證,在新的項目中再次應用其缺陷風險將大幅降低。

所以每做一個項目,以這種策略不斷積累模塊“輪子”組件,隨著經驗的增長,積累的“輪子”就越來越多,也越來越好。所以其優點是顯而易見的,否則每做一個項目,都從輪子造起,開發時間長不說,開發水平也得不到提高,重復性工作也很枯燥。比如前文中談到的非易失存儲管理子系統,如設計良好,就變成一個可靠的可移植的輪子。這段話請深入理解,并拿走不謝!

固件模塊原理

固件開發中模塊化編程的基本概念是創建固件模塊。從概念上講,模塊代表關注點分離。在計算機科學中,關注點分離是將計算機程序分解為功能很少重疊的獨特功能的過程。關注點是程序的任何關注點或功能,并且與功能或行為同義。關注點分離的發展傳統上是通過模塊化和封裝來實現的,其實也就是解耦思想。

固件模塊可以分為幾種類型:

與很多上層用戶模塊都有關的代碼被實現為單獨的固件模塊。常見的如底層硬件相關的抽象實現。例如,hal_adc.c 是ADC用戶模塊的固件模塊,而hal_timer.c是Timer用戶模塊的固件模塊。

用于特定純軟件算法的代碼被實現為單獨的固件模塊。例如,alg_filter.c是執行軟件過濾器(例如中值過濾器,均值過濾器或加權均值過濾器、IIR/FIR濾波)的固件模塊。

特定應用程序的代碼實現為單獨的固件模塊。例如,app_battery.c是電池充電器應用程序的固件模塊。特定工具的代碼實現為單獨的固件模塊。例如,debug_print.c是用于實現日志打印功能的固件模塊。

。。。。。。

實施估計模塊化設計的一些規則:

所有與模塊相關的功能都應集成到單個源文件中,這是高內聚的體現。

模塊對外提供一個頭文件,該文件聲明了該模塊的所有資源(硬件依賴/宏/常量/變量/函數)。盡量用struct將緊密相關的變量進行集總封裝。

在源文件中包括自檢代碼部分,以實現該模塊模塊的所有自檢功能。

固件模塊的接口應經過精心設計和定義。

由于固件取決于硬件,因此需要在源文件頭中明確提及硬件的相關性。比如利用宏將硬件依賴轉定義,或者利用函數將基本操作進行封裝。則在新的架構體系,僅僅需要移植這部分實現即可使用。

通常,固件模塊可供其他團隊成員在其他項目中使用。可能涉及到管理更改,缺陷修復、所有者應維護模塊。源文件頭應包含“作者”和“版本”信息。

固件在某種程度上取決于編譯器。源文件頭中應聲明基于什么開發環境進行過驗證,以指定編譯器或與IDE相關的信息。

需要注意的是,模塊化設計會引入一些調用開銷,也可能增加固件尺寸大小。在實際實現時,折中考量。不要過度模塊化,所以建議采用高內聚、低耦合的實現策略。在前面文章中有談到過的呼吸機PB560的設計,看過其代碼,本打算解讀一下其代碼設計,但讀下來發現,其設計過度模塊化了,沒有實現高內聚的思想。其源代碼很多源文件僅僅實現了一個函數,而不是把一類問題集中抽象實現,后來就放棄了其代碼解讀。

如何拆分模塊?

做工程開發,一定是需求驅動的。第一件事需要對需求有比較清晰的認知,然后才能設計一個比較合理的框架。我們需要實現什么?大致總體設計過程策略我的基本采用如下圖所示思路(我比較喜歡繪圖,圖會讓人比較直觀)

f64b6982-d6f4-11eb-9e57-12bb97331649.png

問自己第一個問題是:這個項目要實現什么主要功能?這個來自哪里?如果是實際產品開發,則可能來自市場的需求,如果是自己的DIY項目,也一定會YY出一個大致的想法?總之不管源自何方,需求總要先梳理清楚。那么需求一般意義上包含哪些呢?

哪些是硬件IO接口需求,比如開關量輸入,ADC采樣,I2C/SPI通信等等

哪些是業務邏輯需求,比如要采集一個傳感器量數據,控制一個加熱裝置,那么這是高內聚的需求。

哪些是算法相關的技術需求,比如產品中哪些信號需要濾波處理,哪些需要做頻域分析等等。

是否有對外的通信協議需求。

是否有業務數據需要歷史存儲,或者設備參數需要掉電保存

是否需要有日志打印需求。

。。。。。。。。

不一而足。

結合固件模塊原理以及相關指導原則,那么將相關性高的需求,抽象實現在一系列的模塊中,在由這一系列模塊配合實現某個相關性高的業務需求,再進一步這些模塊就變成一個子系統。多個子系統在main.c的調度下,協調完成產品的整體功能。

如何集成調度

對于某些不使用RTOS的應用而言,可以使用如下的框架進行:

void main(void){ /*各模塊初始化*/ init_module_1(); init_module_2(); 。。。。 while(1) { /*實現一個定時調度策略*/ if(timer50ms) { timer50ms = 0; app_module_1(); } if(timer100ms) { timer100ms = 0; app_module_2(); } /*異步請求處理,如中斷后臺處理*/ if(flag1) { communication_handler(); } 。。。。。 }}

對于基于RTOS的集成實現舉例:

void task1(void){ /*處理子系統相關的初始化*/ init_task1(); while(1) { /*應用相關調用*/ task1_mainbody(); 。。。。 }}。。。.void taskn(void){ /*處理子系統相關的初始化*/ init_taskn(); while(1) { /*應用相關調用*/ taskn_mainbody(); 。。。。 }}

void main(void){ /*一些基本硬件相關初始化,比如IO,時鐘,OS tick定時器等*/ init_hal(); 。。。。。。 /*一些基本RTOS初始化*/ init_os(); /*任務創建*/ os_creat(“task1”,task1,棧設置,優先級,。。。); 。。。。。。 os_creat(“taskn”,taskn,棧設置,優先級,。。。); /*啟動OS調度器,交由OS調度管理應用任務*/ os_start();}

具體不同的RTOS,其函數名各有不同,但大致思路一般都差不多。

總結一下

本文從為什么需要模塊化設計整體架構,到這樣做的好處,以及具體做的一些指導原則,再到實際中如何實現,怎么做到高內聚低耦合,提供了一些個人工作中的體會以及思路。

同時對于裸機程序整體框架、基于RTOS的集成框架做了兩個demo,基本能解決大部分的框架思路問題。將前文中的一些個人推崇的原則,在加粗總結下:

所有與模塊相關的功能都應集成到單個源文件中,這是高內聚的體現。

模塊對外提供一個頭文件,該文件聲明了該模塊的所有資源(硬件依賴/宏/常量/變量/函數)。盡量用struct將緊密相關的變量進行集總封裝。

在源文件中包括自檢代碼部分,以實現該模塊模塊的所有自檢功能。

固件模塊的接口應經過精心設計和定義。

由于固件取決于硬件,因此需要在源文件頭中明確提及硬件的相關性。比如利用宏將硬件依賴轉定義,或者利用函數將基本操作進行封裝。則在新的架構體系,僅僅需要移植這部分實現即可使用。

通常,固件模塊可供其他團隊成員在其他項目中使用。可能涉及到管理更改,缺陷修復、所有者應維護模塊。源文件頭應包含“作者”和“版本”信息。

固件在某種程度上取決于編譯器。源文件頭中應聲明基于什么開發環境進行過驗證,以指定編譯器或與IDE相關的信息。

極力建議采用先設計-后開發的模式,比較忌諱逐步debug,想到哪里寫到哪里。當然對于新手學習而言,后一種模式,可以逐步漸進迭代,也可以比較快的增長經驗。當然如何取舍,全憑個人意愿。相信您如深入閱讀,細細體會,應該從設計思想上得到些領悟,有所提高。

編輯:jq

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

    關注

    6067

    文章

    44998

    瀏覽量

    650879
  • adc
    adc
    +關注

    關注

    99

    文章

    6712

    瀏覽量

    549357
  • 函數
    +關注

    關注

    3

    文章

    4381

    瀏覽量

    64963
  • RTOS
    +關注

    關注

    24

    文章

    851

    瀏覽量

    121225

原文標題:詳述單片機固件模塊化架構設計

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    單片機定制開發的設計思路

    單片機定制開發是根據特定場景和功能需求,量身打造符合要求的單片機應用方案,其設計過程需要兼顧技術可行性與實際應用價值,涉及多個關鍵環節。 一、需求分析階段 單片機定制開發的第一步是深入的需求分析
    的頭像 發表于 07-17 11:14 ?110次閱讀
    <b class='flag-5'>單片機</b>定制開發的設計<b class='flag-5'>思路</b>

    STC單片機范例程序

    電子發燒友網站提供《STC單片機范例程序.zip》資料免費下載
    發表于 06-04 16:27 ?4次下載

    2.4寸TFT彩屏配套測試程序-51單片機

    如題,2.4寸TFT彩屏配套測試程序-51單片機
    發表于 06-04 16:26 ?0次下載

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

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

    單片機編程語言有哪些選擇

    單片機(Microcontroller Unit,MCU)編程是指為單片機編寫程序的過程,這些程序控制單片機的行為和功能。單片機廣泛應用于嵌
    的頭像 發表于 11-01 14:13 ?2459次閱讀

    單片機怎么寫入程序

    程序通常涉及以下幾個步驟: 選擇單片機和開發環境 : 確定項目需求,選擇合適的單片機型號。 安裝相應的開發環境,如Keil、IAR、MPLAB等。 硬件連接 : 將單片機連接到開發板或
    的頭像 發表于 10-21 11:21 ?2468次閱讀

    單片機有哪些中斷類型

    單片機中斷是指在單片機執行程序的過程中,當外部設備或內部條件發生某個特定事件時,能夠暫停當前正在執行的程序,轉而去執行一個特定的服務程序(稱
    的頭像 發表于 10-17 18:12 ?2419次閱讀

    單片機的中斷機制

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

    keil可以讀出單片機程序

    Keil是一款廣泛應用于單片機程序開發的軟件,它提供了包括C編譯器、宏匯編、連接器、庫管理和一個功能強大的仿真調試器等在內的完整開發方案。然而,關于Keil是否能直接“讀出”單片機程序
    的頭像 發表于 09-02 10:32 ?2169次閱讀

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

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

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

    單片機(Microcontroller Unit, MCU)是一種集成電路芯片,它將計算機的CPU、存儲器、輸入/輸出接口等集成在一塊芯片上,用于控制各種電子設備。單片機燒錄程序是指將編寫
    的頭像 發表于 09-02 10:04 ?3162次閱讀

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

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

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

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

    stm32單片機燒錄程序會擦除原來的程序

    在STM32單片機燒錄程序的過程中, 通常情況下會擦除原來的程序 ,并將新程序寫入單片機的閃存(Flash)中。這一過程是通過燒錄工具(如S
    的頭像 發表于 09-02 09:42 ?4729次閱讀

    藍牙模塊如何實現單片機和手機端數據互傳

    ZX-D30、ZX-D37、ZX-D32等。 藍牙模塊設置 : 將藍牙模塊與單片機連接。通常,藍牙模塊通過串口(UART)與單片機通信。 設置藍牙模塊的工作模式和參數,例如波特率、名稱、停止位、數據位等。這通常通過發送特定的AT命令來完成。 編寫
    的頭像 發表于 07-24 17:59 ?5681次閱讀
    藍牙模塊如何實現<b class='flag-5'>單片機</b>和手機端數據互傳
    主站蜘蛛池模板: 久久99精国产一区二区三区四区 | 欧美牲交A欧美牲交 | 60岁老年熟妇在线无码 | 日本伦理片 中文字幕 | 爱啪国产精品视频在线 | 色-情-伦-理一区二区三区 | 国产精品1区2区 | 国产AV无码熟妇人妻麻豆 | 伊人国产在线播放 | 国产老师开裆丝袜喷水漫画 | 91精品国产高清久久久久久 | 国产精品久久久久无码AV色戒 | yellow片高清视频免费看 | 国产人人为我我为人人澡 | 欧美 另类 美腿 亚洲 无码 | 国产偷抇久久精品A片蜜臀A | 欧美日韩亚洲第一区在线 | 久久精品亚洲热综合一本 | 国产精品自在在线午夜精品 | 亚洲AV成人无码网天堂 | 国产精品亚洲精品日韩电影 | 国产成人小视频在线观看 | 99久久精品毛片免费播放 | 国产精品女主播主要上线 | 2020精品国产视 | 二次元美女扒开内裤喷水 | 最近韩国HD免费观看国语 | 一个人的免费完整在线观看HD | 俄罗斯美幼 | yellow在线观看免费直播 | 亚洲人成在线观看一区二区 | 99久久精品一区二区三区 | 亚洲理论在线a中文字幕 | 日本伦理片 中文字幕 | 国产日韩亚洲专区无码 | 在线视频 国产精品 中文字幕 | 全彩无翼污之邪恶女教师 | 一个人的免费高清影院 | 欧美亚洲国产手机在线有码 | 国产免费内射又粗又爽密桃视频 | 国产午夜三区视频在线 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品