小企业网站建设系统哪个好,网站美化的目标,网页在线发短信平台,wordpress 升级数据库打开Freedom KL25的例程包#xff0c;任意找一个code example#xff0c;以lower_power_dma_uart_demo为例#xff0c;分析一下启动汇编文件的代码。代码主要分三部分#xff1a;堆栈等的配置、向量表、初始启动跳转。1. 堆栈配置; Stack Configuration; Stack Size (in …打开Freedom KL25的例程包任意找一个code example以lower_power_dma_uart_demo为例分析一下启动汇编文件的代码。代码主要分三部分堆栈等的配置、向量表、初始启动跳转。1. 堆栈配置; Stack Configuration; Stack Size (in Bytes) 0x0-0xFFFFFFFF:8; Stack_Size EQU 0x00000800AREA STACK, NOINIT, READWRITE, ALIGN3Stack_Mem SPACE Stack_Size__initial_sp EQU 0x20002ff8; Heap Configuration; Heap Size (in Bytes) 0x0-0xFFFFFFFF:8; Heap_Size EQU 0x00000000AREA HEAP, NOINIT, READWRITE, ALIGN3__heap_baseHeap_Mem SPACE Heap_Size__heap_limit注AREA关键字的作用是告诉汇编器该section是独立的一段应该重新开始解析。AREA后面的一系列表示该段的属性。SPACE关键字告诉其后的一段memory存储空间不被初始化为某些特定值与FILL相对。EQU可以理解为等于。2. 向量表; Vector Table Mapped to Address 0 at ResetAREA RESET, DATA, READONLYEXPORT __VectorsEXPORT __Vectors_EndEXPORT __Vectors_Size__Vectors DCD __initial_sp ; Top of StackDCD Reset_Handler ; Reset HandlerDCD NMI_Handler ; NMI HandlerDCD HardFault_Handler ; Hard Fault HandlerDCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD SVC_Handler ; SVCall HandlerDCD 0 ; ReservedDCD 0 ; ReservedDCD PendSV_Handler ; PendSV HandlerDCD SysTick_Handler ; SysTick Handler; External InterruptsDCD DMA0_IRQHandler ; DMA channel 0 transfer complete interruptDCD DMA1_IRQHandler ; DMA channel 1 transfer complete interruptDCD DMA2_IRQHandler ; DMA channel 2 transfer complete interruptDCD DMA3_IRQHandler ; DMA channel 3 transfer complete interruptDCD Reserved20_IRQHandler ; Reserved interrupt 20DCD FTFA_IRQHandler ; FTFA interruptDCD LVD_LVW_IRQHandler ; Low Voltage Detect, Low Voltage WarningDCD LLW_IRQHandler ; Low Leakage WakeupDCD I2C0_IRQHandler ; I2C0 interruptDCD I2C1_IRQHandler ; I2C0 interrupt 25DCD SPI0_IRQHandler ; SPI0 interruptDCD SPI1_IRQHandler ; SPI1 interruptDCD UART0_IRQHandler ; UART0 status/error interruptDCD UART1_IRQHandler ; UART1 status/error interruptDCD UART2_IRQHandler ; UART2 status/error interruptDCD ADC0_IRQHandler ; ADC0 interruptDCD CMP0_IRQHandler ; CMP0 interruptDCD TPM0_IRQHandler ; TPM0 fault, overflow and channels interruptDCD TPM1_IRQHandler ; TPM1 fault, overflow and channels interruptDCD TPM2_IRQHandler ; TPM2 fault, overflow and channels interruptDCD RTC_IRQHandler ; RTC interruptDCD RTC_Seconds_IRQHandler ; RTC seconds interruptDCD PIT_IRQHandler ; PIT timer interruptDCD Reserved39_IRQHandler ; Reserved interrupt 39DCD USB0_IRQHandler ; USB0 interruptDCD DAC0_IRQHandler ; DAC interruptDCD TSI0_IRQHandler ; TSI0 interruptDCD MCG_IRQHandler ; MCG interruptDCD LPTimer_IRQHandler ; LPTimer interruptDCD Reserved45_IRQHandler ; Reserved interrupt 45DCD PORTA_IRQHandler ; Port A interruptDCD PORTD_IRQHandler ; Port D interrupt向量表很长此处只截取一部分这些向量表中的向量的默认名字就在这里指定了。开发人员只需将中断向量函数的具体功能实现即可。当然有一些默认的dummy 异常handler已经有了都是死循环; Dummy Exception Handlers (infinite loops which can be modified)NMI_Handler PROCEXPORT NMI_Handler [WEAK]B .ENDPHardFault_Handler\PROCEXPORT HardFault_Handler [WEAK]B .ENDPSVC_Handler PROCEXPORT SVC_Handler [WEAK]B .ENDPPendSV_Handler PROCEXPORT PendSV_Handler [WEAK]B .ENDPSysTick_Handler PROCEXPORT SysTick_Handler [WEAK]B .ENDP3. 启动代码启动代码就放在Reset复位向量里面因为Reset向量是MCU启动时候第一个进入到PC寄存器并开始执行的地方。; Reset HandlerReset_Handler PROCEXPORT Reset_Handler [WEAK]IMPORT SystemInitIMPORT __mainLDR R0, SystemInitBLX R0LDR R0, __mainBX R0ENDP启动代码首先将SystemInit的地址load到R0寄存器中然后使用BLX跳转指令跳到SystemInit函数开始处去执行执行完毕以后再执行main函数的执行。接下去需要找SystemInit的代码查看。