要了解eCos的CortexM启动代码,需要理清下面几个文件的编译和链接关系。
packages/hal/cortexm/arch/current/src/vector.S
packages/hal/cortexm/arch/current/src/hal_misc.c
packageshalcortexmlpc17xxlpc1766stkcurrentincludepkgconfmlt_cortexm_lpc1766_rom.ldi
mlt_cortexm_lpc1766_rom.ldi:
// eCos memory layout
#include #include MEMORY { ram : ORIGIN = 0x10000000, LENGTH = 0x00008000-CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE ahb_sram_bank0 : ORIGIN = 0x2007C000, LENGTH = 0x00004000 ahb_sram_bank1 : ORIGIN = 0x20080000, LENGTH = 0x00004000 flash : ORIGIN = 0x00000000, LENGTH = 0x00040000 } SECTIONS { SECTIONS_BEGIN SECTION_rom_vectors (flash, 0x00000000, LMA_EQ_VMA) SECTION_RELOCS (flash, ALIGN (0x8), LMA_EQ_VMA) SECTION_text (flash, ALIGN (0x8), LMA_EQ_VMA) SECTION_fini (flash, ALIGN (0x8), LMA_EQ_VMA) SECTION_rodata (flash, ALIGN (0x8), LMA_EQ_VMA) SECTION_rodata1 (flash, ALIGN (0x8), LMA_EQ_VMA) SECTION_fixup (flash, ALIGN (0x8), LMA_EQ_VMA) SECTION_gcc_except_table (flash, ALIGN (0x8), LMA_EQ_VMA) SECTION_eh_frame (flash, ALIGN (0x8), LMA_EQ_VMA) SECTION_got (flash, ALIGN (0x8), LMA_EQ_VMA) USER_SECTION (ahb_sram0, ahb_sram_bank0, 0x2007C000 (NOLOAD), LMA_EQ_VMA) USER_SECTION (ahb_sram1, ahb_sram_bank1, 0x20080000 (NOLOAD), LMA_EQ_VMA) SECTION_data (ram, 0x10000400, FOLLOWING (.got)) SECTION_sram (ram, ALIGN (0x8), FOLLOWING (.data)) SECTION_bss (ram, ALIGN (0x8), LMA_EQ_VMA) CYG_LABEL_DEFN(__heap1) = ALIGN (0x8); SECTIONS_END } hal_vsr_table = 0x10000000; hal_virtual_vector_table = hal_vsr_table + 128*4; hal_startup_stack = 0x10000000 + 1024*32; packages/hal/cortexm/arch/current/src/vector.S //========================================================================== .syntaxunified .thumb //========================================================================== //Initial exception vector table // //This only contains the stack and entry point for reset. The table //to be used at runtime is constructed by code in hal_reset_vsr(). .section ".vectors","ax" .global hal_vsr_table hal_vsr_table_init: .long hal_startup_stack // 0 Reset stack .long hal_reset_vsr // 1 Reset entry 这里我们可以看到,hal_vsr_table_init开始的预留了8个byte,我们可以猜想这个就是系统的启动部分。 但是,要想了解eCos的启动代码,我们必须知道hal_startup_stack和hal_reset_vsr来源于何处如何设定。 //========================================================================== 观察map文件 我们通过arm-eabi-nm这样的工具把elf文件生成几个map文件看一看这些symbol的具体位置。 在命令行输入arm-eabi-nm hello 000009bc T hal_reset_vsr 10008000 A hal_startup_stack 00000000 t hal_vsr_table_init 00000008 A _stext 00000008 A __exidx_start 00000000 A __rom_vectors_lma 00000000 A __rom_vectors_vma hal_reset_vsr是系统初始化的一个重要函数 hal_reset_vsr还调用了stm32变体层的初始化函数hal_system_init。 分析一下生成的binary文件 以ROM类型的二进制文件为例,使用命令行输入arm-eabi-objcopy kthread0 -O ihex kthread0.hex 把elf文件转换为二进制文件,他会默认的执行0x0000000也就是0x0800000,我们通过windows的notepad++来看这个二进制文件的前8个字节。 我们会看到 :0800000000800010610A0000FD :10000800C432000001000000DC36000001000000DE 而之前我们通过map文件查到的 10008000 A hal_startup_stack 000009bc T hal_reset_vsr 为什么和rickleaf说的不一样呢? 我用arm-eabi-readelf hello 了一下, 发现输出的这个2个值还是一样的,我把程序烧录到板子里面去后,程序能正常运行 查阅lpc1768的资料发现,他的程序复位后是从0x000000处开始跑的,
上一篇:ARM的AREA指令的使用
下一篇:LPC1788 emWin应用笔记
推荐阅读最新更新时间:2024-11-13 20:10
设计资源 培训 开发板 精华推荐
- DC1787A,基于 LT3759EMSE SEPIC 的演示板,VIN = 2.8V 至 36V,V OUT = 12V @1A
- ADP2230CP-EVALZ,用于评估 ADP2230 双通道、2MHz、800mA、同步、低静态电流降压稳压器的评估板
- AP7335-EV,用于采用 DFN2020-6 封装的 AP7335 低压差线性稳压器的评估模块
- Loli3接收机xLyRX
- LT6654BMPS6-1.25 升压输出电流电压基准的典型应用
- AD587KRZ-REEL 作为 CMOS 双路 DAC 的 10V 基准的典型应用电路
- DIY-Perks,USB麦克风,线路部分[暂未验证]
- 使用 Broadcom Inc 的 HFBR-1524Z 的参考设计
- u盘大小的便携式wifi杀手
- ESP_8_BIT:ESP32 带你体验怀旧游戏机