0

yagarto GCC コンパイラを使用した STM32F0 アプリケーションがあります。_sbrk newlib_stubs.c を実装しました。私が直面している問題は、_sbrk を呼び出して 4K のメモリを要求する際に、malloc(256) を malloc と呼んでいることです。私のシステムには合計 8K しかないので、明らかにこれは問題です。私は _sbrk への呼び出しを監視しましたが、これが少量のメモリを割り当てる前にいくつかの呼び出しを行っているようです。

今のところ、悪臭を避けるために鼻を押さえて、次のようなことをすることで、これを回避しています。

if(requested > 512)
    requested = 512;

ヒープを再配置する前に _sbrk で。

システムはしっかりしているように見えますが、これが戻ってきて、思いがけないときに私を悩ませることになると確信しています.

4

1 に答える 1

1

malloc を使用しないことについてのコメントで提供された微妙なヒントを使用して、自分のメモリを割り当てるために何かを作成することになりました。リリースする必要がないので、簡単になりました。約 1 時間私を悩ませたのは、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 でした。フィードバックをいただければ幸いです。

于 2012-12-04T14:44:47.523 に答える