Gcc LPC1850:为什么在systick中断后程序执行跳转到0xFFFFFE?
我为LPC1857编写了一个工作程序,它启用中断,然后每个systick中断调用一些函数。它与LPC1857完美配合。当我尝试在LPC1850上运行相同的程序时,程序执行跳转到0xFFFFFE,并在中断发生时停止。在SystickHandler中调用的函数永远不会被调用。看起来程序得到了错误的处理程序地址,但我不明白这是怎么回事。发生这种情况时,LR指向0xFFFFF9。这两个地址都是保留的 我更改了LPC1850的链接器文件(与LPC1857项目的唯一区别在于初始化了一些不相关的端口),看起来如下所示:Gcc LPC1850:为什么在systick中断后程序执行跳转到0xFFFFFE?,gcc,interrupt,lpc,Gcc,Interrupt,Lpc,我为LPC1857编写了一个工作程序,它启用中断,然后每个systick中断调用一些函数。它与LPC1857完美配合。当我尝试在LPC1850上运行相同的程序时,程序执行跳转到0xFFFFFE,并在中断发生时停止。在SystickHandler中调用的函数永远不会被调用。看起来程序得到了错误的处理程序地址,但我不明白这是怎么回事。发生这种情况时,LR指向0xFFFFF9。这两个地址都是保留的 我更改了LPC1850的链接器文件(与LPC1857项目的唯一区别在于初始化了一些不相关的端口),看起来
ENTRY(_start)
INPUT(& &)
MEMORY
{
FLASH (rx) : ORIGIN = 0x1C000000, LENGTH = 16M
SRAM (rwx) : ORIGIN = 0x10000000, LENGTH = 64K
}
SECTIONS
.text :
{
_text = .;
KEEP(*(.isr_vector))
*startup.o(.text)
*(.text*)
*(.glue_7t) *(.glue_7)
*(.rodata*)
_text_end = .;
} > SRAM
.bss :
{
_bss = .;
*(.bss*)
*(COMMON)
_bss_end = .;
. = ALIGN(4);
} > SRAM
.data : AT (ADDR(.text) + SIZEOF(.text))
{
_data = .;
*(vtable)
*(.data*)
_data_end = .;
} > SRAM
. = ALIGN(4);
.ARM.extab : {
*(.ARM.extab*)
} > SRAM
. = ALIGN(4);
__exidx_start = ABSOLUTE(.);
.ARM.exidx : {
*(.ARM.exidx*)
} > SRAM
__exidx_end = ABSOLUTE(.);
.stack :
{
_stack_top = . + SIZEOF(.stack);
} > SRAM
}
你知道我错过了什么吗?如果你需要任何其他信息,请告诉我。
提前谢谢 FLASH中没有分区!?对于1850,您可以在外部闪存中下载程序,地址为0x1C000000 虽然这个问题很古老,但我最近遇到了这种问题,所以这里有一些答案:一般来说,当所有中断都导致pc进入
0xfffffffe
时,这表明向量表有严重错误。如果您正在使用某些硬件调试器,并且处于这种情况,则应检查SCB中VTOR寄存器[1]的内容。它应该指向有效的向量表(例如从GCC骑乘启动程序集生成的节.isr\u vector
)
LPCxxx芯片对我来说是陌生的,所以我不能给出任何有用的细节,但例如,如果LPC1850和LPC1857在内存地址上有差异,并且您在某个地方设置了VTOR,您可能需要将其设置为不同的位置。首先,您能够引导(调用重置处理程序)LPC1850,这表明您拥有引导设备的有效向量表
[1]
0xe000ed08
为什么它不能在SRAM中工作?LPC1857在SRAM上运行良好。谢谢。这并没有解决我的问题,但它是一个有用的建议。