1. 程式人生 > >如何在裸機下設計一個嵌入式系統架構?

如何在裸機下設計一個嵌入式系統架構?

實踐 嵌入式開發 charts 影響 dex 接收 智能家居 結合 刷新

如何在裸機下設計一個嵌入式系統架構?

如何不使用操作系統的情況下設計一個嵌入式系統的架構呢?比如串口數據如何接受,串口數據協議在什麽地方解析,SPI總線的數據如何有效的接收?等等問題。如何設計,才能盡量保證各個模塊的效率呢?自己有一些設計,想一起討論下。比如串口的數據先在中斷程序中放入一個大數組中,然後在主程序中解析接收到的數據,等等~~還有哪些技巧呢? 被瀏覽 7,457

8 個回答

技術分享圖片 Tony Ho 嵌入式與物聯網

狀態機與時間觸發是其中的兩個方向(不一定準確,僅供參考):
1. 時間觸發
建議你看一下下面這本書:
時間觸發嵌入式系統設計模式 (豆瓣)
很久前讀的是英文版,1000多頁,易讀,且有source code,因此結合使用proteus仿真驗證。另外這本書有許多構建冗余與健壯性嵌入式系統的諸多討論。
2. 狀態機
可以看一下CS專業的自動機相關圖書,例如《自動機理論與應用》。另外可以看看傻的一些文章,如果你有amobbs的賬號的話:
[FSM]狀態機實踐入門——程咬金只要三斧頭厲害 (amoBBS 阿莫電子論壇)
[學海拾貝]狀態機思路在單片機程序設計中的應用 (amoBBS 阿莫電子論壇)
QP?狀態機框架學習之菜鳥範例(一):閃燈(MDK,STM32F10x) (amoBBS 阿莫電子論壇)

前面 @橋裏 提到的基於事件觸發也是一種。在各類物聯網芯片(2.4G)中用得不少。
最後謝邀,希望回答對你有幫助。
編輯於 2016-02-03 技術分享圖片 夏宇航 學通信做嵌入式智能硬件的網管 以下全程無幹貨
利益相關:只做過小程序,了解 51 arduino cortex-m4
根據我的理解,有兩種方式,一種方式是類似於時間片,大部分代碼都放在中斷中,比如串口中斷定時器中斷,大部分時間單片機處於空閑狀態,觸發中斷後盡快完成響相應工作,優點是功耗低,在邏輯不太復雜時候比較方便,不用控制不同功能之間的影響,缺點是如果有耗時比較長的操作(如模擬spi i2c總線)有可能不穩定,且debug比較麻煩,適用於時間長邏輯少的功能,比如智能家居的燈控制,zigbee的根節點是這麽實現的
另外一種方式是大部分代碼從主函數中順序執行,串口等接收後存入數組或者解析後存入數組,之後程序繼續執行,到達函數或代碼塊後再進行處理,優點是程序容易控制流程,debug方便,缺點是功耗比較大,程序效率不太高,適用於邏輯復雜或計算量大的功能,比如自動控制等
編輯於 2015-02-26 技術分享圖片 in nek KL@HS

如果你的系統不復雜,你的所有問題就簡單的是一個如何設計狀態機的問題,你構造你的狀態機模型就可以了。這個有很多書可以看,狀態機就三個要素:狀態,躍遷條件和Action,剩下的問題只是代碼組織,那是個獨立主題。

如果你的系統較復雜,你的問題根本就是“如何設計一個嵌入式操作系統”,這個,你按這個題目去查資料就好了。

你想問題想得太高了,什麽串口處理放在哪裏處理什麽的,根本不著邊際。你有問題解決問題,想你的CPU現在應該幹什麽才是正道。 編輯於 2015-12-30 技術分享圖片 靳小都 做正確的事的一枚小碼農 自己設計了一個
主要是基於FreeRTOS設計
使用事件的方式,有一個任務專門處理其他任務發送過來的事件,類似於消息處理機制。
串口使用循環緩沖區的方案,發送來的數據先放到循環緩沖區中,這樣效率可能不是很高。
串口日誌輸出,使用一個buff,然後使用空閑任務刷新這個buff。
其他---
發布於 2016-08-17 技術分享圖片 STM32 ST腦殘粉

Practical UML Statecharts in C/C++, Second Edition: Event-Driven Programming for Embedded Systems

神書,網上可以找到電子版的中文版和英文版。我覺得還是看英文版好點。 發布於 2015-12-28 技術分享圖片 橋裏 我讀書少只上了五年小學,你別騙我 去學習嵌入式架構,給你個建議,事件驅動多任務系統架構 發布於 2015-09-13 技術分享圖片 chau rong 破繭成蝶

確定執行的框架:
一個while循環裏面檢查串口是否有輸入,在判斷每個字符的時候,執行 switch_job(),
switch_job()裏面做如下工作:
1. 定時處理,檢查定時器是否到期,到期則定時處理。
2. 消息處理,檢查消息隊列是否有數據,(消息隊列裏的數據會在中斷裏面寫入)有則處理。

================================================================
以上就實現了一個裸系統的shell,周期處理,基於消息的處理。這個架構下面不能延時處理要重新規劃。因為實際上除了中斷就是單線程的。
發布於 2016-10-30 技術分享圖片 深夜吃不胖 跟風公眾號:轉行碎碎念。MyLostStory。

其實重要的是架構。
一個典型的項目包括按鍵輸入,顯示輸出,通訊。恰好我就是這種。
模塊的組織以數據為核心,以狀態來判斷。按鍵輸入改變數據,顯示輸出提取數據。同一個按鍵同一個顯示在不同情況下功能不同,我通過狀態來分別。
存在問題是全局變量滿天飛,狀態很多,但是我目前找不到更好的方法。

顯示用顯存輸出, 發布於 2015-12-27

如何在裸機下設計一個嵌入式系統架構?