我正在使用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”中的函数。
结构未在函数内声明。我相信这是我的问题,但我不确定它是如何被宣布错误的。我已经看到了其他线程,但没有真正帮助解决我的问题。我认为问题是我在我的struct中调用一个函数。如果有人可以验证,或者帮我解决这个问题,那就太好了。
答案 0 :(得分:1)
如果gpio1
到gpio10
是整数,正如你所说,那么你在这里声明的是,正如编译器所说,它是无效的。 C中的全局变量初始值设定项必须是常量表达式,这意味着不允许变量!
答案 1 :(得分: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
在此上下文中衰减为指向字符串文字的指针。这使它成为一个常量表达式,因此允许这样做。
答案 2 :(得分:0)
GPIOF_DIR_OUT,GPIOF_INIT_LOW,GPIOF_INIT_HIGH是宏,而不是函数。所以这不是原因。
我认为这个问题可能与gpio1~gpio10定义有关,这些东西是变量还是宏?
答案 3 :(得分:0)
生成gpio1
等const
值,它将编译,例如:
const unsigned gpio1 = 1;