Witam serdecznie forumowiczów,
Mam taki kod źródłowy dla pewnego urządzenia diagnostycznego.
Jest sobie tam zdefiniowany bufor i flaga buffer_full, bufor jest tablicą, flaga zmienną uint8_t
Jeśli flaga zostanie ustawiona mechanizm przerwaniowy wyśle dane z bufora na uart'a po czym skasuje flagę buffer_full.
Oczywiście musi pójść kilka przerwań aby wszystkie dane zostały wysłane.
Zatem dostęp do zmiennej buffer_full jest wymagany z poziomu przerwania.
Mam również RTOS'a i scheduler sterujący wywołaniem zadania o nazwie : rs232_handler.
Zadanie to rozpoczyna się tak:
DISABLE_INTERRUPTS;
buffer_full_temp = buffer_full;
ENABLE_INTERRUPTS;
if ((RESET != buffer_full_temp) || (NO_JOB == current_job_id))
return;
/* some other code... */
Mam pytanie : jakiż jest sens umieszczania instrukcji przepisywania flagi w sekcji krytycznej w tym wypadku ?
Rozumiem iż jeśli zmienna buffer_full byłaby 16-bitowa mogłoby być tak że na 8 bitowej architekturze załadował by pierwszy bajt i mogłoby pójść przerwanie co zakłóciłoby całkowicie proces odczytu. Jednak tutaj zmienna jest 8 bitowa.
I jeszcze jedno pytanie:
Co oznacza słówko "far" w deklaracji parametru przyjmowanego przez funkcję jak poniżej :
inline uint8_t foo(x_s * far p1, uint8_t p2);
Oczywiście p1 jest wskaźnikiem na strukturę o nazwie x_s jednakże nie kapuję co oznacza te słówko "far".
Jeden z kolegów mówił mi coś na temat tego że to sposób aby procek odnosił się do pamięci zewnętrznej jednakże ciągle nie mogę pojąć jak jest to rozwijane przez kompilator. Czy ktoś z łaski swojej mógłby przybliżyć ten temat ze słówkiem "far" ?