Прошу помощи с PROGMEM

Здравствуйте.

в этом скетче, в зависимости от символа, принятого из порта, необходимо переписать содержимое одного из массивов: array1 или array2, находящихся в PROGMEM, в массив array0.

const unsigned int PROGMEM array1[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
const unsigned int PROGMEM array2[10] = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
unsigned int array0[10];
String stroka;
int i;

void setup()
{

  Serial.begin(9600);
}
void loop()
{
  if (Serial.available() > 0)
  {
    char priem = Serial.read();
    if (priem == '\n') // конец пакета
    {
      if (stroka == "a")
      {
        for (i=0;i<=9;i++) array0[i]=pgm_read_word(&array1[i]);
      }
      if (stroka == "b")
      {
        for (i=0;i<=9;i++) array0[i]=pgm_read_word(&array2[i]);
      }
      stroka = "";
    }
    else
    {
      if ((byte) priem != 13) stroka += priem;
    }
  }
}

Вопрос. Каким образом организовать процедуру, чтобы уростить строки 21 и 25.

memcpy_P() ?

https://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html#gad92fa2ebe26e65fa424051047d21a0eb

С какой целью и до каких пределов их надо упрощать? Что хочется получить?

1 лайк

Хочется получить процедуру с циклом от нуля до девяти, в которую передавать только один параметр: адрес массива array1 или array2.

Думаю так.

Вызов процедуры: prg(array1);

// сама процедура
void prg(unsigned int *ptr)
{
        for (int j=0;j<=9;j++) array0[j]=pgm_read_word(ptr[j]);
}

Ну да. В чем проблема то?

1 лайк

В неуверенности.

В чём?

В моих первых шагах в работе с указателями.

Так нужно вопрос правильно формировать)))
Вон тебе уже и memcpy_p посоветовать успели, а дело в указателях оказывается… ))

И в указателях.
А в итоге мне надо было получить вот это:

const unsigned int PROGMEM array1[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
const unsigned int PROGMEM array2[10] = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
unsigned int array0[10];
String stroka;
int i;

void setup()
{

  Serial.begin(9600);
}
void loop()
{
  if (Serial.available() > 0)
  {
    char priem = Serial.read();
    if (priem == '\n') // конец пакета
    {
      if (stroka == "a")
      {
        memcpy_P(array0, array1, 10*sizeof(int));
        for (i = 0; i <= 9; i++) Serial.println(array0[i]);
      }
      if (stroka == "b")
      {
        memcpy_P(array0, array2,10*sizeof(int));
        for (i = 0; i <= 9; i++) Serial.println(array0[i]);
      }
      stroka = "";
    }
    else
    {
      if ((byte) priem != 13) stroka += priem;
    }
  }
}

memcpy_P(array0, array2, sizeof(array0));

3 лайка

Если вам нужно во время работы что то изменить в PROGMEM, значит вы что то делаете не так.
Для сохранения энергонезависимых данных предназначен EEPROM.

В PROGMEM у меня константы. Менять там ничего не надо.

А зачем их куда-то копировать?Разве нельзя читать массив прямо из ПРОГМЕМ?

А чё можно? И даже без pgm_read_word? На стмке или еспэшке понимаю, а на аврке?

А че? pgm_read_word - это теперь уже не “прямо из ПРОГМЕМ”?

Если просто использовать - это одно, а если еще и изменять нужно - уже другое…

Это я про предложения

Ну, ТС же написал: