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
不需要牺牲的。。。可以把高32M作为堆栈和动态块(用malloc等分配)来使用。在BSP中通过内存映射函数把这块内存添加到系统内存堆中。
也就是说,文本段的大小被限制为低32M内,使用26位寻址,但数据段则没有限制。
如果使用longcall,代价太大,不合适。。。。
网上看了一下,longcall有不少缺点,不太想用。
你说的内存映射函数在哪里?如何实现能说的具体点吗?
我在bsp中将bank模块定义为64M的,但size为32M,剩余的32M除了用memAddToPool()函数,还能增么添加进去?
谢谢yaopg,有空请你吃肯德基
[em10]应该是:LOCAL_MEM_SIZE 64M
USER_RESERVED_MEM 32M
RAM_HIGH_ADRS不要超过32M范围,在29M处比较合适吧。
在sysLib.c里面用memAddToPool函数添加,,,,很多参考bsp里面有例子。
启动后,用大型内存块分配来测试是否成功。
内存起始地址定义:0x30000000
LOCAL_MEM_SIZE 64M
USER_RESERVED_MEM 32M
RAM_LOW_ADRS 0x30001000
RAM_HIGH_ADRS 0x30200000
正常启动后,内存大小为32M,此时加载应用程序loadmodule()正常
但,如果添加到内存池后,通过memAddToPool(0x32000000,0x2000000);
加载应用程序会像以前一样报出:“Relocation value does not fit in 26 bits.”
而且感觉两部分内存没有连接上,memAddToPool之后,用malloc来测试,
发现动态加载32M不成功,加载两个20M成功,20M的内存指针分别位于低32M和高32M中
所有两块内存没有连接统一管理。
分支和带链接分支寻址+—32M,添加内存池后,寻址范围还是超过32M。
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 | |
汽车电子中巡航控制系统的使用被打赏10分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏100分 | |
分享汽车电子中巡航控制系统知识被打赏10分 | |
分享安全气囊系统的检修注意事项被打赏10分 |