2011-09-27 9 views
6

Obecnie uczymy się programować mikrokontrolery AVR (tylko standard Ansi C89). Część dołączonych sterowników to nagłówek, który zajmuje się planowaniem, tj. Uruchamianiem zadań o różnych stawkach. Moje pytanie jest zrobić z cytatem z dokumentacją: „Każde zadanie musi utrzymać swój stan, za pomocą statycznych lokalnych zmienne”Pustka * używana do utrzymywania stanu ... (programowanie C)

Co to naprawdę oznacza? Wydaje się, że przekazują one funkcję do utrzymywania stanu, ale potem jej nie używają?

Patrząc na kod w pliku wnoszę to co one oznaczają:

{.func = led_flash_task, .period = TASK_RATE/LED_TASK_RATE, .data = 0} 
/* Last term the pointer term */ 

Jest to funkcja, która biegnie z powyższych parametrów w tablicy jednak, że działa tylko jako planisty. Następnie funkcja led_flash_task jest

static void led_flash_task (__unused__ void *data) 
{ 
    static uint8_t state = 0; 

    led_set (LED1, state); /*Not reall important what this task is */ 
    state = !state; /*Turn the LED on or off */ 
} 

I z nagłówka

#define __unused__ __attribute__ ((unused)) 

a przejazdem void *data jest przeznaczona do utrzymania stanu zadania? Co to oznacza?

podziękowaniem za pomoc

Odpowiedz

5

Jak widać z makra __unused__ kompilatora parametr jest niewykorzystana. Zazwyczaj robi się to, ponieważ metoda musi pasować do określonego podpisu (przerywnik, nowy wątek, itd.). Pomyśl o przypadku biblioteki pthread, w której podpis jest czymś w rodzaju void * func (void * data). Użytkownik może lub nie może korzystać z danych, a jeśli nie, skarży się na to, że makro "__unused__" usuwa ostrzeżenie, informując kompilatora, że ​​wiesz, co robisz.

Zapomniałem również o zmiennych statycznych, jak zostało powiedziane w drugiej odpowiedzi, zmienne statyczne nie zmieniają się od wywołania metody do wywołania metody, więc zmienna jest zachowywana między wywołaniami, zachowując stan (tylko wątek bezpieczny w C++ 11).

+0

+1 za wzmiankę o bezpieczeństwie wątków. Biorąc pod uwagę tę konfigurację i wielowątkowy system operacyjny na uC, umieściłbym na górze masywny baner wszystkich takich modułów: "ZASILA DANE STATYCZNE PAŃSTWA - NIE POWINNY BYĆ WYWOŁANE Z WIELU NICI". –

1

Z dokumentacji: nieużywany Ten atrybut, dołączony do zmiennej oznacza, że ​​zmienna ma być ewentualnie niewykorzystane. GCC nie wygeneruje ostrzeżenia dla tej zmiennej.

1

Stan musi być utrzymywany w lokalnej zmiennej statycznej.

Oznacza to zmienna zadeklarowana wewnątrz funkcji z hasła statycznego:

static uint8_t state = 0; 

w swoim przykładzie.

Nie ma to nic wspólnego z parametrem przekazanym do zadania, które w twoim przykładzie nie jest używane.