搜索
bottom↓
回复: 45

有人会用ads的分散加载文档吗

[复制链接]

出0入0汤圆

发表于 2009-4-15 09:39:36 | 显示全部楼层 |阅读模式
我的源文件就2个,2440init.s和2440main.c

我想让2440init.o     加载到0地址,运行在0地址
2440main.o           加载到4096 地址,运行在0x30000000地址

请问怎么写scatter这个加载文件?

工程文件:点击此处下载 ourdev_436639.rar(文件大小:43K) (原文件名:led.rar)

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2009-4-15 11:05:53 | 显示全部楼层
load1 0
{
  exec1 0
  {
    2440init.o (*)
  }
}
load2 4096
{
  exec2 0x30000000
  {
  2440main.o (*)
  }
}

别的自己填。
具体生成的BIN格式和Fill的内容请自行测试。
代码拷贝要么依赖于CRTL,要么自己写代码。
注意$$tables,主引导代码(__main)那些,必须在主区,就是Load1 exec1里边。

出0入0汤圆

发表于 2009-4-15 11:33:16 | 显示全部楼层
学习了 谢谢楼上高人

出0入0汤圆

 楼主| 发表于 2009-4-15 14:39:58 | 显示全部楼层
但是不行,编译的时候出现22个错误如下:

(原文件名:QQ截图未命名.JPG)

我把工程放到楼主那,希望帮帮忙

出0入0汤圆

发表于 2009-4-15 14:46:09 | 显示全部楼层
你没注意到大侠还说其它的自己填一下吗???你就填了这两个吗?还有,这是链接时错误,不是编译时的。。。

出0入0汤圆

 楼主| 发表于 2009-4-15 15:15:09 | 显示全部楼层
是我写错了,这个是链接时候的错误。

我是初学者,其他的还要填什么吗,我只有两个原文件:2440init.s和2440main.c
如果知道怎么填的,能不能说下,我真的是初学者。

出0入0汤圆

发表于 2009-4-15 16:03:55 | 显示全部楼层
楼上不要误会,没有别的意思啊。。。我也不是很了解这个分散加载文件,也没装ADS,你到他的帮助里找一个ADS_LINKERGUIDE_A.PDF
看一看吧,里面有详细的介绍

出0入0汤圆

发表于 2009-4-15 17:48:47 | 显示全部楼层
汗……你还真就直接用了啊。。。说了其它的你要自己填写的。
因为你给的信息不足以让别人知道你到底要完成什么工作。

Scatter,十分重要的之一,是要知道你代码的大小,否则段溢出了你就没得玩了。
尝试这样的:

load1 0
{
  exec1 0
  {
    2440init.o (*)
    __main.o (*)
  }
}
load2 4096
{
  exec2 0x30000000
  {
  2440main.o (*)
  * (*)
  }
}


而且,看起来好像你C运行库没裁减……用起来可能会问题比较多。

出0入0汤圆

 楼主| 发表于 2009-4-15 18:35:28 | 显示全部楼层
首先非常感谢 dr2001 的耐心回答 ,我目的其实很简单,就是想把一部分代码分开放到4k之后的nandflash里。所以就学习这个分散加载,但是老是出现错误,网上资料也不多。
另外,我按7楼的方法做了之后,只有一个错误了,如下:
<center>
(原文件名:截图00.jpg) </cente

是因为dr2001说的因为c运行库没有裁剪的原因吗,如果是,应该怎么裁剪?我只是想实现一个简单的代码分开存放的功能,没想到会牵涉到这么多的知识,还希望能再次指点一下,再次感谢。

出0入0汤圆

发表于 2009-4-15 19:24:28 | 显示全部楼层
虽然我不太会,但我还想再说一句,那个帮助里讲到了,虽然是英文的,可是你想学习的话,早晚都是要看的,,还是看一下吧。。。

而且建议别用ADS了,用RealView吧。。。。。。。

出0入0汤圆

发表于 2009-4-15 20:27:35 | 显示全部楼层
To LZ:
显然是你运行库初始化的原因。。。
手册里说了,一旦使用了Scatter,是不会有Image$$xx$$Limit这样的变量的。。。 。。。

我以前发过个东西,捏可以参考。

To 9#
Realview,不论是RVCT还是MDK的RVCT,都是一样的。他们的C库基本没变化。只是功能增强了。
ADS 1.2在原始手册版本里边,列为RVCT 1.2。买了Realview之后就是2.0。Keil从3.0开始的,好象。

出0入0汤圆

发表于 2009-4-15 20:53:07 | 显示全部楼层
Demo Projectourdev_436705.rar(文件大小:15K) (原文件名:Demo_LED.rar)

简单修改了一下你的工程。
因为本来代码就缺少很多东西,并不是完善的可引导,Boot的代码,所以修改只是Show一下会是什么效果而已。

特别注意,这里,两个Load Region的分散加载会生成两个bin文件的。

修改了很多工程配置,还需要自己认真研究研究,呵呵。不只是分散加载文件,还有.s文件,编译选项。按工程中原来那种做法,挂都不知道怎么挂的。

出0入0汤圆

 楼主| 发表于 2009-4-16 13:11:49 | 显示全部楼层
哦,原来还要修改这么多东西,我看到的书上写到的都是不全的,所以老是链接失败,所以才会上来发帖子问问的,谢谢dr2001的热情帮助。顺便问一下 有两个bin文件可以合并在一起吗,如果不行,两个bin文件如何下载到 对应的nandflash的地址呢(因为我时候用supervivi的引导程序下程序到nandflash里的,里面没有下载到哪个地址的选项,而且只能默认下到0地址处)。所以我想把两个bin文件合并起来 中间用0来代替可以吗,如何做?

我的qq是723953397,dr2001能加我为好友吗?

出0入0汤圆

发表于 2009-4-16 13:14:48 | 显示全部楼层
合并成一个的话,把最外边的Load那个大括号合并成一个。
只留下Load_A就行了。Load_B的内容放进LoadA里。

出0入0汤圆

 楼主| 发表于 2009-4-16 13:23:15 | 显示全部楼层
那么load_b的内容的下载地址会变吗,中间的nandflash地址是用0填充的吗

出0入0汤圆

发表于 2009-4-16 13:51:01 | 显示全部楼层
哦……要这个功能啊。那不能那么搞,一个Load Region就是最小BIN模式了,中间不会有填充的。

不知道具体要干什么事情。嗯。如果是用2410一类的芯片,玩NAND Boot,贴出来的那个引导头没有Load NAND的代码的,还缺少很多别的东西。。。9成以上概率起不来。除非有另外的东西,没有在这个Demo的代码里,嘿嘿。

如果要生成一个文件的话,尝试Fromelf输出HEX文件,我不知道是不是一个。。。或者,你用HJTAG里边的那个H-Convertor,好像是可以用AXF转出来的。
这个我就没弄过了。仅供参考。

btw:
如果是写NAND的二次BootLoader,不建议这么搞。还是分开写,分开调试比较好。出了问题重新烧也方便。
代码Load和Exec Region不一致的情况,也就是ITCM和MMU启动以后用的情况多吧。感觉上。

出0入0汤圆

 楼主| 发表于 2009-4-16 15:30:15 | 显示全部楼层
dr2001好强啊,知道我要写的好是bootloader,我正在看韦东山的嵌入式linux完全手册,里面讲到写启动代码中有将2440的nandflash的4k后的内容复制到sdram 中去再跳转到 sdram中执行主程序,由于程序不足4k,不用复制到sdram中也能运行,所以他就链接时把main文件放到4k之后,然后 在启动代码里将4k后面的程序复制到sdram中再执行。在gcc下,他的连接脚本nand.lds内容如下。
SECTIONS {
  firtst          0x00000000 : { head.o init.o nand.o}
  second         0x30000000 : AT(4096) { main.o }
}

这两句话就行了,但是我不知道在 ads中怎么实现的,所以才开始学习scatter的。我觉得这个只是挺重要的,所以一直停在这里了。
这是nandflash的工程点击此处下载 ourdev_437070.rar(文件大小:37K) (原文件名:read nandflash.rar)

出0入0汤圆

发表于 2009-4-16 16:00:35 | 显示全部楼层
建议先看一下芯片手册吧。NAND Boot一般是把第一个Sector开始的,大小由芯片和第一级BootLoader决定的内容复制到SRAM中,然后运行。其它的Boot程序就不管了。因此你需要写一个大小不大于手册规定内容的二级BootLoader程序。让第一级加载到SRAM里。然后二级BSL初始化各种东西,SDRAM等等,然后把其它的数据Load到SDRAM里边,然后运行。。。
跟你说的意思是一样的,但是你的说法好像有点问题。

具体到你的东西,用Demo那个Scatter就可以了。生成两个BIN,一个小于4K的,直接烧到0开始的地址;另外一个烧写到4096开始的地方就行了。如果你觉得这么干不放心,可以找我说的HConvertor,它应该可以从AXF里边直接转出来你要的东西。

GCC的链接描述和Demo那个工程里的Scatter基本等价。GCC链接的结果和ADS编译的AXF的结果也是基本等价。生成两个BIN的问题,只是说AXF到BIN的转换软件采用了不同的转换策略而已。找个合适的转换软件就好了。呵呵。

出0入0汤圆

 楼主| 发表于 2009-4-16 17:49:34 | 显示全部楼层
我用hc-convertor的确转出了一个bin文件,那么这个bin文件能按照我说的那个地址自动存放到相应的位置吗 ,也就是main代码段自动存放到了nandflash的4k地址后吗?中间地址都是空的 吗?

出0入0汤圆

发表于 2009-4-16 19:58:56 | 显示全部楼层
应该是这样的。

你用UltraEdit之类的打开看看就知道了。呵呵。
至少,文件大小应该是4096+另外一个bin的大小。

出0入0汤圆

 楼主| 发表于 2009-4-16 20:44:59 | 显示全部楼层
对不起,我看错了,好像转出来两个文件bin1和bin2 都是1k大小的。

出0入0汤圆

发表于 2009-4-16 21:03:30 | 显示全部楼层
很奇怪,为啥需要一个整地bin。。。

ADS的fromelf不能输出合并的bin,RVCT4的可以。
既然你现在用的ADS1.2,那就没有办法了。。。-_-b

出0入0汤圆

 楼主| 发表于 2009-4-16 21:19:29 | 显示全部楼层
因为我下程序不方便,没用并口,所以不能用jtag,我用的supervivi引导程序下的程序,好像不能选择下载地址,那下这两个bin会不会被覆盖掉?

出0入0汤圆

 楼主| 发表于 2009-4-16 21:35:23 | 显示全部楼层
RVCT4哪里可以下到

出0入0汤圆

发表于 2009-4-16 21:37:03 | 显示全部楼层
查了一下ADS的手册,fromelf不能输出一个整地axf;Linker我也没发现能写出这样的scatter,满足直接生成一个bin的要求。
RVCT4是没问题的。。。MDK的RVCT3手头没有手册,没查,应该也能行。

凑合的解决办法,用HJTAG的Convertor,把axf分解成为两个HEX。第一个HEX的最后一行:00000001FF删除;第二个HEX文件全部复制,然后粘贴在第一个HEX的尾巴上。然后再用convertor转换成BIN。这样是没有问题的。

最新的HConvertor请到他的论坛上找吧。www.hjtag.com。在安装包里有。

出0入0汤圆

 楼主| 发表于 2009-4-16 21:59:01 | 显示全部楼层
如果将第二个加到第一个的尾巴上的话那么是不是 两个的地址就连在一起了?我的目的是一个bin(大于4k)文件,bin中间是空的,在地址4096位置之后放main的的代码,这样能行吗?

出0入0汤圆

发表于 2009-4-16 22:17:31 | 显示全部楼层
建议你用Keil MDK 3.50,除非你用的不是常见的MCU,或者用的不属于ARM7,ARM9,Cortex-M3的处理器。
RVCT完整版太复杂了。呵呵。Keil的MDK也是RVCT系列的,只不过授权方式和支持的器件变化了一下。

HEX文件本身是带着地址信息的。直接这么连起来没有问题。我试过了。放心使用。
两个文件文本模式连接,只有文件的最后一行才能有:00000001FF,这是HEX文件结束标志。别的行一个都不能少,顺序也不能错。
HEX A:
:....A
:....B
:00000001FF

HEX B:
:....C
:....D
:00000001FF

合并后变成
:....A
:....B
:....C
:....D
:00000001FF
这样。然后就直接出BIN就好。

出0入0汤圆

 楼主| 发表于 2009-4-16 22:38:59 | 显示全部楼层
如果hex文件是带地址信息的,那么bin文件是不是也自带带地址信息呢。
但是下载时候不是可以 选择下载地址吗,那如果两个不一样时到底是下到哪个地址呢?

出0入0汤圆

发表于 2009-4-17 09:35:42 | 显示全部楼层
汗。就不能Google一下么。

HEX是带有校验和地址信息的。
BIN就是裸的二进制数据,别的什么都没有。

出0入0汤圆

 楼主| 发表于 2009-4-17 15:56:19 | 显示全部楼层
哦,那合并后的文件如果下到0x00的nandflash里的话应该是连续的一块吧!?

出0入0汤圆

 楼主| 发表于 2009-4-17 16:36:12 | 显示全部楼层
我今天从我们论坛里 下了个RVCT4的 formelf转换工具,用-i32combined 命令选项把 axf文件转换成了bin文件(只有 1个bin,原来的转换工具会产生两个bin文件),大小是3k,我想:下载的时候它会自动将main代码段下载到4096后吗(main.o加载域是这个地址)?bin既然是不带地址信息的,又是怎么实现的呢?

出0入0汤圆

发表于 2009-4-17 16:41:34 | 显示全部楼层
编程器上位机软件载入BIN文件时都可以指定地址的..HEX或其它文件因为已经有地址信息了.所以就不必了
这个地址也就是你另外一个贴子中说的:下载地址

出0入0汤圆

发表于 2009-4-17 16:45:59 | 显示全部楼层
To 30#
如果转换正确,应该是4096+xxx字节的。如果不对,说明给的命令行有问题。

Demo那个编译的话,Scatter的地址需要改一下。

出0入0汤圆

 楼主| 发表于 2009-4-17 17:25:19 | 显示全部楼层
我用#26楼的方法 做了可以,原来是地址设置的有问题,改了下就可以了,我真粗心,另外 用fromelf好像不可以,转换后的大小还是不到4k的,可能是我理解错了,我是从下面这个网站看到的这个命令的用发的,是realview的在线帮助文档。那这个--i32combined这个命令的作用是把两个不同加载域的代码合并起来?还是有什么其他的作用?

出0入0汤圆

发表于 2009-4-17 17:57:42 | 显示全部楼层
Fromelf参考手册
www.arm.com -> Documentation,进入文档页面。
Keil Embedded Development Tools -> ARM Product Manuals -> RealView Utilities Guide -> Using Fromelf -> Command-Line Options
英文的。

我观察的结果,你需要的选项是:
--bin --bincombined --bincombined_padding=1,0xFF
仅供参考。Fromelf生成的结果,应该和用HEX文件拼出来的差不多才对。(Padding的字符不一样的话,那就没办法了。。。)

HEX的肯定可以。。。不一定你哪里出错误了。

出0入0汤圆

 楼主| 发表于 2009-4-17 20:18:45 | 显示全部楼层
可能是我手册没看彻底,断章取义了。 另外 ,我再确定下用hex合并的方法 的话,那么main段的代码应该可以准确的下载到4096地址(也就是它的加载地址)了吧。
还有 我今天在自己的工程里面 试着用scatter 工程配置改的跟你的一样,头文件 也修改的一样,但就是不能编译连接成功,你还修改了哪个地方呢。
我今天跟你的工程对比了一天也没有发现哪里不一样,除了.s,分散加载文件和编译选项,你还修改了哪里呢?下面是未成功的工程文件
点击此处下载 ourdev_437471.rar(文件大小:39K) (原文件名:led.rar)

出0入0汤圆

发表于 2009-4-17 22:26:16 | 显示全部楼层
对。HEX合并后,没有问题。满足你的要求。

main函数用int main(void),因为没有人会给你传递argc/argv,不能用那个。用argc说明程序用semihosting。

出0入0汤圆

发表于 2009-4-17 22:41:04 | 显示全部楼层
每次看dr2001 的回答都能学到东西,谢谢dr2001

出0入0汤圆

 楼主| 发表于 2009-4-17 23:31:01 | 显示全部楼层
非常感谢 dr2001 。问题已经解决了。经过过这么多的交流后,学到了很多的东西,再次谢谢dr2001。真希望论坛里多写像dr2001这样热心的人,让我们初学者能尽快入门,当然我也会热情帮助论坛里的人,只要我知道的我也会尽可能的回答(尽管我现在还懂的不多)。继续奋斗中……

出0入0汤圆

发表于 2009-5-21 13:10:20 | 显示全部楼层
谢谢DR2001和楼主

出0入0汤圆

发表于 2010-2-20 15:49:27 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-9-20 15:17:37 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-9-20 16:54:07 | 显示全部楼层
dr2001是好人

出0入0汤圆

发表于 2010-11-29 14:15:42 | 显示全部楼层
学习

出0入0汤圆

发表于 2012-2-6 22:57:03 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 10:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表