资源预览内容
第1页 / 共24页
第2页 / 共24页
第3页 / 共24页
第4页 / 共24页
第5页 / 共24页
第6页 / 共24页
第7页 / 共24页
第8页 / 共24页
第9页 / 共24页
第10页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
Copyright 2009www.ultrawise.com.cnCortex-M3启动代码分析Copyright 2009www.ultrawise.com.cn目标掌握嵌入式应用程序设计 的基本知识掌握starup_stm32f10x_cl.s中常见汇编 指令能分析starup_stm32f10x_cl.s启动代码Copyright 2009www.ultrawise.com.cn嵌入式应用系统中的存储映射 在设计嵌入式应用系统时,为了追求最好的性能价格比, 系统中通常包括多种存储器,如ROM、16位RAM、32位 RAM和FLASH等,这样一个重要的问题就是设计其存储系 统的布局。 在RAM 体系结构中,系统复位后将跳转到地址0x0处执行 ,该处存放的是复位异常中断的中断向量。对于嵌入式系 统来说,在系统复位时RAM中是不存在代码和数据的。因 此在系统复位时,地址0x0处应该为ROM,即系统复位后 应该首先从ROM中开始执行。Copyright 2009www.ultrawise.com.cn地址0x0处为ROM 这里所说的地址0x0处为ROM,是指在系统运行过程中, 地址0x0处为ROM,对于嵌入式系统来说,在系统复位时 地址0x0处总为ROM。这种情况非常简单,在地址0x0处存 放着复位异常中断向量,根据此中断向量,程序跳转到相 应的位置进行系统初始化等操作。 这种情况有一个缺点,通常相对于RAM来说,ROM的数据 宽度较小,速度较慢,这会使系统响应异常中断的速度较 慢,而且如果异常中断向量表放在ROM中,则中断向量表 内容不能修改。Copyright 2009www.ultrawise.com.cn地址0x0处为RAM 这里所说的地址0x0处为RAM,是指在系统运行过程中, 地址0x0处为RAM,对于嵌入式系统来说,在系统复位时 地址0x0处总为ROM。因此,对于地址0x0处为RAM的系统 ,为了保证系统复位后从ROM中开始执行,在系统复位时 ,系统中的存储映射机构将ROM映射到地址0x0处,然后 在程序运行的最初几条指令中,系统中的存储映射机构进 行地址重映射,重新将RAM映射到地址0x0处。 优点:RAM的数据宽度较大,速度较快,这会使系统响应 异常中断的速度更快。而且异常中断向量表放在RAM中, 程序在运行过程中可以修改中断向量表内容,使得系统更 为灵活。Copyright 2009www.ultrawise.com.cn系统初始化 系统运行环境初始化,包括异常中断向量初始化、数据栈 初始化以及IO初始化等。 应用程序初始化,例如C语言变量的初始化等。 启动代码功能总结: 1)堆和栈的初始化; 2)向量表定义; 3)地址重映射及中断向量表的转移; 4)设置系统时钟频率; 5)中断寄存器的初始化; 6)进入C应用程序。Copyright 2009www.ultrawise.com.cn预备知识一个由C/C+编译的程序占用的内存分为以下几个部分 : 栈区(stack) 编译器自动分配释放,存放函数的参数 值,局部变量的值等。操作方式类似于数据结构中的栈。 堆区(heap) 一般由程序员分配释放, 若程序员不 释放,程序结束时可能由OS回 收 。注意它与数据结构中 的堆是两回事,分配方式倒是类似于链表。 全局区(静态区)(static)全局变量和静态变量的存储 是放在一块的,初始化的 全局变量和静态变量在一块区域 , 未初始化的全局变量和未初始化的静态变量在相邻的 另 一块区域。 程序结束后由系统释放。 Copyright 2009www.ultrawise.com.cn预备知识 文字常量区 常量字符串就是放在这里的。 程序结束后 由系统释放 程序代码区存放函数体的二进制代码。 /main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() int b; 栈 char s = “abc”; 栈 char *p2; 栈 char *p3 = “123456”; 1234560在常量区,p3在栈上 Copyright 2009www.ultrawise.com.cn预备知识 static int c =0; 全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); 分配得来得10和20字节的区域就在堆区。 strcpy(p1, “123456“); 1234560放在常量区,编译器可能 会将它与p3所指向的“123456“ 优化成一个地方。 ENTRY: 伪操作指定程序的人口点 AREA:伪操作用于定义一个代码段或者数据段 DCD:用于分配一段字内存单元Copyright 2009www.ultrawise.com.cn代码分析1 栈的初始化: Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size _initial_sp 定义Stack Size为0x00000400; 定义栈 ,可初始化为0,8字节对齐 分配0x00000400个连续字节,并初始化为0 汇编代码地址标号 Copyright 2009www.ultrawise.com.cn代码分析2 堆的初始化: Heap_Size EQU 0x00000400 AREA HEAP, NOINIT, READWRITE, ALIGN=3 _heap_base Heap_Mem SPACE Heap_Size _heap_limit 定义Heap Size为0x00000400; 定义堆 ,可初始化为0,8字节对齐 分配0x00000400个连续字节,并初始化为0 汇编代码地址标号 Copyright 2009www.ultrawise.com.cn代码分析3 PRESERVE8 THUMB 指定当前文件堆栈8字节对齐 告诉汇编器下面是32为的Thumb指令,如果需要汇编器将 插入位以保证对齐Copyright 2009www.ultrawise.com.cn代码分析4 见 STM3210X datasheet V10C.pdf 130页 ; Vector Table Mapped to Address 0 at Reset AREA RESET, DATA, READONLY /定义复位向量段,只读 EXPORT _Vectors EXPORT _Vectors_End EXPORT _Vectors_Size/定义一个可以在其他文件 中使用的全局标号,此处表示中断地址 _Vectors DCD _initial_sp ; Top of Stack /给_initial_sp 分配4字节32位的地址0x0Copyright 2009www.ultrawise.com.cn代码分析5 DCD Reset_Handler ; Reset Handler / 给标号Reset Handler分配地址为0x00000004 DCD NMI_Handler ; NMI Handler /给标号NMI Handler分配地址0x00000008 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 /这种形式就是保留地址,不给任何标号分配。Copyright 2009www.ultrawise.com.cn代码分析6 DCD ETH_WKUP_IRQHandler ; Ethernet Wakeup through EXTI line DCD CAN2_TX_IRQHandler ; CAN2 TX DCD CAN2_RX0_IRQHandler ; CAN2 RX0 DCD CAN2_RX1_IRQHandler ; CAN2 RX1 DCD CAN2_SCE_IRQHandler ; CAN2 SCE DCD OTG_FS_IRQHandler ; USB OTG FS _Vectors_End _Vectors_Size EQU _Vectors_End - _VectorsCopyright 2009www.ultrawise.com.cn代码分析7 中断向量表的转移 AREA |.text|, CODE, READONLY /代码段定义 ; Reset handler routine Reset_Handler PROC /标记一个函数的开始 EXPORT Reset_Handler WEAK /【WEAK】选项表示当所有的源文件都没有定义一个标号时 ,编译器也不给出错误信息,在多数情况下将该标号置为 0,若该标号为B或BL指令引用,则将B或BL指令置为NOP 操作; /EXPORT 提示编译器标号可以为外部文件引用;Copyright 2009www.ultrawise.com.cn代码分析8 IMPORT _main /通知编译器要使用的标号在其他文件 LDR R0, =_main / 使用“”表示LDR目前是伪指令不是标准指令,这里是把 _main的地址给R0; BX R0 /BX是ARM指令集和THUMB指令集之间的程序的跳转 ENDPCopyright 2009www.ultrawis
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号