Keil中指定代码段与常量在Flash中地址方法

  • Keil中使用使用.sct来决定代码编译出来的程序与常量等在Flash中的分布位置。

    • Keil ->Target Option ->Linker,如下图

    •  

  • 分配代码文件到Flash指定位置方法

    • 在.sct文件中指定代码输出文件(.o格式)到Flash指定位置,如下图
      •  
        • BootMain.o被指定放于 0x08000000-0x08004000段区间

  • 分配常数到Flash指定位置

    • 程序中写法举例:const int data __at(0x08004000)
      • data被存放于Flash中地址为 0x08004000的位置。
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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 区了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值