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.

[参考译文] TMS320F280049C:如果从 RAM 运行、简单代码的不同行为

Guru**** 2680875 points

Other Parts Discussed in Thread: TMS320F280049C

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1568245/tms320f280049c-different-behavior-of-simple-code-if-run-from-ram

器件型号: TMS320F280049C
主题中讨论的其他器件: CODECOMPOSER

工具/软件:

在 TMS320F280049C 上、我们的工程中有两个不同函数中的这段代码。 一个置于 GSRAM 中(让我们将其称为 funcRAM)、另一个置于闪存中 (funcFLASH)。  funcFlash 正确执行(PTR->x 已更新)、但另一个不执行。 以下是片段:

 

if (rxCAN.msg <= 8u){

   ptr->x= rxcan.msg;

}其他{

   PTR->x= 8u;

}

 flag = true;

 

要添加更多详细信息:

 

代码使用 CPU 执行、而不是使用 CLA。

 

其中一个函数在接收到消息 A 时执行、另一个函数在接收到消息 B 时执行。 标志将触发一个答案、因此我们知道每一个都是在正确的时间执行的、并且代码通过了 ptr->x 被更新的行。 我想说的是、其余代码不应该是问题所在、这里已进行了本地化。

 

此外、ptr 指向位于 GSRAM(结构 0xd180 的地址)中的结构、但指针本身位于闪存(地址 0x912be)中。 funcRAM 从地址 0x12000 运行。 此函数还使用本身在 RAM(地址 0xc004)中的另一个指针访问 0xd180 结构的特定部分。 该其他不使用闪存指针的代码同时在 funcRAM 和 funcFLASH 上运行。

 

我们不再需要从 RAM 执行 funcRAM、因此我们有一种权变措施。 另一方面、我们需要了解为什么会发生这种情况、以发现任何可能由同一根本原因引起的错误。 过去、我们观察到某些代码上的行为也不同、具体取决于它是放在 LSRAM 还是 GSRAM 上(使用 CPU 执行、而不是 CLA)。 我不把细节放在首位;如果需要、我必须将其挖掘出来。 我想知道这种行为是相关的还是不同的。

顺便说一下、代码是使用 Simulink 生成的、不过我认为该代码与此相关。

这取自我们的 Makefile:


C:/ti/ccs1210/ccs/tools/compiler/ti-cgt-c2000_22.6.0.LTS/bin/cl2000 --define=model=FW_EPC_50A_NI --define=NUMST=2 --define=NCSTATES=0 --define=HAVESTDIO --define=model_has_drive_sfCNS=0 --define=classical_interface=0 ---define=ALLOCATIONS=0   preproc_dependency=@:%.obj=%.dep)-preproc_with_compile --large_memory_model -silicon_version=28 -define=large_model -i -i/include -i -for_speed=5 /ti/ccs1210/ccs/tools/compiler/ti-cgt-c2000_22.6.0.LTS/lib /ti/ccs1210/ccs/tools/compiler/ti-cgt-c2000_22.6.0.LTS/include warn_sections --heap_size=1024 --reread_libs --rom_model --priority -mfw_project.map -o “FW_project.out"$“$(ordered_OBJS)

提前感谢您。

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

    在这种情况下、闪存和 RAM 之间的最大区别是闪存处于等待状态((100MHz CPU 下为 4 个周期)、而 RAM 为 0WS 存储器。  这意味着执行闪存中的代码所需的时间将比放置在 RAM 中的相同代码所需的时间更长。   

    是否可以在 RAM 版本的代码中设置 BP 来查看发生了什么错误;即写入的值是否不正确、或者根本没有写入该值、等等?  除了 WS 外、正常的代码执行无法修改闪存、但我的意思是、如果闪存过载、您就无法用闪存 API “覆盖“闪存内容。  另一方面、RAM、如果出现栈溢出;或某种类型的过度使用区域、您可能会开始看到基于代码执行的奇数行为。

    如果我们想测试这一点、应该能够阻止来自 RAM 某些区域的写入、等等

    此致、

    Matthew

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

    我看到其他的代码问题在一个项目中可以正常工作、但在另一个项目中不可以正常工作。 例如:不写入寄存器、执行 ISR 调用的简短函数内递增但不是分配的中断。 这是从闪存执行的代码、而不是从 RAM 执行的代码。

    我现在认为这个问题与-O3 优化有关。 通过  在与跳过的分配的调用序列相关的几个简短函数上使用#pragma FUNCTION_OPTIONS (...,--opt_level=0 ),我得到了预期的行为。

    这是正常的吗? 不建议使用-O3 吗? 我正在阅读编译器用户指南、我看到有一些注意事项、但我没有看到与 “跳过“分配相关的任何内容。

    谢谢你

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

    Ivan、

    我不知道对-O3 有任何限制、我们通常使用/推荐 O2、以便实现最佳性能与代码读取能力之间的权衡。

    我可以说、即使使用-O2、优化也会使得在 C 源代码中设置断点并不总是会解析为准确的代码行、一般来说、调试会变得更加困难。

    我也看了刚读的警告、ISR 中有没有机会使用共享全局变量?  根据该文件、需要将这些变量声明为 volatile。

    此致、
    Matthew

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

    谢谢马修。

    这可能与 RAM 和闪存之间的差异无关、但与我最新评论的问题有关。 易失的共享全局变量、但我观察到了其他内容:

    我调用 Interrupt_enable (INT_DMA_CH5);INT_DMA_CH5 由 TI 在 hw_ints.h 中定义。 我注意到 IER7 从未设置、ISR 从未触发、但如果我在 Interrupt_enable 中引入断点、则会设置该断点并触发 ISR。

    有什么线索可以导致这种情况? 我甚至尝试了使用 #pragma function_options (...,--opt_level=0 ) 创建我自己的中断启用副本,但它没有任何区别。

    我真的被这种行为困扰。

    这种情况在 v22.6.0 和 v20.2.1 时都发生。

    与中断相关的代码所处理的原始最小工程是用 EABI 格式编译的、我将其集成在 COFF 中的工程、我们不打算进行迁移。

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

    注意:关于这种在使用调试器逐步运行代码时仅写入 IER 的问题、我看到-O2 和-O3 之间没有区别。

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

    请参阅我的私人消息来跟进此问题。

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

    再次大家好

    我们希望继续解决这个错误。 我们希望了解根本原因、以评估是否存在其他可能的后果。

    谢谢

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

    Ivan、

    我知道从我们这边回来已经有一段时间了。  我一直在尝试导入/复制、但 CCS 存在问题等  我可以运行.out 文件、但由于我没有连接 EEPROM、我相信代码会在问题发生之前充分停顿。

    两条路径:

    1) 您可以联系 Mathworks 寻求帮助,他们可能知道您遇到了哪些问题。

    2) 我已经安装了 Mathworks 软件包,2025b。  如果您认为在论坛外共享该级别的项目将有助于我尝试导入它。

    此致、

    Matthew

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

    Matthew、

    在使用或不使用 EEPROM 时、工作的代码会有所不同、如 zip 文件中包含的屏幕截图所示、尽管如此、它确实通过 DMA 使用 SPI 发送。 此代码不仅使用 CPU 发送前几个字节、而且永远不会触发相应的 ISR、也不会发送这些接下来的字节。

    1.连接 EEPROM 的确定固件:


    2.未连接 EEPROM 的正常固件(由于没有答案,它继续发送):


    3.不起作用的固件(有或没有 EEPROM):


    希望这能把它弄清楚。 我还能做些什么来促进您的工作?

    Iván μ s

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

    您好、

    有任何关于这个问题的消息吗?

    谢谢

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

    您好、

    有任何关于这个问题的消息吗?

    谢谢

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

    尊敬的 Ivan:

    对您回复时出现的延迟表示歉意。 我与 Matt 讨论了这个问题、并希望在我进一步研究之前、看看您是否有任何解决方案、或者它是否仍处于开放状态。  

    此致

    Lori