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:清除系统软件中断的标志

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/593278/tms570ls1224-clearing-the-flag-of-a-system-software-interrupt

器件型号:TMS570LS1224

你(们)好

我在使 SSI 中断工作几次时遇到问题。

在 SSI 开始时(读取寄存器后)禁用 GIO 中断、并在 SSI 完成处理后启用 GIO 中断。 问题是  

1)禁用和启用 GIO 中断时、SSI 不会再次工作。

2)如果我不禁用 GIO 中断、SSI 会重复一次、然后什么也不起作用

我不n´t 造成这种情况的原因,但我认为是清除了旗帜  

IM 使用此行清除寄存器:  

uint32 offset = systemREG1->SSIVEC; 

但它似乎无法正常工作。 有什么想法吗?

我无法上传代码、但可以通过私人邮件发送。

感谢你们的帮助!!

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

    读取 SSIVEC 寄存器将为您提供导致中断的 SSI 向量、但不一定清除该标志。 向 SSIF 寄存器中与 SSIVEC 寄存器中的向量读取相对应的相应位写入1即可将中断标志清零。 如果不清除中断标志、则中断将无法在第二次和后续时间触发。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是如何工作的?

    该如何写行?

    谢谢!!

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

    由于此行:

    uint32 offset = systemREG1->SSIVEC;

    将分配启动中断的特定 SSWI 的偏移值、以清除标志、然后将相同的值写入 SSIF 寄存器。

    即、顺序为:

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

    哦,还可以

    我认为、正如 TRM 所说的、只需读取寄存器即可清除标志、只需读取标志即可。 明天早上我将测试它并告诉你=)

    谢谢!!

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

    你(们)好、Chuck

    我用这两行测试了代码、一切都很好。 尽管如此... 完成中断后、它会在主程序开始时返回、就像在完成系统软件中断后重新指令 MCU 一样...

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

    我认为这不是预期的行为? 能否在 SSWI ISR 中设置断点并在返回前检查 LR 寄存器中的值? 它应该是中断启动后的返回点。

    您能否检查 SYSESR 寄存器以查看是否发生了复位? 为了确保这一点、您应该在启动时读取并清除该寄存器、以便以后发生的事件(例如这种事件)可以看到后续复位的来源。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在中断上有一个断点。 标志在第一行被清除。 SSIVEC 寄存器上的值:
    SYS_SIVec
    00000801
    SYS_SSIF
    0000000100000008

    输入 IR 时。 然后、
    SYS_SIVec
    00000800
    SYS_SSIF
    0000000000000008

    关于重置:
    初始值:
    SYS_SysEsr
    00002008
    在中断发生前:
    SYS_SysEsr
    00000008
    在中断期间和结束时:
    SYS_SysEsr
    00000008


    逐行运行,到达}后,代码跳转到
    rtiREG1->GCTRL |=((UINT32) 1U <<(计数器和3U);
    它在崩溃之前就已经存在了。
    在该行之后、它到达 RTI.c 的}、然后从我跳到另外两个代码、不执行任何操作、然后它到达
    resetEntry
    b _c_int00
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Miguel、

    这听起来像是堆栈或堆栈指针损坏。 您是否可以尝试观察 CPU 寄存器和堆栈中的值、以查看是否可以将其跟踪到发生错误的位置?

    此外、在读取和清除操作期间、您能否仔细检查 SSIVEC 和 SSIF 寄存器中的值、以确保根据您使用的 SSI 设置的位是预期的值?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我很乐意这样做、但是... 我不知道如何做这个部分...
    我该怎么做?

    我已经对 SSIVEC 和 SSIF 值进行了三重检查。 这里的一切都是正确的...

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

    你(们)好、Chuck

    希望你们做的很好

    我想知道您能否向我解释如何查看堆栈的值以检查正在发生的情况、或者如果我上传代码是否更容易...

    谢谢!

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

    如果您可以上传一个演示该问题的简单项目、我可以查看该项目。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../4520.Protesis_5F00_de_5F00_mano_5F00_nov_5F00_2016.zipHi

    我将上传代码。 我省去了重要信息、但代码起作用、并且存在我所解释的问题。

    使用 MCU 的 DSP 库进行即时消息传递。 谢谢!!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好、Chuck
    希望你们做的很好。
    我尝试了2件事:
    1)删除 SS 中断中的所有代码(不起作用,问题仍然存在)
    2)将中断线(systemREG1->SSISR1 =(0x7500 |(0xFF 和 data1));)置于 GIOB 中断之外的 main 中。
    这里发生了怪异的事情。 中断发生了、但在 SSI 之后、MCU 没有得到复位、但没有再次输入中断、就像所有中断都被禁用了一样...

    我缺少什么?

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

    我今天看的是您的代码,我注意到您没有将 SystemInterrupt()函数声明为中断服务例程。 您能否在函数之前添加语句"#pragma weak (SystemInterrupt)、然后查看它是否正确返回(请注意、我正在查看您在5月15日发布的代码。 再说一次、很抱歉耽误你的时间。 我们在发布帖子时尝试处理这些帖子、但在某些情况下、我们必须将需要基准测试的更涉及的问题移至一个问题、以便在我们有时间解决这些问题时进行处理。

    此外、很清楚、项目的包含路径不允许我完全构建项目、因此由于所提供项目的复杂性、我仍然没有机会构建和测试项目。 由于未定义对具有特定 PC 路径的文件的引用、仍有一个文件未链接、尽管我已更新项目的所有包含路径、但我无法找到此路径的来源。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Chuck Davenport">我今天看了您的代码,我注意到您没有将 SystemInterrupt()函数声明为中断服务例程。 您能否在函数之前添加语句"#pragma weak (SystemInterrupt)、然后查看它是否正确返回(请注意、我正在查看您在5月15日发布的代码。 再说一次、很抱歉耽误你的时间。 我们在发布帖子时尝试处理这些帖子、但在某些情况下、我们必须将需要基准测试的更多相关问题移至一个问题、因为我们有时间解决这些问题。[/引述]

    代码完全相同。 区别在于、我删除了有关 DSP 库的所有代码、以便更易于编译。 但其余的是相同的。  

    关于 pragma ... 我将在今天晚些时候对其进行测试并告诉您。  

    不用担心延迟。 我知道这并不容易。  

    关于代码的编译、上传到另一个上的代码完全相同、但没有 DSP 库的使用。 它应该能够毫无问题地进行编译。  

    我今天对它进行测试、并告诉您发生了什么。 也许这可能是个问题...

    谢谢!!!  

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

    好的、我刚刚添加 了#pragma weak (SystemInterrupt)、但它不起作用。 最重要的是、系统直接以中止方式启动:

    一次(不知道为什么)它达到此点。  

    为什么会发生这种情况?

    编辑了****

    此外、一旦我单击"run"、代码将正常启动。 然后、当脱离 SSI 时、它到达 RTIStartCounter:

    然后转至:

    最后是:

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好、Chuck
    我以为我们要使用另一篇帖子、但这是可以的

    我尝试了一些修改。 我将 SSI 中断移到了通知文件中、但问题仍然存在... 也是如此
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    米格尔

    您能否在 CMSIS 库完全删除的情况下提供代码的另一个版本。 正如我提到过的、当我尝试编译时、它仍在搜索特定于您安装的路径中的 CMSIS 相关内容。 这甚至是在我将包含路径更新到 PC 上的默认位置之后。 我不确定工程设置或代码中的某个位置是否有硬编码路径。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好、Chuck

    这是代码。 请注意以下路径:

    e2e.ti.com/.../2084.Protesis_5F00_de_5F00_mano_5F00_nov_5F00_2016.zip

    它应该能够顺利编译

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好、Chuck
    我希望你们做的很好
    我想知道您是否可以构建项目、或者是否遇到问题。 我一直在尝试解决这个问题、但是... 我没有成功...

    此致
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好、Chuck
    但愿你一切都很好
    我想知道您是否有任何更新... 我可以将截止日期改为7月6日、但我无法做任何事情、因为整个代码都依赖于此代码才能正常工作...
    谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Miguel、

    我对拖延这一点确实表示歉意。 过去几周、由于商务旅行和度假、我外出了很多次。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不用担心。
    导致中断未正确生成的原因是什么? 因为、如果你已经运行了代码、一旦中断结束、它会在转至 RTI 启动计数器后进入中止状态。 我不知道发生了什么... 我甚至尝试移除 RTI、但也出现了同样的问题(它在脱离 SSI 之后会中止)
    此致
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    问题已解决。 只需使用以下 pragma:  

    #pragma CODE_STATE (系统中断、32)
    
    #pragma INTERRUPT (系统中断、IRQ)
    
    #pragma WEAK (系统中断)
    
    void 系统中断(void)
    
    {
    
    uint32 offset = systemREG1->SSIVEC;
    
    systemREG1->SSIF = offset;
    
    } 

    显然、这为中断提供了一个干净的返回路径。 更多信息、请访问 :e2e.ti.com/.../413343

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

    太棒了!! 很高兴您能够解决这个问题。 我真的很抱歉无法为您解决此问题。 的确,任何借口都是不可接受的。 希望您现在可以满足您的最后期限、如果问题再次出现、您可以为我们提供另一个帮助机会。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好、Chuck
    没关系。 我有疑问... 您的 N2HET 表现如何??? 我需要解决一些问题(在不同的帖子中)
    谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Miguel、

    N2HET 不适合我。 我可以帮助回答一些简单的问题、但更复杂的问题、我必须服从其他专家。 继续并发表您的问题、我们会将这些问题发送给合适的人员以提供帮助。