本帖最后由 会飞的猪_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)
}
}
|