加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

LPC1768 eCos 启动代码分析(1)系统复位

发布时间:2020-12-15 06:45:36 所属栏目:百科 来源:网络整理
导读:? 参考文章:http://www.voidcn.com/article/p-aajaitum-bo.html 要了解eCos的CortexM启动代码,需要理清下面几个文件的编译和链接关系。 packages/hal/cortexm/arch/current/src/vector.S packages/hal/cortexm/arch/current/src/hal_misc.c packageshalc
?
参考文章:http://www.voidcn.com/article/p-aajaitum-bo.html
要了解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 <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,LMA_EQ_VMA)
??? SECTION_fini (flash,LMA_EQ_VMA)
??? SECTION_rodata (flash,LMA_EQ_VMA)
??? SECTION_rodata1 (flash,LMA_EQ_VMA)
??? SECTION_fixup (flash,LMA_EQ_VMA)
??? SECTION_gcc_except_table (flash,LMA_EQ_VMA)
??? SECTION_eh_frame (flash,LMA_EQ_VMA)
??? SECTION_got (flash,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,FOLLOWING (.data))
??? SECTION_bss (ram,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处开始跑的,

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读