Czy korzystasz z systemu operacyjnego czasu rzeczywistego? Ogólnie rzecz biorąc, ten typ rzeczy byłby obsługiwany przez posiadanie wątku o wysokim priorytecie, który zostanie zasygnalizowany, aby wykonać jakąś pracę przez przerwanie.
Jeśli nie korzystasz z systemu operacyjnego czasu rzeczywistego, masz tylko kilka zadań, a praca wykonywana przez przerwanie nie wymaga dużego nakładu zasobów, najprościej może być wykonanie zadania o wysokim priorytecie w kontekście przerywacz. Jeśli te warunki nie zostaną spełnione, wdrożenie tego, co mówisz, będzie początkiem podstawowego wielozadaniowego systemu operacyjnego. To może być interesujący projekt sam w sobie, ale jeśli chcesz po prostu wykonać pracę, możesz rozważyć prosty RTOS.
Skoro wspomniano kilka szczegółów na temat pracy robisz, oto przegląd jak mam obchodzić podobny problem w przeszłości:
Dla obsługi otrzymanych danych przez UART jednym ze sposobów, że mam używane w przypadku prostszego systemu, który nie ma pełnego wsparcia dla zadań (tj. zadania są zaokrąglone i na prostej pętli while
) ma mieć wspólną kolejkę dla danych, które zostały odebrane z UART. Po uruchomieniu przerwania UART dane są odczytywane z rejestru RDR (Receive Data Register) UART i umieszczane w kolejce. Sztuczka, która radzi sobie z tym w taki sposób, że wskaźniki kolejki nie są uszkodzone, to ostrożne ustawianie wskaźników kolejek i upewnianie się, że tylko przerywnik modyfikuje wskaźnik końcowy i że tylko zadanie "pierwszego planu" odczytuje dane z kolejki zmodyfikował wskaźnik główny. Przegląd danych na wysokim poziomie:
Upewnij się, że queue.head
i queue.tail
są volatile
(lub napisać te bity w zespole), aby upewnić się, że nie istnieją żadne problemy sekwencjonowania.
Teraz wystarczy upewnić się, że kolejka danych odbieranych przez system UART jest wystarczająco duża, aby pomieścić wszystkie bajty, które można odebrać, zanim zadanie pierwszego planu zostanie uruchomione. Zadanie pierwszego planu musi wyciągnąć dane z kolejki do własnych buforów, aby zebrać wiadomości do zadania "procesor wiadomości".
Dzięki, Miro! Szukałem wszędzie informacji o tym, jak uruchomić przerwanie PendSV, i to jest, gdzie w końcu znalazłem! Chociaż przypuszczam, że przeczytałbym bardziej uważnie mój podręcznik techniczny Cortex M3 r1p1, znalazłbym go na stronie opisującej rejestr państwa kontroli przerwań: http://infocenter.arm.com/help/topic/com.arm .doc.ddi0337e/DDI0337E_cortex_m3_r1p1_trm.pdf –
Z mojego odczytu Prawie cały czas RTOS na CortexM3 wykorzystuje przerwanie Timera Systicka (45 dziesiętnych, 2D hex) do uruchomienia ich harmonogramu. W takim razie PendSV jest sposobem na zainicjowanie specjalnej "syscall"? Mam nadzieję, że to rozumiem. –
@WarrenP: PendSV służy do obsługi przełącznika kontekstu. Znacznik sys jest używany do zadań typu round-robin - sys tick z kolei generalnie ustawia PendSV. –