2009-07-08 19 views
6

在ARM7 C上編程的嵌入式應用程序(具有可移植性要求)中,目前使用基於商業優先級的搶佔式RTOS,我們需要刪除每個客戶授權的RTOS和任何RTOS依賴項。我們有8個任務使用許多硬件接口,睡眠語句,I2C通信。實際上,SW很好地利用了RTOS特性來簡化代碼,儘管在沒有RTOS的情況下時序要求是可以管理的。在RTOS移除練習中顯式堆棧的替代方法?

包括在很多地方調用的例程在內的幾個函數當前實現了對I2c驅動程序函數,睡眠語句等進行阻塞(針對該線程)的調用順序。 基於對I2C調用/睡眠的輪詢不可接受客戶,這樣的調用必須是非阻塞的並且返回。當然,問題是「回到」「聲明」,當I2C完成或睡眠時間已過時,可能會從頂層任務條目中調用4次。

我正在朝着每個任務的層次狀態機設計聚合,頂部有一個簡單的調度程序。但是,處理好幾個例程,它們用來創建then-blocking調用序列,現在成爲一個狀態機,它可以在幾個地方和不同的函數調用深度調用,這似乎要求每個任務都有一個明確的堆棧特性,這樣每次啓動一個子狀態機時,我都可以爲該進程分配狀態,並將它們推送到該任務的「狀態堆棧」上,以便下一個調度程序調用該任務將能夠關閉所有分層狀態繼續處理「停止」的位置。

您是否可以看到適用於該問題的其他設計體系結構,將代碼快速移植到非搶佔範例的注意事項,還是指向思考豐富的關於「RTOS移除」技術和設計的資源和討論?


這三個答案一起描繪了基於狀態機的開發相關性和相關工具的良好畫面,以避免重新發明車輪。我們的客戶不會採取任何形式的許可,包括GPL。從答案看來,如果想要使用沒有RTOS的分級狀態機並且禁止輪詢調用,那麼高速緩存狀態就沒有辦法了。由於分層SM通過保存其結構(對函數調用例程變成調用子狀態機)幫助大量移植現有代碼,我將採用這種方式,使用提供的工具作爲示例。 - 謝謝。

回答

4

使用工具(如IARvisualState),您可以生成分層狀態機的代碼,而無需單獨的堆棧。有一個免費贈品SMC效率稍低,功能較少,並且不支持漂亮的UML StateChart圖片。

您還可以用狀態機的switch語句和靜態變量來手動編寫狀態機作爲函數來保存狀態。

有一些基於輕量級狀態機的僞線程庫,它們使用C宏來執行此操作。退房protothreads

3

我強烈建議看看Miro Samek的Quantum programming framework。他擁有在許多平臺上運行的最高效的HSM之一,例如ARM7。他還具有各種層次的框架複雜性以滿足您的需求。我建議抓住他的書Practical StateCharts in C/C++。他在C和C++中都有一個分層狀態機。這個框架的優點在於從UML或狀態圖到具有某種程度效率的實際代碼都不難。這個框架可以像自己的調度程序一樣運行,也可以與RTOS一起使用。

我實際上在C++中實現了我自己的HSM,爲我公司的一個本土RTOS實現了一些成功。我使用了許多Samek的設計原則,但不是因爲GPL(免費版)和商業許可證(非GPL)的定價而使用他的代碼。

5

你簽出了Adam Dunkels' Protothreads嗎?他稱他們爲「輕量級,無堆棧線程在C」

而不是重新發明輪子,我會直接引用來自protothreads網站一點點在網上瀏覽:

Protothreads非常輕的無堆棧線程設計用於嚴格限制內存的系統,如小型嵌入式系統或無線傳感器網絡節點。 Protothreads爲在C中實現的事件驅動系統提供線性代碼執行。Protothreads可以使用或不使用底層操作系統來提供阻塞事件處理程序。 Protothreads提供順序的控制流程,無需複雜的狀態機或全多線程。

我已經使用Protothreads & Samek的QP HSM - 它們都是重疊域問題的很好解決方案。爲此,我可能會傾向於原始線程。

你提到消除了商業RTOS。想知道如果這是因爲代碼空間,成本,工程師學習曲線,性能.​​..你能用一個(很多)免費的代替RTOS嗎?我猜不是,但問問問題並沒有什麼不好。

P.S. Dunkels還爲嵌入式開發人員提供了很多useful resources & software的優秀網站 - 查看它(Contiki,協議棧等)。

1

我還想去量子編程框架!