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.

[参考译文] 编译器/TM4C123GE6PZ:存在外部中断处理程序时、使用引导加载程序从不同地址运行程序时出现问题。

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/847982/compiler-tm4c123ge6pz-problem-running-a-program-from-a-different-address-with-bootloader-when-external-interrrupt-handlers-are-present

器件型号:TM4C123GE6PZ
主题中讨论的其他器件:TM4C123

工具/软件:TI C/C++编译器

大家好、  

我在使用自定义 TM4C123板上的引导加载程序运行应用程序时遇到问题。  

该应用程序有2个中断处理程序、这些处理程序在 startup.ccs 文件上链接。

当应用程序从 appbase = 0x00000000运行时、没有问题、并且这些中断处理程序被无问题地调用。

但是、当我将 cmd 文件上的 appbase 更改为0x00002800时、即使映射文件显示了未调用的处理程序符号的正确偏移量和地址  

程序将跳转至没有用户应用程序(0x20009002)的地址。

是否有人遇到类似的问题?

谢谢。  

cmd 文件如下所示:


--retain=g_pfnVectors


#define APP_BASE 0x00002800
#define RAM_base 0x20000000

存储器

闪存(RX):origin = app_BASE,length = 0x0003d800
SRAM (rwx):origin = RAM_base,length = 0x00008000

部分

.intvecs:> app_base
.text:> FLASH
.const:> FLASH
.cinit:>闪存
.pinit:> FLASH
init_array:> FLASH

.vtable:> RAM_base
.data :> SRAM
.bss:> SRAM
.sysmem:> SRAM
.stack:> SRAM

__STACK_TOP =__STACK + 512;

符号如下所示:  

全局符号:按符号地址排序

地址名称
---- ----
00000200 _STACK_SIZE
00002800 g_pfnVectors
(笑声)
(笑声)
00003e3f Timer1BIntHandler
00003e53看门狗0IntHandler

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

    你好,金枪鱼

     您是否使用 TivaWare 引导加载程序示例作为参考? 您是否有机会运行任何 TivaWare 引导加载程序示例?  

     既然您在 0x2800定义了 APP_BASE、那么您是否也在 bl_config.h 文件中进行了相同的更改(如果您使用 TivaWare 引导加载程序示例作为参考)?  

    //
    //
    //应用程序的起始地址。 这必须是1024的倍数
    //字节(使其与页边界对齐)。 矢量表的预期值为
    //此位置,以及向量表(位于的栈)的感知有效性
    //在 SRAM 中、位于闪存中的复位矢量)用作的指示
    //应用程序映像的有效性。
    //
    //引导加载程序的闪存映像不得大于此值。
    //
    //取决于:无
    //不包括:无
    //要求:无
    //
    //
    #define APP_START_ADDRESS 0x4000 //示例中的默认值为0x4000,您需要更改为0x2800以匹配 cmd 文件

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

    是的、我使用的是使用2800而非 USB 示例的引导串行示例。

    我可以运行我构建的其他没有任何自定义中断处理程序的项目。  

    只有当我有外部中断处理程序时、我才会遇到问题。

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

    我怀疑您没有使 NVIC (嵌套矢量中断控制器)指向正确的矢量表。 默认情况下、矢量表基地址为地址0x0。 您可以在 Code Composer 的 NVIC 寄存器中看到基地址。

    矢量表可以位于闪存或 RAM 中。 您的链接命令文件已针对这两个文件进行设置、因此我不确定您要使用哪一个。 我将对这两者进行解释。

    默认情况下、矢量表位于闪存中的地址0处。 如果要在闪存中使用矢量表、而该矢量表不在地址零、则必须将新矢量表的地址写入 NVIC_vtable 寄存器。 没有 TivaWare 函数可执行此操作、因此可以通过直接寄存器写入来完成:

    //
    //将 NVIC 指向新的闪存矢量表。
    //
    HWREG (NVIC_vtable)= 0x2800;
    

    调用 TivaWare 函数 IntRegister()时、可将矢量表移动到 RAM。 此函数将 NVIC_vtable 寄存器指向的向量复制到 RAM 部分".VTable"中(除非它已经指向该向量)、然后替换您正在注册的向量。  

    如果将这两种方法混合到与引导加载程序一起运行的应用程序代码中,则必须在调用 IntRegister()之前使用 NVIC_vtable 的 HWREG 写入。 这样,IntRegister()函数会将应用程序的矢量表从闪存复制到 RAM,而不是复制引导加载程序矢量表。

    有关闪存矢量表与 RAM 之间差异的更多信息、请参阅 TivaWare 临时驱动程序库用户指南的第17.1节。 (C:\ti\TivaWare_C_Series-2.1.4.178\docs\SW-TM4C-DRL-UF-2.1.4.178.pdf)

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

    Bob、

    员工和本报记者(一致)对您撰写的内容的细心、详细和完整表示赞赏。   很棒——“如果只有”一个(足够的标签)可以 “附加!”

    标签:论坛"变更"会对主要论坛贡献者产生负面影响!   意外后果(再次)规则。   海报的标签-在打开帖子时出现(仅限)-"太一般、无法证明使用!"   “掩盖巨大的努力”是否有任何理由?   (这只是发生了什么-不是吗?)    在论坛降级之前(可怕)删除'**像!**(正如我们预测的那样)...

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

    Bob、您好!

    感谢您的详细回答。

    我正在使用闪存 NVIC 表、我的应用链接到2800上的表。  

    我也尝试将 NVIC 表设置为2800、但中断仍然没有触发。

    现在、我要在 CCS 上隔离(不带引导加载程序)测试应用程序、这是否也会导致问题、或者串行引导加载程序没有配置来更改 NVIC 表的偏移?

    此致、

    金枪鱼比希姆  

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

    即使没有 NVIC 表、该程序也会立即运行。  

    我认为在没有引导加载程序的调试模式下进行测试时、遇到中断时、该示例将发生故障。

    我还在调试时测试了 NVIC 表的更改、除非发生复位、否则所有内容都运行、然后由于表返回0x0000、发生同样的行为是有意义的。  

    我还尝试使用 IntRegister、但出于某种原因、它对我不起作用。 可能我做了一些错误。  

    再次感谢所有回答。  

    此致、

    金枪鱼比希姆