1

NXP の MPC5748G で LZMA (C バージョン) (7-zip.org/sdk.html) を実行しようとしています。単純なコードをコンパイルしてストリームをエンコード/デコードしますが、いくつかのエラーが発生します...ただし、ファイルはラップトップで正常にコンパイルされ、LZMA アプリケーションを実行できました

DCC が表示するエラーは次のとおりです。

scons: done reading SConscript files.
scons: Building targets ...
..\tools\wr\mpc5748_wr594\diab\5.9.4.2\WIN32\bin\dcc.exe -c -Xenum-is-best -Xrtti-off -Xexceptions-off -Xforce-declarations -ee1481 -tPPCVLEES:simple -Xsection-split -g3 -XO -Xsize-opt -DTGT_MPC5748_WR594 -DC_DERIVATIVE_MPC5748G -DFREESCALE_OS -DAUTOSAR_OS_USED -DOSDIABPPC -DADC_INTERRUPT_TYPE=MCAL_ISR_TYPE_NONE -DCAN_INTERRUPT_TYPE=MCAL_ISR_TYPE_NONE -DGPT_INTERRUPT_TYPE=MCAL_ISR_TYPE_NONE -DICU_INTERRUPT_TYPE=MCAL_ISR_TYPE_NONE -DLIN_INTERRUPT_TYPE=MCAL_ISR_TYPE_NONE -DPWM_INTERRUPT_TYPE=MCAL_ISR_TYPE_NONE -DSPI_INTERRUPT_TYPE=MCAL_ISR_TYPE_NONE -DTGT_DBG -DTGT_APP -DCFG_CFG -DCFG_CAN -DCFG_CSL -DCFG_MCU -DCFG_DUT -DCFG_MEM -DCFG_MOV -DCFG_GPI -DCFG_GPO -DCFG_ADC -DCFG_SED -DCFG_FRY -DCFG_LPM -DCFG_ETH -IC:\GW_MCU\tools\wr\mpc5748_wr594\diab\5.9.4.2\include -Ibsw\mcal\mcalAS\inc -I. lib\lzma\Alloc.c -o lib\lzma\Alloc.o
..\tools\wr\mpc5748_wr594\diab\5.9.4.2\WIN32\bin\dcc.exe -tPPCVLEES:simple -u__lear_calypso_memory_init -Wl,-Xremove-unused-sections -Wl,-Xunused-sections-list -lc -Wl,-m6 -Wm bsw/mcal/mcalm/linkerDescriptionVLE_App.dld -o out\app\BmwBdc2018GwmDutApp.elf out/app\objToLink.inl 1>out/app/BmwBdc2018GwmDutApp.map
dld: warning: Undefined symbol '__HEAP_END' in file 'sbrk.o(C:\GW_MCU\tools\wr\mpc5748_wr594\diab\5.9.4.2\PPCVLEE\libchar.a)'
dld: warning: Undefined symbol '__HEAP_START' in file 'sbrk.o(C:\GW_MCU\tools\wr\mpc5748_wr594\diab\5.9.4.2\PPCVLEE\libchar.a)'
dld: error: Undefined symbols found - no output written

このエラーはdiabコンパイラに固有のものであり、ドキュメントで見つけたものは次のとおりです。

Dynamic Memory Allocation - the heap, malloc( ), sbrk( )
malloc( ) allocates memory from a heap managed by function sbrk( ) in src/sbrk.c.
There are two ways to create the heap:
■ Define __HEAP_START and __HEAP_END, typically in a linker command file.
See the files conf/default.dld, conf/sample.dld, and 25.6 Command File
Structure, p.419 for examples.
■ Recompile sbrk.c as follows:
dcc -ttarget -c -D SBRK_SIZE=n sbrk.c
where n is the size of the desired heap in bytes.

私はターゲットのソースコードも C の LZMA SDK の作成者でもありません。LZMA エンコーダーはエンコーダーに少なくとも 1Mb の RAM を割り当て、MPC5748 は 768Kb の RAM しか提供しないことを理解しています。

だから私は質問にLZMAとdiabコンパイラ(タグが見つかりません)にタグを付けました。両方で働いた人だけが私を助けることができました

更新

dld: warning: Undefined symbol 'LzmaEncProps_Init' in file 'lib/lzma/LzmaLib.o' の問題を削除しました。対応するソース ファイルを makefile に含めますが、HEAP の問題は解決しません。問題は消えましたが、アプリは実行されません trace32 デバッガーを使用して、このエラーの原因を診断することができました:

 p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb));

この行は空の p->probs を返すため、alloc は必要なサイズをすべて割り当てることができなかったようです

ありがとう

4

1 に答える 1

1

使用している MCU で malloc が許可されていない可能性があります。静的割り当てを使用するか、独自の malloc を実装してみてください。

ここで役立つ説明を見つけることができます:

https://www.quora.com/Why-is-malloc-harmful-in-embedded-systems

于 2016-03-14T23:37:15.473 に答える