单位网站建设规划,wordpress编辑页面打开慢,python h5网站开发,文山建设局网站除了FreeRTOS提供的动态内存管理方法#xff0c;标准的C库也提供了函数malloc()和函数free()来实现动态的申请和释放内存。
为啥不用标准的C库自带的内存管理算法#xff1f;因为标准C库的动态管理方法有如下缺点#xff1a;
占用大量的代码空间#xff0c;不适合用在资源…除了FreeRTOS提供的动态内存管理方法标准的C库也提供了函数malloc()和函数free()来实现动态的申请和释放内存。
为啥不用标准的C库自带的内存管理算法因为标准C库的动态管理方法有如下缺点
占用大量的代码空间不适合用在资源紧缺的嵌入式系统中没有线程安全的相关机制运行有不确定性每次调用这些函数时花费的时间可能都不相同内存碎片化
因此FreeRTOS提供了多种动态内存管理的算法可针对不同的嵌入式系统。
算法优点缺点heap_1分配简单时间确定只允许申请内存不允许释放内存heap_2允许申请和释放内存不能合并相邻的空闲内存块会产生碎片、时间不定heap_3直接调用C库函数malloc和free简单速度慢、时间不定heap_4相邻空闲内存可合并减少内存碎片的产生时间不定heap_5能够管理多个非连续内存区域的heap_4时间不定
我们一般使用heap_4。heap_4内存管理算法使用了首次适应算法也支持内存的申请和释放并且能够将空间且相邻的内存进行合并从而减少内存碎片的现象。
首次适应算法
假设heap有3块空闲内存按内存块地址有底到高排序5字节、50字节、25字节
现在新创建一个任务需要申请20字节的内存
第一步找出第一个能满足pvPortMalloc的内存50字节
第二步把它划分为20字节、30字节返回这20字节的地址剩下的30字节仍然是空闲状态留给后续的pvPortMalloc使用
heap_4内存管理算法会把相邻的空闲内存合并为一个更大的空闲内存这有助于减少内存的碎片问题。
函数描述void *pvPortMalloc( size_t xWantedSize )申请内存void vPortFree( void *pv )释放内存size_t xPortGetFreeHeapSize( void )获取当前空闲内存大小
关于内存这里在多说几句
裸机时我们会定义堆栈大小例如**_Min_Heap_Size 0x200**_Min_Stack_Size 0x400这个是在RAM中的。如果是使用标准C库的malloc函数那么就会从这个堆中申请内存如果是函数中的局部变量那么就是申请的这里的栈内存。
FreeRTOS中也会定义一个堆空间ucHeap[ configTOTAL_HEAP_SIZE ]这个堆空间也是RAM的一部分和裸机中的堆栈没有任何关系。这个堆空间用于FreeRTOS中API申请内存空间例如动态创建任务任务的堆栈空间再或者pvPortMalloc函数动态申请内存。