问题描述
我正在尝试访问通过tftp加载的文件中的数据。我正在使用AM3358处理器
tftp 81000000 mydata
我可以看到数据已正确加载
=> md 81000000
81000000: 00004000 00000000 00002000 00000400 .@....... ......
在u-boot代码中,我创建了一个指向该地址的指针,然后尝试取消对它的引用,但是该值不正确,这使我觉得我使用的地址不正确
unsigned long addr = 0x81000000;
uint32_t *ptr = &addr;
uint32_t val = *(ptr+0);
printf("addr %ul val: %ul",addr,val);
此外,我正在尝试将mydata
的地址加载到32位LCD寄存器中,但是0x81000000
的物理地址超出了32位数字的地址。我相信我对这里涉及的地址映射感到困惑。
bdi产量
=> bdi
arch_number = 0x00000000
boot_params = 0x80000100
DRAM bank = 0x00000000
-> start = 0x80000000
-> size = 0x20000000
baudrate = 115200 bps
TLB addr = 0x9fff0000
relocaddr = 0x9ffb4000
reloc off = 0x1f7b4000
irq_sp = 0x9df8ba90
sp start = 0x9df8ba80
Early malloc usage: 4a8 / 1000
fdt_blob = 0x9df8bea0
解决方法
为什么0x81000000
不是有效的32位数字?
0x00000000
我认为您的逻辑可能有误:您正在使用ptr
的地址而不是其内容的地址来初始化addr
。
正确的代码应该是这样的:
uint32_t addr = 0x81000000;
uint32_t *ptr = (uint32_t*)(uintptr_t) addr;
uint32_t val = *(ptr+0);
printf("addr %ul val: %ul",addr,val);
这可以在您的PC上进行测试-您可能需要添加对构建32位应用程序的支持,即在Ubuntu上执行sudo apt-get install gcc-multilib
。
ptr.c
:
#include <stdio.h>
#include <stdint.h>
int
main ()
{
uint32_t addr = 0x81000000; // gcc 9.3.0 is complaining about uint32_t *ptr = &addr;
// your code
{
uint32_t *ptr = &addr;
printf ("%p\n",ptr);
}
// correct code
{
uint32_t *ptr = (uint32_t *) (uintptr_t) addr;
printf ("%p\n",ptr);
}
}
gcc -m32 -o ptr ptr.c
./ptr
0xff83bc60
0x81000000
这就是为什么您无法访问使用TFTP
传输的文件的内容的原因,因为您正在从错误但有效的地址进行读取。