我对自己的代码感到困惑 :-) 我正在尝试从 PROGMEM 读取数据。当我在 PROGMEM 中只有这个数组时,这可以正常工作。在 PROGMEM 中添加额外的单独数组时会出错。也就是说,当它在不同的代码和#included 中定义时。当放在1个代码中时,它很好。但我希望这些数组在不同的代码段中分开存在。
我相信我在此处包含的最后一个函数中有错误(callMenuItemParaName
)。这与我读出 PROGMEM 的方式有关。我认为最好使用 memcpy_P 但找不到任何关于如何准确使用它的在线解释。
我现在拥有的代码可以工作,但只要我不在 PROGMEM 中放置另一个数组。(此例程使用 memcpy_P 函数正常工作。但是如何在函数中实现 memcpy_P callMenuItemParaName
?
感谢您提供的任何建议!(当然包括 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*));
但没有运气。(也找不到关于 memcpy_P 的好教程,顺便说一句)