Project

General

Profile

Actions

ResearchMemory

STM32CubeMXが自動生成するFreeRTOS環境のバグで、newlibの中でmalloc()が呼ばれるとヒープが破壊されるという問題があります。
参考 http://www.nadler.com/embedded/newlibAndFreeRTOS.html

この問題を何とかしたいので、mallocファミリの乗っ取りを企みます。

wrapする

GNU gcc/ld - wrapping a call to symbol with caller and callee defined in the same object file を見ると、ライブラリの中で呼ばれている関数をリンク時に乗っ取れるようです。

リンカスクリプトに以下のように記述することで、malloc, calloc, realloc, freeを乗っ取りました。
修正差分はリポジトリの SHA-1: 42f35a0 にあります。

COMMA := ,
WRAP := malloc calloc realloc free
LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections -Wl,--print-memory-usage $(addprefix -Wl$(COMMA)--wrap=,$(WRAP))

__wrap_~ を用意する

上記のリポジトリの、 common/molelord/MoleMalloc.c に実装があります。
malloc()だと単に以下のようにするだけです。

void *
__wrap_malloc(size_t size)
{
    return pvPortMalloc(size);
}

pvPortMalloc()は、FreeRTOSのスケジューラが動き出す前でも正しく動作します。
もちろんスケジューラが動き出した後でも、vTaskSuspendAll()で排他しながら動作するので、マルチタスクで動いていても問題ありません。


累計表示回数:24

Updated by mole lord 27 days ago · 4 revisions