时间触发嵌入式系统设计模式 读书笔记
1 下載地址:
https://download.csdn.net/download/longzitailang8/10496129
本書前所未有地提出一整套軟件模式,為開發嵌入式軟件系統提供幫助。書中討論了基于廣為使用的8051系列微控制器進行設計并應用軟件 的方法。此外還重點關注了其可靠性。 本書中一共有超過70個軟件模式,并介紹了如何將這些技巧應用到你自己的項目中,作者為迅速創建各種各樣的嵌入式應用提供了很多實用的資料和建議。本書從簡單系列復雜系統。列舉了大量詳盡的的實例。
作者 英國人 Michael J Pont
http://www.engg.le.ac.uk/books/Pont
好像是打不開了
2 參考書
How_To_Design_Multiple_Tasks_Embedded_System_Demo.pdf
推薦的《時間觸發嵌入式系統設計模式》和《UML狀態圖的C/C++設計》
奉上《UML狀態圖的實用C/C++設計》中文書簽版和英文版,還有《時間觸發嵌入式系統設計模式.(patterns for time-triggered embedded systems.)》英文版,中文版《時間觸發嵌入式系統設計模式》
另外《pattern for time-triggered embedded system》我也是看英文版的,除了后面的一些應用實例沒看,其余的基本看完了,這是我覺得最易懂的一本書。建議樓主看英文的,會增加你對英文的興趣
Practical UML Statecharts in C.pdf
第二章 使用模式來設計嵌入式系統
巡航控制系統(cruise-control system,CCS)。
Hatley
Pirbhai
編寫了一本關于實時軟件設計的標準教科書。
Awad等(1996)
鬧鐘
第13章
合作式 調度器
本書中主要使用合作式調度器
并且有限制的使用混合式的調度器
進階閱讀
14 章 合作式調度器
OSAL —
Page213
(稍后補充)
15 需要下載的Keil C51 軟件:
https://www.keil.com/download/product/
進入Debug 模式
RUN
17 另外一本書
《C嵌入式編程設計模式》
英文名《Design Patterns for Embedded Systems in C》中文名《C嵌入式編程設計模式》這本書的源代碼
18 論壇討論 備忘
https://www.amobbs.com/thread-5468237-1-1.html?_dsign=112128f0
《時間觸發嵌入式系統設計模式》是一本好書
在概念上別被“基于時間觸發”束縛住。這只是任務調度的一種基本形式,而且
并不是萬能的,效率也不是最高的——如果你總是執著于用時間來觸發的話。其實,任務調度的關鍵只有以下三點:
1、用于調度的函數指針,及相關的TASK結構體
2、基于觸發的調度,觸發有很多種,時間恰好只是最笨的一類
3、從觸發來考慮,可以漸漸考慮基于消息觸發的結構
等你熟悉了基于消息觸發的系統,你的系統應該擁有了相當的復雜度,這個時候要考慮最簡化的形式:
即怎樣做到最簡單最靈活的“基于觸發的任務調度”?
最終結論:
基于事件觸發的調度器系統
進一步推論:
基于狀態的多任務系統
狀態機編程是一種非常有效的辦法。
尤其是基于 面向對象的編程。
關于狀態機,其實在傻孩子的《深入淺出AVR》和馬老師的《avr》書中都有涉及,當時僅僅感覺是個按鍵去抖的好方法。但慢慢接觸一些狀態機的文章后也發現,狀態機也可以做為程序的框架。
受益良多,我寫程序不多,沒有什么框架,結構的編程思想。程序如何組織,自己去想,很不規范。也很吃力。對于調度器,信息,事件,狀態等認識幾乎空白。可否推薦幾本書,系統的學習一下。
入門的話先用《時間觸發嵌入式設計》,接下來看《深入淺出MFC》(貌似只要頭幾個章節就可以了)
做到這兩步,基本上就可以自己去探索和實踐了,實踐一段時間以后看高煥堂的《UML+OOPC》,
然后就牛X了……
我現在做的一個食品機器,有紅外漫射探頭,檢測人手進入危險區域,同時也檢測按鍵是否按下。我用C++編寫,電機運轉,探頭檢測,按鍵檢測封裝在一起。運行電機的函數,如果作為任務加入任務隊列,但它1.不是只運行一次,2.不是周期的。3.不是一段確定的時間。它的結束是事件觸發的(就是位置檢測探頭檢測到運行到終點位置)。簡單照搬這個時間調度器的程序結構看來行不通。
比較好的一種就是被稱為“任務自回收式合作式調度器”。
說起來很簡單:
1、把一個大任務拆分成很多原形相同的子程序,每一個子程序都表示一個步驟(通常用來表示狀態機的一個狀態)。
而要求使用相同的原形,是為了使用函數指針。
2、每一個子程序都直接指定自己的后續(狀態機中就是指定下一個狀態的地址)
以上的內容就是經典的 “狀態機函數指針描述法(調度法)”,下面我要介紹基于這個方法的一個改進,也就是所謂
的任務自回收模式:
3、我們為調度的基本單位定一個TASK塊,這是常見的方法,在這個TASK塊里面有一個函數指針,指向TASK要運行的
具體任務(這也是常見的處理方法,沒什么稀奇的)。
4、TASK塊所運行的那個函數會有一個返回值,返回true或者false。定義true表示TASK塊指定的函數還要運行,false,
表示TASK快指定的那個函數不需要運行了。
5、建立一個TASK隊列,也就是傳說中的ready隊列,一定要用鏈表來做。
6、建立一個函數,叫做register_task()。這個函數接收一個函數指針(也就是要在注冊的時候指定運行的目標函數),
以及其他參數,比如運行目標函數的時候所要傳遞的參數列表等等(這個不重要)。這個register_task只干一件事情
就是從TASK池(堆)中申請一個TASK,按要求設置好它,最后扔到ready隊列里面。
6、亮點來了:調度器工作的時候,每次從隊列中取一個TASK,并運行其函數指針指向的函數。如果函數返回false,則
直接把TASK注銷——也就是仍回TASK池(堆描述的)中;如果函數返回true,先把當前的TASK注銷(同上),然后
根據剛才注銷TASK里面的內容(比如運行哪個函數,傳遞的參數列表之類),調用register_task()來注冊一個新任務。
-------------------------華麗的分割線----------------------------
這就是工作原理,用戶要做的事情永遠是調用register_task,系統每次都會立即自動注銷當前TASK。是不是很類似自動
垃圾收集的原理?你當然也可以稱其為任務的垃圾收集器。
那么怎么用呢?考慮以下幾種情況
1、建立新任務:當然是register_task(),這個不羅嗦
2、怎么在從一個子狀態(函數)跳到下一個子狀態呢?
a. 調用register_task,并把下一個子狀態函數傳遞給他.
b. 當前子狀態return false.
3、怎么結束一個任務?在沒有調用regiseter_task的情況下直接return false。
4、怎么知道當前系統有幾個活躍的線程?直接看ready隊列里面元素的數量。
5、怎么知道系統idle?直接看ready隊列是不是空……
6、還有其他特性么?有,簡單的在TASK塊里面加入一個函數指針的棧和簡單的修改,就可以支持子線程的調用,而不必
讓當前線程傻乎乎的在查詢子線程的狀態。
7、怎么讓事情變得簡單?
定義宏,比如把register_task分別定義成TRANSFER_TO_STATE(…) 、NEW_FSM()、CALL_SUB_FSM()等等……
…
8、這個系統支持多任務么?只要你很好的把每一個任務都拆分成細小的步驟,并用一個函數來描述,每一個這樣的函數
都是NONE-Block的,那么這個系統就是多任務的。這種模式有其適合狀態機。
9、如何定義系統允許的最大任務數量?和狀態機的狀態數量有關么?和狀態機狀態數量無關。任務的數量也是沒有限制的,
但是有一個最大活躍任務的限制。簡單說就是活著的任務有限制。這個當然直接由TASK池中TASK的數量限制的。
10、有最大的活躍人物限制對開發有什么限制么?其實沒有,因為register_task是一個有true/false返回的函數,因為系統
都是由狀態機編寫的。所以如果要考慮對最大活躍任務的兼容,你可以在調用register_task的時候檢測返回值,肯定是
返回true,才將當前的狀態返回false。這樣做以后,就變成用時間換資源了。當然,在極端的情況下,還是要考慮死鎖
的可能性。
-------------------------華麗的分割線----------------------------
關于這個調度器,請看帖子
http://www.ourdev.cn/thread-4319119-1-2.html
關于應用例子,請看帖子
http://www.ourdev.cn/thread-5468708-1-1.html
這個帖子含金量高了,記得以前有個51上跑最簡單的操作系統的帖子,說的也很精彩!!
這個帖子含金量高了,記得以前有個51上跑最簡單的操作系統的帖子,說的也很精彩!!
比較常見了,很多公司的單片機上都是跑這類小OS。再加上足狀態機,就可以簡單模擬進程、線程的概念。
可以是一個簡單的例子,假設有10個Led同時工作:
第1個一直閃爍,頻率1HZ;
第2個一直閃爍,頻率2HZ;
第3個一直閃爍,頻率3HZ;
第4個一直閃爍,頻率4HZ;
第5個一直閃爍,頻率5HZ;
第6個一直閃爍,頻率6HZ;
第7個一直閃爍,頻率7HZ;
第8個一直閃爍,頻率8HZ;
第9個一直閃爍,頻率9HZ;
第10個一直閃爍,頻率10HZ;
搞定這個,就會明白很多…
我也一直在學習借鑒一些程序框架。時間觸發,狀態機。事件驅動,基于消息的,太多了。原來農民講習所講過一個程序架構,后來在**ic上看到過王紹偉 的一個程序架構,發上來供大家討論。
論壇現在不知道為什么不能上傳附件。
http://www.study-bbs.com/thread-46471-1-1.html
這個是王工的一個程序框架
Xmega本身帶有事件驅動的。
你這個可以簡化 我早就用在PIC 上面了
鳳老大, 他的MS3的架構。 其基本思想是:時間觸發(混合式)調度器 + 簡單的消息觸發機制。
那個調度器,就是時間觸發嵌入式編程模式中講的那個“混合式調度器”, 而鳳老大在它的基礎上增加了消息的一些機制和特性。 這個架構比較輕量級,也比較好理解。
1.為什么說是簡單的消息機制呢? 這里主要是實現消息的觸發,沒有擴展增強像UCOSII中消息郵箱那樣,可以實現消息參數的傳遞, 這樣就不需要或減少使用全局變量來傳遞參數, 減少耦合度,更加方便實現模塊化。
2.關于消息機制及處理,可以參考學習原來農民講所所長的那個“建立通用程序框架”的教程及范例,個人感覺講解得比較好,特別是關于模塊化的一些思想和方法還是值得學習的。
我認為在目前嵌入式行業,對于擁有OS的MCU去控制實時性比較強的外設,無疑是比較苦惱,我們要用過多的信號量、互斥量和任務管理來實現,這樣會加重產品的
程序架構,導致很多莫名奇妙的BUG。使用雙MCU來處理,可以大大減少隱患和實現分模開發,減少開發周期。我已經用這種雙MCU方案開發有幾年了,效果還是很不錯。
19 給51 DIY超輕量級多任務操作系統
https://www.amobbs.com/forum.php?mod=viewthread&tid=1398508&highlight=51%2B操作系統&_dsign=e39a9436
(稍后整理補充)
總結
以上是生活随笔為你收集整理的时间触发嵌入式系统设计模式 读书笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu蓝牙Bluetooth命令行
- 下一篇: 使用Windows XP 的任务计划