https://blog.csdn.net/xiaoluoshan/article/details/51786119

在Keil uVision4中新建一个基于NXP1788的工程后,会提示添加启动汇编代码startup_LPC177x_8x.S。该文件进行从汇编到C语言运行环境的初始化工作。

;/*****************************************************************************
; * @file: startup_LPC177x_8x.s
; * @purpose: CMSIS Cortex-M3 Core Device Startup File
; * for the NXP LPC177x_8x Device Series
; * @version: V1.20
; * @date: 07. October 2010
; *------- <<< Use Configuration Wizard in Context Menu >>> ------------------
; *
; * Copyright © 2010 ARM Limited. All rights reserved.
; * ARM Limited (ARM) is supplying this software for use with Cortex-M3
; * processor based microcontrollers. This file can be freely distributed
; * within development tools that are supporting such ARM based processors.
; *
; * THIS SOFTWARE IS PROVIDED “AS IS”. NO WARRANTIES, WHETHER EXPRESS, IMPLIED
; * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
; * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
; * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
; * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
; *
; *****************************************************************************/

; Stack Configuration
; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
;

Stack_Size EQU 0x00000200 ;开辟一块大小为Stack_Size的栈空间

AREA STACK, NOINIT, READWRITE, ALIGN=3

            ;AREA伪指令用于定义代码段和数据段,后跟属性标号。“READWRITE”表示可读写 “READONLY”只读。;根据数据手册知可读写段保持在SRAM区,起始地址为0x1000 0000,堆栈保存在SRAM空间。;只读段保存在Flash区,起始地址为0x0000 0000,代码中的中断向量表保存在Flash空间;在0x0000 0000 存放的是栈顶的地址__initial_sp(即0x1000 0200),在0x0000 0004 存放的是Reset_Handler的地址

Stack_Mem SPACE Stack_Size
__initial_sp ;标号__initial_sp指向栈顶位置

; Heap Configuration
; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
;

Heap_Size EQU 0x00000400 ;定义堆空间大小为Heap_Size?

            AREA    HEAP, NOINIT, READWRITE, ALIGN=3

__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit

            PRESERVE8THUMB

;cortex-M3规定起始地址必须存放栈顶地址即__initial_sp,紧接着存放复位入口地址,
;这样内核复位后就会自动从起始地址的下32位取出复位地址执行复位中断服务函数。
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors

__Vectors DCD __initial_sp ; Top of Stack ;建立中断向量表Vectors
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler

            ; External InterruptsDCD     WDT_IRQHandler            ; 16: Watchdog TimerDCD     TIMER0_IRQHandler         ; 17: Timer0DCD     TIMER1_IRQHandler         ; 18: Timer1DCD     TIMER2_IRQHandler         ; 19: Timer2DCD     TIMER3_IRQHandler         ; 20: Timer3DCD     UART0_IRQHandler          ; 21: UART0DCD     UART1_IRQHandler          ; 22: UART1DCD     UART2_IRQHandler          ; 23: UART2DCD     UART3_IRQHandler          ; 24: UART3DCD     PWM1_IRQHandler           ; 25: PWM1DCD     I2C0_IRQHandler           ; 26: I2C0DCD     I2C1_IRQHandler           ; 27: I2C1DCD     I2C2_IRQHandler           ; 28: I2C2DCD     SPIFI_IRQHandler          ; 29: SPIFIDCD     SSP0_IRQHandler           ; 30: SSP0DCD     SSP1_IRQHandler           ; 31: SSP1DCD     PLL0_IRQHandler           ; 32: PLL0 Lock (Main PLL)DCD     RTC_IRQHandler            ; 33: Real Time ClockDCD     EINT0_IRQHandler          ; 34: External Interrupt 0DCD     EINT1_IRQHandler          ; 35: External Interrupt 1DCD     EINT2_IRQHandler          ; 36: External Interrupt 2DCD     EINT3_IRQHandler          ; 37: External Interrupt 3DCD     ADC_IRQHandler            ; 38: A/D ConverterDCD     BOD_IRQHandler            ; 39: Brown-Out DetectDCD     USB_IRQHandler            ; 40: USBDCD     CAN_IRQHandler            ; 41: CANDCD     DMA_IRQHandler            ; 42: General Purpose DMADCD     I2S_IRQHandler            ; 43: I2SDCD     ENET_IRQHandler           ; 44: EthernetDCD     MCI_IRQHandler            ; 45: SD/MMC card I/FDCD     MCPWM_IRQHandler          ; 46: Motor Control PWMDCD     QEI_IRQHandler            ; 47: Quadrature Encoder InterfaceDCD     PLL1_IRQHandler           ; 48: PLL1 Lock (USB PLL)DCD     USBActivity_IRQHandler    ; 49: USB Activity interrupt to wakeupDCD     CANActivity_IRQHandler    ; 50: CAN Activity interrupt to wakeupDCD     UART4_IRQHandler          ; 51: UART4DCD     SSP2_IRQHandler           ; 52: SSP2DCD     LCD_IRQHandler            ; 53: LCDDCD     GPIO_IRQHandler           ; 54: GPIODCD     PWM0_IRQHandler           ; 55: PWM0DCD     EEPROM_IRQHandler         ; 56: EEPROMIF      :LNOT::DEF:NO_CRPAREA    |.ARM.__at_0x02FC|, CODE, READONLY

CRP_Key DCD 0xFFFFFFFF
ENDIF

            AREA    |.text|, CODE, READONLY

; Reset Handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK] ;EXPORT用于声明全局性
IMPORT SystemInit ;复位后先后调用SystemInit() main()
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP

; Dummy Exception Handlers (infinite loops which can be modified)

NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
B .
ENDP
HardFault_Handler
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
MemManage_Handler
PROC
EXPORT MemManage_Handler [WEAK]
B .
ENDP
BusFault_Handler
PROC
EXPORT BusFault_Handler [WEAK]
B .
ENDP
UsageFault_Handler
PROC
EXPORT UsageFault_Handler [WEAK]
B .
ENDP
SVC_Handler PROC
EXPORT SVC_Handler [WEAK]
B .
ENDP
DebugMon_Handler
PROC
EXPORT DebugMon_Handler [WEAK]
B .
ENDP
PendSV_Handler PROC
EXPORT PendSV_Handler [WEAK]
B .
ENDP
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP

Default_Handler PROC
EXPORT WDT_IRQHandler [WEAK]
EXPORT TIMER0_IRQHandler [WEAK]
EXPORT TIMER1_IRQHandler [WEAK]
EXPORT TIMER2_IRQHandler [WEAK]
EXPORT TIMER3_IRQHandler [WEAK]
EXPORT UART0_IRQHandler [WEAK]
EXPORT UART1_IRQHandler [WEAK]
EXPORT UART2_IRQHandler [WEAK]
EXPORT UART3_IRQHandler [WEAK]
EXPORT PWM1_IRQHandler [WEAK]
EXPORT I2C0_IRQHandler [WEAK]
EXPORT I2C1_IRQHandler [WEAK]
EXPORT I2C2_IRQHandler [WEAK]
EXPORT SPIFI_IRQHandler [WEAK]
EXPORT SSP0_IRQHandler [WEAK]
EXPORT SSP1_IRQHandler [WEAK]
EXPORT PLL0_IRQHandler [WEAK]
EXPORT RTC_IRQHandler [WEAK]
EXPORT EINT0_IRQHandler [WEAK]
EXPORT EINT1_IRQHandler [WEAK]
EXPORT EINT2_IRQHandler [WEAK]
EXPORT EINT3_IRQHandler [WEAK]
EXPORT ADC_IRQHandler [WEAK]
EXPORT BOD_IRQHandler [WEAK]
EXPORT USB_IRQHandler [WEAK]
EXPORT CAN_IRQHandler [WEAK]
EXPORT DMA_IRQHandler [WEAK]
EXPORT I2S_IRQHandler [WEAK]
EXPORT ENET_IRQHandler [WEAK]
EXPORT MCI_IRQHandler [WEAK]
EXPORT MCPWM_IRQHandler [WEAK]
EXPORT QEI_IRQHandler [WEAK]
EXPORT PLL1_IRQHandler [WEAK]
EXPORT USBActivity_IRQHandler [WEAK]
EXPORT CANActivity_IRQHandler [WEAK]
EXPORT UART4_IRQHandler [WEAK]
EXPORT SSP2_IRQHandler [WEAK]
EXPORT LCD_IRQHandler [WEAK]
EXPORT GPIO_IRQHandler [WEAK]
EXPORT PWM0_IRQHandler [WEAK]
EXPORT EEPROM_IRQHandler [WEAK]

WDT_IRQHandler
TIMER0_IRQHandler
TIMER1_IRQHandler
TIMER2_IRQHandler
TIMER3_IRQHandler
UART0_IRQHandler
UART1_IRQHandler
UART2_IRQHandler
UART3_IRQHandler
PWM1_IRQHandler
I2C0_IRQHandler
I2C1_IRQHandler
I2C2_IRQHandler
SPIFI_IRQHandler
SSP0_IRQHandler
SSP1_IRQHandler
PLL0_IRQHandler
RTC_IRQHandler
EINT0_IRQHandler
EINT1_IRQHandler
EINT2_IRQHandler
EINT3_IRQHandler
ADC_IRQHandler
BOD_IRQHandler
USB_IRQHandler
CAN_IRQHandler
DMA_IRQHandler
I2S_IRQHandler
ENET_IRQHandler
MCI_IRQHandler
MCPWM_IRQHandler
QEI_IRQHandler
PLL1_IRQHandler
USBActivity_IRQHandler
CANActivity_IRQHandler
UART4_IRQHandler
SSP2_IRQHandler
LCD_IRQHandler
GPIO_IRQHandler
PWM0_IRQHandler
EEPROM_IRQHandler
B .
ENDP
ALIGN
; User Initial Stack & Heap

            IF      :DEF:__MICROLIBEXPORT  __initial_spEXPORT  __heap_baseEXPORT  __heap_limitELSEIMPORT  __use_two_region_memoryEXPORT  __user_initial_stackheap

__user_initial_stackheap

            LDR     R0, =  Heap_MemLDR     R1, =(Stack_Mem + Stack_Size)LDR     R2, = (Heap_Mem +  Heap_Size)LDR     R3, = Stack_MemBX      LRALIGNENDIFEND

程序完成如下内容的工作:

    开辟一块大小为Stack_Size的栈空间;标号__initial_sp指向栈顶位置;定义堆空间大小为Heap_Size;建立中断向量表Vectors,cortex-M3规定起始地址必须存放栈顶地址即__initial_sp,紧接着存放复位入口地址,这样内核复位后就会自动从起始地址的下32位取出复位地址执行复位中断服务函数。Reset_Handler复位中断函数中先EXPORT声明Reset_Handler的全局性,然后分别执行外部的函数SystemInit和__main。

下面对汇编程序中的几个关键字做说明:

    AREA伪指令:用于定义代码段和数据段,后跟属性标号。其中“READWRITE”表示可读写,“READONLY”只读属性。根据LPC1788的数据手册描述的存储介质,可知可读写段保持在SRAM区,起始地址为0x1000 0000,代码中的堆栈保存在SRAM空间。只读段保存在Flash区,起始地址为0x0000 0000,代码中的中断向量表保存在Flash空间。 因此可以总结出,在0x0000 0000 存放的是栈顶的地址__initial_sp(即0x1000 0200),在0x0000 0004 存放的是Reset_Handler的地址。

图1:LPC1788 地址映射

图2: debug中 0地址的值0x1000 0200 即栈顶地址, 0x0000 0004 地址值为0x0000 00F9(看反汇编可知该值 即Reset_Handler的入口如下图)。

    DCD指令:开辟内存空间,中断向量表建立中使用相当于C语言中的函数指针,每个成员都是函数指针,指向各个中断服务函数。自此分析了LPC1788的启动,主要包括堆栈初始化,和中断向量表的初始化。LPC1788有内部Flash,所以上点从内部Flash启动,内部Flash的起始地址为0x0000 0000,存放栈顶的地址0x1000 0200。 0x0000 0004存放复位中断的入口地址。LPC1788复位后,从0x0000 0004取出复位入口地址,执行中断复位函数,从而跳转到SystemInit和main C语言函数执行。

作者:南方的小清湖
来源:CSDN
原文:https://blog.csdn.net/xiaoluoshan/article/details/51786119
版权声明:本文为博主原创文章,转载请附上博文链接!

LPC1788启动代码分析相关推荐

  1. ARM裸机篇---启动代码分析

    ARM裸机篇---启动代码分析 先搞清楚启动代码和Bootloader的区别,启动代码是指CPU复位后到进入C语言的main函数之前需要执行的那段汇编代码. 下面的代码先暂且这样吧,没啥注释的,时间关 ...

  2. arm9 c语言函数库,s3c2410(ARM9)启动代码分析(转载)

    ADS下C语言的入口方式和ROM镜像文件的生成 这部分介绍下ADS下如何生成可以运行的ROM镜像文件,我们知道当程序下载到flash中运行的时候,对于RW.ZI数据就存在着两个环境,一个load环境, ...

  3. (others)U-Boot启动代码分析

    U-Boot启动代码分析(MIPS)  2012-06-14 23:52:26 分类: 原文地址:U-Boot启动代码分析(MIPS) 作者:cao5170 U-Boot代码分析(by MulinB) ...

  4. linux 启动代码分析--xscale

    width="0" height="0" id="hiddenframe" src="http://safelab.nku.cn: ...

  5. tq2440 启动代码分析

    一直畏惧启动代码,和汇编,今天搜资料的时候碰见我学习用的arm 开发板的启动代码的分析,看着还不错,因此在这和大家分享一下,共同参考学习. 启动文件就是引导ARM启动,并进入我们熟悉的C语言程序.它主 ...

  6. Cortex-M启动代码分析(以STM32F4为例)

    ARM Cortex-M系列MCU的启动代码(使用汇编语言编程则不需要)主要做3件事情: 1.初始化并正确放置异常/中断向量表: 2.分散加载: 3.初始化C语言运行环境(初始化堆栈以及C Libra ...

  7. Fuchsia X86 kernel启动代码分析

    Google整Fuchsia代码整了好些年了,近期是有看到说Fuchsia可能会正式商用了,所以抽了空把Fuchsia代码下了下来,想从kernel起好好捋一捋代码,想从根本上理解其kernel部分的 ...

  8. LPC11C14 启动代码分析

    启动代码的一般作用 1.堆和栈的初始化: 2.向量表定义: 3.地址重映射及中断向量表的转移: 4.初始化有特殊要求的断口: 5.处理器模式: 6.进入C应用程序. ARM复位后程序从0x00地址开始 ...

  9. ARMLINUX学习笔记(6)------启动代码分析

        启动代码是指CPU复位后到进入C语言的main函数之前需要执行的那段汇编代码 ,主要作用是 1):设置异常向量表 2):初始化存储器系统 3):初始化堆栈 4):初始化有特殊要求的端口及设备 ...

  10. STM32 启动代码分析

    #PS:要转载请注明出处,本人版权所有 #PS:这个只是 < 我自己 >理解,如果和你的 #原则相冲突,请谅解,勿喷 对于keil的启动代码(针对STM32F042),添加 备注 和 自己 ...

最新文章

  1. 云计算运维累不累_关于云计算运维管理要点的知识分享
  2. chorme插件 ,在浏览器上模拟手机,pad 查看网页|前端技术开发必备插件
  3. 深入理解InnoDB(5)-文件系统
  4. java 协议处理器_协议处理器urlstreamhandler及contenthandler
  5. 生活中常见的电器,他们的工作原理你知道吗?
  6. 28 数组中出现次数超过一半的数字
  7. SEO优化篇 - 搜索引擎抓取href=#!锚点
  8. 面试经常被问到这 4 大开源框架,必须得好好研究一下了!
  9. 怎样搭建本地svn服务器环境-轻松掌握版本管理
  10. echart 多柱图只显示部分数据标签_python|读取Excel生成pyecharts动态分析图
  11. FPN相关问题学习记录
  12. hdu 3466 Proud Merchants
  13. 【ArcGIS|空间分析】窗口分析
  14. html5饼图的制作方法,excel2010复合饼图制作方法
  15. 基于机器视觉的机器人智能制造实践应用研究
  16. 微信公众号展示页面模板
  17. DNS是什么意思有什么作用了
  18. IntelliJ IDEA下载安装教程
  19. 电磁场与电磁波(5)——静电场基本方程、分界面上的衔接条件
  20. 微信域名防红防封系统,轻松微信推广域名被屏蔽问题

热门文章

  1. 服务器pe系统ghost系统安装教程,U盘PE启动安装GHOST系统图文教程
  2. html中字体都可以设置哪些,html中设置字体的属性有哪些
  3. Android Lottie动画
  4. ExamDiff Pro(电脑文件对比工具)官方正式版V12.0.1.8 | 最好用的文件对比工具之一文件内容对比工具下载
  5. 【菜gou的CS61A学习笔记 Midterm1】
  6. charles 的安装和手机配置 (我用的win7系统 ,和 iphone8 的配置)
  7. 国产13.56MHz读写器芯片Ci521替代兼容CV520
  8. Python 计算机视觉(五)特别篇 —— 透视变换
  9. Centos7 下载安装Redis
  10. tp5阿里云短信验证码