Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一个用于维护状态的空*。。。(C)方案编制_C_Microcontroller_Void_Avr - Fatal编程技术网

一个用于维护状态的空*。。。(C)方案编制

一个用于维护状态的空*。。。(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

目前,我们正在学习如何编程AVR微控制器(仅限于Ansi C89标准)。所包含的驱动程序的一部分是一个标头,用于处理以不同速率调度ie运行任务的问题。我的问题是引用文档中的一段话:

“每个任务都必须通过使用静态本地来保持自己的状态 变量。“

这到底是什么意思?它们似乎将一个
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上的多线程操作系统,我会在所有这些模块的顶部添加一个巨大的横幅:“维护静态数据-不得从多线程调用”。