題:
嵌入式系統的RTOS
Kortuk
2009-12-03 02:59:25 UTC
view on stackexchange narkive permalink

我看過許多文章,告訴我應該將RTOS用於時間管理和資源管理。我的時間不允許進行自己的研究,因此我向Chiphacker尋求建議。

我使用低資源微控制器(MSP430,PIC),並正在尋找可以使用的RTOS。

到這一點:

  1. 系統的資源成本
  2. 系統的優勢
  3. 系統的劣勢
  4. 實施技巧
  5. 不應/不應使用RTOS的情況。
  6. ol>

    我不使用像arduino這樣的系統,與我合作的項目不能支持這種系統的成本。 >

我對此感到困惑。如果選民能給我反饋,我將在以後避免這種行為。
同上。這是一個很好的問題。
我接受了一個問題,因為,即使認為這是開放式的,我也收到了很多好評,並想為此付出至少一位作家。
九 答案:
Jason S
2009-12-03 11:07:38 UTC
view on stackexchange narkive permalink

除QNX之外,我在RTOS方面沒有太多的個人經驗(總體來說很棒,但是價格並不便宜,我對特定的主板供應商也有非常不好的經驗,並且QNX的我們不在乎態度對於非PIC和MSP430而言太大的系統。

從RTOS受益的地方是

  • 線程管理/調度
  • 線程間通信+同步
  • 具有stdin / stdout / stderr或串行端口或以太網支持或文件系統(大多數情況下不是MSP430或PIC)的I / O (對於串行端口除外)

對於PIC或MSP430的外設:對於串行端口,我將使用環形緩衝區+中斷...我在每個系統中編寫一次,然後重複使用;其他外圍設備我不認為您會從RTOS那裡獲得很多支持,因為它們是如此特定於供應商的。

如果您需要精確到微秒的計時,則RTOS可能會成功。 t幫助-RTOS的定時已受限制,但由於上下文切換延遲而通常在其調度中確實存在定時抖動...在PXA270上運行的QNX的抖動通常在幾十微秒內,最大值為100-200us,所以我不會將它用於運行速度必須高於約100Hz或需要定時比約500us更精確的東西。對於這種情況,您可能必須實現自己的中斷處理。有些RTOS可以很好地解決這個問題,而另一些RTOS則使它痛苦不堪:您的時間安排和他們的時間安排可能無法很好地共存。

如果時序/調度不太複雜,則使用設計良好的狀態機可能會更好。如果您還沒有的話,我強烈建議您閱讀 C / C ++實用狀態圖。在我工作的某些項目中,我們已經使用了這種方法,與傳統的狀態機相比,它在管理複雜性方面具有一些真正的優勢……這確實是您需要RTOS的唯一原因。

我在一家剛起步的公司工作,那裡經驗最豐富的嵌入式系統專家剛剛大學畢業(即,我自己和與我合作大約2年的其他人)。在我的工作周中,我花費了大量時間自學有關行業實踐的知識。正如我一直在閱讀的那樣,除最低成本的系統外,我已經獲得除RTOS之外的所有建議。
用於PIC和MSP430之類的東西的RTOS系統似乎資源很低,它們可以幫助從非常複雜的系統中創建確定性系統,同時也大大簡化了我們保持模塊分離的管理。我曾經是一個由兩個人組成的團隊的成員,該團隊有效地構建了現場數據收集和路由系統。現在,我看了RTOS,發現它非常適合我們的設計。
抱歉,使用三個帖子位,您的回答非常有幫助,我正在尋找一種資源很少的解決方案,但是此信息非常有用,感謝您的幫助。
不用擔心評論數(恕我直言,StackExchange框架缺少的一件事是對討論的支持... Q / A格式涵蓋了大多數內容,但不包含某些內容)...聽起來您對什麼內容有很好的了解您正在尋找。我沒有看過Steve提到的FreeRTOS,但是如果將它移植到低端微控制器上,也許它將完成您需要的調度管理。
它似乎可以通過堆棧保存每個線程的狀態(類似於50個push / pull語句),並且可以處理定時中斷。我的系統通常使用端口中斷進行線程切換,但是該任務看起來可行。我希望此站點類型以更好的格式處理討論。
Steve Melnikoff
2009-12-03 06:05:08 UTC
view on stackexchange narkive permalink

您嘗試過 FreeRTOS嗎?它是免費(取決於T&C),並且已移植到MSP430和幾種PIC版本。學習,尤其是如果您以前沒有使用過RTOS。

可以獲得(非免費)商業許可證以及IEC 61508 / SIL 3版本。

謝謝您,我將在一周內進行調查,我將保留其他問題的答案,但是您將為您提供很大的幫助!
Jay Atkinson
2010-06-04 02:35:03 UTC
view on stackexchange narkive permalink

我剛剛發現了有關 NuttX的RTOS,它甚至可以在8052(8位)系統上運行。它沒有很多端口,但是看起來很有趣。 POSIX可能是一個加分項,因為如果您升級到功能更強大的處理器並且想運行實時linux或QNX,它可能會使您的某些代碼更具可移植性。

我不會我對商業RTOS本身有任何經驗,但多年來我一直使用自製的RTOS!它們非常擅長幫助您將代碼開發分散到許多程序員之間,因為它們本質上可以各自獲得一個“任務”或“線程”以各自工作。您仍然必須進行協調,並且必須有人監督整個項目,以確保每個任務都能按時完成。

我還建議您在使用RTOS時研究速率單調分析或RMA。這將幫助您確保您的關鍵任務能夠按時完成。

我還將研究Miro Samek的 QP-nano事件驅動的編程框架,該框架可以使用或不使用RTOS仍然為您提供實時功能。有了它,您就可以將設計分為分層狀態機,而不是傳統任務。 Jason S在他的帖子中提到了Miro的書。很棒的讀物!

supercat
2011-03-16 09:06:07 UTC
view on stackexchange narkive permalink

我發現在許多機器上有用的一件事是一個簡單的堆棧切換器。我實際上沒有為PIC寫一個,但是我希望如果兩個/所有線程總共使用31個或更少的堆棧級別,則該方法在PIC18上會很好用。在8051上,主要例程是:

 _taskswitch:xch a,SP xch a,_altSP xch a,SP ret 

在PIC上,我忘記了堆棧指針的名稱,但是例程類似於:

 _taskswitch:movlb _altSP >> 8 movf _altSP,w,b movff _STKPTR,altSP movwf _STKPTR,c return 

程序,調用task2()例程,該例程用備用堆棧的地址加載altSP(對於PIC18Fxx,16可能會很好地工作)並運行task2循環;這個慣例絕不能返回,否則事情將死於痛苦的死亡。相反,只要它希望對主要任務產生控制權,就應該調用_taskswitch。然後,只要主要任務要屈服於次要任務,就應調用_taskswitch。通常,會有一些可愛的小例程,例如:

 void delay_t1(unsigned short val){do taskswitch(); while((無符號短] [millisecond_clock-val)> 0xFF00); } 

請注意,任務切換器無法執行任何“等待條件”操作;它所支持的只是一次旋轉等待。另一方面,任務切換是如此之快,以至於在另一個任務正在等待計時器到期時嘗試taskswitch()將切換到另一個任務,檢查計時器並比典型的任務切換器更快地切換回去將確定不需要執行任務切換。

請注意,協作式多任務處理有一些局限性,但是在不可變項被暫時干擾的情況下,它避免了使用大量鎖定和其他與互斥鎖有關的代碼的需求。可以快速重建。

(編輯):關於自動變量的一些警告,例如:

  1. 如果兩個線程都調用了使用任務切換的例程,則通常有必要編譯該例程的兩個副本(可能是#兩次包含相同的源文件,並使用不同的#define語句)。任何給定的源文件要么只包含一個線程的代碼,要么包含將被編譯兩次的代碼(每個線程一次),因此我可以使用“ #define delay(x)delay_t1(x)”之類的宏,或者#define delay(x)delay_tx(x)”取決於我正在使用的線程。
  2. 我相信無法“看到”正在調用的函數的PIC編譯器將假定該函數可能會破壞所有函數CPU寄存器,從而避免了在任務切換例程中保存任何寄存器的需求(與搶先式多任務處理相比,這是個不錯的好處),任何考慮為其他CPU使用類似任務切換器的人都需要了解所使用的寄存器約定。假設存在足夠的堆棧空間,在任務切換之前彈出並在之後彈出它們是一種輕鬆的方法來處理事務。 ol>

    協作式多任務處理不能使人們完全擺脫鎖定等問題,但這確實確實大大簡化了工作。在具有壓縮垃圾收集器的搶占式RTOS中例如,r必須允許固定對象。使用協作式切換器時,如果代碼假設GC對象可以在tasktask()調用時隨時移動,則不必這樣做。不必擔心固定對象的緊湊型收集器可能比簡單的收集器簡單得多。

很棒的答案。我認為在我自己的RTOS上獲得一些資源鏈接會很有趣。我在這裡的工作重點實際上是從已經完成了確保實時性的工作的供應商那裡獲得高質量的RTOS,但這對我來說可能是一個有趣的業餘愛好者項目。
太酷了,從未想過要切換SP來完成任務...
@JGord:我已經在8x51和TI DSP上完成了微型任務切換器。如上所示,8051專為完成兩項任務而設計。 DSP 1與4一起使用,有點複雜。但是,我只是有個瘋狂的主意:一個人只需使用三個任務切換器就可以處理四個任務。每次前兩個任務之一想要進行任務切換時,都應調用TaskSwitch1和TaskSwitch2。當後兩個任務之一要進行任務切換時,應調用Taskswitch1和Taskswitch3。假定代碼從stack0開始,並且每個任務切換器都設置有其相應的堆棧號。
@JGord:嗯...不太有效;它似乎產生了三路循環,而忽略了第三個切換台。好吧,做實驗,我想您可能會找到一個好的公式。
uɐɪ
2009-12-08 22:16:22 UTC
view on stackexchange narkive permalink

我在MSP430上使用了 Salvo。這對處理器資源的影響很小,並且只要您遵守實施規則,就非常易於使用和可靠。這是一個協作操作系統,需要在任務功能的外部功能調用級別執行任務切換。這種限制使OS可以在非常小的內存設備中工作,而無需使用大量的堆棧空間來維護任務上下文。

在AVR32上,我正在使用FreeRTOS。到目前為止,它還是非常可靠的,但是FreeRTOS發行的版本與Atmel框架提供的版本之間存在一些配置/版本差異。但是,它具有免費的優勢!

Amos
2009-12-09 17:09:18 UTC
view on stackexchange narkive permalink

日常實用電子產品的12月版包含PIC實時操作系統系列的第3部分(在PIC n'Mix列中),並詳細介紹瞭如何使用MPLAB和FreeLAB設置FreeRTOS。 PICKit2。前兩篇文章(我尚未見過)似乎已經討論了各種RTOS的優點,並著眼於FreeRTOS。一旦當前文章設置了開發環境,他們便開始設計二進制數字時鐘。似乎至少還有一部分涉及該主題。

我不確定美國的EPE的可用性如何,但是似乎確實有一家美國商店從其站點鏈接到該商店,並且可能會有電子版。

Jeanne Pindar
2010-06-04 07:36:57 UTC
view on stackexchange narkive permalink

PIC的CCS編譯器帶有一個簡單的RTOS。我還沒有嘗試過,但是如果您有此編譯器,嘗試起來會很容易。

我實際上是第一次嘗試。它不是真正意義上的RTOS。它絕不是搶先的。它需要定期使用yield命令,以便RTOS可以決定下一步運行誰,如果有其他程序需要接管,則必須有意識地將它們連續放置。
我認為它仍稱為RTOS。聽起來好像它具有協作調度程序,而不是完全搶占式調度程序。
是的,從技術上講,它仍然是RTOS,但是我擁有它,並且仍然沒有什麼價值。我知道這是個人的事情,但對我來說,必須先行成為有價值的東西。我仍然+1,因為這是一個很好的答案,而且很有價值。
davidcary
2010-06-10 02:28:42 UTC
view on stackexchange narkive permalink

密切相關的問題: https://stackoverflow.com/questions/1624237/multithreading-using-c-on-pic18

謝謝!看起來大多數人都沒有得到這個問題,但這仍然很有趣。
我在SO問題上發布了邀請用戶來E&R尋求幫助的問題!
我認為我們“了解”了SO的問題,它提出的問題有所不同,但與此問題相關。關於您對認證的評論;這取決於很多事情。看這裡的答案,我喜歡DoxaLogos的關於QP-nano的答案。我的經驗使我比線程和隱式上下文切換更喜歡事件驅動的代碼。
Rocketmagnet
2011-01-25 04:32:27 UTC
view on stackexchange narkive permalink

關於您的應用程序您還沒有說太多。是否使用RTOS在很大程度上取決於您在PIC中需要執行的操作。除非您要執行幾種不同的異步操作(這些操作需要嚴格的時間限製或有多個線程在運行),否則RTOS可能會顯得過大。最重要的是:

  1. 恆定幀頻:例如,對於運行伺服控制器且必須以1000Hz運行的PIC PIC。如果PID算法執行時間少於1毫秒,則您可以使用毫秒的剩餘時間執行其他任務,例如檢查CAN總線,讀取傳感器等。

  2. 所有中斷:PIC中發生的所有事件均由中斷觸發。可以根據事件的重要性確定中斷的優先級。

  3. 將其循環粘貼,並儘可能快地執行所有操作。您可能會發現這提供了合適的時間範圍。

  4. ol>
我了解其他方法,但想擴展到RTOS。我將運行多個任務並擁有一個硬實時系統,但願意在沒有硬實時要求的情況下開始工作。感謝您抽出寶貴的時間回答問題,但是我想學習一個RTOS,以便可以在需求很高的情況下使用它。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 2.0許可。
Loading...