关于在IAR中生成一个能够在其他内存空间运行的hex文件的方法

草根聪 2013-05-21 02:51:14
现在我的目的如下:
我在CC2530F256中下载了一个基本Flash操作程序,能够对Flash的任意一个区域进行读写操作。同时我现在用IAR生成了一个hex文件,再用软件转换成了一个bin文件,我从串口把这个bin文件读入写入到Flash的bank2中,现在想跳转到bank2中去执行这个新的程序。但是没有成功,查看汇编,是因为在跳转寻找的过程中一些相对寻址乱了导致的。因此问题就在生成这个hex文件的时候没有处理好,曾经做ARM-M3的时候遇到过,解决了,但是在IAR中对于CC2530不知道怎么解决。

提供我现在想到的方法:应该会修改IAR中Link文件即.xcl文件,但是我不知道怎么去修改。
当然我的程序也可以不写在bank2中,写在其他地方也行。只要能帮我生成一个能在其他bank正常运行的程序即可(除bank0)。

希望能告诉我方法,并能给我一个流水灯的hex文件。我尝试一下。感谢大家,求大神帮忙解决。



http://bbs.feibit.com/thread-10094-1-1.html我在这里也提问了,悬赏了10飞币,相当于10人民币。如果你回答了这个问题,请不要忘记复制过去,我两边都给你分数,谢谢
...全文
301 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
草根聪 2013-06-05
  • 打赏
  • 举报
回复
引用 14 楼 pcgg5244 的回复:
-D_CODE_START=0x0000 -D_CODE_END=0x7FFF 不是改这个声明这里么
嗯,这里应该是要该的,但是不能仅仅只改这里,我尝试过改这里,连接时会出错,而且我也了解下xcl文件,好像你还必须按照这里的申明进行段的划分,如果段划分与这里申明不一致,就出错了。
草根聪 2013-06-04
  • 打赏
  • 举报
回复
引用 5 楼 lbing7 的回复:
[quote=引用 4 楼 cangencong 的回复:] [quote=引用 2 楼 lbing7 的回复:] 在IAR写CC2430的时候,BANK的选择是可以直接在编译器里进行设置的,LZ找一下IAR相关的帮助看看 应该会有讲到这部分的内容
Bank选择是可以设置,但是Bank可选的是针对代码区的后32K,因此就算改变Bank也能达到目的呀。必须让链接的时候,寻址不是按照0x00000开始,而必须按照0x80000开始才行。我看了帮助文档的xlink相关语法,但是还是不怎么懂。[/quote] 如果要改启动地址,这个可能做不到,这个和芯片的体系结构有关。 要改这个靠谱么??[/quote] 其实不是想改动启动地址,而是想某一个程序能够在我自己想使用的哪段内存区域运行。比如我想在0x80000开始运行,启动地址仍然是0x00000,但是我第几句就跳转到0x80000就行了,但是关键是,在0x80000能够成功运行的程序现在不能够生成呀。
草根聪 2013-06-04
  • 打赏
  • 举报
回复
引用 11 楼 further_away 的回复:
icf文件没处理好。 你下一个官网的icf文件,试试。 另外你跳转 bank2的 跟icf没关系吧,这个跳转时用的绝对地址跳转的吧。
现在是icf文件,但是CC2530里面是一个默认的xcl文件。的确是配置文件没有处理好,但是官方的那个实现的功能与我需要的不匹配,因为他默认的就是从0x0000开始,但是我现在想要我的一个程序不在0x0000-----0x8000这段地址运行。我想这个程序可以放在0x8000---0xffff这个段进行运行。所以得修改Link文件。
pcgg5244 2013-06-04
  • 打赏
  • 举报
回复
-D_CODE_START=0x0000 -D_CODE_END=0x7FFF 不是改这个声明这里么
further_away 2013-06-03
  • 打赏
  • 举报
回复
icf文件没处理好。 你下一个官网的icf文件,试试。 另外你跳转 bank2的 跟icf没关系吧,这个跳转时用的绝对地址跳转的吧。
草根聪 2013-06-01
  • 打赏
  • 举报
回复
引用 9 楼 andy_wsj 的回复:
IAR可以直接生成.bin文件... 如果自己转换,遵循一下规则,我做过转换,没有问题: 跳转不成功,一般可能是堆栈设置问题 1 - HEX文件是包括地址信息的,而BIN文件格式只包括了数据本身 在烧写或下载HEX文件的时候,一般都不需要用户指定地址,因为HEX文件内部的信息已经包括了地址。而烧写BIN文件的时候,用户是一定需要指定地址信息的。 3 - BIN文件格式 对二进制文件而言,其实没有”格式”。文件只是包括了纯粹的二进制数据。 4 - HEX文件格式 HEX文件都是由记录(RECORD)组成的。在HEX文件里面,每一行代表一个记录。记录的基本格式为: +-------------------------------------------------------------------------------------------------+ | RECORD | RECLEN | LOAD | RECTYPE | INFO or DATA | CHKSUM | | MARK ':' | | OFFSET | | | | +--------------------------------------------------------------------------------------------------+ | 1-byte | 1-byte | 2-byte | 1-byte | n-byte | 1-byte | +--------------------------------------------------------------------------------------------------+ 记录类型包括: '00' Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录 '01' End of File Record: 用来标识文件结束,放在文件的最后,标识HEX文件的结尾 '04' Extended Linear Address Record: 用来标识扩展线性地址的记录 '02' Extended Segment Address Record: 用来标识扩展段地址的记录 在上面的后2种记录,都是用来提供地址信息的。每次碰到这2个记录的时候,都可以根据记录计算出一个“基”地址。 对于后面的数据记录,计算地址的时候,都是以这些“基”地址为基础的。 数据记录的具体格式: +---------------------------------------------------------------------------------------------------+ | RECORD | RECLEN | LOAD | RECTYPE | INFO or DATA | CHKSUM | | MARK ':' | | OFFSET | '00' | | | +---------------------------------------------------------------------------------------------------+ | 1-byte | 1-byte | 2-byte | 1-byte | n-byte | 1-byte | +----------------------------------------------------------------------------------------------------+ 看个例子: :020000040000FA :10000400FF00A0E314209FE5001092E5011092E5A3 :00000001FF 对上面的HEX文件进行分析: 第1条记录的长度为02,LOAD OFFSET为0000,RECTYPE为04,说明该记录为扩展段地址记录。数据为0000,校验和为 FA。从这个记录的长度和数据,我们可以计算出一个基地址,这个地址为0X0000。后面的数据记录都以这个地址为基地址。 第2条记录的长度为10(16),LOAD OFFSET为0004,RECTYPE为00,说明该记录为数据记录。 数据为FF00A0E314209FE5001092E5011092E5,共16个BYTE。这个记录的校验和为A3。此时的基地址为 0X0000,加上OFFSET, 这个记录里的16BYTE的数据的起始地址就是0x0000 + 0x0004 = 0x0004. 第3条记录的长度为00,LOAD OFFSET为0000,TYPE = 01,校验和为FF。说明这个是一个END OF FILE RECORD,标识文件的结尾。 在上面这个例子里,实际的数据只有16个BYTE:FF00A0E314209FE5001092E5011092E5,其起始地址为0x4 4 - HEX文件和BIN文件大小有区别 HEX文件是用ASCII来表示二进制的数值。例如一般8-BIT的二进制数值0x3F,用ASCII来表示就需要分别表示字符'3'和字符'F',每个字符需要一个BYTE,所以HEX文件需要 > 2倍的空间。 对一个BIN文件而言,你查看文件的大小就可以知道文件包括的数据的实际大小。而对HEX文件而言,你看到的文件大小并不是实际的数据的大小。一是因为HEX文件是用ASCII来表示数据,二是因为HEX文件本身还包括别的附加信息。
非常感谢,但是你理解错了我,我能够生成bin文件,但是就是这个文件,初始运行地址和我需要的不一致,所以我必须进行一个链接文件的修改,再生成一个能够满足我要求的bin文件。
andy_wsj 2013-05-31
  • 打赏
  • 举报
回复
IAR可以直接生成.bin文件... 如果自己转换,遵循一下规则,我做过转换,没有问题: 跳转不成功,一般可能是堆栈设置问题 1 - HEX文件是包括地址信息的,而BIN文件格式只包括了数据本身 在烧写或下载HEX文件的时候,一般都不需要用户指定地址,因为HEX文件内部的信息已经包括了地址。而烧写BIN文件的时候,用户是一定需要指定地址信息的。 3 - BIN文件格式 对二进制文件而言,其实没有”格式”。文件只是包括了纯粹的二进制数据。 4 - HEX文件格式 HEX文件都是由记录(RECORD)组成的。在HEX文件里面,每一行代表一个记录。记录的基本格式为: +-------------------------------------------------------------------------------------------------+ | RECORD | RECLEN | LOAD | RECTYPE | INFO or DATA | CHKSUM | | MARK ':' | | OFFSET | | | | +--------------------------------------------------------------------------------------------------+ | 1-byte | 1-byte | 2-byte | 1-byte | n-byte | 1-byte | +--------------------------------------------------------------------------------------------------+ 记录类型包括: '00' Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录 '01' End of File Record: 用来标识文件结束,放在文件的最后,标识HEX文件的结尾 '04' Extended Linear Address Record: 用来标识扩展线性地址的记录 '02' Extended Segment Address Record: 用来标识扩展段地址的记录 在上面的后2种记录,都是用来提供地址信息的。每次碰到这2个记录的时候,都可以根据记录计算出一个“基”地址。 对于后面的数据记录,计算地址的时候,都是以这些“基”地址为基础的。 数据记录的具体格式: +---------------------------------------------------------------------------------------------------+ | RECORD | RECLEN | LOAD | RECTYPE | INFO or DATA | CHKSUM | | MARK ':' | | OFFSET | '00' | | | +---------------------------------------------------------------------------------------------------+ | 1-byte | 1-byte | 2-byte | 1-byte | n-byte | 1-byte | +----------------------------------------------------------------------------------------------------+ 看个例子: :020000040000FA :10000400FF00A0E314209FE5001092E5011092E5A3 :00000001FF 对上面的HEX文件进行分析: 第1条记录的长度为02,LOAD OFFSET为0000,RECTYPE为04,说明该记录为扩展段地址记录。数据为0000,校验和为 FA。从这个记录的长度和数据,我们可以计算出一个基地址,这个地址为0X0000。后面的数据记录都以这个地址为基地址。 第2条记录的长度为10(16),LOAD OFFSET为0004,RECTYPE为00,说明该记录为数据记录。 数据为FF00A0E314209FE5001092E5011092E5,共16个BYTE。这个记录的校验和为A3。此时的基地址为 0X0000,加上OFFSET, 这个记录里的16BYTE的数据的起始地址就是0x0000 + 0x0004 = 0x0004. 第3条记录的长度为00,LOAD OFFSET为0000,TYPE = 01,校验和为FF。说明这个是一个END OF FILE RECORD,标识文件的结尾。 在上面这个例子里,实际的数据只有16个BYTE:FF00A0E314209FE5001092E5011092E5,其起始地址为0x4 4 - HEX文件和BIN文件大小有区别 HEX文件是用ASCII来表示二进制的数值。例如一般8-BIT的二进制数值0x3F,用ASCII来表示就需要分别表示字符'3'和字符'F',每个字符需要一个BYTE,所以HEX文件需要 > 2倍的空间。 对一个BIN文件而言,你查看文件的大小就可以知道文件包括的数据的实际大小。而对HEX文件而言,你看到的文件大小并不是实际的数据的大小。一是因为HEX文件是用ASCII来表示数据,二是因为HEX文件本身还包括别的附加信息。
miaotouyang 2013-05-27
  • 打赏
  • 举报
回复
引用 3 楼 cangencong 的回复:
[quote=引用 1 楼 miaotouyang 的回复:] 不能用ADS么
ADS貌似很早都不用了呀,现在都是Keil 与 IAR呀。[/quote] 我一直在用,觉得很好。 个人很讨厌库文件什么的。
further_away 2013-05-25
  • 打赏
  • 举报
回复
楼主是找启动的三种方式么?
草根聪 2013-05-25
  • 打赏
  • 举报
回复
引用 5 楼 lbing7 的回复:
[quote=引用 4 楼 cangencong 的回复:] [quote=引用 2 楼 lbing7 的回复:] 在IAR写CC2430的时候,BANK的选择是可以直接在编译器里进行设置的,LZ找一下IAR相关的帮助看看 应该会有讲到这部分的内容
Bank选择是可以设置,但是Bank可选的是针对代码区的后32K,因此就算改变Bank也能达到目的呀。必须让链接的时候,寻址不是按照0x00000开始,而必须按照0x80000开始才行。我看了帮助文档的xlink相关语法,但是还是不怎么懂。[/quote] 如果要改启动地址,这个可能做不到,这个和芯片的体系结构有关。 要改这个靠谱么??[/quote] 这个在CC2530里面不知道是否能实现,但是在STM32中我是实现过的。
lbing7 2013-05-24
  • 打赏
  • 举报
回复
引用 4 楼 cangencong 的回复:
[quote=引用 2 楼 lbing7 的回复:] 在IAR写CC2430的时候,BANK的选择是可以直接在编译器里进行设置的,LZ找一下IAR相关的帮助看看 应该会有讲到这部分的内容
Bank选择是可以设置,但是Bank可选的是针对代码区的后32K,因此就算改变Bank也能达到目的呀。必须让链接的时候,寻址不是按照0x00000开始,而必须按照0x80000开始才行。我看了帮助文档的xlink相关语法,但是还是不怎么懂。[/quote] 如果要改启动地址,这个可能做不到,这个和芯片的体系结构有关。 要改这个靠谱么??
草根聪 2013-05-24
  • 打赏
  • 举报
回复
引用 2 楼 lbing7 的回复:
在IAR写CC2430的时候,BANK的选择是可以直接在编译器里进行设置的,LZ找一下IAR相关的帮助看看 应该会有讲到这部分的内容
Bank选择是可以设置,但是Bank可选的是针对代码区的后32K,因此就算改变Bank也能达到目的呀。必须让链接的时候,寻址不是按照0x00000开始,而必须按照0x80000开始才行。我看了帮助文档的xlink相关语法,但是还是不怎么懂。
草根聪 2013-05-24
  • 打赏
  • 举报
回复
引用 1 楼 miaotouyang 的回复:
不能用ADS么
ADS貌似很早都不用了呀,现在都是Keil 与 IAR呀。
lbing7 2013-05-24
  • 打赏
  • 举报
回复
在IAR写CC2430的时候,BANK的选择是可以直接在编译器里进行设置的,LZ找一下IAR相关的帮助看看 应该会有讲到这部分的内容
miaotouyang 2013-05-24
  • 打赏
  • 举报
回复
不能用ADS么

27,509

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧