[英]Usb device id table understanding
我试图了解linux内核初始化结构的不同方式。 在这个查询中我写了一个示例usb驱动程序,但我不明白一些点,指出前面的注释?
static struct usb_device_id pen_table[] = //?? why pen_table is an array
{
{ USB_DEVICE(0xaaaa , 0x8816) }, //??what type of array initialization is this
{} /* Terminating entry */ //??how this terminates
};
我试图以这种方式初始化设备ID表,但我接近初始化时收到错误
static struct usb_device_id pen_table = {
.match_flags = USB_DEVICE_ID_MATCH_DEVICE,
.idVendor=0xaaaa,
.idProduct = 0x8816,
};
您应该掌握Linux
内核源代码才能真正理解这一点。
pen_table
是一个数组? 它西港岛线是必要的MODULE_DEVICE_TABLE
(见硬的时间了解MODULE_DEVICE_TABLE(USB,id_table)的使用 ),并在规定的情况下usb_driver
结构,见http://opensourceforu.efytimes.com/2011/11/usb-drivers-in-linux -2 / 。
USB_DEVICE
是include / linux / usb.h中定义的宏:
#define USB_DEVICE(vend, prod) \
.match_flags = USB_DEVICE_ID_MATCH_DEVICE, \
.idVendor = (vend), \
.idProduct = (prod)
C标准说:
初始化应在初始化器列表顺序中进行,每个初始化器为特定子对象提供,覆盖同一子对象的任何先前列出的初始化器; 未明确初始化的所有子对象应与具有静态存储持续时间的对象隐式初始化。
和:
如果未显式初始化具有自动存储持续时间的对象,则其值不确定。 如果未显式初始化具有静态存储持续时间的对象,则:
- 如果它有指针类型,则将其初始化为空指针;
- 如果它有算术类型,则初始化为(正或无符号)零;
- 如果它是一个聚合,则根据这些规则初始化(递归)每个成员;
- 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员。
由于这一点, id_table
被定义为一个指针,而不是作为里的数组usb_driver
:
const struct usb_device_id *id_table;
使用id_table
的函数不会独立地传递数组大小, id_table
将指针增加到id_table
直到其中一个元素为NULL。 请参阅代表此技术的这个简短示例:
#include <stdio.h>
#include <stdlib.h>
struct small
{
int a;
int b;
};
struct big
{
struct small *s;
};
struct small table[] =
{
{1, 1},
{2, 2},
{3, 3},
{}
};
int main(void)
{
struct big b = {
.s = table
};
const struct small *s;
/* traverse through table using pointer arithmetic */
for (s = b.s; s->a; s++)
{
printf("%d\n", s->a);
printf("%d\n", s->b);
}
exit(0);
}
我没有,你确定你没有尝试重新定义pen_table
吗? 什么是错误消息?
它是一个数组,因为它是如何定义和使用数据结构的。
您有n个条目,然后是终止条目(在这种情况下,全部为零)。
无论在初始化中使用此数组,它都将从表符号开始并消耗条目,直到它到达终结符,然后停止。 这样您也不需要传达条目数。
此模式有助于配置数据与库的后期绑定,并允许更多的编译时配置,而不是运行时配置,并且还需要更少的事情来同步才能正常运行(因此错误的机会更少)。
你的第二个结构没有终止符,所以解析表的东西只是继续进行,直到它崩溃或出错。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.