2013-09-28 209 views
0

我對自己的代碼感到困惑:-)我試圖從PROGMEM讀取數據。當我在PROGMEM中只有這個數組時,這工作正常。當在PROGMEM中添加一個額外的獨立數組時,它會出錯。也就是說,當它被定義在另一段代碼和#included中。當放在一起的代碼,它很好。但我希望這些數組能夠在不同的代碼片段中生活。Memcpy_p問題,如何解決?

我相信我在最後一個函數中有一個錯誤,我在這裏包含(callMenuItemParaName)。 它與我讀出PROGMEM的方式有關。我認爲最好使用memcpy_P,但無法找到任何關於如何正確使用它的在線解釋。

我現在的代碼有效,但只要我不在PROGMEM中放入另一個數組。 (這個程序是否正常工作,與memcpy_P功能。但我怎麼在函數實現memcpy_P callMenuItemParaName

感謝您能給什麼建議!(ofcourse pgmspace.h包括)

在AVR工作GCC,IDE就是Eclipse,MCU = atmega644 @ 20MHz的

unsigned char (*adresParaName); 

const uint8_t TEXT0[] PROGMEM = "TEXT0"; 
const uint8_t paraNameAtk[] PROGMEM = "Atk "; 
const uint8_t paraNameDcy[] PROGMEM = "Dcy "; 
... 
const uint8_t paraNameTru[] PROGMEM = "Tru "; 
const uint8_t paraNameLight[] PROGMEM = "Light"; 

typedef void (*pMenu)(void); 

typedef struct 
{ 
    void (*pointer2MenuNumber)(void); 
    char VALUE; 
    const unsigned char *adresParaName; 
} sel_item; 

const sel_item menuNumber2ItemDbase[] PROGMEM= 
{ 
    { itemA , 0x00 , TEXT0 }, 
    { itemB , 0x01 , paraNameAtk }, 
    { itemC , 0x02 , paraNameDcy }, 
     ... 
    { itemM , 0x05 , paraNameTru }, 
    { itemN , 0x05 , paraNameLight } 
}; 

//prototypes 
void callMenuItem(const sel_item *item); 
void callMenuItemValue(const sel_item *item); 
void callMenuItemParaName(const sel_item *item); 

// ************************************************* 
// callMenu 
// Description: 
// 
// ************************************************* 

void callMenuItem(const sel_item *item) 
{ 
    pMenu function = (pMenu)pgm_read_word(&item->pointer2MenuNumber); 
    function(); 
} 

void callMenuItemValue(const sel_item *item) 
{ 
    setCursor(1,4); 
    char VAL = (char)pgm_read_byte(&item->VALUE); 
    char2LCD('0'+VAL); 
} 

void callMenuItemParaName(const sel_item *item) 
{ 
    char tempText[5]; 
    char *data = (char*)pgm_read_word(&item->adresParaName); 

    strcpy_P (tempText, data); 
    for (uint8_t x=0;x<5;x++) 
     { 
     char2LCD(tempText[x]); 
     } 
} 

我已經嘗試添加此:

char* pstr = 0; 
memcpy_P (&pstr, data, sizeof(char*)); 

,但沒有運氣(不能˚F ind一個很好的教程memcpy_P要麼,順便說一句)

+0

你認爲'memcpy_P()'來自哪裏?在ISO/IEC 9899:2011--目前的C標準中,它不是標準的C函數。你可以查看SO問題[AVR中的'memcpy_P()'函數](http://stackoverflow.com/questions/14365462/memcpy-p-function-avr),但這並不能解釋'程序空間「。您可能會發現[程序空間字符串實用程序](https://ccrma.stanford.edu/courses/250a/docs/avr-libc-user-manual-1.2.5/group__avr__pgmspace.html)有幫助。 –

+0

沒有意識到它是AVR特定的。我會添加它。 – user2371490

回答

1

你的字符串是6字節長(記住終止0),這意味着當你strcpy_P進入它溢出tempText。改爲使用memcpy_P

memcpy_P(tempText, data, sizeof tempText); 

您使用pgm_read_word的方式就好了。

+0

對!而已。我試過你的建議,這很好!我完全不知道終止0.現在,這意味着如果我將tempText [6]而不是[5],strcpy_p也可以工作。經過測試和工作,但在選擇memcpy_P或strcpy_P時是否需要考慮重要事項? – user2371490