为什么复位时PC指针指向的复位向量地址与flash中查看的不一样
观察到的0x080000D8是复位向量地址的最低字节(为什么说是最低字节往后面看)而不是栈顶地址这里的关键是区分两个不同的地址 1.栈顶地址MSP存储在0x08000000值为0x200011D8。 2.复位向量地址存储在0x08000004值为0x080000D9指向Reset_Handler。为什么看到的是0x080000D8在 Cortex-M 内核中所有函数地址的最低位必须为 1这是为了告诉内核这是一条Thumb 指令而不是 ARM 指令。 -Reset_Handler函数的实际指令地址是0x080000D8。 - 编译器在生成中断向量表时会自动将这个地址的最低位设为 1变成0x080000D9。 - 这个0x080000D9就被存储在0x08000004地址作为复位向量。 所以当你在内存窗口看到0x08000004地址的值是080000D9时它的最低字节0xD9或0x080000D8就是Reset_Handler地址的一部分这和栈顶地址0x200011D8是完全不同的两个概念。芯片复位后严格按照以下步骤执行1.设置栈指针从0x08000000读取 4 字节得到0x200011D8并将其加载到主栈指针MSP。2.跳转到复位处理函数从0x08000004读取 4 字节得到0x080000D9。内核会自动将最低位的 1 忽略得到实际地址0x080000D8然后跳转到Reset_Handler函数开始执行。总结0x080000D8是Reset_Handler函数的起始地址0x080000D8的最低字节它是程序执行的入口。0x200011D8是存储在0x08000000的初始栈顶地址它是栈指针的起点。两者各司其职一个负责程序的开始一个负责栈的初始化flash中的地址可以从左往右看原因是keil自动把ARM的小端问题优化成人类可读
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2422290.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!