1

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

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

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

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

背景

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

4

3 回答 3

2

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

于 2013-03-08T19:29:03.500 回答
2

您可以添加此属性:

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

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

于 2013-03-08T19:30:37.587 回答
0

感谢大家的帮助。我没有使用 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>()
{
}

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

再次感谢!:)

阿德里安

于 2013-03-09T14:32:01.063 回答