91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

淺述單片機(jī)程序的整體框架設(shè)計(jì)的思路體會(huì)

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

掃碼添加小助手

加入工程師交流群

一些初學(xué)單片機(jī)的同學(xué),剛剛?cè)胧肿?a href="http://m.makelele.cn/v/tag/586/" target="_blank">單片機(jī)開發(fā),還沒有涉及到使用RTOS,且剛?cè)胧种苯由蟁TOS可能會(huì)有些難度,有的使用的相對(duì)較老單片機(jī)資源還有限,也不適合跑RTOS。

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

為啥要討論架構(gòu)

單片機(jī)系統(tǒng)開發(fā)人員的目標(biāo)之一是在編程環(huán)境中創(chuàng)建固件,以實(shí)現(xiàn)低成本系統(tǒng)、軟件可靠性以及快速的開發(fā)迭代時(shí)間。實(shí)現(xiàn)這種編程環(huán)境的最佳方法實(shí)踐是使用統(tǒng)一的固件架構(gòu)體系結(jié)構(gòu),該體系結(jié)構(gòu)在產(chǎn)品開發(fā)過程中充當(dāng)框架并支持“固件模塊化”,或稱為子系統(tǒng)。

如果不采用統(tǒng)一的設(shè)計(jì)架構(gòu),那么其業(yè)務(wù)需求耦合關(guān)系復(fù)雜,不采用先設(shè)計(jì)-后開發(fā)的方法論,想到哪里寫到哪里,則程序后期維護(hù)將變得異常艱辛,而引入潛在bug/缺陷的風(fēng)險(xiǎn)也將大大增加,且不具備多人協(xié)同開發(fā)的可能。

可以結(jié)合固件模塊化、可測試性和兼容性的正確組合的設(shè)計(jì)體系架構(gòu)結(jié)構(gòu)應(yīng)用于任何固件開發(fā)項(xiàng)目,以最大程度地提高代碼可復(fù)用性,加快固件調(diào)試速度并提高固件可移植性。

模塊化架構(gòu)設(shè)計(jì)?

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

模塊化/子系統(tǒng)化有助于協(xié)調(diào)團(tuán)隊(duì)中許多人的并行工作,管理項(xiàng)目各個(gè)部分之間的相互依賴關(guān)系,并使設(shè)計(jì)人員、系統(tǒng)集成人員能夠以可靠的方式組裝復(fù)雜的系統(tǒng)。具體來說,它可以幫助設(shè)計(jì)人員實(shí)現(xiàn)和管理復(fù)雜性。

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

即便是一個(gè)人獨(dú)立開發(fā)一個(gè)項(xiàng)目,這樣做依然在代碼的調(diào)試、可讀性、可移植性方面是最佳實(shí)踐的整體策略。如果代碼設(shè)計(jì)良好,則在其他項(xiàng)目可以輕松應(yīng)用。而且模塊經(jīng)過上一項(xiàng)目的測試驗(yàn)證,在新的項(xiàng)目中再次應(yīng)用其缺陷風(fēng)險(xiǎn)將大幅降低。

所以每做一個(gè)項(xiàng)目,以這種策略不斷積累模塊“輪子”組件,隨著經(jīng)驗(yàn)的增長,積累的“輪子”就越來越多,也越來越好。所以其優(yōu)點(diǎn)是顯而易見的,否則每做一個(gè)項(xiàng)目,都從輪子造起,開發(fā)時(shí)間長不說,開發(fā)水平也得不到提高,重復(fù)性工作也很枯燥。比如前文中談到的非易失存儲(chǔ)管理子系統(tǒng),如設(shè)計(jì)良好,就變成一個(gè)可靠的可移植的輪子。這段話請(qǐng)深入理解,并拿走不謝!

固件模塊原理

固件開發(fā)中模塊化編程的基本概念是創(chuàng)建固件模塊。從概念上講,模塊代表關(guān)注點(diǎn)分離。在計(jì)算機(jī)科學(xué)中,關(guān)注點(diǎn)分離是將計(jì)算機(jī)程序分解為功能很少重疊的獨(dú)特功能的過程。關(guān)注點(diǎn)是程序的任何關(guān)注點(diǎn)或功能,并且與功能或行為同義。關(guān)注點(diǎn)分離的發(fā)展傳統(tǒng)上是通過模塊化和封裝來實(shí)現(xiàn)的,其實(shí)也就是解耦思想。

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

與很多上層用戶模塊都有關(guān)的代碼被實(shí)現(xiàn)為單獨(dú)的固件模塊。常見的如底層硬件相關(guān)的抽象實(shí)現(xiàn)。例如,hal_adc.c 是ADC用戶模塊的固件模塊,而hal_timer.c是Timer用戶模塊的固件模塊。

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

特定應(yīng)用程序的代碼實(shí)現(xiàn)為單獨(dú)的固件模塊。例如,app_battery.c是電池充電器應(yīng)用程序的固件模塊。特定工具的代碼實(shí)現(xiàn)為單獨(dú)的固件模塊。例如,debug_print.c是用于實(shí)現(xiàn)日志打印功能的固件模塊。

。。。。。。

實(shí)施估計(jì)模塊化設(shè)計(jì)的一些規(guī)則:

所有與模塊相關(guān)的功能都應(yīng)集成到單個(gè)源文件中,這是高內(nèi)聚的體現(xiàn)。

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

在源文件中包括自檢代碼部分,以實(shí)現(xiàn)該模塊模塊的所有自檢功能。

固件模塊的接口應(yīng)經(jīng)過精心設(shè)計(jì)和定義。

由于固件取決于硬件,因此需要在源文件頭中明確提及硬件的相關(guān)性。比如利用宏將硬件依賴轉(zhuǎn)定義,或者利用函數(shù)將基本操作進(jìn)行封裝。則在新的架構(gòu)體系,僅僅需要移植這部分實(shí)現(xiàn)即可使用。

通常,固件模塊可供其他團(tuán)隊(duì)成員在其他項(xiàng)目中使用。可能涉及到管理更改,缺陷修復(fù)、所有者應(yīng)維護(hù)模塊。源文件頭應(yīng)包含“作者”和“版本”信息。

固件在某種程度上取決于編譯器。源文件頭中應(yīng)聲明基于什么開發(fā)環(huán)境進(jìn)行過驗(yàn)證,以指定編譯器或與IDE相關(guān)的信息。

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

如何拆分模塊?

做工程開發(fā),一定是需求驅(qū)動(dòng)的。第一件事需要對(duì)需求有比較清晰的認(rèn)知,然后才能設(shè)計(jì)一個(gè)比較合理的框架。我們需要實(shí)現(xiàn)什么?大致總體設(shè)計(jì)過程策略我的基本采用如下圖所示思路(我比較喜歡繪圖,圖會(huì)讓人比較直觀)

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

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

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

哪些是業(yè)務(wù)邏輯需求,比如要采集一個(gè)傳感器量數(shù)據(jù),控制一個(gè)加熱裝置,那么這是高內(nèi)聚的需求。

哪些是算法相關(guān)的技術(shù)需求,比如產(chǎn)品中哪些信號(hào)需要濾波處理,哪些需要做頻域分析等等。

是否有對(duì)外的通信協(xié)議需求。

是否有業(yè)務(wù)數(shù)據(jù)需要?dú)v史存儲(chǔ),或者設(shè)備參數(shù)需要掉電保存

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

。。。。。。。。

不一而足。

結(jié)合固件模塊原理以及相關(guān)指導(dǎo)原則,那么將相關(guān)性高的需求,抽象實(shí)現(xiàn)在一系列的模塊中,在由這一系列模塊配合實(shí)現(xiàn)某個(gè)相關(guān)性高的業(yè)務(wù)需求,再進(jìn)一步這些模塊就變成一個(gè)子系統(tǒng)。多個(gè)子系統(tǒng)在main.c的調(diào)度下,協(xié)調(diào)完成產(chǎn)品的整體功能。

如何集成調(diào)度

對(duì)于某些不使用RTOS的應(yīng)用而言,可以使用如下的框架進(jìn)行:

void main(void){ /*各模塊初始化*/ init_module_1(); init_module_2(); 。。。。 while(1) { /*實(shí)現(xiàn)一個(gè)定時(shí)調(diào)度策略*/ if(timer50ms) { timer50ms = 0; app_module_1(); } if(timer100ms) { timer100ms = 0; app_module_2(); } /*異步請(qǐng)求處理,如中斷后臺(tái)處理*/ if(flag1) { communication_handler(); } 。。。。。 }}

對(duì)于基于RTOS的集成實(shí)現(xiàn)舉例:

void task1(void){ /*處理子系統(tǒng)相關(guān)的初始化*/ init_task1(); while(1) { /*應(yīng)用相關(guān)調(diào)用*/ task1_mainbody(); 。。。。 }}。。。.void taskn(void){ /*處理子系統(tǒng)相關(guān)的初始化*/ init_taskn(); while(1) { /*應(yīng)用相關(guān)調(diào)用*/ taskn_mainbody(); 。。。。 }}

void main(void){ /*一些基本硬件相關(guān)初始化,比如IO,時(shí)鐘,OS tick定時(shí)器等*/ init_hal(); 。。。。。。 /*一些基本RTOS初始化*/ init_os(); /*任務(wù)創(chuàng)建*/ os_creat(“task1”,task1,棧設(shè)置,優(yōu)先級(jí),。。。); 。。。。。。 os_creat(“taskn”,taskn,棧設(shè)置,優(yōu)先級(jí),。。。); /*啟動(dòng)OS調(diào)度器,交由OS調(diào)度管理應(yīng)用任務(wù)*/ os_start();}

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

總結(jié)一下

本文從為什么需要模塊化設(shè)計(jì)整體架構(gòu),到這樣做的好處,以及具體做的一些指導(dǎo)原則,再到實(shí)際中如何實(shí)現(xiàn),怎么做到高內(nèi)聚低耦合,提供了一些個(gè)人工作中的體會(huì)以及思路。

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

所有與模塊相關(guān)的功能都應(yīng)集成到單個(gè)源文件中,這是高內(nèi)聚的體現(xiàn)。

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

在源文件中包括自檢代碼部分,以實(shí)現(xiàn)該模塊模塊的所有自檢功能。

固件模塊的接口應(yīng)經(jīng)過精心設(shè)計(jì)和定義。

由于固件取決于硬件,因此需要在源文件頭中明確提及硬件的相關(guān)性。比如利用宏將硬件依賴轉(zhuǎn)定義,或者利用函數(shù)將基本操作進(jìn)行封裝。則在新的架構(gòu)體系,僅僅需要移植這部分實(shí)現(xiàn)即可使用。

通常,固件模塊可供其他團(tuán)隊(duì)成員在其他項(xiàng)目中使用??赡苌婕暗焦芾砀?,缺陷修復(fù)、所有者應(yīng)維護(hù)模塊。源文件頭應(yīng)包含“作者”和“版本”信息。

固件在某種程度上取決于編譯器。源文件頭中應(yīng)聲明基于什么開發(fā)環(huán)境進(jìn)行過驗(yàn)證,以指定編譯器或與IDE相關(guān)的信息。

極力建議采用先設(shè)計(jì)-后開發(fā)的模式,比較忌諱逐步debug,想到哪里寫到哪里。當(dāng)然對(duì)于新手學(xué)習(xí)而言,后一種模式,可以逐步漸進(jìn)迭代,也可以比較快的增長經(jīng)驗(yàn)。當(dāng)然如何取舍,全憑個(gè)人意愿。相信您如深入閱讀,細(xì)細(xì)體會(huì),應(yīng)該從設(shè)計(jì)思想上得到些領(lǐng)悟,有所提高。

編輯:jq

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

    關(guān)注

    6076

    文章

    45495

    瀏覽量

    670301
  • adc
    adc
    +關(guān)注

    關(guān)注

    100

    文章

    7511

    瀏覽量

    555943
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4417

    瀏覽量

    67502
  • RTOS
    +關(guān)注

    關(guān)注

    25

    文章

    866

    瀏覽量

    122979

原文標(biāo)題:詳述單片機(jī)固件模塊化架構(gòu)設(shè)計(jì)

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    單片機(jī)里的程序運(yùn)行方式

    我們想要理解單片機(jī)是如何運(yùn)行程序的,我們首先需要了解單片機(jī)的組成,我們這里以80C51單片機(jī)為例來理解程序
    發(fā)表于 01-16 06:57

    單片機(jī)如何燒錄程序?

    單片機(jī)如何燒錄程序
    發(fā)表于 01-08 07:04

    單片機(jī)解密是什么?

    單片機(jī)解密是什么? 單片機(jī)解密又叫單片機(jī)**,芯片解密,IC解密,但是這嚴(yán)格說來這幾種稱呼都不科學(xué),但已經(jīng)成 了習(xí)慣叫法,我們把CPLD解密,DSP解密都習(xí)慣稱為單片機(jī)解密。
    發(fā)表于 12-30 08:19

    浮思特 | 電子溫度計(jì)單片機(jī)如何選型?ABOV單片機(jī)提供幾點(diǎn)很關(guān)鍵!

    時(shí)需要關(guān)注的幾個(gè)核心要點(diǎn),并以行業(yè)常用的ABOV(現(xiàn)代單片機(jī))方案為例,分享一些實(shí)際的設(shè)計(jì)思路。一、測量精度與速度是首要考量溫度計(jì)的核心功能是測溫,其準(zhǔn)確性與響應(yīng)速度
    的頭像 發(fā)表于 12-15 09:43 ?464次閱讀
    浮思特 | 電子溫度計(jì)<b class='flag-5'>單片機(jī)</b>如何選型?ABOV<b class='flag-5'>單片機(jī)</b>提供幾點(diǎn)很關(guān)鍵!

    單片機(jī)程序的執(zhí)行

    更快的SRAM中,以得到更快的執(zhí)行速度。而對(duì)于,單片機(jī)而言工作頻率也就幾M,幾十M,從Flash中與從RAM中讀的差異可能并不明顯,不會(huì)成為程序執(zhí)行的瓶頸。 而對(duì)于PC而言,F(xiàn)lash的速度太慢
    發(fā)表于 12-04 06:20

    第1章 如何學(xué)習(xí)單片機(jī)

    ? 在錯(cuò)誤的道路上日夜兼程,最終也無法成功,方法和思路絕對(duì)是最重要的。本章節(jié)講到的學(xué)習(xí)單片機(jī)的方法,都是作者學(xué)習(xí)單片機(jī)的無數(shù)經(jīng)驗(yàn)和教訓(xùn)總結(jié)出來的瑰寶。通過作者前面的披荊斬棘,開辟了道路,可以告訴讀者
    的頭像 發(fā)表于 10-10 10:32 ?513次閱讀

    單片機(jī)燒錄原理是怎樣的?輝芒微單片機(jī)燒錄程序詳細(xì)步驟講解

    燒錄(Programming)就是把 .hex/.bin 文件里的機(jī)器碼搬運(yùn)進(jìn)單片機(jī)片內(nèi) Flash 的過程。輝芒微(FMD)單片機(jī)內(nèi)部有一塊 自舉 BootROM,上電時(shí)會(huì)先跑這段程序;如果檢測
    的頭像 發(fā)表于 09-17 16:14 ?2307次閱讀
    <b class='flag-5'>單片機(jī)</b>燒錄原理是怎樣的?輝芒微<b class='flag-5'>單片機(jī)</b>燒錄<b class='flag-5'>程序</b>詳細(xì)步驟講解

    單片機(jī)的儲(chǔ)存優(yōu)點(diǎn)是什么

    單片機(jī)作為嵌入式系統(tǒng)的核心,其儲(chǔ)存系統(tǒng)是實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)與程序運(yùn)行的關(guān)鍵部分。與獨(dú)立存儲(chǔ)芯片相比,單片機(jī)的儲(chǔ)存單元在集成度、功耗、可靠性等方面具備獨(dú)特優(yōu)勢,這些優(yōu)點(diǎn)使其能適應(yīng)從消費(fèi)電子到工業(yè)控制的多樣化
    的頭像 發(fā)表于 07-31 10:09 ?694次閱讀

    怎么測單片機(jī)系統(tǒng)頻率

    單片機(jī)系統(tǒng)頻率是指單片機(jī)工作時(shí)的時(shí)鐘頻率,它直接影響單片機(jī)的運(yùn)行速度和處理能力,準(zhǔn)確測量系統(tǒng)頻率對(duì)單片機(jī)應(yīng)用開發(fā)、程序調(diào)試和性能優(yōu)化具有重要
    的頭像 發(fā)表于 07-25 11:39 ?783次閱讀

    單片機(jī)怎么驅(qū)動(dòng)電機(jī)?

    在各類自動(dòng)化設(shè)備和智能裝置中,電機(jī)是重要的執(zhí)行部件,而單片機(jī)作為控制核心,需要通過特定的方式驅(qū)動(dòng)電機(jī)運(yùn)轉(zhuǎn)。單片機(jī)驅(qū)動(dòng)電機(jī)并非直接連接即可,而是要根據(jù)電機(jī)類型和功率,搭配合適的驅(qū)動(dòng)電路,才能實(shí)現(xiàn)穩(wěn)定
    的頭像 發(fā)表于 07-25 09:31 ?897次閱讀

    單片機(jī)是怎么控制的

    單片機(jī)作為電子系統(tǒng)的控制核心,通過接收外部信號(hào)、執(zhí)行預(yù)設(shè)程序、驅(qū)動(dòng)外部設(shè)備的方式實(shí)現(xiàn)控制功能,其控制過程涉及信號(hào)輸入、數(shù)據(jù)處理和指令輸出三個(gè)關(guān)鍵環(huán)節(jié),每個(gè)環(huán)節(jié)的協(xié)同配合決定了整體控制效果。 信號(hào)輸入
    的頭像 發(fā)表于 07-23 13:59 ?773次閱讀

    單片機(jī)怎么燒程序

    單片機(jī)程序是將編寫好的程序代碼寫入單片機(jī)內(nèi)部存儲(chǔ)單元,讓單片機(jī)按照預(yù)設(shè)邏輯工作的過程,是單片機(jī)
    的頭像 發(fā)表于 07-23 11:47 ?1273次閱讀

    單片機(jī)定制開發(fā)的設(shè)計(jì)思路

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

    STC單片機(jī)范例程序

    電子發(fā)燒友網(wǎng)站提供《STC單片機(jī)范例程序.zip》資料免費(fèi)下載
    發(fā)表于 06-04 16:27 ?10次下載

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

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