單片機非耦合業務邏輯框架

在小型單片機項目開發初期,由于業務邏輯相對簡單,我們往往較少關注程序架構層面的設計。

然而隨著項目經驗的積累,開發者會逐漸意識到模塊間的耦合問題:當功能迭代時,一處修改可能引發連鎖反應。

此時,構建松耦合的軟件架構便成為提升系統擴展性的關鍵

當前的代碼框架采用了一種基于全局變量的解耦設計模式。各模塊函數僅依賴底層驅動接口,無需跨模塊調用其他功能函數,而是通過修改特定標志位傳遞狀態信息。系統借助時間片輪詢機制,在每個調度周期內由輸出函數統一解析標志位狀態,據此決定執行邏輯或輸出動作。

這種設計有效隔離了模塊間的直接依賴,使得代碼維護與功能擴展更為靈活。

松耦合設計的核心特征

1. 全局變量驅動的通信機制

通過統一的狀態標識實現模塊間信息交互:

  • 狀態控制lock_flag?作為門鎖狀態標志,被解鎖模塊、報警模塊等共同讀寫;
  • 模式切換mode?變量定義系統工作模式(如待機、運行、調試),供電源管理、數據采集等模塊動態調用;
  • 異常追蹤password_error?記錄密碼錯誤次數,聯動提示音模塊、鎖定計時模塊觸發對應邏輯。
2. 任務調度的隔離性

各核心任務(如?key_proc()?按鍵處理、lcd_proc()?屏幕刷新、as608_proc()?指紋識別)遵循 “獨立執行” 原則:

  • 無交叉調用:任務間僅通過調度器分配的時間片(如 10ms / 次)輪詢激活,避免函數嵌套帶來的耦合風險;
  • 職責單一:每個任務專注處理專屬功能,如?lcd_proc()?僅負責界面渲染,不涉及其他模塊的業務邏輯。
3. 中斷服務的原子性
  • 串口中斷:各串口(UART1/2/3)中斷函數獨立解析接收數據,更新對應緩沖區全局變量(如?uart1_rx_buf),不介入其他模塊控制;
  • 定時器中斷:周期性刷新系統時鐘、采樣間隔等基礎變量(如?tick_count),與業務邏輯解耦,確保時序穩定性。

架構設計的顯著優勢

1. 高度模塊化開發
  • 并行協作:開發團隊可獨立調試單個模塊(如單獨測試指紋識別算法),無需依賴完整系統環境;
  • 敏捷擴展:新增功能(如藍牙通信模塊)僅需編寫獨立任務函數并注冊至調度器,零侵入式集成。
2. 低風險維護特性
  • 修改隔離:調整?lock_flag?的邏輯判斷條件時,僅需驗證門鎖模塊,不影響 LCD 顯示或串口通信功能;
  • 精準調試:通過監控全局變量(如?password_error?計數),可快速定位異常狀態,降低調試復雜度。
3. 嵌入式場景適配性
  • 資源優化:減少函數調用棧深度,避免因嵌套調用導致的內存溢出風險,適合 RAM/ROM 受限的 MCU(如 STM32F103);
  • 簡化同步:通過全局變量與時間片輪詢替代復雜的鎖機制或信號量,降低多任務協作的開發成本

舉個實際的例子:

在我定義的門鎖控制函數中,整個項目上下僅僅只有定義,和在主函數中調用兩個地方引用,在其他函數中卻沒有被調用。那么 門鎖處理函數 是在什么時候知道他需要實現函數呢?

我們可以看到在函數內部,調用了自身驅動的底層函數,他的形參告訴了這個函數什么時候使用。

所以我們只需要在其他函數內部去修改形參這個全局變量就行。

如下圖是全局標志位:可以看到在多個函數內容被修改讀寫。

類似的處理,我們可以稍加修改,在函數內部用判斷的方式來決定什么時候開什么時候關。

同理lock_flag 作為全局變量 被其他任意函數讀寫和修改,而lock_proc() 只需要做好判斷這個標志位并且執行對應操作就行。

那什么時候執行呢,當時是開始運行這個函數的時候,那問題又來了,什么時候運行呢。

這里我使用的是時間片輪詢的方式進行任務調度。

void lock_proc()  //門鎖處理函數
{if(lock_flag==1){lock(1);  //開舵機}else{lock(0);  //關舵機}}

-

業務邏輯大致可以分為兩個部分,但是其實沒有很必要去根據這個再去分層,因為上述的邏輯框架已經很清晰


輸入處理應該包含 :

- 硬件層面的輸入獲取
- 輸入數據的預處理(如按鍵消抖)
- 核心業務邏輯處理
- 狀態標志位的設置


- 輸出處理應該包含 :

- 狀態標志位的檢查
- 簡單的顯示邏輯(如格式化)
- 硬件輸出控制

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

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

相關文章

Zookeeper三臺服務器三節點集群部署(docker-compose方式)

1. 準備工作 - 服務器:3 臺服務器,IP 地址分別為 `10.10.10.11`、`10.10.10.12`、`10.10.10.13`。 - 安裝 Docker:確保每臺服務器已安裝 Docker 和 Docker Compose。 - 網絡通信:確保三臺服務器之間可以通過 IP 地址互相訪問,并開放以下端口: - `2181`:Zookeeper 客戶…

Mac關閉sip方法

Mac關閉sip方法 導航 文章目錄 Mac關閉sip方法導航完整操作流程圖詳細步驟 完整操作流程圖 這東西是我在網上搬運下來的,但是我在為業務實操過程中,根據實操情況還是有新的注意點的 詳細步驟 1.在「關于本機」-「系統報告」-「軟件」;查看SIP是否開啟…

C++| 深入剖析std::list底層實現:鏈表結構與內存管理機制

引言 std::list的底層實現基于雙向鏈表,其設計哲學與std::vector截然不同。本文將深入探討其節點結構、內存分配策略及迭代器實現原理,揭示鏈表的性能優勢和潛在代價。 1. 底層數據結構:雙向鏈表 每個std::list節點包含: 數據域…

漢諾塔問題——用貪心算法解決

目錄 一:起源 二:問題描述 三:規律 三:解決方案 遞歸算法 四:代碼實現 復雜度分析 一:起源 漢諾塔(Tower of Hanoi)問題起源于一個印度的古老傳說。在世界中心貝拿勒斯&#…

【Python】Python 100題 分類入門練習題 - 新手友好

Python 100題 分類入門練習題 - 新手友好篇 - 整合篇 一、數學問題題目1:組合數字題目2:利潤計算題目3:完全平方數題目4:日期天數計算題目11:兔子繁殖問題題目18:數列求和題目19:完數判斷題目21…

【linux】--- 進程概念

進程概念 1.認識馮諾依曼結構2. 操作系統(Operator system)2.1 概念2.2 設計OS的目的2.3 理解操作系統2.4 如何理解管理2.5 理解系統調用和庫函數 3. 進程3.1 基本概念和基本操作3.1.1 描述進程 - PCB3.1.2 task_struct3.1.3 查看進程 3.2 進程狀態3.2.1 運行&&…

算法堆排序記錄

【算法】排序算法之堆排序 - 知乎 應用場景:獲取第n個大或者小的數 操作步驟: 1、將數組構造成堆 2、調整根節點為最大堆 ->倒序對每個根節點執行最大化 ->根節點最大化過程中如果發生交換,需要保證子節點也為最大堆(執行…

STM32 模塊化開發實戰指南:系列介紹

本文是《STM32 模塊化開發實戰指南》系列的導讀篇,旨在介紹整個系列的寫作目的、適用讀者、技術路徑和每一篇的主題規劃。適合從事 STM32、裸機或 RTOS 嵌入式開發的個人開發者、初創工程師或企業項目團隊。 為什么要寫這個系列? 在嵌入式開發中,很多人剛開始都是從點亮一個…

【眼底輔助診斷開放平臺】項目筆記

這是一個標題 任務一前端頁面開發:后端接口配置: 任務二自行部署接入服務 日志修改樣式和解析MD文檔接入服務 Note前端登陸不進去/更改后端api接口304 Not Modifiedlogin.cache.jsonERR_CONNECTION_TIMED_OUT跨域一般提交格式proxy.ts src/coponents 目錄…

【后端開發】Spring MVC-計算器、用戶登錄、留言板

文章目錄 前后端分離設計接口設計思路項目問題解決思路 計算器需求分析接口定義前端頁面代碼服務器代碼 用戶登錄需求分析接口定義用戶登錄校驗接口查詢登錄用戶接口 前端頁面代碼用戶登錄校驗查詢登錄用戶 服務器代碼前后端交互 留言版需求分析接口定義獲取全部留言發布留言前…

在Ubuntu-22.04.5中安裝ONLYOFFICE DocSpace(協作空間)【注意:安裝失敗,謹慎參考!】

1. 通過Docker安裝 預計需要下載10G的鏡像。 (1)下載docspace安裝腳本 curl -fsSL https://download.onlyoffice.com/docspace/docspace-install.sh -o docspace-install.sh (2)修改docker compose的別名為docker-compose ali…

2025年計算機領域重大技術突破與行業動態綜述

——前沿技術重塑未來,開發者如何把握機遇? 2025年第一季度,全球計算機領域迎來多項里程碑式進展,從量子計算到人工智能,從芯片設計到網絡安全,技術革新與產業融合持續加速。本文梳理近三個月內最具影響力…

一、LLM 大語言模型初窺:起源、概念與核心原理

一、初識大模型 1.1 人工智能演進與大模型興起:從A11.0到A12.0的變遷 AI 1.0時代(2012-2022年) 感知智能的突破:以卷積神經網絡(CNN)為核心,AI在圖像識別、語音處理等感知任務中超越人類水平。例如&#…

Redis 分布式鎖+秒殺異步優化

文章目錄 問題思路setnx實現鎖誤刪問題和解決方案Redis Lua腳本問題引出解決方案 setnx實現的問題Redission快速入門redission可重入鎖原理 秒殺優化(異步優化)異步秒殺思路秒殺資格判斷Redis消息隊列 問題 比如我們兩個機器都部署了我們項目,這里nginx使用輪詢的方…

機器學習中的距離度量與優化方法:從曼哈頓距離到梯度下降

目錄 前言一、曼哈頓距離(Manhattan Distance):二、切比雪夫距離 (Chebyshev Distance):三、 閔可夫斯基距離(Minkowski Distance):小結四、余弦距離(Cosine Distance)五、杰卡德距離(Jaccard Distance)六、交叉驗證方法6.1 HoldOut Cross-v…

HTML 嵌入標簽對比:小眾(<embed>、<object>) 與 <iframe> 的優缺點及使用場景和方式

需求背景 在網頁開發中&#xff0c;嵌入外部資源預覽&#xff08;如視頻、PDF、地圖或其他網頁&#xff09;是常見的需求。HTML 提供了多種標簽來實現這一功能&#xff0c;其中 <embed>、<object> 和 <iframe> 是最常用的三種。本文將對比它們的優缺點&…

未來七軸機器人會占據主流?深度解析具身智能方向當前六軸機器人和七軸機器人的區別,七軸力控機器人發展會加快嗎?

六軸機器人和七軸機器人在設計、功能和應用場景上存在明顯區別。六軸機器人是工業機器人的傳統架構&#xff0c;而七軸機器人則在多自由度和靈活性方面進行了增強。 本文將在理解這兩者的區別以及為何六軸機器人仍然是市場主流&#xff0c;從多個方面進行深入解讀六軸和七軸區…

C++基礎精講-07

文章目錄 1. const對象2. 指向對象的指針3. 對象數組4. c中const常見用法總結4.1 修飾常量4.2 修飾指針4.3 修飾函數參數4.4 修飾函數返回值4.5 修飾成員函數4.6 const對象 5. 賦值運算符函數&#xff08;補充&#xff09;5.1 概念5.2 默認賦值運算符函數局限5.3 解決辦法 1. c…

軟件測試之接口測試用例設計

1.接口測試用例設計簡介 我們對系統的需求分析完成之后&#xff0c;即可設計對應的接口測試用例&#xff0c;然后用接口測試用例進行接口測試。接口測試用例的設計也需要用到黑盒測試方法&#xff0c;其與功能測試用例設計的方法類似&#xff0c;接口測試用例設計中還需要增加…

(2)VTK C++開發示例 --- 繪制多面錐體

文章目錄 1. 概述2. CMake鏈接VTK3. main.cpp文件4. 演示效果 更多精彩內容&#x1f449;內容導航 &#x1f448;&#x1f449;VTK開發 &#x1f448; 1. 概述 VTK C開發示例程序&#xff1b; 使用C 和VTK繪制一個多面錐體。 環境說明系統ubuntu22.04、windows11cmake3.22、3.2…