2016-10-03 67 views
1

編輯:我現在明白髮生了什麼事。當我將一個字符(一個字節)添加到其中一個標籤(將「White Oyster Incubation」更改爲「White Oyster IncubationX」)時,我發現類和它的實例化在RAM中被複制, Arduino IDE告訴我,動態內存使用了2個字節,所以我假設一個是爲了課程,另一個是爲了instatiation。在編譯時存儲默認值的優雅和高效的方法?

原來,由於某種原因,來自String.h的字符串似乎一次分配2個字節,所以一個字符串的大小爲2,兩個字符串爲2,三個字符串爲3,等等。尺寸增加偶數。

當然,現在我意識到這個類被存儲在Arduino PROGMEM(EPROM)中,並且實例化在RAM中,所以數據並不真正在RAM中複製。

原始問題如下: 我正在製作Arduino(atmega328)的程序,其中蘑菇溫室將被控制。對於蘑菇發育的不同階段,應該存在多種溫度和溼度參數的概況。 我希望在編譯時保存這些配置文件,然後在配置文件之間進行Arduino更改,以便採取相應措施。 我想到了這一點:

class GrowingProfile 
{ 
private: 
int idealTemp; 

int idealHumi; 

String label; 

public: 
GrowingProfile(int idealTemp,int idealHumi, String label) 
{ 
    this->idealTemp = idealTemp; 
    this->idealHumi = idealHumi; 
    this->label = label; 
}; 
//general methods 
}; 

    class mushroomSpecies1Profiles 
{ 
public: 
GrowingProfile incubationProfile; 
GrowingProfile fruitingProfile; 

WhiteOysterGrowingProfiles(): 
    incubationProfile (100, 95, "White Oyster Incubation"), 
    fruitingProfile (20, 4, "White Oyster Fruiting"){} 

}; 

,然後在主代碼,有mushroomSpecies1Profiles的實例,通過其成員作爲參數,以決定是否envioronment條件(在配置文件中設置)是好還是壞的方法。

但是,在我看來,這是臃腫的,因爲有效的數據是重複的,在類定義中,然後在實例化中。並且考慮到所討論的微控制器只有2K的內存...... 什麼是在最終的可執行文件中沒有重複數據的好方法?就好像它是C#中的靜態類一樣?

+1

我沒有在這裏看到任何重複。 –

+0

配置文件數量是否在編譯時固定?如果是這樣,你可以把名字放入一個枚舉中嗎?如果是這樣,你可以使用模板類。 – Corristo

+4

你不應該濫用屬於某個命名空間的東西。 –

回答

1

假設你的類GrowingProfile確實是固定不變的,我會推薦一些沿着這些路線:

static const GrowingProfile incubationProfile (100, 95, "White Oyster Incubation"); 
static const GrowingProfile fruitingProfile (20, 4, "White Oyster Fruiting"); 
+0

確實可以避免重複類的任何實例的數據 – user3742604

1

字符串文字是該計劃的一部分,如果在程序中定義(任何方式)。爲了避免這些字面量的內存消耗,可以將它們放在一個單獨的文件中,並在訪問該文件時花費文字映射(例如:通過整數鍵)的代價。

但是,如果程序和文件系統位於相同的有限EPROM中,則註定會失敗。你必須儘可能簡短。

+0

這對其他體系結構很有用。但的確,Arduino只有一個EPROM – user3742604