rt-thread的小内存管理是其默认的堆内存管理算法。是采用静态链表来实现的,源文件为mem.c。
1.数据结构
=====
struct heap_mem
{
/* magic and used flag */
rt_uint16_t magic;
// 如果此内存块被分配了,则置0x1ea0,以此标志
// 此块内存是正常分配出来的,而不是非法指针
rt_uint16_t used; // 0:未分配;1:已分配
rt_size_t next, prev; // 前一内存块,后一内存块
};
2.初始化动态内存堆
=====
/**
* @ingroup SystemInit
*
* This function will init system heap
*
* @param begin_addr the beginning address of system page
* @param end_addr the end address of system page
*/
void rt_system_heap_init(void *begin_addr, void *end_addr)
{
struct heap_mem *mem;
rt_uint32_t begin_align = RT_ALIGN((rt_uint32_t)begin_addr, RT_ALIGN_SIZE);
// 得到对齐后的堆内存起始地址
// 在rtdef.h中
// #define RT_ALIGN(size, align) (((size) + (align) - 1) & ~((align) - 1))
// 使得begin_align保持四字对齐,这样对于处理器寻址时比较高效
rt_uint32_t end_align = RT_ALIGN_DOWN((rt_uint32_t)end_addr, RT_ALIGN_SIZE);
// 得到对齐后的堆内存末尾地址
// #define RT_ALIGN_DOWN(size, align) ((size) & ~((align) - 1))
// 使得末尾地址向后四字对齐
RT_DEBUG_NOT_IN_INTERRUPT;
// 确保此函数不是运行在中断例程内
// 在rtdebug.h中
// #define RT_DEBUG_NOT_IN_INTERRUPT \
// do \
// { \
// rt_base_t level; \
// level = rt_hw_interrupt_disable(); \
// if (rt_interrupt_get_nest() != 0) \
// { \
// rt_kprintf("Function[%s] shall not used in ISR\n", __FUNCTION__); \
// RT_ASSERT(0) \
// }
[RT-Thread 源码分析] 1. 内存管理1
最新推荐文章于 2023-09-03 09:14:04 发布