keil中基于标准C库使用malloc时,分配出的地址指向flash
时间: 2024-03-08 22:49:34 浏览: 59
在Keil中,使用标准C库中的malloc函数分配的内存空间默认是指向RAM中的,而不是Flash中的。如果要将动态分配的内存空间放到Flash中,需要使用特殊的编译选项和链接脚本。下面是一些步骤:
1. 在Keil中打开Options for Target窗口。
2. 在C/C++选项卡下,选择Define选项卡。
3. 在Preprocessor Symbols中添加以下定义:
```
__MEMORY_MODEL_LARGE__
```
4. 在链接器选项卡下,选择Use Memory Layout选项卡。
5. 选择Memory Map选项卡,然后在Flash中创建一个新的段:
```
Name: MY_FLASH
Start: 0x08000000
Size: 0x10000
Attributes: CODE, READONLY, CONST
```
6. 在链接器选项卡下,选择Miscellaneous选项卡。
7. 在Linker Command File中选择一个链接脚本文件(例如,stm32f407vg_flash.ld)。
8. 在链接脚本文件中,将MY_FLASH段添加到Flash区域:
```
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 192K
}
SECTIONS
{
.text :
{
/* code sections */
*(.text)
*(.text.*)
*(.rodata)
*(.rodata.*)
...
} >FLASH
MY_FLASH :
{
*(MY_FLASH)
} >FLASH
}
```
9. 在代码中使用malloc函数来分配内存。例如,以下代码将分配一个包含10个整数的数组,并将其放在MY_FLASH段中:
```
#include <stdlib.h>
#pragma location = "MY_FLASH"
int *arr = (int*)malloc(10*sizeof(int));
```
注意:在使用malloc函数时,需要进行错误检查以确保内存分配成功。如果分配失败,malloc函数将返回NULL指针。在上面的示例中,如果分配失败,程序将无法正常运行,因为arr指针没有被初始化。
阅读全文