stm32 使用malloc申请内存和free释放内存造成的内存碎片测试

本例中使用stm32c8t6  mdk3.5 和 gcc-arm-none-eabi-4_9。使用EmBitz IDE  ARM GCC Compiler。

单片机是不建议使用 内存管理函数,但是在物联网应用当中,内存资源很是宝贵,MQTT 协议需要SSL TLS,数据签名 MD5,RSA等等 使用很是耗费内存资源,

使用内存管理函数就显得很有必要了。

经过测试不断的malloc和free 堆还是比较稳定的,测试 的基本思想是

随机小内存申请->如果大内存申请就释放->随机大内存申请->释放申请的小内存  这样一直循环,循环超过了一万次,堆内存稳定在0x200045d0这个地方

stm32 使用malloc申请内存和free释放内存造成的内存碎片测试_第1张图片


100个 范围在1byte-100bye的随机 内存申请和释放,和10 个 范围在10byte-1000byte的随机内存的申请和释放。

在不断的申请释放中堆内存会产生碎片,堆内存不够的的话就好调用_sbrk函数 increment 增加堆内存空间,如过稳定的话就不会增加堆内存空间,这样就是安全的。

不会一直增长到和栈内存空间重叠,堆内存空间和堆内存空间重叠是会导致不可预料的错误结果。

示例代码:

#include "stm32f10x_conf.h"
#include 
#include 
#include 
//char myRWdata[]={0,2,3,4};
//char myRIData[10];
#define MEM_SIZE 100
#define BIG_MEM_SIZE 10

void serial_init()
{
    GPIO_InitTypeDef GPIO_InitStruct;
    USART_InitTypeDef USART_InitStruct;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);

    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStruct);

    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3;
    GPIO_Init(GPIOA,&GPIO_InitStruct);

    USART_InitStruct.USART_BaudRate=9600;
    USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
    USART_InitStruct.USART_Parity=USART_Parity_No;
    USART_InitStruct.USART_StopBits=USART_StopBits_1;
    USART_InitStruct.USART_WordLength=USART_WordLength_8b;
    USART_Init(USART2,&USART_InitStruct);
    USART_Cmd(USART2,ENABLE);

}
  int _write (int fd, char *pBuffer, int size) //重定向打印函数printf的输出到USART2 
    {
        for (int i = 0; i < size; i++)
        {
            while (!(USART2->SR & USART_SR_TXE))
            {
            }
            USART_SendData(USART2, pBuffer[i]);
        }
        return size;
    }

     caddr_t _sbrk(int increment) 
    {
        extern char end asm("end");
        register char *pStack asm("sp");

        static char *s_pHeapEnd;

        if (!s_pHeapEnd)
            s_pHeapEnd = &end;

        if (s_pHeapEnd + increment > pStack)
            return (caddr_t)-1;

        char *pOldHeapEnd = s_pHeapEnd;
        s_pHeapEnd += increment;
        return (caddr_t)pOldHeapEnd;
    }

void test_mem()
{
    char *mem_list[MEM_SIZE];
    memset(mem_list,0,sizeof(char *)* MEM_SIZE);

      for(int i=0;iODR = 0xffffffff; //点亮led灯,判断程序是否在运行
      for(int i=0;i<1000000;i++);
       GPIOB->ODR=00; //熄灭led灯,判断程序是否在运行
       
      if(n>10000) n=0;  //循环10000次归零
      n++;
      //printf("count=%d\r\n",n);
      srand(n);

      for(int i=0;i




你可能感兴趣的:(EmBlocks,EmBitz,STM32,ARM,GCC)