2016-04-27 52 views
1

說我有控制一些聖誕彩燈(這是不實際的應用中,只有一個例子)的程序。這些燈具有一些不同的計算來確定燈i是否會在給定的框架中亮起,t。每個ituint8_t,所以它可以假設有256個燈和t將循環每256幀。一些光圖案可能是以下幾點:廣場功能的指令

int flash(uint8_t t, uint8_t i) { 
    return t&1;} 

int alternate(uint8_t t, uint8_t i) { 
    return i&1 == t&1;} 

int loop(uint8_t t, uint8_t i) { 
    return i == t;} 

如果我當時就想實現模式改變制度,通過這些模式的循環,我可以用一個函數指針數組int (*modes)(uint8_t, uint8_t)[3]。但是,由於這些都是如此簡短的函數,我是否有辦法強迫編譯器將函數直接放在另一個函數的程序存儲器中,有點像內聯數組?

這個想法是,訪問這些函數中的一個不需要評估指針,而是可以告訴處理器正確的功能是modes + pitch*mode,其中pitch是函數之間的間距(至少是最長)。

我要求更多的是出於好奇心比的要求,因爲我懷疑這實際上會造成多大的速度提升。

+1

使用SELECT語句。它通常編譯爲你想要的。 – fuz

+0

爲什麼你需要函數來實現像'&'和'=='這樣的基本運算符? 'flash'甚至不使用參數'i'。 –

+1

@WeatherVane這裏的場景只是一個例子,實際的功能較長,但它們之間的複雜性相似。 –

回答

1

你所要求的並不是直接可用的。但是這樣的邏輯在彙編器中是可能的,C編譯器可能會根據CPU,優化級別等使用不同的彙編技巧。儘量讓邏輯小巧緊湊,將不同的函數標記爲static,並在C中使用switch()塊並查看編譯器生成的彙編程序。

+0

作爲回答說,有沒有辦法做到這一點的標準C.有*可能*會的方式來完成它的編譯器特有的時尚,就像在GCC將頂級代碼比對彙編片段,但我認爲這些將是非常脆弱。特別是如果編譯優化。實際上,直接在彙編代碼中直接編寫這樣的代碼可能會更好。 – Dolda2000

0

你可以使用一個switch語句,如:

#define FLASH  1 
#define ALTERNATE 2 
#define LOOP  3 

int patternexecute(uint8_t t, uint8_t i, int pattern) 
{ 
    switch (pattern) { 
    case FLASH:  return t&1; 
    case ALTERNATE: return i&1 == t&1; 
    case LOOP:  return i == t; 
    } 
    return 0; 
}