我对自己的代码感到困惑:-)我试图从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要么,顺便说一句)
你认为'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)有帮助。 –
没有意识到它是AVR特定的。我会添加它。 – user2371490