2011-09-27 51 views
6

目前我們正在學習如何編程AVR微控制器(僅限Ansi C89標準)。部分包含的驅動程序是處理調度的頭部,即以不同速率運行任務。我的問題是從文檔報價做:「每個任務必須保持自己的狀態,用靜態局部 變量」void *用於維護狀態...(C編程)

這是什麼意思呢?他們似乎通過一個void*到該功能來維持狀態,但然後不使用它?

綜觀文件中的代碼,我收集這是他們的意思:

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

然而有與陣列中的上述參數運行的函數,它只是充當調度。然後函數led_flash_task

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 */ 
} 

而且從頭部

#define __unused__ __attribute__ ((unused)) 

而且的void *data傳球是爲了維護任務的狀態?這是什麼意思?

感謝您的幫助

回答

5

你可以從__unused__編譯器宏觀看參數未使用。通常這是因爲該方法需要匹配特定的簽名(中斷處理程序,新線程等)。想象一下pthread庫的情況,其中籤名是類似於void * func(void * data)的東西。您可能會也可能不會使用這些數據,如果您沒有編譯器抱怨,那麼堅持__unused__宏會通過告訴編譯器知道您在做什麼來消除警告。

也像在其他答案中所說的那樣忘了靜態變量靜態變量不會從方法調用更改爲方法調用,因此變量在調用之間保留,因此保留狀態(僅在C++ 11中爲線程安全)。

+0

+1提到線程安全。鑑於這種情況,以及uC上的多線程操作系統,我會在所有這些模塊的頂部包含一個大型橫幅:「主要靜態狀態數據 - 不能從多個線程中調用」。 –

1

看到從文檔: 未使用 該屬性,連接到一個變量,表示該變量是指可能不會被使用。 GCC不會爲這個變量產生警告。

1

該狀態必須維護在本地靜態變量中。

這意味着有static關鍵字在函數內部聲明的變量:

static uint8_t state = 0; 
在你的榜樣

這與傳遞給任務的參數無關,在您的示例中該參數未被使用。