2011-09-27 52 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; 
在你的榜样

这与传递给任务的参数无关,在您的示例中该参数未被使用。