【发布时间】:2014-10-04 03:46:32
【问题描述】:
我正在尝试为 LPC1768 芯片运行 SD/MMC Card Application from NXP. 它。
但是我在使用全局数据缓冲区时遇到了一些问题。
在 main.c 文件中,数据缓冲区是一个指向片上 SRAM 的指针
/* data buffer */
uint8_t *buf = (uint8_t *)0x2007C000; // 16KB
我在我的板子上编译运行程序,程序可以检测到我的SD卡并通过uart打印“2.0或更高版本的High/eXtended Capacity SD card”。
但是程序在第一次尝试访问数据缓冲区时终止,并在 gdb 上显示错误消息
lpc1768.cpu -- clearing lockup after double fault
Program received signal SIGINT, Interrupt.
0x100006fe in SD_RecvDataBlock (buf=0x0, len=512) at sd.c:502
502 buf[i] = SPI_RecvByte ();
当在 gdb 中打印 buf 的值时,这是我得到的
(gdb) p buf
$17 = (uint8_t *) 0x0
(gdb) p &buf
$18 = (uint8_t **) 0x10004010
(gdb) p *buf
$19 = 176 '°'
为什么程序不能访问代码中指示的内存位置 0x2007C000?
【问题讨论】:
-
这个编译器的
int大小是多少? -
我使用的是 uVision 4.74,int 大小为 32 位
-
似乎正在发生以下情况之一:运行时未初始化
buf(在某些裸板环境中,例如您可能在 LPC1768 上运行的环境中,您需要确保有足够的执行全局初始化的运行时)或某些东西正在覆盖buf变量。显然buf不是0x2007C000。既然你有一个可以工作的调试器,你应该单步调试程序并查看buf的值,以确保它在main()的开头被初始化,然后查看它的变化。 -
buf 的值是从 main 开始的。我想我在keil中缺少一些项目设置。似乎我需要在链接器脚本中添加一些东西,所以编译器专门将值 0x2007c000 分配给 buf。在调试中,我在 main 开始处停止并做了 (gdb) set buf = 0x2007c000。在我继续代码工作后:)
-
uVision 是 Keil 的 IDE,而不是编译器。由于您使用的是 GDB,您似乎使用的是 GCC 而不是 armcc?
标签: pointers memory embedded global