Arduino - эффективно перебирать массив C - PullRequest
3 голосов
/ 20 января 2012

У меня есть следующий массив:

PROGMEM prog_uint16_t show_hide_info[] = { 4216, 8900, 4380, 580, 500, 600, 500, 580, 1620, 580, 500, 600, 500, 580, 500, 600, 480, 600, 500, 580, 1620, 580, 1620, 600, 500, 580, 1620, 580, 1620, 600, 1600, 600, 1620, 580, 1620, 600, 500, 580, 1620, 580, 500, 600, 1600, 600, 500, 580, 1620, 580, 500, 600, 1620, 580, 1620, 600, 480, 600, 1620, 580, 500, 600, 1600, 600, 500, 580, 1620, 580, 500, 600, 39300, 8860, 2160, 580, 0 };

Я хотел бы иметь возможность пройти через этот массив и выполнить следующие методы соответственно:

pulseIR(4216);
delayMicroseconds(8900);
pulseIR(4380);
delayMicroseconds(580);
...

Это то, что ядо сих пор, что, очевидно, далеко от следа:

unsigned int* get(prog_uint16_t code[]) {
  unsigned int c;

  while ((c = pgm_read_word(code++))) {
    //pulseIR(c); ??
    //delayMicroseconds(c+1); ??
  }
}

Не совсем уверен, что я должен делать с c, если честно.

Из-за недостатка снаЯ не могу понять всю мою документацию по PROGMEM:

http://arduino.cc/en/Reference/PROGMEM

Ответы [ 3 ]

1 голос
/ 21 января 2012

В итоге я использовал следующий код.Делает то, что мне нужно, чтобы сделать.Не уверен, что это самый эффективный способ.Я открыт для любых предложений и готов принять ответы на мой последний.

void sendCode(prog_uint16_t inArray[], int nLimit) {

  unsigned int arr[nLimit];
  unsigned int c;
  int index = 0;

  while ((c = pgm_read_word(inArray++))) {
    arr[index] = c;
    index++;
  }

  for (int i = 0; i < nLimit; i=i+2) {
    delayMicroseconds(arr[i]);
    pulseIR(arr[i+1]);
  }

}
1 голос
/ 23 января 2012

Будет ли этот бит немного быстрее

    for (int i = 0; i < nLimit; i=i+2) {
    delayMicroseconds(arr[i]);
    pulseIR(arr[i+1]);
  }

если

for (int i = 0; i < nLimit; i++) {
    delayMicroseconds(arr[i]);
    i++;
    pulseIR(arr[i]);
  }
1 голос
/ 20 января 2012

Сначала вам понадобится короткая рука, чтобы найти конец массива. Если это фиксированное число значений, то компилятор может рассчитать его таким образом, чтобы найти количество значений int16:

PROGMEM prog_uint16_t show_hide_info[] = { 4216, 8900, 4380, 580, ....etc
int arraySize = sizeof(show_hide_info) / sizeof(prog_uint16_t);

Тогда, если вы хотите иметь функцию, которая проходит через ваш массив только один раз, функцию можно объявить следующим образом:

void cycleThruArrayOnce(prog_uint16_t *pInArray, int nLimit) {
 for (int i=0;i<nLimit;i=i+2) {
   pulseIR(pgm_read_word(pInArray++));
   delayMicroseconds(pgm_read_word(pInArray+));
 }
}

И это можно вызвать из вашей основной программы следующим образом:

cycleThruArrayOnce(show_hide_info, arraySize);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...