我有一个使用yagarto GCC编译器的STM32F0应用程序。 我已经实现了_sbrk newlib_stubs.c。 我遇到的问题是我在调用 _sbrk malloc(256) 时调用 malloc(256) 并要求 4K 内存。 我的系统总共只有8K,所以显然这是一个问题。 我已经监视了对_sbrk的调用,它似乎在分配较少的内存量之前进行了几次调用。
现在,我正在通过捏住鼻子来避免恶臭并做类似的事情来解决这个问题:
if(requested > 512)
requested = 512;
在我重新定位堆之前_sbrk。
尽管该系统看起来坚如磐石,但我相当确定它会在我最意想不到的时候回来困扰我。
由于评论中提供了关于不使用malloc的微妙提示,我最终创建了某种东西来分配自己的内存。 我永远不需要释放它,所以这让它变得简单。 唯一让我刺痛了大约一个小时的是保持 32 位对齐。
这是我的实现pm_代表穷人。
#define HEAPSIZE 0x800 //2K
uint16_t __heapPtr = 0;
uint8_t __customHeap[HEAPSIZE];
void *pm_malloc(uint16_t size){
while(__heapPtr % 4 != 0)
__heapPtr++;
void *block = &__customHeap[__heapPtr];
if(size + __heapPtr > HEAPSIZE)
return 0;
__heapPtr += size;
return block;
}
在过去的15年里,我一直在学习C#,Java和Objective-C,所以任何反馈将不胜感激。