Пустота * используется для поддержания состояния ... (программирование на C) - PullRequest
6 голосов
/ 27 сентября 2011

В настоящее время мы учимся программировать микроконтроллеры AVR (только стандарт Ansi C89). Часть включенных драйверов является заголовком, который имеет дело с планированием, то есть выполнением задач с различными скоростями. Мой вопрос связан с цитатой из документации:

"Каждая задача должна поддерживать свое собственное состояние, используя статический локальный переменные. "

Что это значит на самом деле? Кажется, они передают 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 предназначено для поддержания состояния задачи? Что подразумевается под этим?

Спасибо за помощь

Ответы [ 4 ]

5 голосов
/ 27 сентября 2011

Как видно из макроса компилятора __unused__, параметр не используется.Обычно это делается потому, что метод должен соответствовать определенной сигнатуре (обработчик прерываний, новый поток и т. Д.). Подумайте о случае библиотеки pthread, где сигнатура имеет вид void * func (void * data).Вы можете или не можете использовать данные, и если вы этого не сделаете, компилятор будет жаловаться, поэтому вставка макроса __unused__ удаляет предупреждение, сообщая компилятору, что вы знаете, что делаете.

Также забыли о статических переменных, как былоВ другом ответе статические переменные не меняются от вызова метода к вызову метода, поэтому переменная сохраняется между вызовами, поэтому сохраняется состояние (только поточно-ориентированное в C ++ 11).

2 голосов
/ 27 сентября 2011

данные не используются в этой функции (отсюда __unused__). Состояние сохраняется в состоянии статической переменной, которая будет сохранять свое значение между вызовами. См. Также Каково время жизни статической переменной в функции C ++?

1 голос
/ 28 сентября 2011

Состояние должно поддерживаться в локальной статической переменной.

Это означает, что переменная, объявленная внутри функции с ключевым словом static:

static uint8_t state = 0;

в вашем примере.

Это не имеет ничего общего с параметром, переданным в задачу, который в вашем примере не используется.

1 голос
/ 27 сентября 2011

Из документации: не используется Этот атрибут, прикрепленный к переменной, означает, что переменная, возможно, не используется.GCC не выдаст предупреждение для этой переменной.

...