嵌入式軟件架構規范之 - 分層設計

一、規范的核心思想:驅動文件的“獨立性”與“復用性”

該規范的本質是通過分層隔離,實現驅動代碼的高復用性、低耦合性,確保驅動模塊僅關注“硬件操作邏輯”,不依賴上層業務或下層硬件接口的具體實現細節。其核心要求包括:

二、關鍵要點解析

1. 驅動文件不能包含應用層內容
  • 應用層定義:指與具體業務邏輯相關的代碼(如業務狀態機、數據處理邏輯、通信協議解析等)。
  • 原因
    • 驅動是“硬件操作的抽象層”,應專注于控制硬件(如GPIO讀寫、SPI通信時序),而非處理業務數據。
    • 若驅動包含應用層邏輯,會導致驅動與特定業務強綁定,無法在其他項目中復用。
  • 舉例
    • 錯誤示范(驅動包含應用層邏輯):
      // 驅動文件(錯誤):在LED驅動中處理“按鍵狀態→LED亮滅”的業務邏輯
      void LED_Driver_Process(void) {if (Key_GetState() == PRESS) {  // 調用應用層的按鍵狀態獲取函數LED_On();} else {LED_Off();}
      }
      
    • 正確示范(驅動僅封裝硬件操作):
      // 驅動文件(正確):僅提供LED的硬件控制接口
      void LED_Init(void) {// 初始化GPIO引腳為輸出模式
      }
      void LED_On(void) {// 寫寄存器使LED點亮
      }
      void LED_Off(void) {// 寫寄存器使LED熄滅
      }
      
    • 應用層調用驅動(業務邏輯與驅動分離):
      // 應用層文件:獨立處理按鍵與LED的邏輯
      void App_Main(void) {while (1) {if (Key_Detect()) {  // 應用層自己處理按鍵檢測LED_On();  // 調用驅動提供的接口} else {LED_Off();}}
      }
      
2. 驅動文件不能包含底層接口定義
  • 底層接口定義:指直接操作硬件寄存器的函數或宏(如寄存器地址定義、寄存器位操作等)。
  • 原因
    • 底層接口與具體芯片型號強相關(如STM32的寄存器地址 vs. 瑞薩的寄存器地址),若驅動依賴底層接口,會導致驅動無法跨芯片平臺復用。
    • 應通過“硬件抽象層(HAL)”或“芯片適配層”隔離底層差異,驅動僅調用抽象后的接口。
  • 舉例
    • 錯誤示范(驅動直接操作底層寄存器):
      // 驅動文件(錯誤):直接使用STM32的寄存器地址
      #define LED_GPIO_PORT GPIOA
      #define LED_GPIO_PIN GPIO_PIN_5
      void LED_On(void) {LED_GPIO_PORT->BSRR = LED_GPIO_PIN;  // 直接操作STM32的寄存器
      }
      
    • 正確示范(驅動調用底層抽象接口):
      // 底層抽象層(芯片適配層),提供統一接口
      // hal_gpio.h
      void HAL_GPIO_Write(GPIO_TypeDef* port, uint16_t pin, GPIO_State state);// 驅動文件(正確):通過抽象接口操作硬件
      void LED_On(void) {HAL_GPIO_Write(LED_GPIO_PORT, LED_GPIO_PIN, GPIO_HIGH);  // 調用抽象接口
      }
      
    • 底層實現(以STM32為例)
      // hal_gpio.c(STM32適配)
      void HAL_GPIO_Write(GPIO_TypeDef* port, uint16_t pin, GPIO_State state) {if (state == GPIO_HIGH) {port->BSRR = pin;} else {port->BSRR = (uint32_t)pin << 16;  // BRR寄存器操作}
      }
      

三、分層架構示意圖

應用層(業務邏輯)
├─ 調用驅動接口(如LED_On())
│
驅動層(硬件操作抽象)
├─ 調用底層抽象接口(如HAL_GPIO_Write())
│
底層適配層(芯片相關)
└─ 直接操作寄存器(如STM32的GPIO寄存器)

四、遵循規范的優勢

  1. 驅動復用性最大化
    • 同一驅動(如LED驅動)可直接用于STM32、瑞薩、ESP32等不同芯片平臺,只需修改底層適配層。
  2. 維護成本降低
    • 硬件變更時(如更換芯片型號),只需修改底層適配層,驅動層和應用層代碼無需改動。
  3. 分工清晰
    • 驅動開發人員專注于硬件操作邏輯,應用開發人員專注于業務邏輯,底層開發人員專注于芯片適配,提高協作效率。

五、常見反例與修正

反例場景錯誤代碼(驅動文件)修正后代碼(驅動文件)
驅動包含業務邏輯void LCD_ShowData(int data)
(直接處理數據格式化)
void LCD_DrawPixel(int x, int y)
(僅提供畫點接口,數據格式化由應用層處理)
驅動依賴具體芯片寄存器#define UART_DR (*(volatile uint32_t*)0x40013804)調用 HAL_UART_Transmit(&huart1, buf, len, timeout)
(通過HAL庫抽象接口)

六、總結

該規范是嵌入式軟件“分層設計”的核心原則之一,核心目標是通過驅動層→底層適配層→應用層的解耦,實現“一次編寫,多平臺復用”的驅動代碼。實際開發中,可結合具體項目需求,通過硬件抽象層(HAL)或板級支持包(BSP)實現底層接口的隔離,確保驅動模塊的獨立性和可移植性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/80896.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80896.shtml
英文地址,請注明出處:http://en.pswp.cn/web/80896.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PyQt5繪圖全攻略:QPainter、QPen、QBrush與QPixmap詳解

摘要&#xff1a;掌握PyQt5繪圖核心控件&#xff0c;輕松實現窗體繪圖、文字渲染、幾何圖形繪制及圖像加載。本文附帶完整代碼示例與效果圖&#xff0c;助你快速上手GUI圖形開發。 繪圖基礎&#xff1a;為什么需要這些控件&#xff1f; 在GUI開發中&#xff0c;繪圖功能是數據…

C++學習:六個月從基礎到就業——多線程編程:std::thread基礎

C學習&#xff1a;六個月從基礎到就業——多線程編程&#xff1a;std::thread基礎 本文是我C學習之旅系列的第五十四篇技術文章&#xff0c;也是第四階段"并發與高級主題"的第一篇&#xff0c;介紹C11引入的多線程編程基礎知識。查看完整系列目錄了解更多內容。 引言…

【計算機網絡】TCP如何保障傳輸可靠性_筆記

文章目錄 一、傳輸可靠性的6方面保障二、分段機制三、超時重傳機制四、流量控制五、擁塞控制 提示&#xff1a;以下是本篇文章正文內容&#xff0c;下面案例可供參考 源網站 按TCP/IP 4層體系&#xff0c;TCP位于傳輸層&#xff0c;為應用層提供服務 一、傳輸可靠性的6方面保障…

2025年保姆級教程:Powershell命令補全、主題美化、文件夾美化及Git擴展

文章目錄 1. 美化 Powershell 緣起2. 安裝 oh-my-posh 和 posh-git3. 安裝文件夾美化主題【可選】 1. 美化 Powershell 緣起 背景&#xff1a;用了 N 年的 Windows 系統突然覺得命令行實在太難用了&#xff0c;沒有補全功能、界面也不美觀。所以&#xff0c;我決定改變它。但是…

基于Mongodb的分布式文件存儲實現

分布式文件存儲的方案有很多&#xff0c;今天分享一個基于mongodb數據庫來實現文件的存儲&#xff0c;mongodb支持分布式部署&#xff0c;以此來實現文件的分布式存儲。 基于 MongoDB GridFS 的分布式文件存儲實現&#xff1a;從原理到實戰 一、引言 當系統存在大量的圖片、…

【Linux】Linux安裝并配置Redis

目錄 1.安裝 2.啟動服務 3.配置 3.1.綁定地址 3.2.保護模式 3.3.持久化選項 3.3.1.RDB 持久化 3.3.2.AOF 持久化 3.3.3.如何選擇 1.安裝 Redis 可以從默認的 CentOS 軟件倉庫中安裝。運行以下命令來安裝 Redis sudo dnf install redis -y 響應如下 2.啟動服務 安裝完成后&…

python-數據可視化(大數據、數據分析、可視化圖像、HTML頁面)

通過 Python 讀取 XLS 、CSV文件中的數據&#xff0c;對數據進行處理&#xff0c;然后生成包含柱狀圖、扇形圖和折線圖的 HTML 報告。這個方案使用了 pandas 處理數據&#xff0c;matplotlib 生成圖表&#xff0c;并將圖表嵌入到 HTML 頁面中。 1.XSL文件生成可視化圖像、生成h…

黑馬點評相關知識總結

黑馬點評的項目總結 主要就黑馬點評項目里面的一些比較重要部分的一次總結&#xff0c;方便以后做復習。 基于Session實現短信登錄 短信驗證碼登錄 這部分使用常規的session來存儲用戶的登錄狀態&#xff0c;其中短信發送采取邏輯形式&#xff0c;并不配置云服務驗證碼功能。…

手搓四人麻將程序

一、麻將牌的表示 在麻將游戲中&#xff0c;總共有一百四十四張牌&#xff0c;這些牌被分為多個類別&#xff0c;每個類別又包含了不同的牌型。具體來說&#xff0c;麻將牌主要包括序數牌、字牌和花牌三大類。序數牌中&#xff0c;包含有萬子、條子和筒子&#xff0c;每種花色…

【Java高階面經:數據庫篇】17、分庫分表分頁查詢優化:告別慢查詢與內存爆炸

一、分庫分表基礎&#xff1a;策略與中間件形態 1.1 分庫分表核心策略 分庫分表是應對海量數據存儲和高并發訪問的關鍵架構設計&#xff0c;其核心在于將數據分散到不同的數據庫或表中&#xff0c;以突破單庫單表的性能限制。常見的分庫分表策略包括&#xff1a; 1.1.1 哈希…

貪心算法之跳躍游戲問題

問題背景 本文背景是leetcode的一道經典題目&#xff1a;跳躍游戲&#xff0c;描述如下&#xff1a; 給定一個非負整數數組 nums&#xff0c;初始位于數組的第一個位置&#xff08;下標0&#xff09;。數組中的每個元素表示在該位置可以跳躍的最大長度。判斷是否能夠到達最后…

Label Studio:開源標注神器

目錄 一、Label Studio 是什么&#xff1f; 二、核心功能大揭秘 2.1 多類型數據全兼容 2.2 個性化定制隨心配 2.3 團隊協作超給力 2.4 機器學習巧集成 三、上手實操超簡單 3.1 安裝部署不頭疼 3.1.1 Docker安裝 3.1.2 pip安裝 3.1.3 Anaconda安裝 3.2 快速開啟標注…

創建信任所有證書的HttpClient:Java 實現 HTTPS 接口調用,等效于curl -k

在 Java 生態中&#xff0c;HttpClient 和 Feign 都是調用第三方接口的常用工具&#xff0c;但它們的定位、設計理念和使用場景有顯著差異。以下是詳細對比&#xff1a; DIFF1. 定位與抽象層級 特性HttpClientFeign層級底層 HTTP 客戶端庫&#xff08;處理原始請求/響應&#…

從零基礎到最佳實踐:Vue.js 系列(7/10):《常用內置 API 與插件》

引言 Vue.js 是一款輕量且強大的前端框架&#xff0c;因其易用性和靈活性受到廣泛歡迎。無論是初學者還是資深開發者&#xff0c;都可以通過其內置 API 和插件生態快速構建高效、可維護的 Web 應用。本文將從基礎用法講起&#xff0c;逐步深入到進階技巧&#xff0c;結合大量實…

線性代數:AI大模型的數學基石

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;10年以上C/C, C#, Java等多種編程語言開發經驗&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開…

Java-System工具類深度解析

Java-System工具類深度解析 前言一、System 類概述1.1 基本定義與特點1.2 重要成員變量 二、標準輸入輸出功能2.1 標準輸入&#xff08;System.in&#xff09;2.2 標準輸出&#xff08;System.out&#xff09;2.3 標準錯誤輸出&#xff08;System.err&#xff09; 三、系統屬性…

刪除用戶憑證

Git 部分倉庫無法操作&#xff0c;部分倉庫沒問題 問題出現 我用個人電腦修改了項目&#xff0c;提交了git。然后第二天在公司電腦git pull的時候失敗&#xff0c;只有部分倉庫&#xff0c;git colne直接失敗&#xff0c;部分倉庫無問題。 解決方式 刪除git相關憑證&#xff…

19. 結合Selenium和YAML對頁面實例化PO對象改造

19. 結合Selenium和YAML對頁面實例化PO對象改造 一、架構升級核心思路 1.1 改造核心目標 # 原始PO模式&#xff1a;顯式定義元素定位 username (id, ctl00_MainContent_username)# 改造后PO模式&#xff1a;動態屬性訪問 self.username.send_keys(Tester) # 自動觸發元素定…

鴻蒙App開發學習路徑

以下是一份系統的鴻蒙&#xff08;HarmonyOS&#xff09;App開發學習路徑&#xff0c;適合從零開始逐步掌握相關技能&#xff1a; 1. 基礎知識儲備 1.1 理解鴻蒙系統 鴻蒙核心特性&#xff1a;分布式能力、一次開發多端部署、原子化服務、ArkUI框架。與Android/iOS的區別&…

spring boot啟動報錯:2002 - Can‘t connect to server on ‘192.168.10.212‘ (10061)

錯誤代碼 10061 通常表明無法建立到指定服務器的網絡連接。這個錯誤屬于 Windows Sockets 錯誤代碼&#xff0c;具體指的是無法建立網絡連接&#xff0c;通常是因為目標地址不可達。以下是一些解決此問題的步驟&#xff1a; 檢查 IP 地址和端口&#xff1a; 確保你輸入的 IP …