这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » mega128,bootloader,application mega128怎样

共2条 1/1 1 跳转至

mega128,bootloader,application mega128怎样将一个程序分两段分别烧入bootloader和application

院士
2006-09-17 18:14:16     打赏
mega128,bootloader,application mega128怎样将一个程序分两段分别烧入bootloader和application



关键词: mega128     bootloader     applic    

院士
2006-12-22 22:43:00     打赏
2楼
问 用的是iccAVR和progpony,谢谢! 1: 可不可以在程序里指定某部分从哪个flashrom地址开始烧写?有相应的伪指令或者其他什么手段吗?谢!! 2: 先烧BOOTER,再下载 3: 问题是放到boot区的不一定有全部的boot功能啊就是因为放不下,才想放一部分到application里去。
可以用下面这个直接在源代码里面指定程序段写入的绝对地址吗?
# pragma abs_address:<address>
# pragma end_abs_address

4: 可以指定能否把全部的代码合并为一个hex文件,再烧录。 5: 我就是只有一个hex文件
我是将源代码分成两部分,用此在源程序里指定了两个不同的起始地址(分别在boot和application)但还未能烧录成功。 6: 能否介绍一下您的编译方式和烧录方式。大家一起想杨办法 7: 用iccAVR编译,ponyprog烧录的! 8: 分别编译APPLICATION和BOOTLOADER1、分别编译APPLICATION和BOOTLOADER,成两个HEX文件(至少保证生成的BIN文件的大小和小于你的MCU-FLASH值)
2、用文本编辑器(如UE)打开两个HEX文件
3、新建一个文本文件,另存为XXXX.HEX
4、把那两个HEX文件都复制到这个XXX.HEX中
5、删掉两行相同的":00000001FF"(或是别的)
6、保存
7、用PONYPRO2000打开
8、完成 9: 如果可以的话就好了,可是分别编译的话,就要各自include必需的*.h文件,这样即使仅有boot部分生成的hex文件也会太大,4k放不下。
这也是最初想要烧写一部分在application里面的原因。
*.h文件是用c写的,这样是不是只能用汇编重新编写*.h才能解决? 10: inculde .h并不会增加目标文件长度 11: Asnake的办法比较好,试试 12: Asnake的办法中,烧录以后boot和application部分能相互识别吗?能的话,通过什么识别?
好像不能用call一个绝对地址来实现跳转(调用) 13: ICCAVR中没有段定位吗?在IAR中可以通过*.XCL文件非常方便的实现段定位,ICCAVR也应该有吧 14: 烧录后的boot和application认别应该是通过编程熔丝位进行的。 15: 我是这样认为的,大家看一看是否正确noday问题:想从boot调用application里的函数,可以实现吗?

从芯片的原理来看,两个bootloaderapplication两个部分还是编一编址的,只是下载编程(或自编程)机制按照熔丝位的设定进行,但在运行时两个部分应该是一样的,因此应该是可以从boot调用application里的函数。

以上仅仅只是我的想法,最终应该以实验结果为准。 16: 重新描述一下问题吧,前面说的比较乱,^_^    最初直接通过#pragma abs_address <绝对地址> 指定,想把一个hex文件一次性分两部分烧到app和boot里面指定的地址。但是发现只有指定到app区域的写入成功,到boot区的没有写入。  
      从生成的hex文件来看,本来指定到0x1e000的程序被写到了0xe000处,不知为何?
  ( 注:ICCAVR编译器里面的memory size是以byte来计的,mage128的128kbyte flash rom即0x20000。这样选择boot区为8k byte时,即是0x1e000开始.  ) 17: 把测试代码贴出来。> 从生成的hex文件来看,本来指定到0x1e000的程序被写到了0xe000处,不知为何?
怎么得到?能否把源程序贴出来。

>注:ICCAVR编译器里面的memory size是以byte来计的,mage128的128kbyte flash rom即0x20000。这样选择boot区为8k byte时,即是0x1e000开始.  )
看不明白。
选择boot为4KWord,为8kB,应该从0x1000开始放中断向量的。0x1e000开始是什么意思? 18: 高64KFLASH是要通过寄存器RAMPZ设置的。 19: 0x1e000是boot区(4k word)的起始地址啊我的程序结构如下:
#pragma abs_address:0x8000   //指定到application

... 程序段1

#pragma end_abs_address

#pragma abs_address:0x1e000   //指定到boot区

...程序段2

#pragma end_abs_address

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]