我看過許多文章,告訴我應該將RTOS用於時間管理和資源管理。我的時間不允許進行自己的研究,因此我向Chiphacker尋求建議。
我使用低資源微控制器(MSP430,PIC),並正在尋找可以使用的RTOS。
到這一點:
- 系統的資源成本
- 系統的優勢
- 系統的劣勢
- 實施技巧
- 不應/不應使用RTOS的情況。 ol>
我不使用像arduino這樣的系統,與我合作的項目不能支持這種系統的成本。 >
我看過許多文章,告訴我應該將RTOS用於時間管理和資源管理。我的時間不允許進行自己的研究,因此我向Chiphacker尋求建議。
我使用低資源微控制器(MSP430,PIC),並正在尋找可以使用的RTOS。
到這一點:
我不使用像arduino這樣的系統,與我合作的項目不能支持這種系統的成本。 >
除QNX之外,我在RTOS方面沒有太多的個人經驗(總體來說很棒,但是價格並不便宜,我對特定的主板供應商也有非常不好的經驗,並且QNX的我們不在乎態度對於非PIC和MSP430而言太大的系統。
從RTOS受益的地方是
對於PIC或MSP430的外設:對於串行端口,我將使用環形緩衝區+中斷...我在每個系統中編寫一次,然後重複使用;其他外圍設備我不認為您會從RTOS那裡獲得很多支持,因為它們是如此特定於供應商的。
如果您需要精確到微秒的計時,則RTOS可能會成功。 t幫助-RTOS的定時已受限制,但由於上下文切換延遲而通常在其調度中確實存在定時抖動...在PXA270上運行的QNX的抖動通常在幾十微秒內,最大值為100-200us,所以我不會將它用於運行速度必須高於約100Hz或需要定時比約500us更精確的東西。對於這種情況,您可能必須實現自己的中斷處理。有些RTOS可以很好地解決這個問題,而另一些RTOS則使它痛苦不堪:您的時間安排和他們的時間安排可能無法很好地共存。
如果時序/調度不太複雜,則使用設計良好的狀態機可能會更好。如果您還沒有的話,我強烈建議您閱讀 C / C ++實用狀態圖。在我工作的某些項目中,我們已經使用了這種方法,與傳統的狀態機相比,它在管理複雜性方面具有一些真正的優勢……這確實是您需要RTOS的唯一原因。
您嘗試過 FreeRTOS嗎?它是免費(取決於T&C),並且已移植到MSP430和幾種PIC版本。學習,尤其是如果您以前沒有使用過RTOS。
可以獲得(非免費)商業許可證以及IEC 61508 / SIL 3版本。
我剛剛發現了有關 NuttX的RTOS,它甚至可以在8052(8位)系統上運行。它沒有很多端口,但是看起來很有趣。 POSIX可能是一個加分項,因為如果您升級到功能更強大的處理器並且想運行實時linux或QNX,它可能會使您的某些代碼更具可移植性。
我不會我對商業RTOS本身有任何經驗,但多年來我一直使用自製的RTOS!它們非常擅長幫助您將代碼開發分散到許多程序員之間,因為它們本質上可以各自獲得一個“任務”或“線程”以各自工作。您仍然必須進行協調,並且必須有人監督整個項目,以確保每個任務都能按時完成。
我還建議您在使用RTOS時研究速率單調分析或RMA。這將幫助您確保您的關鍵任務能夠按時完成。
我還將研究Miro Samek的 QP-nano事件驅動的編程框架,該框架可以使用或不使用RTOS仍然為您提供實時功能。有了它,您就可以將設計分為分層狀態機,而不是傳統任務。 Jason S在他的帖子中提到了Miro的書。很棒的讀物!
我發現在許多機器上有用的一件事是一個簡單的堆棧切換器。我實際上沒有為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()將切換到另一個任務,檢查計時器並比典型的任務切換器更快地切換回去將確定不需要執行任務切換。
請注意,協作式多任務處理有一些局限性,但是在不可變項被暫時干擾的情況下,它避免了使用大量鎖定和其他與互斥鎖有關的代碼的需求。可以快速重建。
(編輯):關於自動變量的一些警告,例如:
協作式多任務處理不能使人們完全擺脫鎖定等問題,但這確實確實大大簡化了工作。在具有壓縮垃圾收集器的搶占式RTOS中例如,r必須允許固定對象。使用協作式切換器時,如果代碼假設GC對象可以在tasktask()調用時隨時移動,則不必這樣做。不必擔心固定對象的緊湊型收集器可能比簡單的收集器簡單得多。
我在MSP430上使用了 Salvo。這對處理器資源的影響很小,並且只要您遵守實施規則,就非常易於使用和可靠。這是一個協作操作系統,需要在任務功能的外部功能調用級別執行任務切換。這種限制使OS可以在非常小的內存設備中工作,而無需使用大量的堆棧空間來維護任務上下文。
在AVR32上,我正在使用FreeRTOS。到目前為止,它還是非常可靠的,但是FreeRTOS發行的版本與Atmel框架提供的版本之間存在一些配置/版本差異。但是,它具有免費的優勢!
日常實用電子產品的12月版包含PIC實時操作系統系列的第3部分(在PIC n'Mix列中),並詳細介紹瞭如何使用MPLAB和FreeLAB設置FreeRTOS。 PICKit2。前兩篇文章(我尚未見過)似乎已經討論了各種RTOS的優點,並著眼於FreeRTOS。一旦當前文章設置了開發環境,他們便開始設計二進制數字時鐘。似乎至少還有一部分涉及該主題。
我不確定美國的EPE的可用性如何,但是似乎確實有一家美國商店從其站點鏈接到該商店,並且可能會有電子版。
PIC的CCS編譯器帶有一個簡單的RTOS。我還沒有嘗試過,但是如果您有此編譯器,嘗試起來會很容易。
關於您的應用程序您還沒有說太多。是否使用RTOS在很大程度上取決於您在PIC中需要執行的操作。除非您要執行幾種不同的異步操作(這些操作需要嚴格的時間限製或有多個線程在運行),否則RTOS可能會顯得過大。最重要的是:
恆定幀頻:例如,對於運行伺服控制器且必須以1000Hz運行的PIC PIC。如果PID算法執行時間少於1毫秒,則您可以使用毫秒的剩餘時間執行其他任務,例如檢查CAN總線,讀取傳感器等。
所有中斷:PIC中發生的所有事件均由中斷觸發。可以根據事件的重要性確定中斷的優先級。
將其循環粘貼,並儘可能快地執行所有操作。您可能會發現這提供了合適的時間範圍。