2014-01-05 63 views
0

我使用Sublime和Arduino來編程晴雨表(MS5611)。但是,什麼是存儲只是用作臨時存儲特定函數內部變量的最佳做法:最佳實踐:變量,函數和Arduino?

1)創建適用於所有變量我的頭文件中的私有變量?

2)在使用它們的函數內部創建變量?

什麼最需要的處理能力和內存使用情況 - (1)一次性創建爲私有變量和更改與職能的內容,或(2)創建變量每個I調用一個函數的時間?

+2

如果您的函數只能用於單個函數,那麼將它們定義爲函數中的局部變量。函數使用的堆棧空間將會增加,但是在函數執行時它只是臨時的,添加額外的堆棧空間不會影響性能。 –

回答

0

取決於您的採樣率,這意味着多少次調用該函數來保存數據? 在任何情況下,重要的是還要考慮收集和處理數據後內存如何清空,無論如何,如果您沒有太多變量,但必須處理更多可以使用的函數最好將它們設置在全球範圍內。至少,我在我的項目中這樣做,我從來沒有遇到過問題。

0

總是在函數中聲明它們。這樣可以提高可讀性,因爲它顯示了聲明背後的意圖。它也降低了犯錯的機率。

儘可能以「const」爲例,例如,

uint16_t sample_it() { 
    const uint16_t sample = analogRead(...); 
    const uint16_t result = do_somehting(sample); 
    return result; 
} 

幾乎出於同樣的原因,但這也給了編譯器更多的優化選項。

是否以及如何變量分配要由編譯器和優化。除非你有非常緊性能限制有機會,編譯器將優化比你好得多。實際上,使用全局變量有時會減慢代碼速度。當然你可以避免分配。但是,您將通過額外的存儲說明付款。另一方面,「分配」可能會被優化掉,然後你的全局變量代碼變得比局部變量代碼慢。

+0

除了你不能修改'const變量'... – ladislas

+1

這就是要點。大多數「變量」實際上是它們範圍內的常量。所以他們應該被宣佈爲常量。這允許編譯器進行顯着的優化。 –

+0

我同意你應該對任何不改變的變量進行const修飾,並用一個*確定的*值初始化它,但在你的例子中,你的常量會隨着時間的推移而改變(每次你調用這個函數)這是禁止:) – ladislas

0

您應該避免使用全局變量,因爲它們是從可用堆RAM中分配的,並且在程序期間存在(佔用空間)(永遠在嵌入式系統中)。全局變量還會降低可維護性和更脆弱的程序。

如果你只需要一個函數裏面的數據,有申報。幾乎沒有懲罰(僅初始化),並且當函數返回時自動返回已用空間,因爲局部變量作爲傳遞參數放置在堆棧上。