以MEC1428为例来介绍EC的开发流程和基本原理。按照惯例从链接开始介绍。
一.自定义链接脚本。默认Mplab x默认使用xc32提供的脚本,在Mplab x也可以按照下图自定义链接脚本。
二.定义地址映射
针对MEC1428其地址及内存映射关系如下Data RAM:32K(0xBFD18000),Code RAM:160K(0xBFCF0000),ROM:192K(0xBFC00000),MMCR:2M(0xA0000000)
/*************************************************************************
* Memory Regions
* Memory regions without attributes cannot be used for orphaned sections.
* Only sections specifically assigned to these regions can be allocated
* into these regions.
*************************************************************************/
MEMORY
{
kseg1_boot_mem : ORIGIN = 0xBFC00000, LENGTH = 0x30000 (192K)
kseg0_program_mem (rx) : ORIGIN = 0xBFCF0000, LENGTH = 0x28000 (Code RAM:160K,读+执行)
sfrs : ORIGIN = 0xA0000000, LENGTH = 0x100000 (MMCR:1M?)
kseg1_data_mem (rwx) : ORIGIN = 0xBFD18000, LENGTH = 0x8000 (Data RAM:32K,读写+执行)
}
下面的sections段,定义了.reset也就是系统reset之后执行的user app第一行代码reset hander的位置(0xBFD00000),在在使用mec142x_spi_gen.exe编译SPI flash文件的时候,.toml脚本的
fw1EntryAddress段必须填入0xBFD00000作为开机后执行的第一条user app指令。fw1LoadAddress必须是kseg0_program_mem就是是user app必须加载到code ram的开始位置。
SECTIONS
{
.reset _RESET_ADDR :
{
KEEP(*(.reset))
} > kseg0_program_mem
.app_excpt _GEN_EXCPT_ADDR :
{
KEEP(*(.gen_handler))
} > kseg0_program_mem
}
下面是编译输出的最终地址映射表,可以从中看到代码段的加载基地址(.text),reset hander(.reset),异常向量表(.app_excpt),C startup如口段(.startup)
.reset 0xbfd00000 0x18 /microchip/xc32/v2.10/bin/bin/../../lib/gcc/pic32mx/4.8.3/../../../../pic32mx/lib/./proc/MEC1428/crt0_mips32r2.o
.gen_handler 0xbfd00180 0x10 ./microchip/xc32/v2.10/bin/bin/../../lib/gcc/pic32mx/4.8.3/../../../../pic32mx/lib/./proc/MEC1428/crt0_mips32r2.o
.reset.startup 0xbfd017ac 0x140 ./microchip/xc32/v2.10/bin/bin/../../lib/gcc/pic32mx/4.8.3/../../../../pic32mx/lib/./proc/MEC1428/crt0_mips32r2.o
.text.main_entry 0xbfcf8b64 0x54 ./microchip/xc32/v2.10/bin/bin/../../lib/gcc/pic32mx/4.8.3/../../../../pic32mx/lib/./proc/MEC1428/crt0_mips32r2.o
0xbfcf8b98 __crt0_exit
转载请注明出处,亦可关注微信公众号:固件C字营
Cstyle.z.zhou@outlook.com // http://blog.csdn.net/CStyle_0x007