微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > ARM技术讨论 > 关于freescale的k60芯片使用malloc的问题

关于freescale的k60芯片使用malloc的问题

时间:10-02 整理:3721RD 点击:

问题描述: 使用拉普兰德的k60固件库的malloc函数申请堆存,我想要一个8字节的空间(对齐以后的struct),可是每次malloc都给我分配了两个block(一个block 16字节),以至于使用链表的时候总是堆存不够,如何解决?代码如下

  1. /*
  2. * This struct forms the minimum block size which is allocated, and
  3. * also forms the linked list for the memory space used with alloc()
  4. * and free().  It is padded so that on a 32-bit machine, all malloc'ed
  5. * pointers are 16-byte aligned.
  6. */
  7. typedef struct ALLOC_HDR
  8. {
  9.     struct
  10.     {
  11.         struct ALLOC_HDR     *ptr;
  12.         unsigned int size;
  13.     } s;
  14.     unsigned int align;
  15.     unsigned int pad;
  16. } ALLOC_HDR;

  17. static ALLOC_HDR base;
  18. static ALLOC_HDR *freep = NULL;

复制代码

  1. void * malloc (unsigned nbytes)
  2. {
  3.     /* Get addresses for the HEAP start and end */
  4.     #if defined(__IAR_SYSTEMS_ICC__)
  5.       char* __HEAP_START = __section_begin("HEAP");
  6.       char* __HEAP_END = __section_end("HEAP");
  7.     #else
  8.       #warning 非IAR编译器需确定HEAP起始结束地址
  9.       extern char __HEAP_START;
  10.       extern char __HEAP_END[];
  11.     #endif
  12.    
  13.     ALLOC_HDR *p, *prevp;
  14.     unsigned nunits;

  15.     nunits = ((nbytes+sizeof(ALLOC_HDR)-1) / sizeof(ALLOC_HDR)) + 1;
  16.         
  17.     if ((prevp = freep) == NULL)
  18.     {
  19.         p = (ALLOC_HDR *)__HEAP_START;
  20.         p->s.size = ( ((uint32)__HEAP_END - (uint32)__HEAP_START)
  21.             / sizeof(ALLOC_HDR) );
  22.         p->s.ptr = &base;
  23.         base.s.ptr = p;
  24.         base.s.size = 0;
  25.         prevp = freep = &base;
  26.     }
  27.     for (p = prevp->s.ptr; ; prevp = p, p = p->s.ptr)
  28.     {
  29.         if (p->s.size >= nunits)
  30.         {
  31.             if (p->s.size == nunits)
  32.             {
  33.                 prevp->s.ptr = p->s.ptr;
  34.             }
  35.             else
  36.             {
  37.                 p->s.size -= nunits;
  38.                 p += p->s.size;
  39.                 p->s.size = nunits;
  40.             }
  41.             freep = prevp;
  42.                         OLED_ShowNum(0, 5, p -> s.size, 18);
  43.             return (void *)(p + 1);
  44.         }

  45.         if (p == freep)
  46.             return NULL;
  47.     }
  48. }

复制代码



已退回3积分

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top