【发布时间】:2014-02-05 15:05:47
【问题描述】:
我正在研究 STM32F4 微控制器内部的 ARM Cortex M4F (M3),没有操作系统。语言是纯C。
我遇到了 malloc() 函数的问题。下面的代码使用从 SD 卡读取的全局和易失性数据表 (volatile unsigned char[] fat_sector_buffer)。在函数中,我声明了指针内存(用于从表中读取数据的结构类型为结构),并将内存分配为第二个结构,用于保存来自 RTC 的日期和时间。
问题是,当我使用 malloc() 时,内存分配在 fat_sector_buffer 上。
代码:
unsigned char fat16_update_entry()
{
uint8_t looking=1;
unsigned int i=0;
char ret=0;
Fat16Entry *data;
DateTimeStruct *dt=malloc(sizeof(DateTimeStruct));
unsigned short time,date;
dt= read_calendar(dt); //Read calendar date and time
...
在 malloc 之后我得到的是: http://i.stack.imgur.com/Lv0Mn.png
为什么会发生,我该如何解决?
【问题讨论】:
-
您能告诉我们 fat_sector_buffer 的分配方式和位置,以及您发布的代码与分配之间的关系吗?如果 malloc /really/ 是从全局堆中分配的(无需您做任何事情),则 libc 存在严重问题。如果这是正在发生的事情,我建议其他东西正在破坏堆并破坏 malloc()。你能在你的平台上运行 valgrind 吗?
-
您好,对于 Valgrind,这是不可能的,因为这是无操作系统(嵌入式)应用程序。 fat_sector_buffer 是 unsigned char 数组,大小为 512。这不是索引出表的问题(错误位置的索引是 224)。我检查了内存配置,范围没有覆盖。
-
fat_sector_buffer变量是内存映射变量,因此使用固定地址声明?如果是这样:这个地址真的可能会改变吗?或者你可以一起取消volatile(当然没有可能带来的优化问题) -
不太可能改变。事实上,之前它没有 volatile 标识符,因为这里不需要它,添加它只是为了看看它是否有帮助(它没有)。
-
拜托,学习格式化代码,这看起来很糟糕!
标签: c pointers memory-management malloc stm32