This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS570LS1224:启用中断后、引导加载程序应用程序跳转会导致 undefEntry

Guru**** 2479725 points
Other Parts Discussed in Thread: TMS570LS1224, HALCOGEN

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/688822/tms570ls1224-bootloader-application-jump-leads-to-undefentry-after-interrups-are-enabled

器件型号:TMS570LS1224
主题中讨论的其他器件: HALCOGEN

大家好、

在 TMS570LS1224上向现有工程添加引导加载程序时遇到问题。 在添加引导加载程序之前、该应用程序在2年中一直运行无任何问题。

现在,我在从引导程序启动应用程序时遇到问题。 在我跳转到应用程序后、我最终会进入 undefEntry、在我的案例中、这是一个无限循环。

对于引导加载程序和应用程序、我使用相同的 Halcogen 配置、但使用不同的原因链接器脚本。 在跳转到应用程序之前、我会取消初始化所有使用的模块、并使用_disable_interrupts_disable 所有中断。 对于引导加载 程序、F021 API 配置为从 RAM 运行、并且在调用引导加载程序 BL_C_MAIN ()之前、我在引导加载程序复位处理程序(_BL_c_init_00)中将其从闪存复制到 RAM 中。 之后、我能够写入闪存和 EEPROM。  对于应用、F021 API 会保留在闪存中、因为我只从闪存中写入 EEPROM。

为了分析我的问题、我通过 JTAG 刷写了引导加载程序和应用程序。 当我现在调试引导加载程序并跳转到应用程序时,我到达应用程序重置处理程序_c_init_00(),最后到达应用程序 main()。 现在、所有内容似乎都能正常工作、直到我通过调用_enable_interrupts_再次启用中断。 立即或在执行几个后续步骤后、我最终会进入引导加载程序 undefEntry。 链接寄存器始终指向引导加载程序 F021 API 所在的 RAM。

我想我在 VIM 中有一些错误配置的中断处理程序。 现在、我的问题是如何确定导致问题的中断。

此致

Jens

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Jens:

    请使用以下示例更改您的中断矢量:
    (0x100F8是应用程序起始地址减0x08)

    b _c_int00 ;0x00
    b #0x100F8 ;0x04;0x100F8=$10100-0x8;其中0x10100是应用程序的起始地址
    b #0x100F8 ;0x08、软件中断
    b #0x100F8 ;0x0C,中止(预取)
    b #0x100F8 ;0x10、中止(数据)
    保留尝试
    b 保留尝试 ;0x14
    LDR PC、[PC、#-0x1b0] ;0x18
    LDR PC、[PC、#-0x1b0] ;0x1C
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ、

    非常感谢您的回复。 您的示例是引导加载程序还是应用程序的矢量表?

    这是我的引导程序矢量表:

    resetEntry:
           b  _BL_c_int00
    解 defEntry:
           b  未定义尝试
    svcEntry:
           b  svcEntry
    PrefetchEntry:
           B  prefetchEntry
           b  _dabort
           b  相位中断
           LDR PC、[PC、#-0x1b0]
           LDR PC、[PC、#-0x1b0]

    这是我的应用程序的矢量表:

    resetEntry:
           b  _c_int00
    解 defEntry:
           b  未定义尝试
    svcEntry:
           b  svcEntry
    PrefetchEntry:
           B  prefetchEntry
           b  _dabort
           b  相位中断
           LDR PC、[PC、#-0x1b0]
           LDR PC、[PC、#-0x1b0]

    此致

    Jens

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Jens:

    我的示例是引导加载程序的矢量表。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ、

    由于 undefEntry、svcEntry 和 prefetchEntry 是无限循环、我没有针对它们的特殊处理程序它没有问题、即应用程序没有自己的 undefEntry、svcEntry 和 prefetchEntry 矢量。  我的问题不是我的应用程序最终会出现在 undefEnrty 的引导程序矢量表中、而是最终出现在 undefEntry 中。

    如何确定 UNDEF 异常的原因?

    此致

    Jens

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Jens:

    请尝试我的引导加载程序矢量表、看看会发生什么情况。
    其中:0x100F8 =应用程序起始地址- 0x8

    b _c_int00
    b #0x100F8
    b #0x100F8
    b #0x100F8
    b #0x100F8
    保留尝试
    b reservedEntry;0x14
    LDR PC、[PC、#-0x1b0];0x18
    LDR PC、[PC、#-0x1b0];0x1C
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 QJ、

    我在本周结束前不在办公室。 我一回到办公室就会检查它。

    此致
    Jens
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ、

    我尝试了您的矢量表、但这样我总是会在 sys_startup.c 中的这部分代码的 for 循环中结束、并且错误 LED 会亮起:

    /*检查加电期间是否存在 ESM 组3错误。
    *这些可能发生在电子保险丝自动加载期间或从闪存 OTP 读取期间
    *在加电期间。 器件运行不可靠、不建议这样做
    *。
    * ESM 组3错误仅将 nERROR 引脚驱动为低电平。 外部电路
    *监控 nERROR 引脚的器件必须采取适当的措施来确保这一点
    *系统被置于安全状态,由应用程序确定。
    *
    if ((esmREG->SR1[2])!= 0U)
    {
    //*用户代码开始(24)*/
    //*用户代码结束*/
    /*SAFETYMCUSW 5 C MR:NA "for (;;)可通过在上述和下方的用户代码中添加"#if 0"和"#endif"来删除。"*/
    /*SAFETYMCUSW 26 S MR:NA "for (;;)可通过在上述和下方的用户代码中添加"#if 0"和"#endif"来删除。"*/
    /*SAFETYMCUSW 28 D MR:NA "for (;;)可通过在上述和下方的用户代码中添加"#if 0"和"#endif"来删除。"*/
    for (;;)
    {
    }/*等待*/
    /*用户代码开始(25)*/*
    用户代码结束*/
    } 

    此致

    Jens

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ、

    在尝试找到 undefEntry IRQ 的原因时、我在单步执行模式下使用调试器单步执行代码。 使用我的矢量表版本、我能够多次运行我的应用程序、但大多数时候我最终在 undefEntry 中运行。 因此、我认为我的设置在原则上似乎是正确的、但必须有一个引起 undefEntry IRQ 的竞争条件。

    有什么想法如何缩小问题的原因?

    此致

    Jens

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Jens、

    Cortex-R4 TRM 详细介绍了如何处理"未定义指令"异常。 当然、您可以识别导致异常的指令、然后选择再次执行或在导致异常的指令之后返回到该指令。

    请参阅 :developer.arm.com/.../undefined-instruction

    此致、
    Sunil
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jens:

    由于应用程序未位于闪存的开头、因此您需要修改 cmd 文件以将应用程序起始地址用于 vector 和 flash0。

    /*------------------ *

    /*链接器设置                               *

    --retain="*(.intvecs)"

    堆0x800

    /*------------------ *

    /*内存映射                                 *

    存储器{

      引导程序(X) :origin=0x00010000 length=0x00000020

      FLASH0 (RX):origin=0x00010020 length=0x0007FFE0

      堆栈 (RW):origin=0x08000000 length=0x00001300

      RAM  (RW):origin=0x08001300 length=0x0003ED00

    /*------------------ *

    /*段配置                            *

    剖面{

      .intvecs:{}>向量

      .text  :{}> FLASH0

      .const :{}>FLASH0

      .cinit :{}> FLASH0

      .pinit :{}> FLASH0

      .bss  :{}> RAM

      .data  :{}> RAM

    .sysmem :{}>RAM

    /*--------------------

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ、

    原因、引导加载程序和应用程序有不同的链接器脚本。

    引导加载程序:

    /*------------------ //
    /* sys_link.ld */
    * */
    /*(c) Texas Instruments 2009-2013、保留所有权利。 */
    * */
    //*--------------------------------------------------------------------------------------------------------- //
    
    //*入口点*/
    entry (_bl_c_int00)
    
    //堆栈的最高地址*/
    _estack = 0x8030000;// 192K RAM 的末尾*//
    
    //*如果堆和堆栈不适合 RAM,则生成链接错误*/
    _min_Heap_size = 0x400; /*所需的堆数量*/
    
    /*指定内存区域*/
    内存
    {
    vectors(Rx) :origin = 0x00000000,length = 32 // Bank0 / Sektor 0 */
    F021_API (Rx):origin = 0x00000020,length = 5088 // Bank0 / Sektor 0 */
    BL_FLASH (Rx):origin = 0x00001400,length = 123K // Bank0 / Sektor 0。 6 */
    闪存(Rx) :origin = 0x00020000、length = 0x0011FFFF /* Bank 0 / Sektor 7。 15 */
    CPU_STACK (RW):origin = 0x08000000,length = 0x00001500 //堆栈在 sys_core.asm 中配置*/
    RAM (xrw) :origin = 0x08001500,length = 0x0002EB00
    memory_B1 (Rx):origin = 0x60000000,length = 0K
    NVM_FLASH (Rx):origin = 0xF0200000,length = 64K // Bank 7/Sektor 0。 3 */
    }
    
    _app_start = origin (flash);
    _app_end = origin (flash)+ length (flash)- 1;
    _app_size_max =_app_end -_app_start;
    
    //定义输出段*/
    段
    {
    // ISR 矢量首先进入 RAM */
    .intvecs:
    {
    。 =对齐(4);
    Keep (*(.intvecs))/* ISR 矢量*/
    。 = align (4);
    }>引导
    
    程序.magic origin (flash)+ length (vectors):
    {
    。 =对齐(4);
    Keep (*(.magic))
    。 =。 + 4;
    }> FLASH
    _app_magic = ADDR (.magic);
    
    .f021_API:
    {
    Keep (*(.f012_API))
    。 =对齐(4);
    _f021API_START =.;
    *(.f021_API*)
    *NVM.o:*(.*)
    * libF021_API_CortexR4_be_V3D16_NDS.A:*
    。 =对齐(4);
    _f021API_END =.;
    }>RAM at >F021_API
    
    _f021API_LOAD = LOADDR (.f021_API);
    
    
    //程序代码和其他数据进入 RAM */
    .text:
    {
    。 =对齐(4);
    *(.text) /*.text 段(代码)*/
    *(.text*) /*.text*段(代码)*/
    *(.胶 水_7) /*将胶臂粘到拇指代码*/
    *(.胶 水_7T) /*将拇指粘附到 ARM 代码中*/
    *(.eh_frame)
    
    保留(*(.init))
    保留(*(.fini))
    
    。 =对齐(4);
    _etext =.; /*在代码结束时定义全局符号*/
    }>BL_FLASH
    
    /*常量数据进入 RAM */
    .rodata:
    {
    。 =对齐(4);
    *(.rodata) /*.rodata 段(常量、字符串等) *
    *(.rodata*) /*.rodata*段(常量、字符串等) *
    。 = align (4);
    }>BL_FLASH
    
    .arm.extab:{*(.arm.extab*.GNU.linkone.armextab.*)}>RAM
    arm:{
    _exidx_start =.;
    *(.arm.exidx*)
    _exidx_end =.;
    } >bl_flash
    
    .preinit_array
    :{
    Provide_hidden (__preinit_array_start =.);
    保留(*(.preinit_array*))
    Provid_hidden (__preinit_array_end =.);
    }>BL_FLASH
    .init_array:
    {
    Provide_hidden (__init_array_start =.);
    保留(*(sort (.init_array。*)))
    保留(*(.init_array*))
    Provid_hidden (__init_array_end =.);
    }>BL_FLASH
    .fini_array:
    {
    Provide_hidden (__fini_array_start =.);
    保留(*(sort (.fini_array。*)))
    保留(*(.fini_array*))
    Provide_hidden (__fini_array_end =.);
    }>
    
    启动时用于初始化数据的 BL_FLASH //
    _simata = LOADDR (.data);
    
    /*已初始化的数据段进入 RAM,在代码*/
    .data:
    {后加载 LMA 副本
    。 =对齐(4);
    _sdata =.; /*在数据开始时创建全局符号*/
    *(.data) /*.data 段*/
    *(.data*) /*.data*段*/
    
    。 =对齐(4);
    _edata =.; /*在数据末尾定义全局符号*/
    }>RAM at>BL_FLASH
    
    /*未初始化的数据段*/
    。 = align (4);
    .bss:
    {
    /*启动时使用此选项来初始化.bss secion */
    _sbss =.; /*在 BSS 开始时定义全局符号*/
    _bss_start_=_sbss;
    *(.bss)
    *(.bss*)
    *(通用)
    
    。 =对齐(4);
    _ebss =.; /*在 BSS 末尾定义全局符号*/
    __bss_end__=_ebss;
    }>RAM
    
    提供(end =_ebss);
    提供(_end =_ebss);
    
    // memory_Bank1段,代码必须明确地位于此处 //
    *示例:extern int foo (void)__attribute__((section (".mb1text")));*/
    .memory_B1_text:
    {
    *(.mb1text) /*.mb1text 段(代码)*/
    *(.mb1text*) /*.mb1text*段(代码)*/
    *(.mb1rodata) /*只读数据(常量)*/
    *(.mb1rodata*)
    }> memory_B1
    
    /*从标准库中删除信息*/
    /discard /:
    {
    libc.a (*)
    libm.a (*)
    libgcc.a (*)
    }
    
    arm.attributes 0:{*(.arm.attributes)}
    
    

    应用:

    /*------------------ //
    /* sys_link.ld */
    * */
    /*(c) Texas Instruments 2009-2013、保留所有权利。 */
    * */
    //*--------------------------------------------------------------------------------------------------------- //
    
    //*入口点*/
    entry (_bl_c_int00)
    
    //堆栈的最高地址*/
    _estack = 0x8030000;// 192K RAM 的末尾*//
    
    //*如果堆和堆栈不适合 RAM,则生成链接错误*/
    _min_Heap_size = 0x400; /*所需的堆数量*/
    
    /*指定内存区域*/
    内存
    {
    vectors(Rx) :origin = 0x00000000,length = 32 // Bank0 / Sektor 0 */
    F021_API (Rx):origin = 0x00000020,length = 5088 // Bank0 / Sektor 0 */
    BL_FLASH (Rx):origin = 0x00001400,length = 123K // Bank0 / Sektor 0。 6 */
    闪存(Rx) :origin = 0x00020000、length = 0x0011FFFF /* Bank 0 / Sektor 7。 15 */
    CPU_STACK (RW):origin = 0x08000000,length = 0x00001500 //堆栈在 sys_core.asm 中配置*/
    RAM (xrw) :origin = 0x08001500,length = 0x0002EB00
    memory_B1 (Rx):origin = 0x60000000,length = 0K
    NVM_FLASH (Rx):origin = 0xF0200000,length = 64K // Bank 7/Sektor 0。 3 */
    }
    
    _app_start = origin (flash);
    _app_end = origin (flash)+ length (flash)- 1;
    _app_size_max =_app_end -_app_start;
    
    //定义输出段*/
    段
    {
    // ISR 矢量首先进入 RAM */
    .intvecs:
    {
    。 =对齐(4);
    Keep (*(.intvecs))/* ISR 矢量*/
    。 = align(4);
    }>闪
    
    存.magic:
    {
    。 =对齐(4);
    Keep (*(.magic)
    )}> FLASH
    _app_magic = ADDR (.magic);
    
    //程序代码和其他数据进入 RAM */
    .text:
    {
    。 =对齐(4);
    *(.text) /*.text 段(代码)*/
    *(.text*) /*.text*段(代码)*/
    *(.胶 水_7) /*将胶臂粘到拇指代码*/
    *(.胶 水_7T) /*将拇指粘附到 ARM 代码中*/
    *(.eh_frame)
    
    保留(*(.init))
    保留(*(.fini))
    
    。 =对齐(4);
    _etext =.; /*在代码结束时定义全局符号*/
    }>闪存
    
    
    /*常量数据进入 RAM */
    .rodata :{
    
    。 =对齐(4);
    *(.rodata) /*.rodata 段(常量、字符串等) *
    *(.rodata*) /*.rodata*段(常量、字符串等) *
    。 = align (4);
    }> FLASH
    
    .arm.extab:{*(.arm.extab*.GNU.linkone.armextab.*)}> RAM
    arm:{
    _exidx_start =.;
    *(.arm.exidx*)
    _exidx_end =.;
    } >闪
    
    存.preinit_array
    :{
    Provide_hidden (__preinit_array_start =.);
    保留(*(.preinit_array*))
    Provid_hidden (__preinit_array_end =.);
    }> FLASH
    .init_array:
    {
    Provide_hidden (__init_array_start =.);
    保留(*(sort (.init_array。*)))
    保留(*(.init_array*))
    Provid_hidden (__init_array_end=.);
    }> FLASH
    .fini_array:
    {
    Provide_hidden (__fini_array_start =.);
    保留(*(sort (.fini_array。*)))
    保留(*(.fini_array*))
    Provide_hidden (__fini_array_end =.);
    }>闪存
    
    /*由启动程序用来初始化数据*/
    _simata = LOADDR (.data);
    
    /*已初始化的数据段进入 RAM,在代码*/
    .data:
    {后加载 LMA 副本
    。 =对齐(4);
    _sdata =.; /*在数据开始时创建全局符号*/
    *(.data) /*.data 段*/
    *(.data*) /*.data*段*/
    
    。 =对齐(4);
    _edata =.; /*在数据末尾定义全局符号*/
    }> RAM 在>闪存
    
    /*未初始化的数据段*/
    。 = align (4);
    .bss:
    {
    /*启动时使用此选项来初始化.bss secion */
    _sbss =.; /*在 BSS 开始时定义全局符号*/
    _bss_start_=_sbss;
    *(.bss)
    *(.bss*)
    *(通用)
    
    。 =对齐(4);
    _ebss =.; /*在 BSS 末尾定义全局符号*/
    __bss_end__=_ebss;
    }>RAM
    
    提供(end =_ebss);
    提供(_end =_ebss);
    
    // memory_Bank1段,代码必须明确地位于此处 //
    *示例:extern int foo (void)__attribute__((section (".mb1text")));*/
    .memory_B1_text:
    {
    *(.mb1text) /*.mb1text 段(代码)*/
    *(.mb1text*) /*.mb1text*段(代码)*/
    *(.mb1rodata) /*只读数据(常量)*/
    *(.mb1rodata*)
    }> memory_B1
    
    /*从标准库中删除信息*/
    /discard /:
    {
    libc.a (*)
    libm.a (*)
    libgcc.a (*)
    }
    
    arm.attributes 0:{*(.arm.attributes)}
    
    

    从引导加载程序跳转至应用程序有效、我可以使用调试器从引导程序单步转到应用程序。 如果我在 应用程序 main()的开头直接放置一个无限循环"while (true);",则应用程序将继续运行。 仅当我运行与引导加载程序处理 halcogen 配置非常类似的完整应用程序时、我才会在 undefEntry 中结束;如果我使用初始链接器脚本、应用程序本身运行并运行时不会出现任何问题:

    /*------------------ //
    /* sys_link.ld */
    * */
    /*(c) Texas Instruments 2009-2013、保留所有权利。 */
    * */
    //*--------------------------------------------------------------------------------------------------------- //
    //*入口点*/
    entry (_c_int00)
    
    //堆栈的最高地址*/
    _estack = 0x8040000;// 256K RAM 的末尾*/
    
    //*如果堆和堆栈不适合 RAM,则生成链接错误*/
    _min_Heap_size = 0x400; /*所需的堆数量*/
    
    /*指定内存区域*/
    内存
    {
    vectors(Rx) :origin = 0x00000000,length = 0x00000020
    闪存(Rx) :origin = 0x00000020,length = 0x0013FFE0
    CPU_STACK (RW):origin = 0x08000000,length = 0x00001500 // Stack 在 sys_core.asm 中配置*/
    RAM (xrw) :origin = 0x08001500,length = 0x0002eb00
    memory_B1 (Rx):origin = 0x60000000,length = 0K
    }
    
    /* define output sections */
    SECTIONS
    {//
    ISR 向量首先进入 RAM */
    .intvecs:
    {
    。 =对齐(4);
    Keep (*(.intvecs))/* ISR 矢量*/
    。 = align(4);
    }>vectors/*
    
    程序代码和其他数据进入 RAM */
    .text:
    {
    。 =对齐(4);
    *(.text) /*.text 段(代码)*/
    *(.text*) /*.text*段(代码)*/
    *(.胶 水_7) /*将胶臂粘到拇指代码*/
    *(.胶 水_7T) /*将拇指粘附到 ARM 代码中*/
    *(.eh_frame)
    
    保留(*(.init))
    保留(*(.fini))
    
    。 =对齐(4);
    _etext =.; /*在代码结束时定义全局符号*/
    }>闪存
    
    /*常量数据进入 RAM */
    .rodata :{
    
    。 =对齐(4);
    *(.rodata) /*.rodata 段(常量、字符串等) *
    *(.rodata*) /*.rodata*段(常量、字符串等) *
    。 = align (4);
    }> FLASH
    
    .arm.extab:{*(.arm.extab*.GNU.linkone.armextab.*)}> RAM
    arm:{
    _exidx_start =.;
    *(.arm.exidx*)
    _exidx_end =.;
    } >闪
    
    存.preinit_array
    :{
    Provide_hidden (__preinit_array_start =.);
    保留(*(.preinit_array*))
    Provid_hidden (__preinit_array_end =.);
    }> FLASH
    .init_array:
    {
    Provide_hidden (__init_array_start =.);
    保留(*(sort (.init_array。*)))
    保留(*(.init_array*))
    Provid_hidden (__init_array_end=.);
    }> FLASH
    .fini_array:
    {
    Provide_hidden (__fini_array_start =.);
    保留(*(sort (.fini_array。*)))
    保留(*(.fini_array*))
    Provide_hidden (__fini_array_end =.);
    }>闪存
    
    /*由启动程序用来初始化数据*/
    _simata = LOADDR (.data);
    
    /*已初始化的数据段进入 RAM,在代码*/
    .data:
    {后加载 LMA 副本
    。 =对齐(4);
    _sdata =.; /*在数据开始时创建全局符号*/
    *(.data) /*.data 段*/
    *(.data*) /*.data*段*/
    
    。 =对齐(4);
    _edata =.; /*在数据末尾定义全局符号*/
    }> RAM 在>闪存
    
    /*未初始化的数据段*/
    。 = align (4);
    .bss:
    {
    /*启动时使用此选项来初始化.bss secion */
    _sbss =.; /*在 BSS 开始时定义全局符号*/
    _bss_start_=_sbss;
    *(.bss)
    *(.bss*)
    *(通用)
    
    。 =对齐(4);
    _ebss =.; /*在 BSS 末尾定义全局符号*/
    __bss_end__=_ebss;
    }>RAM
    
    提供(end =_ebss);
    提供(_end =_ebss);
    
    // memory_Bank1段,代码必须明确地位于此处 //
    *示例:extern int foo (void)__attribute__((section (".mb1text")));*/
    .memory_B1_text:
    {
    *(.mb1text) /*.mb1text 段(代码)*/
    *(.mb1text*) /*.mb1text*段(代码)*/
    *(.mb1rodata) /*只读数据(常量)*/
    *(.mb1rodata*)
    }> memory_B1
    
    /*从标准库中删除信息*/
    /discard /:
    {
    libc.a (*)
    libm.a (*)
    libgcc.a (*)
    }
    
    arm.attributes 0:{*(.arm.attributes)}
    

    因此、到 目前为止、我的配置似乎是正确的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    OJ 您好、Sunil 您好

    在一个周末的调试之后、我终于解决了这个问题。 这不是由引导加载程序或应用程序的设置引起的。

    在调试时、我观察到寄存器 r11指向 IRQ 堆栈区域、而我卡在 undefEntry 内部。 为了防止控制器引发 UNDEF 异常、我在发生 UNDEF 异常的位置放置了一个虚拟函数、并在那里设置了一个断点。 下一次运行后、我可以看到整个调用堆栈一直到这个位置、并找到问题的原因。 它是一个未初始化的回调函数数数组、必须在没有引导加载程序的情况下使用引导加载程序和原始应用程序中的适当值(NULL)意外地初始化。

    因此、很抱歉遇到问题、非常感谢您的帮助。

    此致

    Jens

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Jens:

    很高兴听到这个消息。 请注意、除不精确中止外的每个例外都有明确的方法来识别导致例外的"有罪"指令。 应用程序必须包含处理程序来处理其中的每一个(预取中止、数据中止、未定义指令)、而不是最终会导致看门狗复位的无限循环、除非这是所需的实际响应。

    此致、
    Sunil