Istnieją dwa główne typy wielozadaniowych systemów operacyjnych: zapobiegawcze i kooperacyjne. Oba pozwalają na zdefiniowanie wielu zadań w systemie, różnica polega na tym, jak działa przełączanie zadań. Oczywiście w przypadku jednego procesora lokalnego w danym momencie działa tylko jedno zadanie.
Oba typy systemów wielozadaniowych wymagają osobnego stosu dla każdego zadania. Oznacza to dwie rzeczy: po pierwsze, procesor pozwala na umieszczanie stosów w dowolnym miejscu w pamięci RAM, a zatem ma instrukcje do przesuwania wskaźnika stosu (SP) - tzn. Nie ma stosu specjalnego przeznaczenia, takiego jak na niskim poziomie PIC. Pomija to serię PIC10, 12 i 16.
Możesz napisać system operacyjny prawie całkowicie w C, ale przełącznik zadań, w którym SP się porusza, musi być w zestawie. W różnych momentach pisałem przełączniki zadań dla PIC24, PIC32, 8051 i 80x86. Odwagi są całkiem różne w zależności od architektury procesora.
Drugim wymaganiem jest wystarczająca ilość pamięci RAM, aby zapewnić wiele stosów. Zwykle ktoś chciałby mieć kilkaset bajtów na stos; ale nawet przy zaledwie 128 bajtach na zadanie osiem stosów będzie wymagało 1 KB bajtów pamięci RAM - nie trzeba jednak przydzielać stosu tego samego rozmiaru dla każdego zadania. Pamiętaj, że potrzebujesz stosu wystarczającego do obsłużenia bieżącego zadania i wszystkich wywołań do jego zagnieżdżonych podprogramów, ale także stosu miejsca na wywołanie przerwania, ponieważ nigdy nie wiadomo, kiedy nastąpi.
Istnieją dość proste metody określania, ile stosu używasz do każdego zadania; na przykład możesz zainicjować wszystkie stosy do określonej wartości, powiedzmy 0x55, i uruchomić system na chwilę, a następnie zatrzymać i zbadać pamięć.
Nie mówisz, jakiego rodzaju PIC chcesz użyć. Większość PIC24 i PIC32 będzie miało dużo miejsca na system operacyjny wielozadaniowy; PIC18 (jedyny 8-bitowy PIC posiadający stosy w pamięci RAM) ma maksymalny rozmiar pamięci RAM wynoszący 4K. Więc to dość niepewne.
W przypadku wielozadaniowości kooperacyjnej (prostszej z dwóch) przełączanie zadań odbywa się tylko wtedy, gdy zadanie „rezygnuje” z kontroli nad systemem operacyjnym. Dzieje się tak za każdym razem, gdy zadanie musi wywołać procedurę systemu operacyjnego, aby wykonać funkcję, na którą będzie czekał, na przykład żądanie We / Wy lub wywołanie timera. Ułatwia to systemowi przełączanie stosów, ponieważ nie jest konieczne zapisywanie wszystkich rejestrów i informacji o stanie, SP można po prostu przełączyć na inne zadanie (jeśli nie ma innych zadań gotowych do uruchomienia, stos bezczynności jest podana kontrola). Jeśli bieżące zadanie nie musi nawiązywać połączenia z systemem operacyjnym, ale działa przez jakiś czas, musi dobrowolnie zrezygnować z kontroli, aby system mógł reagować.
Problem ze współpracującą wielozadaniowością polega na tym, że jeśli zadanie nigdy nie poddaje się kontroli, może zapchać system. Tylko on i wszelkie procedury przerwań, które przypadkowo otrzymają kontrolę, mogą działać, więc system operacyjny wydaje się blokować. Jest to aspekt „kooperacyjny” tych systemów. Jeśli zaimplementowany jest zegar nadzoru, który jest resetowany tylko po wykonaniu przełączenia zadania, możliwe jest przechwycenie tych błędnych zadań.
Windows 3.1 i wcześniejsze były współpracującymi systemami operacyjnymi, dlatego częściowo ich wydajność nie była tak świetna.
Zapobiegawcza wielozadaniowość jest trudniejsza do wdrożenia. Tutaj zadania nie są wymagane do ręcznego zrezygnowania z kontroli, ale zamiast tego każdemu zadaniu można poświęcić maksymalny czas na uruchomienie (powiedzmy 10 ms), a następnie przełącza się zadanie na następne zadanie, jeśli takie istnieje. Wymaga to arbitralnego zatrzymania zadania, zapisania wszystkich informacji o stanie, a następnie przełączenia SP do innego zadania i uruchomienia go. To sprawia, że przełącznik zadań jest bardziej skomplikowany, wymaga większego stosu i nieco spowalnia system.
Zarówno w przypadku wielozadaniowości kooperacyjnej, jak i zapobiegawczej, przerwania mogą wystąpić w dowolnym momencie, co tymczasowo wstrzyma uruchomione zadanie.
Jak zauważa supercat w komentarzu, jedną z zalet wielozadaniowości kooperacyjnej jest łatwiejsze współdzielenie zasobów (np. Sprzęt taki jak wielokanałowy ADC lub oprogramowanie takie jak modyfikacja połączonej listy). Czasami dwa zadania chcą mieć dostęp do tego samego zasobu w tym samym czasie. Dzięki planowaniu wyprzedzającemu system operacyjny mógłby przełączać zadania w trakcie jednego zadania za pomocą zasobu. Dlatego konieczne są blokady, aby uniemożliwić wejście do innego zadania i dostęp do tego samego zasobu. W przypadku wielozadaniowości kooperacyjnej nie jest to konieczne, ponieważ zadanie kontroluje, kiedy zwolni je z powrotem do systemu operacyjnego.