LPC1850:为什么程序执行会在systick中断后跳转到0xFFFFFFFE?

时间:2013-01-07 15:08:21

标签: gcc interrupt lpc

我为LPC1857制作了一个工作程序,它启用了中断,每个systick中断然后调用一些函数。它与LPC1857完美配合。当我尝试在LPC1850上运行相同的程序时,程序执行跳转到0xFFFFFFFE并在中断发生时停止。 SystickHandler中调用的函数永远不会被调用。看起来程序的处理程序的地址错误,但我不明白这是怎么回事。当发生这种情况时,LR指向0xFFFFFFF9。这两个地址都是保留的。

我更改了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
}

你知道我错过了什么吗?如果您需要任何其他信息,请告诉我们。 在此先感谢!!

2 个答案:

答案 0 :(得分:0)

FLASH中没有任何部分!对于1850年,您使用地址0x1C000000在外部闪存中下载程序。

答案 1 :(得分:0)

虽然这个问题很古老,但最近我遇到了这种问题,所以这里有一些答案:一般来说,当所有中断导致pc进入0xfffffffe时,它表明向量表有一些可怕的错误。如果您正在使用某些HW调试器并且处于这种情况,则应检查SCB中的VTOR寄存器[1]的内容。它应该指向有效的向量表(例如从GCC骑行启动程序集生成的.isr_vector部分)。

LPCxxxx芯片对我来说很陌生,所以我不能提供任何有用的细节,但是例如如果LPC1850和LPC1857在内存地址上有差异并且你在某处设置了VTOR,你可能需要以不同的方式设置它。您首先能够启动(调用重置处理程序)LPC1850的事实表明您具有启动设备的有效向量表。

[1] 0xe000ed08 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/Ciheijba.html