2013-03-08 59 views
1

編寫asm代碼時,通過告訴cpu顯式跳轉到下一條指令,可以減慢代碼一個或兩個週期的竅門。我正在考慮用C++模板做類似的事情。這裏是我的代碼:停止轉移優化g

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

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

雖然這個想法聽起來很合理,但優化程序似乎通過刪除jmp代碼來阻礙。任何想法如何實現?

背景

其原因也需要這樣做是減慢微控制器,使得其在一個非常特定的頻率輸出光脈衝的代碼。這是一個非常專業化的用途,除了低級硬件訪問(如寫入驅動程序或編程微控制器)外,這種用法不常見。即使那樣,我仍會盡可能地避免這種事情。不幸的是,這並不總是可以避免的。

+2

爲什麼要這樣做?像這樣的任何基於代碼的減速幾乎都是錯誤的做法。 – 2013-03-08 19:29:13

+2

我希望我遇到了試圖減慢我的代碼的問題 – 2013-03-08 19:30:57

+0

根據編譯器的不同,您可以將asm直接放入C++中(至少在Visual C++中) – QuentinUK 2013-03-08 19:32:13

回答

0

感謝您的幫助。

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

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

在我曾經引用這在稍微較粗粒度工作volatile變量一點:除了使用JMP指令,我跟NOP指令去

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

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

當我」這可能是有用的內存不足。

再次感謝! :)

Adrian

2

這就是優化器應該做的 - 優化,包括刪除非功能性代碼。 要麼在您的編譯器選項中完全禁用優化,要麼使用其他方法來減慢您的程序,有很多API可以讓您在指定時間內休眠。

+0

他們不夠好。我正在編程一個微控制器。僅供參考,我正在使用這種方法進行粗略的延遲控制。 – Adrian 2013-03-08 19:31:55

+0

使用內聯彙編 – SomeWittyUsername 2013-03-08 19:32:55

+0

想知道是否可以使用模板完成。 – Adrian 2013-03-08 19:38:14

2

您可以添加此屬性:

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

,應可防止優化。雖然正如其他人所提到的,但可能有更好的方法,但如果這純粹是爲了學習的目的而不是所有的好處。我通常使用this來驗證彙編輸出的真快,或者當我不在命令行時。

+0

刪除這樣的優化會引入額外的代碼。但是,該網站是偉大的!它確實讓我記住了nop指令。 – Adrian 2013-03-08 19:58:11

+0

嗯,有解決辦法,但本網站不會讓我發佈它作爲答案。 GRRRR。 – Adrian 2013-03-08 20:13:00