您的位置 首页 知识

STM32发动代码剖析问题

能否讲解一下startup_stm32f10x_cls启动代码含义,谢谢!我现在看反汇编如下0x080000000678LSLSr0,r7,25(查看Memory窗口0x080000

能否解说一下startup_stm32f10x_cl.s发动代码意义,谢谢!

我现在看反汇编如下
0x08000000 0678 LSLS r0,r7,#25(检查Memory窗口0x08000000 : 78 06 00 20 —STM32小端原因)

0x08000002 2000 MOVS r0,#0x00
0x08000004 1105 ASRS r5,r0,#408
0x08000006 0800 LSRS r0,r0,#00A
。。。。。。。。。。。。。。。。。。。。。。

上面应该对应
__Vectors DCD __initial_sp ; Top of Stack
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

0x08001104 4808 LDR r0,[pc,#32];程序一运转跳到这儿,why?
0x08001106 4700 BX r0,r0,#0

上面对应
Reset_Handler PROC
EXPORTReset_Handler [WEAK]
IMPORT__main
LDR R0, =__main
BX R0
ENDP

那位能说一下为什么跳到0x08001104,即PC =0x08001104, 我想应该PC应该先跳到0x08000000?

回答:

cortex-M3和ARM9的架构有很大差异,ARM7、ARM9在复位后是从地址0处开端履行指令,也就是说地址0x00000000的内容是指令。而cortex-M3的反常向量表中的内容并不是指令,0x00000000处(当然也或许映射到其他规模)是主仓库指针的数值,0x00000004的内容是复位后需求跳转到的地址,是一个地址而不是一条指令。

stm32挑选flash发动方法,中断向量表映射到0x08000000,由楼主给出的反汇编可知,复位后主仓库指针的方位是0x20000678,0x08000004方位的数值是0x08001105,因为cortex-M3只能运转在thumb2状况,所以要确保向PC(R15)写入的数值的bit0有必要是1(假如向PC写入的数值的bit0是0,则处理器以为企图切入ARM状况,会发生fault),而实际上stm32的指令是半字对齐的,所以复位后会跳转到0x08001104.

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/276754.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部