Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C u-boot:如何访问';引导计数';从linux用户空间?_C_Beagleboneblack_U Boot - Fatal编程技术网

C u-boot:如何访问';引导计数';从linux用户空间?

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内存强

我正在尝试使用检测在TI am335x设备(例如beaglebone black)上引导的多次失败尝试。在TI/Davinci平台上,引导计数值存储在
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()
行似乎也不是副本。