为什么 DCD 分配向量表时,函数地址要加 1(LSB=1)?
难度:★★本文首发于我的嵌入式技术号「OneChan」,未经授权禁止转载。打开任何一个 Cortex-M3 的启动文件,查看向量表,你会看到类似这样的代码:__Vectors DCD __initial_sp ; 0x00000000:栈顶 DCD Reset_Handler ; 0x00000004:复位入口 DCD NMI_Handler ; 0x00000008:NMI入口 DCD HardFault_Handler ; 0x0000000C:HardFault入口第一项__initial_sp是栈顶地址,这个值是多少就是多少,不用改。但后面的函数地址呢?假设Reset_Handler实际位于 Flash 的0x08000100处。向量表里应该填什么?如果你填DCD 0x08000100,程序一跑就 HardFault。正确答案是填0x08000101——这个地址的 LSB(最低位)必须是 1。为什么?这是一个困扰过无数嵌入式工程师的问题。

相关新闻