在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2268|回复: 0

[原创] ARM编译时数据压缩

[复制链接]
发表于 2010-9-27 09:01:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
最近调试程序出现了一个怪现象。
      环境:FPGA烧ARM1136内核、IEC JTAG调试、功能模块UART、I2C等、裸机跑功能代码。
      问题:最初我将我的一段执行成功的代码移植到另外一个执行工程上,执行的不对,我在代码中加了UART打印信息,发现没有打印出来,奇怪!经过一番查找,原来问题出在这里:为设定UART通道,我引入了一个全局变量UART_Channel=1;结果我发现,在程序加载及执行过程都没有将UART_Channel 变为1;而是另一个莫名其妙的数。以前没有出现过这种情况。
      问题算是找到了,但想弄明白和彻底的解决问题却是不易。又是经过一番折腾,发现了一个另一个怪现象,只要我的RW_data段的数据大于296字节,ICE加载时RW_data数据就不是初始化的数据,而是莫名的数据。如果小于296字节,ICE加载到FPGA的数据就是初始化的数据。这是为什么呢?我在分散加载文件里没有提到相关的加载RW大小的信息啊!
      遇到到了此问题及怪现象我的解决办法有4种,我试过的均可,有点大同小异;
第一种方法:在用scatter文件件情况下,可以把RW域属性加个“NOCOMPRESS”。这样,你加载到内存后数据就为你初始化的数据的了。
第二种方法:不用scatter文件时,更改RVDS工程属性里连接器设置有个reloc选项,选中此选项,也可解决问题,而且此时也是不压缩RW数据的。(注:option reloc ignored when using --scatter.)
第三种方法:之前我的工程从boot程序直接bl main,可将其改为blx __main;在这种情况下刚加载到内存的数据依然是被压缩的数据,所以仍然不对,但在进__main里进行了解压,所以经过__main后进入main时,RW数据已经初始化为原初始化数据了。
第四种方法:在RVDS工程Setting选项里,有个连接器命令输入,在Command里加入“--datacompressor=off”同样可以解决此问题。(手册原文:--datacompressor on|off:RW data compression is enabled by default to minimize ROM size. Use --datacompressor off to turn off RW data compression.
还有一种方法尝试过但没有成功,不知道为什么,我在启动代码中加了一段
     IMPORT |Load$$ER_ZI$$Base|LDR  ;  
     R4,=|Load$$ER_ZI$$Base|
是在RVDS手册里看到的:“The linker does not apply compression if a Load$$region_name$$Base symbol is used, where region_name follows any execution region containing compressed data in the same load region.”希望高手告诉俺怎么回事?
    说到这里,答案基本已经浮出水面了,原来问题的根本原因是数据被压缩了,因此在没有解压的情况下数据加载到内存的数据当然是不对的了。
    新的疑问又出现了,为什么数据会被压缩?为什么__main可以解压数据?在用户手册里有这样一句话:Compression is applied automatically if:Compressed data size + Size of decompressor < Uncompressed data size。噢!是为了节省空间!那__main是如何解压的呢,原来ARM库里有解压代码,所以当你数据被压缩时,编译器就会为你编译本有解压库函数(用不用由你!),虽然给你了,但仅当我们调用__main时它会调用此解压函数(估计咱们自己调用也可,没有试过)_decompress(原来看过__main的文章,没有提到解压的事情啊)。
      还有疑问就是,为什么设定RELOC属性后,就不进行压缩了?后来查了一下重定位的资料,感觉不多,而且说的咱也不懂。我的猜测可能是这样,这个重定位主要是为了其他文件调用产生非Arm体系结构的可执行文件,换句话就是为符合通用二进制文件接口,所以在在这种情况下如果压缩RW_data(全局变量)会容易出问题,Arm资料上说其它文件或平台不存在数据解压器。~~只能暂时这么理解了,很是希望高手能帮我解答这个问题,或者提供点资料让我看看是怎么回事。下边是我在ARM手册上看到的一段话:
RW compression:
The decompressor for compressed RW data is tightly integrated into the start-up code in the ARM C library. When running an application on a platform OS, this functionality must provided by the platform or platform libraries. By default, RW compression is turned off when linking a BPABI or SysV file because there is no decompressor.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-19 18:18 , Processed in 0.028921 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表