2015-03-25 19 views
0

我目前正在使用不同語言設置的項目。爲了解決這個問題,一個表格用來存儲程序中使用的不同語言的所有文本。因此,無論何時要在屏幕上寫入文本,都會調用此表,並根據當前語言設置是什麼返回文本字符串。我最近加入了這個項目,並且我注意到這種存儲方式並沒有得到很好的優化,每增加一種新語言,查找正確字符串的時間就會增加。因此,我想出了一個(在我看來)更好的解決方案。然而,當我試圖實現它時,我遇到了一個錯誤,即使用了太多的內存,我不明白爲什麼。我正在使用IAR嵌入式工作臺。錯誤[Lp001]內存不足時我不應該

僞/ C初始溶液++代碼:

typedef struct 
{ 
    enum textId; 
    enum language; 
    string textString; 
} Text; 

static const Text s_TextMap[] = 
{ 
    { TextId::RESTORE_DATA_Q    ,Language::ENGLISH  ,"Restore Data?"       }, 
    { TextId::RESTORE_DATA_Q    ,Language::SWEDISH  ,"Återställa data?"      }, 
    { TextId::RESTORE_DATA_Q    ,Language::GERMAN   ,"Wiederherstellen von Daten?"   }, 
    { TextId::CHANGE_LANGUAGE    ,Language::ENGLISH  ,"Change Language"      }, 
    { TextId::CHANGE_LANGUAGE    ,Language::SWEDISH  ,"Välj språk"        }, 
    { TextId::CHANGE_LANGUAGE    ,Language::GERMAN   ,"Sprache wählen"       }, 
}; 

我在僞/ C溶液++代碼:

typedef struct 
{ 
    const char* pEngText; 
    const char* pSweText; 
    const char* pGerText; 
} Texts; 

static Texts addTexts(const char* pEngText, const char* pSweText, const char* pGerText) 
{ 
    Texts t; 
    t.pEngText = pEngText; 
    t.pSweText = pSweText; 
    t.pGerText = pGerText; 
    return t; 
} 

typedef struct 
{ 
    enum textId; 
    Texts texts; 
} Text; 

static const TextTest s_TextMapTest[] = 
{ 
    {TextId::RESTORE_DATA_Q,  addTexts("Restore Data?","Återställa data?","Wiederherstellen von Daten?")}, 
    {TextId::CHANGE_LANGUAGE,  addTexts("Change Language","Välj språk","Sprache wählen")}, 
}; 

我的解決辦法是明顯快於平均水平的情況下,以查找並根據我計算它也應該使用更少的內存。當使用完整表格時,我計算出原始解決方案需要7668個字節,而且我的解決方案需要4248個字節。我這樣做的方式是在一個小的測試程序中實現完整的表格,並使用sizeof(s_TextMap)。然而,當我嘗試編譯的代碼我得到的鏈接錯誤說:

錯誤[Lp011]:部分放置未能 無法爲具有0x130301字節的總估計最小尺寸段/塊分配空間(最大對齊0x1000)在< [0x0000a000-0x0007ffff]>(未提交的總空間0x757eb)。

錯誤[Lp011]:部分放置失敗 無法與0x47de4字節< [0x1fff0000-0x2000fff0]>(總未提交的空間0x1fff1)總估計最小尺寸(最大對齊爲0x20),用於分段/塊分配空間。

錯誤[Lp021]:壓縮初始化程序批次「USER_DEFAULT_MEMORY-1」的目標位置取決於批處理的大小,這在使用lz77壓縮時不允許。考慮使用「初始化通過包裝=零複製」(或無)來代替。

錯誤[Lp021]:壓縮初始化程序批次「USER_DEFAULT_MEMORY-1」的目標位置取決於批處理的大小,這在使用lz77壓縮時不允許。考慮使用「初始化通過包裝=零複製」(或無)來代替。

我最困惑的錯誤是第一個說我的代碼估計需要0x130301字節的內存,我看不出這是可能的。這可能是IAR中的一些錯誤,或者我錯過了什麼?

回答

2

在您的解決方案s_TextMapTest[]一定會被設在RAM中,而因爲指針是在運行時設置的 - 不過不清楚如何設法使用函數調用作爲數組元素初始化。在大多數微控制器上,RAM是一種更爲有限的資源。您沒有提供關於目標或其內存映射的信息。

無論採用哪種方式,都應檢查鏈接器的存儲器映射輸出,以驗證數據是否位於適當的位置以及您希望的位置。

原始代碼和您在自己的答案中提出的解決方案是可ROMable的。

維持原來的建議的形式,而其餘ROMable是寫addTexts()宏,而不是功能的解決方案:

#define addTexts(eng, swe, ger, fin) {eng, swe, ger, fin} 

雖然我不能看到的好處是什麼,你是不是真的「添加」文本 - 文本始終通過初始化。

0

好吧,所以我設法讓它工作。我remowed額外的結構和功能,只是它簡化爲:

typedef struct 
{ 
    TextId::e textId; 
    const char* pEngText; 
    const char* pSweText; 
    const char* pGerText; 
    const char* pFinText; 
} Text; 

它看起來並不好給我,但至少它的工作原理