C中的十六进制数组

时间:2012-11-15 13:14:06

标签: c

我正在尝试在此指令http://41j.com/blog/2011/09/beagleboard-gpio-input-driverless/

上学习处理器的扩展头配置

我有一个我无法理解的部分

volatile ulong *pinconf;
pinconf = (ulong*) mmap(NULL, 0x10000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x48000000);
pinconf[0x2168/4] = 0x001C001C;

任何人都可以解释pinconf数组的工作原理吗?它存储了什么价值?

编辑:我真的无法理解pinconf[0x2168/4]的意思。它是十六进制数组,它指的是什么值?

4 个答案:

答案 0 :(得分:2)

pinconf是一个内存映射文件/设备。查看链接代码,fd是新打开的/ dev / mem的描述符。因此,无论你写入pinconf数组,实际上都是直接写入/ dev / mem,无论你在数组中使用什么偏移量。我假设这是代码与GPIO硬件“交谈”的方式。如果没有GPIO设备的存储器映射,很难知道正在写入的地址会发生什么。

查看/ dev/mem是什么。

阅读有关内存映射i / o的信息,这就是它的作用(有点),请参阅:http://www.kernel.org/doc/htmldocs/uio-howto.html#userspace_driver

答案 1 :(得分:2)

基于你问题的标题,我认为你对访问数组的十六进制表示法感到困惑。

hex只是写数字的另一种方式,不要让它给你太多。我可以写:

int a = 0xA;

int a = 10;

他们的意思相同。所以在这种情况下:

pinconf[0x2168/4] = 0x001C001C;

只是:

pinconf[8552/4] = 1835036;

后者实际上更令人困惑,因为pinconf存储的地址通常使用4(或8)个字节以十六进制写入,因此00继续执行其余的数字(1C001C)< / p>

答案 2 :(得分:2)

我是原创博客/代码作者,这就是我的意思:

要回答您的要点,pinconf [0x2168 / 4]指的是地址0x48002168。 pinconf阵列从地址0x48000000开始。它被定义为ulong [1],在ARM处理器上是4个字节。我知道我想访问地址pinconf + 0x2168。要将地址0x2168转换为pinconf中的索引,我需要除以4.


从头开始遍历代码:

volatile ulong *pinconf;

pinconf被定义为ulong(32位int)指针。它被定义为volatile,这意味着我们的代码之外的东西可能会改变它的价值。它告诉编译器每次我们使用该值时我们都需要从内存中读取它,这会阻止编译器进行巧妙的优化,这可能会搞砸了。

pinconf = (ulong*) mmap(NULL, 0x10000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x48000000);

这会将pinconf设置为指向地址0x48000000。通常你可以这样做:

pinconf = (ulong*) 0x48000000;

使pinconf指向一个地址,但这不起作用。 0x48000000是受保护的地址,只能由内核访问。 mmap magic为您提供了一种从用户空间访问地址的方法。

pinconf[0x2168/4] = 0x001C001C;

我们已经介绍了这个,但是这是写一个值到地址:0x48000000 + 0x2168。值0x48002168来自OMAP3数据表,用于与GPIO系统进行内存映射IO。我们除以4将地址0x2168转换为pinconf中的索引。

[1]我应该使用uint32_t来说实话。

答案 3 :(得分:1)

pinconf数组存储ulong(unsigned long)。

使用volatile ulong *pinconf;定义指向ulong的指针。它指向数组的第一个元素。它是易变的,意味着它可能被外部“事件”改变而不会被缓存。它可以在C中使用任何数组。

在这种情况下,它被映射到具有文件描述符fd。

的文件/设备