Memcpy_p проблемы, как решить?

Я озадачен своим собственным кодом 🙂 Я пытаюсь прочитать данные из PROGMEM. Это работает нормально, когда у меня есть только этот массив в PROGMEM. При добавлении дополнительного отдельного массива в PROGMEM все идет не так. То есть, когда он определен в другом фрагменте кода и #included. Когда собраны в 1 код, это нормально. Но я хочу, чтобы эти массивы жили в разных частях кода.

Я считаю, что у меня есть ошибка в последней функции, которую я включил сюда (callMenuItemParaName).
Это связано с тем, как я читаю PROGMEM. Я думаю, что лучше всего использовать memcpy_P, но не могу найти онлайн объяснения о том, как именно это использовать.

Код, который у меня сейчас есть, работает, но пока я не помещаю другой массив в PROGMEM. (эта процедура работает правильно, с функцией memcpy_P. Но как мне реализовать memcpy_P в функции callMenuItemParaName?

Спасибо за любой совет, который вы можете дать! (конечно же, pgmspace.h включен)

Работая на AVR GCC, IDE — Eclipse, mcu = atmega644 при 20 МГц

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)

0

Решение

Ваши строки имеют длину 6 байт (запомните завершающий 0), что означает, что вы переполнены tempText когда ты strcpy_P внутрь. использование memcpy_P вместо.

memcpy_P(tempText, data, sizeof tempText);

Как вы используете pgm_read_word просто отлично.

1

Другие решения

Других решений пока нет …