在 gcc 分支下的 startup_stm32f10x_cl.s 文件中,有几处代码看不懂,向大家请教一下: (1)一个是在定义中断向量表项的地方: .section .isr_vector,"a",%progbits .type g_pfnVectors, %object .size g_pfnVectors, .-g_pfnVectors g_pfnVectors: .word _estack .word Reset_Handler .word NMI_Handler .word HardFault_Handler 其中的 .size 指令中,句点 '.' 表示的当前地址与 g_pfnVectors 标号代表的地址应该是一个地址吧?如果是这样的话、这条指令岂不是设置 g_pfnVectors 对象的大小为 0? 这条指令的作用体现在哪里? (2)在向量表的最后一项: .word BootRAM /* @0x1E0. This is for boot in RAM mode for STM32F10x Connectivity line Devices. */ 在文件中定义的 BootRAM 值为:.equ BootRAM, 0xF1E0F85F。向量表的最后一项为什么要放这个值,其作用是什么? |
RE:关于 stm32f10x_cl 启动汇编代码的问题
回复:关于 stm32f10x_cl 启动汇编代码的问题
.section .isr_vector,"a",%progbits 执行域
.type g_pfnVectors, %object
.size g_pfnVectors, .-g_pfnVectors
g_pfnVectors:
.word _estack
.word Reset_Handler
.word NMI_Handler
.word HardFault_Handler
其中的 .size 指令中,句点 '.' 表示的当前地址与 g_pfnVectors 标号代表的地址应该是一个地址吧?如果是这样的话、这条指令岂不是设置 g_pfnVectors 对象的大小为 0? 这条指令的作用体现在哪里?
首先明确下ARM的软件编译出来分为:代码段(存在ROM/Flash)和数据段(存在RAM)。 因此程序下载到芯片Flash中,然后在开工的时候从Flash取出来放到RAM中来运行。程序存放的地址叫做加载域,程序执行的地址叫做执行域。ARM通过分散加载文件(scatter)制定加载域和执行域的地址。 你的工程中有一个分散加载文件 .scf 或者类似的文件。 这个文件与汇编文件对应。 你在加载文件中肯定能看到Reset_Handler等。
(2)在向量表的最后一项:
.word BootRAM /* @0x1E0. This is for boot in RAM mode for
STM32F10x Connectivity line Devices. */
在文件中定义的 BootRAM 值为:.equ BootRAM, 0xF1E0F85F。向量表的最后一项为什么要放这个值,其作用是什么?
这个也是与分散加载相关。你讲BOOTRAM指定一个地址,代码运行的时候直接跳转到这个地址。 因此需要在加载文件中将代码加载到这个地址。 所谓的BOOTLoad就是用来干这个的。