硬汉嵌入式论坛

 找回密码
 立即注册
查看: 806|回复: 4
收起左侧

[技术讨论] 如何把剩余的ram分配给malloc使用?

[复制链接]

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
发表于 2024-12-16 15:30:07 | 显示全部楼层 |阅读模式
本帖最后由 会飞的猪_2020 于 2024-12-16 15:41 编辑

我使用的是tlsf,我按照rtt的代码抄袭。发现我reset或者重新上电也好,ram不会清零。
heap.zip (36.81 KB, 下载次数: 3)

[C] 纯文本查看 复制代码
#if (defined(__ARMCC_VERSION) && __ARMCC_VERSION >= 6000000)
__asm(".global __use_no_heap_region\n\t"); // AC6申明不使用C库的堆
#elif defined(__CC_ARM)
#pragma import(__use_no_heap_region) // AC5申明不使用C库的堆
#else
#endif
/*---------- includes ----------*/
#include "bsp_config.h"
#include "TLSF-2.4.6/src/tlsf.h"
#include "export.h"
#include "stdlib.h"
/*---------- macro ----------*/
#define RT_ALIGN(size, align)           (((size) + (align) - 1) & ~((align) - 1))
#define RT_ALIGN_DOWN(size, align)      ((size) & ~((align) - 1))
#define RT_ALIGN_SIZE 8

#define _SRAM_SIZE      20
#define _SRAM_END       (0x20000000 + _SRAM_SIZE * 1024)
#if defined(__ARMCC_VERSION)
extern int Image$$RW_IRAM1$$ZI$$Limit;
#define HEAP_BEGIN      ((void *)&Image$$RW_IRAM1$$ZI$$Limit)
#endif

#define HEAP_END        _SRAM_END

#define POOL_SIZE (HEAP_END - (uint32_t)HEAP_BEGIN)
/*---------- type define ----------*/

/*---------- variable prototype ----------*/
/*---------- function prototype ----------*/
/*---------- variable ----------*/
/*---------- function ----------*/
static void rt_system_heap_init(void *begin_addr, void *end_addr)
{
    uint32_t begin_align = RT_ALIGN((uint32_t)begin_addr, RT_ALIGN_SIZE);
    uint32_t end_align   = RT_ALIGN_DOWN((uint32_t)end_addr, RT_ALIGN_SIZE);
    /* Initialize system memory heap */
    init_memory_pool(end_align - begin_align,begin_addr);
}

int heap_init(void)
{
rt_system_heap_init((void *) HEAP_BEGIN, (void *) HEAP_END);
}
INIT_BOARD_EXPORT(heap_init);

#if defined(__ARMCC_VERSION)
void *malloc(size_t size)
{
    return tlsf_malloc(size);
}

void free(void *p)
{
    tlsf_free(p);
}

void *realloc(void *p, size_t want)
{
    return tlsf_realloc(p, want);
}

void *calloc(size_t nmemb, size_t size)
{
    return tlsf_calloc(nmemb, size);
}
#endif


[C] 纯文本查看 复制代码
LR_IROM1 0x08000000 0x00020000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00020000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }

  DEV_REGION 0x20000000 0x00000200  {  ; RW data
   *(.dev_defined)
  }
  DRV_REGION 0x20000100 0x00000200  {  ; RW data
   *(.drv_defined)
  }
  RW_IRAM1 0x20000200 0x00004C00  {  ; RW data
   .ANY (+RW +ZI)
  }
}

回复

使用道具 举报

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
 楼主| 发表于 2024-12-16 15:34:43 | 显示全部楼层
我每次申请1024个字节,然后reset,可以看到这里的计数值不会被清零。每次都叠加上去了。

4.gif

回复

使用道具 举报

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
 楼主| 发表于 2024-12-16 15:37:49 | 显示全部楼层
本帖最后由 会飞的猪_2020 于 2024-12-16 15:39 编辑

单步执行,每次都在这里return。
它初始化的时候会检查是否已经初始化,这个判断每次都过不了。
reset之后不知道为什么内存不会清零,像是这段内存变成了noinit段。但是我的sct没有改呀。

Snipaste_2024-12-16_15-36-56.png

回复

使用道具 举报

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
 楼主| 发表于 2024-12-16 15:43:30 | 显示全部楼层
我之前是直接定义了一个数组,这样子写是内存会清零的。

Snipaste_2024-12-16_15-42-28.png

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-12-17 09:01:07 | 显示全部楼层
这部分区域,如果有清零的需要,可以在xxx system.c文件里面将剩余空间手动清楚。

编译器的ZI区是编译器生成的代码清的。这一部分代码在MDK里面是被封装了,像RP2040做的GCC工程,这部分代码是完全开源出来的,可以方便修改。

MDK这个可以自己手动做下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 06:04 , Processed in 0.054836 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表