打印
[AVR单片机]

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

[复制链接]
3044|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mxh0506|  楼主 | 2008-5-14 17:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

原来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指令的部分转移到应用区, 也不行吗?
有没有做过的高人, 指点一下

相关帖子

沙发
mxh0506|  楼主 | 2008-5-21 14:22 | 只看该作者

看来又是个没人关心的问题

是不是大家很少用bootloader?

使用特权

评论回复
板凳
athlon64fx| | 2008-5-22 22:23 | 只看该作者

理论上是可以的,

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

使用特权

评论回复
地板
mxh0506|  楼主 | 2008-5-24 00:09 | 只看该作者

实现起来不难

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

使用特权

评论回复
5
hotpower00| | 2008-5-28 06:41 | 只看该作者

参考ATmel网站上的说明

AVR105: Power efficient high endurance parameter storage in Flash memory

使用特权

评论回复
6
xwj| | 2008-5-28 08:37 | 只看该作者

不可以也没必要

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

不能自己写自己,因为必须得考虑中间过程

使用特权

评论回复
7
kanprin| | 2008-5-28 20:05 | 只看该作者

可以

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

函数声明如下:

type function (...) __atribute__ ((section(".yoursection")));

使用特权

评论回复
8
athlon64fx| | 2008-5-28 20:39 | 只看该作者

楼主说得详细点好吗?

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

我试过无数次了,无论如何都不能定位,包括修改连接脚本.

使用特权

评论回复
9
kanprin| | 2008-5-28 21:31 | 只看该作者

代码量超过了你定义的空间

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

程序从text段开始执行即

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

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

使用特权

评论回复
10
mxh0506|  楼主 | 2008-5-28 23:22 | 只看该作者

感谢hotpower00的指点

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

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

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

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

使用特权

评论回复
11
hotpower| | 2008-5-28 23:54 | 只看该作者

hotpower00这签名比hotpower+00都酷~~~俺知道你是何人了~~~

使用特权

评论回复
12
athlon64fx| | 2008-5-29 03:53 | 只看该作者

to mxh0506

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

使用特权

评论回复
13
宇宙飞船| | 2008-5-29 18:27 | 只看该作者

若果觉得用GCC的段定位有困难,可参考现成的VIVI

有head.S与Main.c的关于GCC与LD的连接脚本(asm 与 C 的超强混编连接,去掉了所有的多余代码),稍作修改就可符合AVR的bootloader.

使用特权

评论回复
14
mxh0506|  楼主 | 2008-5-30 22:59 | 只看该作者

to athlon64fx:

我做的bootloader也是和app分开的,需要各自独立编译,而且各自有中断向量表. bootloader要占用一部分app区闪存的原因是新选的芯片boot区变小了.

to 宇宙飞船:
多谢指点, 我这就去看看

使用特权

评论回复
15
kanprin| | 2008-6-5 16:37 | 只看该作者

今天无意间搜到的一个链接的

[url = http://bbs.**/thread-59270-1-1.html] 电子工程世界的链接 [/url]

直接把这个帖子给复制过去了,也不知道是否有经过同意???


使用特权

评论回复
16
mxh0506|  楼主 | 2008-6-5 23:18 | 只看该作者

我也看到了

不只是它的论坛里有,竟然还有一个包含这个贴子的"个人空间",也和我在这里的ID同名,真是$#%$^$%……

相关链接:http://home.**/?uid-42900

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

1601

帖子

2

粉丝