多任務操作系統主要有兩種:搶占式和協作式。兩者都允許在系統中定義多個任務,不同之處在於任務切換的工作方式。當然,只有一個核心處理器,一次實際上只運行一個任務。
兩種類型的多任務操作系統都需要為每個任務分配單獨的堆棧。因此,這意味著兩件事:首先,處理器允許將堆棧放置在RAM中的任何位置,並因此具有指令來移動堆棧指針(SP)-即,不存在像低端那樣的專用硬件堆棧PIC的。這樣就省去了PIC10、12和16系列。在不同的時候,我都為PIC24,PIC32、8051和80x86編寫了任務切換器。膽量完全不同,具體取決於處理器的體系結構。
第二個要求是要有足夠的RAM來提供多個堆棧。通常,一個堆棧至少需要數百個字節。但是,即使每個任務只有128個字節,八個堆棧也將需要1K字節的RAM-不過,您不必為每個任務分配相同大小的堆棧。請記住,您需要足夠的堆棧來處理當前任務,以及對其嵌套子例程的任何調用,還需要一個中斷調用的堆棧空間,因為您不知道何時會發生該事件。
有相當簡單的方法確定每個任務使用多少堆棧;例如,您可以將所有堆棧初始化為特定值,例如0x55,然後運行系統一段時間,然後停止並檢查內存。
您沒有說要使用哪種PIC。大多數PIC24和PIC32將有足夠的空間來運行多任務OS。 PIC18(唯一在RAM中具有堆棧的8位PIC)的最大RAM大小為4K。因此,這還真不容易。
使用協作式多任務處理(兩者中的較簡單者),僅當任務將其控制權“交給”操作系統時才執行任務切換。每當任務需要調用OS例程以執行它將等待的某些功能(例如I / O請求或計時器調用)時,就會發生這種情況。這使操作系統更容易切換堆棧,因為不必保存所有寄存器和狀態信息,因此可以將SP切換到另一個任務(如果沒有其他任務可以運行,則空閒堆棧是給定控制權)。如果當前任務不需要進行OS調用但已經運行了一段時間,則需要自動放棄控制以保持系統響應。
協作多任務處理的問題在於,如果該任務永不放棄控制權,它可以佔用系統。只有它和碰巧得到控制的所有中斷例程都可以運行,因此操作系統似乎會鎖定。這是這些系統的“合作”方面。如果實現了僅在執行任務切換時才重置的看門狗計時器,則有可能捕獲這些錯誤的任務。
Windows 3.1和更早的操作系統是協作操作系統,這部分原因是它們的性能沒有
搶先式多任務處理更難實現。在此,不需要手動放棄任務,而是可以為每個任務提供最大的運行時間(例如10毫秒),然後如果有任務,則將任務切換到下一個可運行任務。這要求任意停止一個任務,保存所有狀態信息,然後將SP切換到另一個任務並啟動它。這會使任務切換器變得更加複雜,需要更多的堆棧,並使系統速度降低一點。 / p>
正如supercat在評論中指出的那樣,協作多任務處理的一個優點是共享資源更加容易(例如,諸如多通道ADC之類的硬件或諸如修改鍊錶之類的軟件)。有時,兩個任務希望同時訪問同一資源。通過搶占式調度,操作系統可能會使用資源在一項任務的中間切換任務。因此,必須使用 locks 來防止其他任務進入並訪問同一資源。對於協作式多任務處理,這不是必需的,因為該任務控制著何時將其自身釋放回操作系統。