您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 终于有人把Cortex-m3启动代码分析清楚了
终于有人把Cortex-m3启动代码分析清楚了启动代码文件名一般可命名为如startup_stm32f103.s。启动代码作用一般是:1)堆和栈的初始化包括堆栈的大小,MSP(mainstackpointer)值等。MSP的初始值在复位阶段取自存储区的第一个字(即0地址处的值)。栈Stack:由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。向低地址扩展。堆Heap:一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。分配方式类似于数据结构中的链表。向高地址扩展。SRAM的分配如下图所示:2)向量表定义定义了各MSP初值,以及各个中断服务程序(ISR)的入口地址。3)中断服务程序CPU根据中断号从向量表中获取入口地址后,跳转至对应的ISR4)设置系统时钟频率;可在复位中断服务程序Reset_handler中调用系统时钟频率初始化程序。如:IMPORTSystemInit;//c代码中的系统初始化程序LDRR0,=SystemInit;//时钟频率配置等初始化BLXR05)中断寄存器的初始化;6)进入C应用程序。在复位中断服务程序即Reset_handler中实现进入C程序。如:LDRR0,=__main;使用“=”表示LDR目前是伪指令不是标准指令。这里是把__main的地址给R0。BXR0;BX是ARM指令集和THUMB指令集之间程序的跳转以下对1)~6)进行详细分析(1)按启动代码的次序,先看堆和栈的初始化:Stack_SizeEQU0x00000200;定义栈Stack_Size为0x00000200AREASTACK,NOINIT,READWRITE,ALIGN=3;定义栈,可初始为0,8字节对齐Stack_MemSPACEStack_Size;分配0x200个连续字节,并初始化为0__initial_sp;汇编代码地址标号:用于标识MSP初值Heap_SizeEQU0x00000000;堆配置为0大小。AREAHEAP,NOINIT,READWRITE,ALIGN=3__heap_baseHeap_MemSPACEHeap_Size__heap_limitPRESERVE8;指定当前文件堆栈8字节对齐THUMB;告诉汇编器下面是32位的Thumb指令,若需要,则汇编器将插入字节以保证对齐(2)中断向量表定义AREARESET,DATA,READONLY;定义复位向量段,只读EXPORT__Vectors;定义一个可以在其他文件中使用的全局标号。此处表示中断地址EXPORT__Vectors_EndEXPORT__Vectors_Size__VectorsDCD__initial_sp;给__initial_sp分配4字节32位的地址0x0DCDReset_Handler;给标号ResetHandler分配地址为0x00000004DCDNMI_Handler;给标号NMIHandler分配地址0x00000008DCDHardFault_Handler;HardFaultHandlerDCDMemManage_Handler;MPUFaultHandlerDCDBusFault_Handler;BusFaultHandlerDCDUsageFault_Handler;UsageFaultHandlerDCD0;这种形式就是保留地址,不给任何标号分配DCD0;ReservedDCD0;ReservedDCD0;ReservedDCDSVC_Handler;SVCallHandlerDCDDebugMon_Handler;DebugMonitorHandlerDCD0;ReservedDCDPendSV_Handler;PendSVHandlerDCDSysTick_Handler;SysTickHandler;ExternalInterruptsDCDWWDG_IRQHandler;WindowWatchdogDCDPVD_IRQHandler;PVDthroughEXTILinedetectDCDTAMPER_IRQHandler;TamperDCDRTC_IRQHandler;RTCDCDFLASH_IRQHandler;FlashDCDRCC_IRQHandler;RCCDCDEXTI0_IRQHandler;EXTILine0DCDEXTI1_IRQHandler;EXTILine1DCDEXTI2_IRQHandler;EXTILine2DCDEXTI3_IRQHandler;EXTILine3DCDEXTI4_IRQHandler;EXTILine4DCDDMAChannel1_IRQHandler;DMAChannel1DCDDMAChannel2_IRQHandler;DMAChannel2DCDDMAChannel3_IRQHandler;DMAChannel3DCDDMAChannel4_IRQHandler;DMAChannel4DCDDMAChannel5_IRQHandler;DMAChannel5DCDDMAChannel6_IRQHandler;DMAChannel6DCDDMAChannel7_IRQHandler;DMAChannel7DCDADC_IRQHandler;ADCDCDUSB_HP_CAN_TX_IRQHandler;USBHighPriorityorCANTXDCDUSB_LP_CAN_RX0_IRQHandler;USBLowPriorityorCANRX0DCDCAN_RX1_IRQHandler;CANRX1DCDCAN_SCE_IRQHandler;CANSCEDCDEXTI9_5_IRQHandler;EXTILine9..5DCDTIM1_BRK_IRQHandler;TIM1BreakDCDTIM1_UP_IRQHandler;TIM1UpdateDCDTIM1_TRG_COM_IRQHandler;TIM1TriggerandCommutationDCDTIM1_CC_IRQHandler;TIM1CaptureCompareDCDTIM2_IRQHandler;TIM2DCDTIM3_IRQHandler;TIM3DCDTIM4_IRQHandler;TIM4DCDI2C1_EV_IRQHandler;I2C1EventDCDI2C1_ER_IRQHandler;I2C1ErrorDCDI2C2_EV_IRQHandler;I2C2EventDCDI2C2_ER_IRQHandler;I2C2ErrorDCDSPI1_IRQHandler;SPI1DCDSPI2_IRQHandler;SPI2DCDUSART1_IRQHandler;USART1DCDUSART2_IRQHandler;USART2DCDUSART3_IRQHandler;USART3DCDEXTI15_10_IRQHandler;EXTILine15..10DCDRTCAlarm_IRQHandler;RTCAlarmthroughEXTILineDCDUSBWakeUp_IRQHandler;USBWakeupfromsuspend__Vectors_End__Vectors_SizeEQU__Vectors_End-Vectors(3)中断服务程序AREA|.text|,CODE,READONLY;代码段定义;ResetHandler,复位中断服务程序Reset_HandlerPROC;标记一个函数的开始EXPORTReset_Handler[WEAK];[WEAK]选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为0,若该标号为B或BL指令引用,则将B或BL指令置为NOP操作。EXPORT提示编译器该标号可以为外部文件引用。IMPORTSystemInit;//c代码中的系统初始化程序IMPORT__main;通知编译器要使用的标号在其他文件LDRR0,=SystemInit;//时钟频率配置等初始化BLXR0LDRR0,=__main;使用“=”表示LDR目前是伪指令不是标准指令。这里是把__main的地址给R0。BXR0;BX是ARM指令集和THUMB指令集之间程序的跳转ENDP;DummyExceptionHandlers(infiniteloopswhichcanbemodified)NMI_Handlerm;m其实就是PROC表示汇编函数的开始EXPORTNMI_Handler[WEAK]B.ENDPHardFault_Handler\;\是换行的意思PROCEXPORTHardFault_Handler[WEAK]B.;.号到底是什么含义呢,目前还没查到资料。可能是保留地址,供以后修改的吧ENDPMemManage_Handler\PROCEXPORTMemManage_Handler[WEAK]B.ENDPBusFault_Handler\PROCEXPORTBusFault_Handler[WEAK]B.ENDPUsageFault_Handler\PROCEXPORTUsageFault_Handler[WEAK]B.ENDPSVC_HandlerPROCEXPORTSVC_Handler[WEAK]B.ENDPDebugMon_Handler\PROCEXPORTDebugMon_Handler[WEAK]B.ENDPPendSV_HandlerPROCEXPORTPendSV_Handler[WEAK]B.ENDPSysTick_HandlerPROCEXPORTSysTick_Handler[WEAK]B.ENDPDefault_HandlerPROCEXPORTWWDG_IRQHandler[WEAK]EXPORTPVD_IRQHandler[WEAK]EXPORTTAMPER_IRQHandler[WEAK]EXPORTRTC_IRQHandler[WEAK]EXPORTFLASH_IRQHandler[WEAK]EXPORTRCC_IRQHandler[WEAK]EXPORTEXTI0_IRQHandler[WEAK]EXPORTEXTI1_IRQHandler[WEAK]EXPORTEXTI2_IRQHandler[WEAK]EXPORTEXTI3_IRQHandler[WEAK]EXPORTEXTI4_IRQHandler[WEAK]EXPORTDMAChannel1_IRQHandler[WEAK]EXPORTDMAChannel2_IRQHandler[WEAK]EXPORTDMAChannel3_IRQHandler[WEAK]EXPORTDMAChannel4_IRQHandler[WEAK]EXPORTDMAChannel5_IRQHandler[WEAK]EXPORTDMAChannel6_IRQHandler[WEAK]EXPORTDMAChannel7_IRQHandler[WEAK]EXPORTADC_IRQHandler[WEAK]EXPORTUSB_HP_CAN_TX_IRQHandler[WEAK]EXPORTUSB_LP_CAN_RX0_IRQHandler[WEAK]EXPORTCAN_RX1_IRQHandler[WEAK]EXPORTCAN_SCE_IRQHandler[WEAK]EXPORTEXTI9_5_IRQHandler[WEAK]EXPORTTIM1_BRK_IRQHandler[WEAK]EXPORTTIM1_UP_IRQHandler[WEAK]EXPORTTIM1_TRG_COM_IRQHandler[WEAK]EXPORTTIM1_CC_IRQHandler[WEAK]EXPORTTIM2_IRQHandler[WEAK]EXPORTTIM3_IRQHandler[WEAK]
本文标题:终于有人把Cortex-m3启动代码分析清楚了
链接地址:https://www.777doc.com/doc-5116439 .html