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.

[参考译文] LAUNCHXL-F28379D:调用 DELAY_US 时、即使在初始时执行 memcopy 之后、也会进入非法 ISR

Guru**** 2524460 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/796914/launchxl-f28379d-entering-into-illegal-isr-when-delay_us-is-called-even-after-doing-memcopy-at-the-initial

器件型号:LAUNCHXL-F28379D
主题中讨论的其他器件:C2000WARE

大家好、

我需要有关调试问题的帮助。 我已将 memcopy 添加到设置代码中。 在某些 DELAY_US()时代码仍然失败。 是否有人可以通过查看代码流来指导远程访问、这是一个问题。 代码适用于 CPU1_RAM、但在跳过一些 DELAY_US 函数调用后进入非法 ISR。 无法识别正在发生的情况。  

谢谢、

Akshay Godase  

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

    您尝试运行 C2000ware 的哪个示例?

    使用 CPU1_FLASH 配置时代码是否正常?

    您能否检查此帖子是否有用?
    e2e.ti.com/.../572414

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

    否、我没有运行任何 C2000ware 示例。

    我已经尝试过  

    #ifdef _flash
    memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
    #endif

    也是如此。 它在我的代码中。 您可以查看我的代码吗?

    谢谢、

    Akshay Godase

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

    是否有任何文档可以指导您了解如何在代码进入非法 ISR 时进行调试...?

    如果是、请发送给我、如果不是、请告诉我要执行的调试步骤?

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

    Akshay、

    此函数是一个宏、以 ASM vs C 编码、以提供精确的周期计数(以微秒为单位)。  只需确保您已将此文件包含在位于 C:\ti\c2000\C2000Ware_1_00_06_00\device_support\f2837xd\common\source\f2837xD_usDelay.asm 的 pjt 中

    这需要从 RAM 运行的原因同样与周期计数准确和 RAM 为0WS 相关。

    在调试非法 ISR 方面、您需要执行以下操作:\

    1)进入非法 ISR 并停止后、打开正在调试的内核上的 CPU 寄存器窗口(查看寄存器、然后展开内核寄存器)

    2)找到堆栈指针、SP 寄存器。

    3)堆栈指针的值将是一个16位的立即地址,其中堆栈被保存在内存中

    4)当调用任何 ISR (包括非法)时、会将某些信息保存到堆栈中、此处的相关信息是返回地址。  这将是获取非法指令后的地址。

    5)对 SP 内容进行解码、您可以看到代码尝试执行指令但返回非法(通常为0x0000或0xFFFF)的位置。 就代码的实现方式而言、您可以在栈中或 RPC 寄存器中进一步查看正常函数调用的返回地址

    让我们知道您的发现、我怀疑宏没有放置在它需要的位置、但这应该指向链接器认为它应该位于的位置、我们可以在那里工作。

    最棒的
    Matthew

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

    您好、Matthew、

    此问题现已部分解决。 我有一些代码、例如:

    #pragma CODE_SECTION (GetMax、".xtraCode")

    uint8 GetMax (uint16*数组、uint8长度){

    uint16最大值;

    uint8 i;

    uint8 MaxIndex;

    I=0;

    最大值= 0;

    for (i=0;<Length;i++){)

    if (Array[i]>Max){

    MaxIndex=I;

    Max=Array[i];

    返回 MaxIndex;

    此.bigcode 未在我的链接器命令文件中定义。  我已注释掉该文件、代码开始正常工作、但处于"调试"模式。

    当我尝试使用此选项刷写代码时、

    没有发生任何事情。 我尝试重置 launchpad、我希望 UART 上的数据在我以调试模式工作时可用、但却失败了。 此外、我希望 LED 至少发生变化、这是我的代码调试的一部分。 在调试模式下不起作用。 我想知道一个问题。 可以帮帮我吗?

    谢谢、

    Akshay Godase  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Akshay、
    在 C2000Ware 中的大多数示例项目中、我们有两个构建目标:一个用于 SRAM、另一个用于闪存。

    源代码相同、但更改如下:

    1)在"预定义"符号(在工程属性/高级选项/预定义符号中)中添加了一个_FLASH 符号、以便在 C 源代码中编译任何.if 语句
    2)链接器(.cmd)文件从 RAM 更改为闪存版本,以考虑不同的加载/运行地址。

    我不确定您是使用不同的构建选项还是手动更改源/链接器。 我的意思是、如果您依赖 TI 源文件中的任何自动编译包含、则需要将_flash 符号添加到您的预定义中。

    请告诉我上述情况是否已考虑到这一点。

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

    最后一个问题现已解决。 代码的一部分位于闪存部分。 我删除了所有#pragma、代码开始正常工作!
    感谢您的支持。

    谢谢、
    Akshay Godase