LPC1768 eCos 启动代码分析(1)系统复位
来源:互联网 发布:黑色星期五抢购软件 编辑:程序博客网 时间:2024/06/10 13:28
参考文章:http://blog.csdn.net/rickleaf/article/details/6673136
要了解eCos的CortexM启动代码,需要理清下面几个文件的编译和链接关系。
packages/hal/cortexm/arch/current/src/vector.S
packages/hal/cortexm/arch/current/src/hal_misc.c
packages\hal\cortexm\lpc17xx\lpc1766stk\current\include\pkgconf\mlt_cortexm_lpc1766_rom.ldi
mlt_cortexm_lpc1766_rom.ldi:
// eCos memory layout
#include <pkgconf/hal.h>
#include <cyg/infra/cyg_type.inc>
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处开始跑的,
- LPC1768 eCos 启动代码分析(1)系统复位
- STM32 eCos 启动代码分析(一)系统复位
- STM32 eCos 启动代码分析(三)系统时钟滴答
- ecos代码分析(1)
- STM32 eCos 启动代码分析(二)上下文切换
- eCos学习笔记之启动代码分析
- eCos学习笔记之启动代码分析
- eCos学习笔记之启动代码分析
- ecos代码分析(2)
- ecos代码分析(3)
- ecos代码分析(4)
- ecos 浅析eCos系统Redboot单元启动流程
- MINI2440 QEMU 的 eCos 启动分析
- eCos 系统
- LPC1768系统方框图
- 如何通过hg(水银)代码管理系统搭建完整的ecos源码平台
- Linux系统内核启动代码分析
- eCos学习笔记之中断处理代码分析
- 草根创业者
- 《那些年啊,那些事——一个程序员的奋斗史》——36
- 小白鼠 测验毒药问题
- Oracle的左连接、右连接、(+)
- 回车即登录
- LPC1768 eCos 启动代码分析(1)系统复位
- 树-想起阿凡达
- 大数相加、相乘 字符串处理
- python 中的yield
- Oracle 查看 表 存储过程 触发器 函数 等对象定义语句的方法
- 前置(后置)++ /--与+/-在不同编译器下运算方式不同
- 列出主机系统平均负载
- 【转】无线连接两台笔记本有四种方法
- 各种数据库连接