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.

[参考译文] 编译器/TMS320F28235:参数值丢失、如何查找其更改位置#39;s 的代码

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/853523/compiler-tms320f28235-parameter-value-lost-how-to-find-the-code-where-it-s-changed

器件型号:TMS320F28235

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

您好!

客户的代码面临一个问题。 全局参数 abc 的值已更改、但我们不知道更改的位置。  

逻辑如下所示:

MAIN ()

  if (condition==true)

    ABC &=~def;

ISR()

  ABC |= 0x10;

  hig = 100;

在大约1000次测试期间,我们发现 执行 ISR()后 abc 的值丢失(仍然为"0")(参数 hig 等于100)。 另外999次,在 ISR()之后,abc 的位4为1。 这意味着、在大多数情况下、逻辑工作正常。 但在极少数情况下、abc 会失去其值。  

我们正在努力解决个别测试案例、以找出根本原因、尽管很难重现。  

在这里、我们有疑问:如果 abc &=~def;正在执行(当前 abc=0)、在结束之前、如果一个中断出现(abc|=0x10内部)、从 ISR 恢复后将发生什么、 abc &=~def 完成执行。 abc 是否仍为0或0x10?

ABC &=~def、在 ASM 中、有5行代码(只是一个示例)。 在第4行代码期间、可能会产生中断。 我们想知道在 ISR 和第5行代码之后会发生什么情况。  

希望我明白了。

非常感谢。

BR、Jordan

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

    约旦

    我认为您的发展方向是正确的。 问题可能是因为 abc &=~def 未被编码为原子:也就是说、如果在将"abc"加载到寄存器后发生中断、上下文保存将保护该中断并在 ISR 之后恢复旧值。 在这种情况下、您将失去逐位或 ISR 内部的影响、但只有当中断恰好发生在正确的线路上时、才会发生这种情况、这就是中断如此罕见的原因。

    为了测试这一点、并作为可能的解决方法、您可以禁用该线路的中断:
    Dint;
    abs &=~def;
    EINT;

    或者、如果您在汇编语言中实现该行、请使用原子"读取-修改-写入"和运算:

    和 loc16、Ax

    但愿这对您有所帮助。

    此致、

    Richard

    e2e.ti.com/.../C28xm01-slide-6.pdf

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

    关于中断更改的变量、您需要处理两个细节。

    一个... 每个由中断更改的全局变量都必须使用 volatile 关键字进行标记。

    两个... 以保证...等操作

    [引用用户="Jordan Zhou "] abc &=~def;

    (笑声) 以原子方式执行(这意味着无法中断操作)使用编译器为此提供的内在函数。  在本例中,您编写的内容类似于...

    __and(&abc,~deF); 

    要了解_AND 以及类似的其他内在函数、请在 C28x 编译器手册中搜索 标题 为"使用内在函数访问汇编语言语句"的子章节。

    谢谢、此致、

    乔治

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

    感谢您的评论。

    另一个疑问是、我们是否有任何工具可以查看参数 abc 的 RAM 地址是否由其他参数误操作?

    在这种情况下、也可以更改该值。  

    BR、Jordan

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

    约旦

    您可以通过在目标数据存储器地址上设置观察点来在 C28x 上执行此操作。  我不知道您使用的是哪个 CCS 版本、但在 v9调试视图中、您将执行以下操作:

     -双击代码中的变量名称以将其突出显示

     右键单击并选择 Breakpoint -> Hardware Watchpoint

    您现在已经在数据存储器地址上设置了一个观察点。  运行代码、每次访问该变量时代码都应停止。  要查看和更改观察点:

     - 从 CCS 菜单中:View -> Breakpoints

     -右键单击观察点并选择 Breapoint 属性

    您将看到符号地址和其他设置。

    此致、

    Richard

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

    Richard、

    感谢您的评论。  

    在测试期间、仿真器未连接。 让我思考一下如何通过数据通信来实现。

    BR、Jordan

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

    谢谢 Richard。

    BR、Jordan