【问题标题】:Coldfire force to use RAM instead of registerColdfire 强制使用 RAM 而不是寄存器
【发布时间】:2017-04-18 10:17:09
【问题描述】:

我有一个用 C 语言编写的应用程序,它在 Coldfire 处理器上运行。

我需要强制它为所有局部变量(在函数中声明)使用 RAM,而不是使用寄存器;为了正确调试应用程序。

我该怎么做?

编辑以获取更多信息

有时,在主应用程序中,由于函数的返回值错误,我会收到错误消息。这种情况很少发生,我在返回指令之前放置了一个检查和一个断点,但是许多变量使用相同的寄存器,我无法清楚地了解错误发生时的情况。如果我在函数的开头移动程序计数器并逐步执行结果是正确的。可能是寄存器管理有问题,我想知道是什么。

提前谢谢你,问候。

【问题讨论】:

  • 不是简单地打开调试开关就可以工作吗?也可以试试volatile 关键字。
  • XY 问题。无需将所有本地变量存储在 RAM 中以进行正确调试(以及这对操作员如何工作?)。它也会大大降低你的代码速度。
  • 有时,在主应用程序中,由于函数返回值错误,我会收到错误消息。这种情况很少发生,我在返回指令之前放置了一个检查和一个断点,但是许多变量使用相同的寄存器,我无法清楚地了解错误发生时的情况。如果我在函数的开头移动程序计数器并逐步执行结果是正确的。可能是寄存器管理有问题,我想知道是什么。

标签: c coldfire


【解决方案1】:

出于调试目的执行此操作的常规方法类似于

#ifdef DEBUG_RELEASE
  volatile uint8_t x;
#else
  uint8_t x;
#endif

完成调试后,您可以删除所有编译器开关。但是它们很好,这样您就不会意外留下任何调试代码(非常常见的问题)。

在大多数编译器上,以上内容足以强制变量进入 RAM 位置。如果不是,您可以更进一步:

  volatile uint8_t x;
  volatile uint8_t* dummy = &x;

现在x 必须在 RAM 中分配,因为它的地址已被使用。

注意:如果您使用的是 Codewarrior 编译器,它会附带各种默认启用优化的版本。您可能必须手动禁用各种优化以进行调试。

【讨论】:

  • 谢谢您的回答,优化级别已经设置为0,我会尽快尝试您的解决方案。
猜你喜欢
  • 2020-07-09
  • 2012-11-25
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 2017-12-23
  • 2016-01-23
相关资源
最近更新 更多