问题: - 如何将应用程序定位到非0x0000.0000地址? 处理器:恩智浦LPC1768 开发系统:Keil ARM 4.73
使用的步骤: 1)下面的分散文件用于将加载区和执行区设置为0x0000.2000 2)将向量表复制到0x2000 3)udpated vtor注册到0x2000
问题:应用程序无法运行。
Scatter file used:
LR_IROM1 0x00002000 0x00000D000
{ ; load region size_region
ER_IROM1 0x00002000 0x0000D000
{ ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x10000000 0x00008000 { ; RW data
.ANY (+RW +ZI)
}
}
这遵循恩智浦应用笔记AN10744中指定的说明,我还缺少其他内容?
答案 0 :(得分:1)
向量表偏移寄存器(VTOR)在复位时指向0x00000000
。
因此,堆栈指针必须位于0x00000000
,程序起始地址(程序计数器)位于0x00000004
。
如果在链接器设置中更改向量表的位置,则需要更新VTOR以指向此新位置。这只能在运行时发生。
这意味着您需要一个小的引导加载程序来执行重映射,这意味着必须为此目的保留第一个扇区。
Bootloader需要:
0x2000
。0x2000
获取堆栈指针地址并更新堆栈指针寄存器。0x2004
获取程序起始地址并更新程序计数器。您可能想要查看CMSIS库,它具有NVIC_SetVTOR
和__set_MSP
等功能,可以让这些寄存器更容易设置。
要设置程序计数器,可以将地址转换为函数指针,然后调用函数:
uint32_t * vtor = (uint32_t *)0x2000;
uint32_t startAddr = vtor[1];
( (void(*)(void))startAddr )(); // Cast and call