在编写asm代码时,有一个技巧可以通过告诉cpu显式跳转到下一条指令来使代码减慢一两个周期。我正在考虑使用C ++模板做类似的事情。这是我的代码:
template <unsigned int c>
inline void adelay()
{
goto x;
x:
adelay<c-1>();
}
template <>
inline void adelay<0>()
{
}
虽然这个想法听起来很合理,但优化器似乎通过删除jmp代码来阻碍它。有什么想法可以实现吗?
背景
想要这样做的原因是减慢微控制器的代码,使其以非常特定的频率输出光束脉冲。这是一种非常专业的用途,除了低级硬件访问(例如编写驱动程序或编程微控制器)之外,这种用法并不常见。即便如此,我尽量避免这样的事情。不幸的是,这并不总是可以避免的。
答案 0 :(得分:2)
这就是优化器应该做的 - 优化,包括删除非功能代码。 要么在编译器选项中完全禁用优化,要么使用其他方法来减慢程序的速度,有很多API可以让你在规定的时间内休眠。
答案 1 :(得分:2)
您可以添加此属性:
template <>
inline void __attribute__((optimize("O0"))) adelay<0>()
{
}
哪个应该阻止优化。虽然正如其他人所提到的那样,可能有更好的方法,但如果这纯粹是出于学习目的而不是一切好事。我通常使用this来快速验证汇编器输出,或者当我不在命令行时。
答案 2 :(得分: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>()
{
}
当我内存不足时,这可能很有用。
再次感谢! :)
阿德里安