7071|10

5

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

稍稍复杂一点的问题: bootloader代码是否可以写到应用区? [复制链接]

原来3KB+的bootloader要移植到atmega644,发现启动区最大只有2KB,不够用.
想通过修改代码段映射的方法把一部分bootloader代码移到应用区,但手册上说:
The Application section can never store any
Boot Loader code since the SPM instruction is disabled when executed from the Application
section.

如果我只把不含SPM指令的部分转移到应用区, 也不行吗?
有没有做过的高人, 指点一下
此帖出自单片机论坛

最新回复

分开写是没有问题的, 通常的做法是定位整个text包括中断向量,我也是一直这么做的. 但是这需要boot和app编译两次,它们之间的公共代码也不方便共享. 如果可以随意给text分段和定位,完全可以不编译bootloader而只用 app实现代码大小不受限制的bootloader,而这正是你在楼主位的要求  详情 回复 发表于 2008-5-29 10:55
点赞 关注
 

回复
举报

5

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

回复 楼主 的帖子

看来又是个没人关心的问题
是不是大家很少用bootloader?
此帖出自单片机论坛
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

回复 沙发 的帖子

boot区只要有一个main和一个写flash的函数就可以了.
告诉连接器把其他函数可以放在app区的最后几页.
关键是怎么实现,我没有尝试过..
此帖出自单片机论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

4
 

回复 板凳 的帖子

只要自定义一个段放置APP区的代码,再把这个段定位到APP区的指定位置就行了
具体实现要看用什么linker
等芯片到了把程序烧进去试试看,再公布结果
此帖出自单片机论坛
 
 
 

回复

18

帖子

0

TA的资源

一粒金砂(初级)

5
 

回复 4楼 的帖子

反正必须得把一部分放应用区外

不能自己写自己,因为必须得考虑中间过程
此帖出自单片机论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

6
 

回复 5楼 的帖子

不过你要先知道函数编译后的代码量才比较好分配空间。
我这边说的是使用gcc编译器把函数定义到自定义段空间。

函数声明如下:

type function (...) __atribute__ ((section(".yoursection")));
此帖出自单片机论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

7
 

回复 6楼 的帖子

void boot_program_page (uint32_t page, uint8_t *buf) __attribute__((section(".boot")));

LDFLAGS += -Wl,--section-start=.boot=0x1FF00

d:/winavr/bin/../lib/gcc/avr/4.3.0/../../../../avr/bin/ld.exe: section .boot [0001ff00 -> 0001ffc3] overlaps section .noinit [0001e70e -> 00022d89]
make.exe: *** [a.elf] Error 1

我试过无数次了,无论如何都不能定位,包括修改连接脚本.
此帖出自单片机论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

8
 

回复 7楼 的帖子

猜想你定义了别的段,从你的.boot段到那个下一段的空间放不下你那函数编译后的代码。

程序从text段开始执行即

LDFLAGS += -Wl,--section-start=.text=xxx_value;

那么你的定义LDFLAGS += -Wl,--section-start=.boot=0x1FF00 ,
编译后的代码将放在xxx_value和0x1FF00之间,如果这段空间不够大,
则编译器就会出错了。
此帖出自单片机论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

9
 

回复 8楼 的帖子

实际上boot_program_page函数生成的目标文件才几十个字节.

我又在text和data之间增加了一个段:


  .boot   : AT (ADDR (.text) + SIZEOF (.text))
  {
    *(.boot)
    *(.boot*)
  } > text

  .data      : AT (ADDR (.boot) + SIZEOF (.boot))
  {
    ...
   }

  连接没有错误, 但是avrdude编程时的错误我又看不懂了

Program:  122306 bytes (93.3% Full)
(.text + .data + .bootloader)

Data:      21300 bytes (520.0% Full)
(.data + .bss + .noinit)

EEPROM:     3933 bytes (96.0% Full)
(.eeprom)

avrdude: reading input file "a.hex"
avrdude: input file a.hex auto detected as Intel Hex
avrdude: ERROR: address 0x20010 out of range at line 7642 of a.hex
avrdude: write to file 'a.hex' failed

avrdude done.  Thank you.

make.exe: *** [program] Error 1


打开生成的hex文件,最后一段是什么意思?

:10FF340000020001000300010002000100040001AE
:10FF4400000200010003000100020001000600019C
:10FF5400000200010003000100020001000400018E
:10FF6400000200010003000100020001000500017D
:10FF7400000200010003000100020001000400016E
:10FF8400000200010003000100020001000700015B
:10FF9400000200010003000100020001000400014E
:10FFA400000200010003000100020001000500013D
:10FFB400000200010003000100020001000400012E
:10FFC400000200010003000100020001000600011C
:10FFD400000200010003000100020001000400010E
:10FFE40000020001000300010002000100050001FD
:0CFFF400000200010003000100020001F7
:020000022000DC
:1000000000040001000200010003000100020001E1
:10001000002E20202020202020202020002E2E20F6
:1000200020202020202020200000010202030303C2
:10003000030404040404040404050505050505057A
:100040000505050505050505050606060606060659
:100050000606060606060606060606060606060640
:100060000606060606060606060707070707070729
:100070000707070707070707070707070707070710
:100080000707070707070707070707070707070700
:1000900007070707070707070707070707070707F0
:1000A00007070707070707070708080808080808D9
:1000B00008080808080808080808080808080808C0
:1000C00008080808080808080808080808080808B0
:1000D00008080808080808080808080808080808A0
:1000E0000808080808080808080808080808080890
:1000F0000808080808080808080808080808080880
:10010000080808080808080808080808080808086F
:10011000080808080808080808080808080808085F
:1001200008080808080808080820003454000000DF
:00000001FF
此帖出自单片机论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

10
 

回复 9楼 的帖子

没想到几天没来看这个贴,已经有不少回复了

to athlon64fx:
用GCC写bootloader不用这么麻烦的,我个人认为不能按照libc manual中推荐的方法去做,那个FAQ有误导的嫌疑

其实只要把整个代码段重新定义到boot区的开始位置就行了,没必要再搞一个boot段.否则是很麻烦的.

直接更改代码段定位的好处是C代码里可以完全省略__attribute__((section(".boot")))这样的语句,另外也可以从根本上避免原来代码段的影响(我猜就是你贴的那段红色HEX代码出现的原因)
此帖出自单片机论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

11
 

回复 10楼 的帖子

分开写是没有问题的,
通常的做法是定位整个text包括中断向量,我也是一直这么做的.
但是这需要boot和app编译两次,它们之间的公共代码也不方便共享.
如果可以随意给text分段和定位,完全可以不编译bootloader而只用
app实现代码大小不受限制的bootloader,而这正是你在楼主位的要求
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表