vxworks运行正常,但在加载应用程序时
报出:“relocation value dose not fit in 26 bits”错误,一堆
是否符号表损坏,只要是加载任何程序都是,调用loadmodule时会出错
没见过此现象
如何入手查这问题???
好像由于内存扩大造成,现2片,各32M
相关branch instruction产生错误
在gcc编译中增加mlongcall,编译不通过,不识别longcall
“cc1.exe: Invalid option `longcalls'”,并且无源码,无法重新编译库!
将参数改为longcall或-mlong-calls后,可编译通过,但问题没有解决,可能和库有关。
找到几种解决办法供大家参考:
The easiest way around it is to limit the board memory to 64m, load your
program and do a memAddToPool for the rest of the memory.
Or use mlongcalls
Or link your app in with the kernel
or (I think) get the current release
应该是 -mlongcall ,如:
ccppc -g -mcpu=603 -mlongcall -mstrict-align -ansi -fno-builtin -I. -ID:\WindRiv
er\Tornado2.2.2ForPpc/target/config/wrSbcPowerQuiccII -ID:\WindRiver\Tornado2.2.
2ForPpc/target/h -ID:\WindRiver\Tornado2.2.2ForPpc/target/config/comps/src -ID:\
WindRiver\Tornado2.2.2ForPpc/target/src/drv -DCPU=PPC603 -DTOOL_FAMILY=gnu -DTOO
L=gnu -DPRJ_BUILD -c D:\WindRiver\Tornado2.2.2ForPpc/target/config/comps/src/ve
rsion.c
编译以后使用objdumpppc -r syslib.o查看,使用-mlongcall前编译的函数是24位的:
00000084 R_PPC_REL24 eepromReadByte
000000b4 R_PPC_REL24 eepromUnlock
000000cc R_PPC_REL24 eepromDelay
000000d4 R_PPC_REL24 eepromReadByte
00000114 R_PPC_REL24 eepromLock
00000150 R_PPC_REL24 eepromDelay
000001b8 R_PPC_REL24 eepromDelay
000001ec R_PPC_REL24 eepromDelay
00000224 R_PPC_REL24 eepromDelay
00000278 R_PPC_REL24 vxDecGet
0000028c R_PPC_REL24 vxDecGet
0000029c R_PPC_REL24 abs
000002b4 R_PPC_REL24 abs
000002d0 R_PPC_REL24 abs
00000398 R_PPC_REL24 eepromReadByte
00000498 R_PPC_REL24 eepromWriteByte
000004a0 R_PPC_REL24 eepromReadByte
0000062c R_PPC_REL24 vxTas
使用之后是32位的:
0000008e R_PPC_ADDR16_HA eepromReadByte
00000092 R_PPC_ADDR16_LO eepromReadByte
000000ca R_PPC_ADDR16_HA eepromUnlock
000000ce R_PPC_ADDR16_LO eepromUnlock
000000ee R_PPC_ADDR16_HA eepromDelay
000000f2 R_PPC_ADDR16_LO eepromDelay
00000102 R_PPC_ADDR16_HA eepromReadByte
00000106 R_PPC_ADDR16_LO eepromReadByte
0000014e R_PPC_ADDR16_HA eepromLock
00000152 R_PPC_ADDR16_LO eepromLock
000001a6 R_PPC_ADDR16_HA eepromDelay
000001aa R_PPC_ADDR16_LO eepromDelay
0000021a R_PPC_ADDR16_HA eepromDelay
0000021e R_PPC_ADDR16_LO eepromDelay
0000026a R_PPC_ADDR16_HA eepromDelay
0000026e R_PPC_ADDR16_LO eepromDelay
000002ae R_PPC_ADDR16_HA eepromDelay
000002b2 R_PPC_ADDR16_LO eepromDelay
0000031a R_PPC_ADDR16_HA vxDecGet
0000031e R_PPC_ADDR16_LO vxDecGet
0000033a R_PPC_ADDR16_HA vxDecGet
0000033e R_PPC_ADDR16_LO vxDecGet
00000356 R_PPC_ADDR16_HA abs
0000035a R_PPC_ADDR16_LO abs
0000037a R_PPC_ADDR16_HA abs
0000037e R_PPC_ADDR16_LO abs
000003a2 R_PPC_ADDR16_HA abs
000003a6 R_PPC_ADDR16_LO abs
00000482 R_PPC_ADDR16_HA eepromReadByte
00000486 R_PPC_ADDR16_LO eepromReadByte
0000059e R_PPC_ADDR16_HA eepromWriteByte
000005a2 R_PPC_ADDR16_LO eepromWriteByte
000005b2 R_PPC_ADDR16_HA eepromReadByte
000005b6 R_PPC_ADDR16_LO eepromReadByte
一个很明显的问题,就是代码段变长了,这也是风河的库缺省不使用32位编译的原因。
[em13]不需要牺牲的。。。可以把高32M作为堆栈和动态块(用malloc等分配)来使用。在BSP中通过内存映射函数把这块内存添加到系统内存堆中。
也就是说,文本段的大小被限制为低32M内,使用26位寻址,但数据段则没有限制。
如果使用longcall,代价太大,不合适。。。。
网上看了一下,longcall有不少缺点,不太想用。
你说的内存映射函数在哪里?如何实现能说的具体点吗?
我在bsp中将bank模块定义为64M的,但size为32M,剩余的32M除了用memAddToPool()函数,还能增么添加进去?
谢谢yaopg,有空请你吃肯德基
[em10]有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 | |
【分享评测,赢取加热台】使用8051单片机驱动WS2812被打赏40分 |