Diab 编译器中的解析错误
Parse Error in Diab compiler
我正在尝试 运行 LZMA(C 版本)(7-zip。org/sdk。html)在 NXP 的 MPC5748G 上,通过编译一个简单的代码到 encode/decode 一个流,但我得到了一些错误...
然而,这些文件在我的笔记本电脑上编译成功,我能够 运行 LZMA 应用程序
这是 DCC 显示的错误:
scons: done reading SConscript files.
scons: Building targets ...
..\tools\wr\mpc5748_wr594\diab.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.9.4.2\include -Ibsw\mcal\mcalAS\inc -I. lib\lzma\Alloc.c -o lib\lzma\Alloc.o
..\tools\wr\mpc5748_wr594\diab.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.9.4.2\PPCVLEE\libchar.a)'
dld: warning: Undefined symbol '__HEAP_START' in file 'sbrk.o(C:\GW_MCU\tools\wr\mpc5748_wr594\diab.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 中的问题:警告:文件 'lib/lzma/LzmaLib.o' 中的未定义符号 'LzmaEncProps_Init' 通过将相应的源文件包含到我的 makefile 中,但是 HEAP 问题仍然存在。
问题消失了但是应用程序没有 运行
使用 trace32 调试器我能够诊断出这个错误的来源:
在第
行
p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb));
行 returns empty p->probs 所以似乎 alloc 无法分配所有需要的大小
谢谢
可能您使用的MCU中不允许使用malloc,尝试使用静态分配或实现您自己的malloc。
您可以在这里找到有用的解释:
https://www.quora.com/Why-is-malloc-harmful-in-embedded-systems
我正在尝试 运行 LZMA(C 版本)(7-zip。org/sdk。html)在 NXP 的 MPC5748G 上,通过编译一个简单的代码到 encode/decode 一个流,但我得到了一些错误... 然而,这些文件在我的笔记本电脑上编译成功,我能够 运行 LZMA 应用程序
这是 DCC 显示的错误:
scons: done reading SConscript files.
scons: Building targets ...
..\tools\wr\mpc5748_wr594\diab.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.9.4.2\include -Ibsw\mcal\mcalAS\inc -I. lib\lzma\Alloc.c -o lib\lzma\Alloc.o
..\tools\wr\mpc5748_wr594\diab.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.9.4.2\PPCVLEE\libchar.a)'
dld: warning: Undefined symbol '__HEAP_START' in file 'sbrk.o(C:\GW_MCU\tools\wr\mpc5748_wr594\diab.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 中的问题:警告:文件 'lib/lzma/LzmaLib.o' 中的未定义符号 'LzmaEncProps_Init' 通过将相应的源文件包含到我的 makefile 中,但是 HEAP 问题仍然存在。 问题消失了但是应用程序没有 运行 使用 trace32 调试器我能够诊断出这个错误的来源: 在第
行 p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb));
行 returns empty p->probs 所以似乎 alloc 无法分配所有需要的大小
谢谢
可能您使用的MCU中不允许使用malloc,尝试使用静态分配或实现您自己的malloc。
您可以在这里找到有用的解释:
https://www.quora.com/Why-is-malloc-harmful-in-embedded-systems