一个用于维护状态的空*。。。(C)方案编制
目前,我们正在学习如何编程AVR微控制器(仅限于Ansi C89标准)。所包含的驱动程序的一部分是一个标头,用于处理以不同速率调度ie运行任务的问题。我的问题是引用文档中的一段话: “每个任务都必须通过使用静态本地来保持自己的状态 变量。“ 这到底是什么意思?它们似乎将一个一个用于维护状态的空*。。。(C)方案编制,c,microcontroller,void,avr,C,Microcontroller,Void,Avr,目前,我们正在学习如何编程AVR微控制器(仅限于Ansi C89标准)。所包含的驱动程序的一部分是一个标头,用于处理以不同速率调度ie运行任务的问题。我的问题是引用文档中的一段话: “每个任务都必须通过使用静态本地来保持自己的状态 变量。“ 这到底是什么意思?它们似乎将一个void*传递给函数以维护状态,但不使用它 查看我收集的文件中的代码,这就是它们的意思: {.func = led_flash_task, .period = TASK_RATE / LED_TASK_RATE, .data
void*
传递给函数以维护状态,但不使用它
查看我收集的文件中的代码,这就是它们的意思:
{.func = led_flash_task, .period = TASK_RATE / LED_TASK_RATE, .data = 0}
/* Last term the pointer term */
在数组中有一个使用上述参数运行的函数,但它仅充当调度器。然后功能led\u闪烁\u任务
被激活
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*数据的传递是为了维护任务的状态?这是什么意思
感谢您的帮助您可以从_uunused_u编译器宏中看到参数未使用。通常这样做是因为方法需要匹配某个签名(中断处理程序、新线程等)。请考虑pthread库的情况,其中签名类似于void*func(void*data)。您可以使用数据,也可以不使用数据,如果不使用,编译器会抱怨,因此粘贴_uunused__u宏会告诉编译器您知道自己在做什么,从而删除警告
还忘记了静态变量,正如在其他回答中所说的,静态变量不会在方法调用之间更改,因此变量在调用之间保留,因此保留状态(在C++11中仅为线程安全)。该函数中的数据未使用(因此u unused u)。状态保持为静态变量状态,这将在调用之间保持其值。另请参见文档中的:
未使用的
此属性附加到变量,表示该变量可能未使用。GCC不会为此变量生成警告 必须在局部静态变量中维护状态
这意味着在函数中使用static关键字声明变量:
static uint8_t state = 0;
在你的例子中
这与传递到任务中的参数无关,在您的示例中,该参数未被使用。+1用于提及线程安全。考虑到这一限制,以及uC上的多线程操作系统,我会在所有这些模块的顶部添加一个巨大的横幅:“维护静态数据-不得从多线程调用”。