在线时间0 小时
UID115367
注册时间2009-3-11
NXP金币0
该用户从未签到
新手上路

- 积分
- 35
- 最后登录
- 1970-1-1
|
发表于 2010-7-12 14:13:47
|
显示全部楼层
回复:关于飞思卡尔串口升级问题 急~!
回复第 9 楼 fishandbear于2010-07-12 06:12:33发表:
回复第 6 楼 liangziang于2010-05-04 00:12:27发表:
回复第 5 楼 安 于2010-04-30 09:14:56发表:
你好,我没有搞过飞思卡尔的FLASH程序代码。
1、如果把bootloader和程序放在一起肯定是会将bootloader的地址改变。
2、建议使用外扩flash,作为程序存放。
3、就是你说的分2个工程,将bootloader放入模块flash,但是你的程序不能占用该块,每次升级将起始地址该为该bootloader的地址。等程序烧写完毕以后,将开始地址修改为当前系统的地址。
------------------------------------------------------------------------------------------
bootcode (RX) : ORIGIN = 0x00002200, LENGTH = 0x0000AE00
code (RWX) : ORIGIN = 0x00010010, LENGTH = 0x0005FFF0
两个工程出现的问题:由于烧写bootloader的地址从2200到FFFF,因此,其它段的数据都是主程序的地址,这样就是开始先执行的是主程序,我将它跳至bootloader的main函数地址,执行完bootloader后,再跳回主程序的main函数地址。
虽然两个程序完全独立,但还是有影响,bootloader显示功能不正常,code段程序(主程序)显示也有问题,并且有一些数组的查找有错误(例:根据某个计算结果,去提取相应数组的某个元素,就提取出错。注:主程序直接烧录至芯片功能完全正常),应该是某个地方的地址映射搞混了。但不知道如何修改!
附1:bootloader的INTERNAL_FLASH.lcf
KEEP_SECTION { .vectortable }
KEEP_SECTION { .cfmconfig }
MEMORY {
interrupts (RWX): ORIGIN = 0x00000000, LENGTH = 0x00000300
bootcode (RX) : ORIGIN = 0x00002200, LENGTH = 0x0000AE00
code (RWX): ORIGIN = 0x00010010, LENGTH = 0x0005FFF0
romdata (RWX): ORIGIN = 0x0000D000, LENGTH = 0x00003000
vectorram (RWX): ORIGIN = 0x20000000, LENGTH = 0x00000400
data (RW) : ORIGIN = 0x20000400, LENGTH = 0x0000f800
cfmprotrom (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000020
ipsbar (RW) : ORIGIN = 0x40000000, LENGTH = 0x0
}
SECTIONS {
# Heap and Stack sizes definition
___heap_size = 0x0400;
___stack_size = 0x0400;
.ipsbar : {} > ipsbar
.interrupts :
{
___VECTOR_RAM = .;
* (.vectortable)
. = ALIGN (0x4);
} > interrupts
.cfmprotect :
{
*(.cfmconfig)
. = ALIGN (0x4);
} > cfmprotrom
.bootcode:
{
H500.c (.text)
H500.c (.rodata)
Bootloader.c (.text)
Bootloader.c (.rodata)
ParseS19.c (.text)
ParseS19.c (.rodata)
Cpu.c (.text)
startcf.c (.text)
C_4i_CF_Runtime.a(.text)
C_4i_CF_SZ_MSL.a(.text)
. = ALIGN (0x4);
} > bootcode
.romdata:
{
___ROM_AT = .;
} > romdata
.text :
{
* (.text)
. = ALIGN(0x4);
* (.rodata)
. = ALIGN(0x4);
} > code
.data : AT(___ROM_AT)
{
___DATA_RAM = .;
* (.exception)
. = ALIGN(0x4);
__exception_table_start__ = .;
EXCEPTION
__exception_table_end__ = .;
___sinit__ = .;
STATICINIT
___DATA_START =.;
* (.data)
. = ALIGN (0x4);
___DATA_END =.;
__SDATA_START =.;
* (.sdata)
. = ALIGN (0x4);
__SDATA_END = .;
__SDA_BASE = .;
. = ALIGN(0x4);
} > data
.bss :
{
__START_SBSS = .;
* (.sbss)
*(SCOMMON)
__END_SBSS = .;
__START_BSS = .;
* (.bss)
* (COMMON)
__END_BSS = .;
. = ALIGN(0x4);
} >> data
# 64 Kbytes Internal SRAM
___RAMBAR = 0x20000000;
___RAMBAR_SIZE = 0x00010000;
# 512 KByte Internal Flash Memory
___FLASH_ADDRESS = 0x00000000;
___FLASH_SIZE = 0x00080000;
___IPSBAR = ADDR(.ipsbar);
___SP_AFTER_RESET = ___RAMBAR + ___RAMBAR_SIZE - 4;
___HEAP_START = .;
___HEAP_END = ___HEAP_START + ___heap_size;
___SP_END = ___HEAP_END;
___SP_INIT = ___SP_END + ___stack_size;
___heap_addr = ___HEAP_START;
___heap_size = ___HEAP_END - ___HEAP_START;
__SP_INIT = ___SP_INIT;
_romp_at = ___ROM_AT+SIZEOF(.data);
.romp : AT(_romp_at)
{
__S_romp = _romp_at;
WRITEW(___ROM_AT);
WRITEW(ADDR(.data));
WRITEW(SIZEOF(.data));
WRITEW(0);
WRITEW(0);
WRITEW(0);
}
}
------------------------------------------------------------------------------------------
附2:主程序的INTERNAL_FLASH.lcf
KEEP_SECTION { .vectortable }
KEEP_SECTION { .cfmconfig }
MEMORY {
interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000400
code (RX) : ORIGIN = 0x00010010, LENGTH = 0x0006FFF0
data (RW) : ORIGIN = 0x20000000, LENGTH = 0x00010000
cfmprotrom (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000020
ipsbar (RW) : ORIGIN = 0x40000000, LENGTH = 0x0
}
SECTIONS {
# Heap and Stack sizes definition
___heap_size = 0x0400;
___stack_size = 0x0400;
.ipsbar : {} > ipsbar
.interrupts :
{
___VECTOR_RAM = .;
* (.vectortable)
. = ALIGN (0x4);
} > interrupts
.cfmprotect :
{
*(.cfmconfig)
. = ALIGN (0x4);
} > cfmprotrom
.text :
{
* (.text)
. = ALIGN(0x4);
* (.rodata)
. = ALIGN(0x4);
___ROM_AT = .;
___DATA_ROM = .;
} > code
.data : AT(___ROM_AT)
{
___DATA_RAM = .;
* (.exception)
. = ALIGN(0x4);
__exception_table_start__ = .;
EXCEPTION
__exception_table_end__ = .;
___sinit__ = .;
STATICINIT
___DATA_START =.;
* (.data)
. = ALIGN (0x4);
___DATA_END =.;
__SDATA_START =.;
* (.sdata)
. = ALIGN (0x4);
__SDATA_END = .;
__SDA_BASE = .;
. = ALIGN(0x4);
} > data
.bss :
{
__START_SBSS = .;
* (.sbss)
*(SCOMMON)
__END_SBSS = .;
__START_BSS = .;
* (.bss)
* (COMMON)
__END_BSS = .;
. = ALIGN(0x4);
} >> data
# 64 Kbytes Internal SRAM
___RAMBAR = 0x20000000;
___RAMBAR_SIZE = 0x00010000;
# 512 KByte Internal Flash Memory
___FLASH_ADDRESS = 0x00000000;
___FLASH_SIZE = 0x00080000;
___IPSBAR = ADDR(.ipsbar);
___SP_AFTER_RESET = ___RAMBAR + ___RAMBAR_SIZE - 4;
___HEAP_START = .;
___HEAP_END = ___HEAP_START + ___heap_size;
___SP_END = ___HEAP_END;
___SP_INIT = ___SP_END + ___stack_size;
___heap_addr = ___HEAP_START;
___heap_size = ___HEAP_END - ___HEAP_START;
__SP_INIT = ___SP_INIT;
_romp_at = ___ROM_AT + SIZEOF(.data);
.romp : AT(_romp_at)
{
__S_romp = _romp_at;
WRITEW(___ROM_AT);
WRITEW(ADDR(.data));
WRITEW(SIZEOF(.data));
WRITEW(0);
WRITEW(0);
WRITEW(0);
}
}
在一个工程里面实现完全没问题的,关键是要把存储空间都区分好,最保险的就是让boot和app都有自己的vetcor、code、bss、data等,另外boot和app绝对不能有耦合,即相互的调用,我感觉你是相互调用了。
这种方法我已经实现了,而且应用在一款产品上,运行良好,所以理论上是绝对可行的。
我是用在MCF52259上,应该跟你用的52258没什么区别。 |
|