你好,我是按照《Linux设备驱动程序开发》这本书,在Linux中写一个驱动程序。在一个例子中,代码如下。
struct my_gpios {
int reset_gpio;
int led_gpio;
};
static struct my_gpiosneeded_gpios = {
.reset_gpio = 47;
.led_gpio = 41;
};
static struct resource needed_resources[] = {
[0] = { /* The first memory region */
.start = JZ4740_UDC_BASE_ADDR,
.end = JZ4740_UDC_BASE_ADDR + 0x10000 - 1,
.flags = IORESOURCE_MEM,
.name = "mem1",
},
[1] = {
.start = JZ4740_UDC_BASE_ADDR2,Platform Device Drivers
[ 126 ]
.end = JZ4740_UDC_BASE_ADDR2 + 0x10000 -1,
.flags = IORESOURCE_MEM,
.name = "mem2",
},
};
static struct platform_devicemy_device = {
.name = "my-platform-device",
.id = 0,
.dev = {
.platform_data = &needed_gpios,
},
.resource = needed_resources,
.num_resources = ARRY_SIZE(needed_resources),
};
platform_device_register(&my_device);
我不明白其中的语法 static struct_gpiosneeded_gpios = {}
意思和为什么要点 .reset_gpio
. 句法的含义是什么呢?static struct [] = {[0]={}, [1]={}}
?
请你给我一个参考链接或关键字或例子,关于 static struct {.a = VALUE, .b = VALUE,};
?
static struct something x = {
.field_one = 123,
.field_two = 456
};
这是一个 struct
初始化语法,从C99开始的标准语法(见此). 这个例子创建了一个类型为 struct something
名为 x
,领域为 field_one
和 field_two
初始化为指定的值,其他任何字段初始化为 0
. 该 static
关键字是一个存储持续时间指定符(见此).
static struct something x[] = {[0]={ ... }, [1]={ ... }};
这是这两者的混合。struct
初始化和数组初始化语法,同样是C99的标准语法(见此). 这个例子创建了一个数组 x
类型的变量的 struct something
,索引处的那个 0
的内容进行初始化。{...}
初始化器,同样的道理也适用于索引处的那个 1
. 由于最大的指定指数是 1
阵列大小为 2
.
我不明白为什么他们命名的类型是。
u32
或者说__raw
.
该 u32
类型只是 uint32_t
.
我不确定你到底在哪里看到 __raw
,因为我似乎没有在内核源码中找到类似的东西。在任何情况下,Linux内核作为一系列编译时注解,用于不同用途的变量(__user
, __rcu
等)。) 这些都不是C标准的一部分,甚至经常不是GCC的扩展。它们大多是由 稀疏,Linux 内核语义检查器。
内核中的变量、宏、类型......的命名有什么标准或规则吗?
请参考 Linux内核编码风格 文档页面获取更多信息。我建议你在尝试进行任何内核编程之前,先把它全部读完。你读的文档越多越好。
当我在linux驱动中写代码时,我必须遵守什么C标准?
使用任何C99或更老的标准就可以了。Linux内核代码并没有遵守一个C标准,代码的各个部分甚至不符合标准,而是使用GCC扩展。请看 此处 以获得更多信息。
编译时一般不会选择标准,内核的 Makefile
为你做的,它应该默认为C90。
无论如何,这些问题很多。如果你有一个 特定 问题我建议你分开来问,这样大家才能给你一个重点的、更广泛的回答,因为问得太宽泛或太多都是偏题。