Keil中调用malloc函数,分配出来的地址在flash,怎么改
时间: 2024-03-09 11:50:54 浏览: 113
在 Keil 中调用 malloc 函数时,分配出来的地址在 flash 的原因可能是堆的起始地址和大小没有正确配置。在默认情况下,Keil 会将堆分配到内部 SRAM 的起始地址处,如果 SRAM 空间不足,Keil 会将堆分配到 FLASH 的起始地址处。如果你使用的是 ROM-less 版本的 RA6M4 芯片,那么内部 SRAM 的空间可能较小,可能会导致堆分配到 FLASH 的起始地址处。在这种情况下,当你使用 malloc 函数时,分配出的地址就有可能在 FLASH 区。
为了解决这个问题,你可以手动配置堆的起始地址和大小,以确保分配的内存空间在 RAM 区。具体的操作方法如下:
1. 在 Keil 编译选项中添加 `--heap_size=xxx` 参数,指定堆大小为 xxx 字节。
2. 在代码中定义一个全局的堆数组,并将其放在 RAM 区,例如:
```
#define HEAP_SIZE 1024
uint8_t heap_buf[HEAP_SIZE] __attribute__((section(".my_heap"), zero_init));
```
其中,`__attribute__((section(".my_heap")))` 表示将 `heap_buf` 放在名为 `.my_heap` 的 RAM 区中,`zero_init` 表示将 `heap_buf` 数组中的元素初始化为 0。
3. 在代码中添加 `_sbrk` 函数的定义,用于实现动态内存分配。例如:
```
void *_sbrk(int incr)
{
static uint8_t *heap_end = heap_buf;
uint8_t *prev_heap_end;
prev_heap_end = heap_end;
if (heap_end + incr > heap_buf + HEAP_SIZE) {
/* 堆内存溢出 */
return (void *)0;
}
heap_end += incr;
return (void *)prev_heap_end;
}
```
其中,`_sbrk` 函数用于向操作系统申请增加堆大小,`heap_end` 表示堆的结束地址,`HEAP_SIZE` 表示堆的大小。
4. 在代码中调用 `malloc` 函数进行内存分配,例如:
```
char *str = (char *)malloc(10);
```
5. 编译代码并烧录到目标设备中。
通过以上步骤,你就可以在 Keil 中调用标准 C 库中的 malloc 函数,并确保分配出来的内存地址在 RAM 区了。
阅读全文