0

我正在用 beaglebone 做一些 GPIO,目前在我的代码中有这个:

#include <linux/gpio.h>         //for GPIO

char label[] = "sys/kernel/debug/gpio";

struct gpio xx[] = {
    { gpio1, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio2, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio3, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio4, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio5, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio6, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio7, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio8, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio9, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio10, GPIOF_DIR_OUT|GPIOF_INIT_HIGH, label },
    };

其中 gpio#, 都定义为整数。GPIOF_DIR_OUT 和 GPIOF_DIR_LOW 是“linux/gpio.h”中的函数。

该结构未在函数内部声明。我相信这是我的问题,但我不确定它是如何被宣布为错误的。我已经看到了其他线程,但对我的问题没有任何帮助。我认为问题在于我正在从我的结构中调用一个函数。如果有人可以验证或帮助我解决这个问题,那就太好了。

4

4 回答 4

1

如果gpio1throughgpio10是整数,如您所说,那么您在这里声明的内容,正如编译器所说,是无效的。C 中的全局变量初始化器必须是常量表达式,这意味着不允许使用变量!

于 2013-02-28T02:16:37.563 回答
1

[...] 其中 gpio#, 都定义为整数 [...]

我假设您的意思可能是:

const int gpio1 = 42;
const int gpio2 = 84;
const int gpio3 = 43;
// etc.

但是,由于xx是在全局范围内初始化的,所以它是在编译时分配和初始化的。但是,根据我的假设,gpio1朋友是在运行时分配和初始化的,所以很明显编译器会告诉你它不能初始化xx

您将需要使用常量表达式(或将扩展为文字常量的宏)才能使其工作。例如,你会这样做:

enum {
    gpio1 = 42, 
    gpio2 = 84, 
    gpio3 = 43, 
    // etc.
};

...或者:

#define gpio1 42
#define gpio2 84
#define gpio3 43
// etc.

在你问之前,label在这个上下文中衰减成一个指向字符串文字的指针。这使它成为一个常量表达式,所以这个是允许的。

于 2013-02-28T02:18:52.030 回答
0

制作gpio1etcconst值,它将编译,例如:

const unsigned gpio1 = 1;
于 2013-02-28T02:24:22.220 回答
0

GPIOF_DIR_OUT、GPIOF_INIT_LOW、GPIOF_INIT_HIGH 是宏,不是函数。所以这不是原因。

我认为这个问题可能与 gpio1~gpio10 的定义有关,这些东西是变量还是宏?

于 2013-02-28T02:19:01.433 回答