【问题标题】:Stop goto optimization g停止 goto 优化 g
【发布时间】:2015-06-24 10:05:23
【问题描述】:

在编写 asm 代码时,有一个技巧可以通过告诉 cpu 显式跳转到下一条指令来将代码减慢一两个周期。我正在考虑使用 C++ 模板做类似的事情。这是我的代码:

template <unsigned int c>
inline void adelay()
{
  goto x;
x:
  adelay<c-1>();
}

template <>
inline void adelay<0>()
{
}

虽然这个想法看起来很合理,但优化器似乎通过删除 jmp 代码来阻碍。任何想法如何实现?

背景

想要这样做的原因是为了减慢微控制器的代码,使其以非常特定的频率输出光束脉冲。这是一种非常专业的用途,除了在低级硬件访问(如编写驱动程序或编程微控制器)中不常见。即便如此,我也会尽可能地避免此类事情。不幸的是,这总是无法避免的。

【问题讨论】:

  • 您为什么要这样做?几乎可以肯定,任何像这样基于代码的减速都是错误的做法。
  • 我希望我遇到了试图减慢代码速度的问题
  • 根据编译器的不同,您可以将 asm 直接放入 C++,(至少使用 Visual C++)
  • 我正在编写一个微控制器。
  • 是的,不高兴地尝试了 asm 路线。

标签: c++ templates optimization g++


【解决方案1】:

这就是优化器应该做的——优化,包括删除非功能性代码。 要么在你的编译器选项中完全禁用优化,要么使用其他方法来减慢你的程序,有很多 API 可以让你在定义的时间内休眠。

【讨论】:

  • 它们还不够好。我正在编写一个微控制器。仅供参考,我正在使用这些方法进行粗略的延迟控制。
  • 也不希望周围有多余的标签。
【解决方案2】:

你可以添加这个属性:

template <>
inline void __attribute__((optimize("O0"))) adelay<0>()
{
}

这应该会阻止优化。尽管正如其他人所提到的,可能有更好的方法,但如果这纯粹是为了学习目的,那就太好了。我通常使用this 来快速验证汇编程序输出,或者当我不在命令行时。

【讨论】:

  • 删除这样的优化会引入额外的代码。但是,那个网站很棒!它确实让我记住了 nop 指令。
  • 嗯,有解决方案,但这个网站不会让我将其发布为答案。 Grrrr。
【解决方案3】:

感谢大家的帮助。我没有使用 jmp 指令,而是使用 nop 指令:

template <unsigned int c>
inline void adelay() 
{
  asm("nop");
  adelay<c-1>();
}

template <>
inline void adelay<0>()
{
}

在某一时刻,我使用了一个 volatile 变量,该变量的工作粒度略为粗略:

static volatile int _adelay = 0;
template <unsigned int c>
inline void adelay()
{
  _adelay;
  adelay<c-1>();
}

template <>
inline void adelay<0>()
{
}

当我的内存不足时,这可能很有用。

再次感谢! :)

阿德里安

【讨论】:

    猜你喜欢
    • 2012-10-21
    • 1970-01-01
    • 2011-12-27
    • 2017-05-27
    • 1970-01-01
    • 2022-01-24
    • 2022-05-24
    • 2012-02-12
    • 1970-01-01
    相关资源
    最近更新 更多