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()で排他しながら動作するので、マルチタスクで動いていても問題ありません。
累計表示回数:115
Updated by mole lord 4 months ago · 4 revisions