C u-boot:如何访问';引导计数';从linux用户空间?
我正在尝试使用检测在TI am335x设备(例如beaglebone black)上引导的多次失败尝试。在TI/Davinci平台上,引导计数值存储在C u-boot:如何访问';引导计数';从linux用户空间?,c,beagleboneblack,u-boot,C,Beagleboneblack,U Boot,我正在尝试使用检测在TI am335x设备(例如beaglebone black)上引导的多次失败尝试。在TI/Davinci平台上,引导计数值存储在RTC\u SCRATCH2寄存器()中。但是在linux端,我找不到任何驱动程序将bootcount公开为sysfs节点或设备,作为读取和重置值的手段。因此,(主线)内核似乎不支持这一点,但我想知道是否可以从用户空间实现这一点 参考: 编辑:工作实现 这是一个有效解决方案的要点,但我有一个问题(见下文…) 现在,如果我将mmap'd内存强
RTC\u SCRATCH2
寄存器()中。但是在linux端,我找不到任何驱动程序将bootcount公开为sysfs节点或设备,作为读取和重置值的手段。因此,(主线)内核似乎不支持这一点,但我想知道是否可以从用户空间实现这一点
参考:
mmap
'd内存强制转换为uint32\u t*
(如下所示),以避免以后的类型强制转换,那么我读回的值是不正确的(启动计数不匹配):
当我使用uint32\u t*mem
时,val
是否应该保持相同的值
完整的来源可以是
当我使用uint32\u t*mem
时,val
是否应该保持相同的值
如果您使用了正确的指针算法(您没有),那么您将得到正确的结果
在+
的C表达式中,
表示与指针类型大小相同的量(例如sizeof(struct foo)
。只有当指针是字节指针时,
才会表示字节计数
如果我们有一个由结构的100个元素组成的数组x
,例如
struct foo x[100];
数组的名称可用作指针。因此,数组第十个元素的地址可以引用为
&x[9]
或(x+9)
在您的第一个代码示例中
unsigned char *mem ...
mem
被声明为字节指针。因此,指针计算在
unsigned char *scratch2 = mem + page_offset;
unsigned char *scratch2 = mem + page_offset;
生成您期望的结果,因为sizeof(unsigned char)
为1(byte),并且page\u offset
以字节数表示
但是在第二个代码示例中
uint32_t *mem ...
mem
声明为指向4字节字的指针。因此,中的相同指针计算
unsigned char *scratch2 = mem + page_offset;
unsigned char *scratch2 = mem + page_offset;
真的相当于
unsigned char *scratch2 = (unsigned char *)mem + (sizeof(uint32_t) * page_offset);
其中sizeof(uint32\u t)
是4(字节),应用的偏移量是您预期的四倍。这是因为
page\u offset
仍然是一个字节数,但在原始表达式中被视为指针类型的定标器计数,它是一个4字节的字。您不能简单地更改指针类型(即从
char
更改为int
),并期望指针算法不受影响。将
mem
更改为键入uint32\u t*
时,指针计算需要重新编码,以将字节偏移量转换为四字节偏移量:
unsigned char *scratch2 = mem + (page_offset / sizeof(uint32_t));
您可以通过使用printf()报告
mem
、scratch2
和其他指针计算的值来确认这些语句(或调试代码)。了解如何使用devmem2.c。假设您的代码是从devmem2.c派生的,那么删除版权声明是不正确的或更糟的。“它不起作用”--这是一个不充分的问题描述。考虑到你的职称,如果你费心通过报告程序试图访问的位置来调试代码,你应该能够自己解决这个问题。公平地说,我澄清了什么“不起作用”。让我建议,“考虑到你的职称,你应该能够解决这个问题”并不是问答论坛的建设性反馈。对于C,我是一个新手。在的帮助下,我确实提出了一个可行的解决方案(第一个示例)。我只是查看了devmem2.C,以防我引用的答案是从那里复制的。它们是完全不同的-即使是open(“/dev/mem”
和mmap()
行似乎也不是副本。