【问题标题】:A void* being used to maintain state... (C programming)用于维护状态的 void*...(C 编程)
【发布时间】:2011-09-27 07:20:07
【问题描述】:

目前我们正在学习如何对 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的传递是为了维持任务的状态?这是什么意思?

感谢您的帮助

【问题讨论】:

    标签: c microcontroller void avr


    【解决方案1】:

    从 __unused__ 编译器宏中可以看出,该参数未使用。通常这样做是因为该方法需要匹配某个签名(中断处理程序、新线程等) 想想 pthread 库的情况,其中签名类似于 void *func(void *data)。您可能会或可能不会使用数据,如果您不使用,编译器会抱怨,因此粘贴 __unused__ 宏会通过告诉编译器您知道自己在做什么来消除警告。

    也忘记了静态变量,正如另一个答案中所说的静态变量不会从方法调用更改为方法调用,因此变量在调用之间保留,因此保留状态(仅在 C++11 中是线程安全的)。

    【讨论】:

    • +1 用于提及线程安全。鉴于此约束,以及 uC 上的多线程操作系统,我将在所有此类模块的顶部包含一个巨大的横幅:“维护静态状态数据 - 不得从多个线程中调用”。
    【解决方案2】:

    data 在该函数中未使用(因此 __unused__)。状态保持在静态变量状态中,这将在调用之间保持其值。另见What is the lifetime of a static variable in a C++ function?

    【讨论】:

      【解决方案3】:

      来自文档: 未使用 附加到变量的这个属性意味着该变量可能未被使用。 GCC 不会对此变量产生警告。

      【讨论】:

        【解决方案4】:

        状态必须保存在局部静态变量中。

        这意味着在函数内部使用 static 关键字声明的变量:

        static uint8_t state = 0;
        

        在你的例子中。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-30
          • 1970-01-01
          相关资源
          最近更新 更多