Как прочитать основной код внутри основного кода в Arduino?

Как прочитать шестнадцатеричный код основной программы, хранящейся во флэш-памяти внутри моей работающей программы Arduino?

Пока что я могу прочитать Flash по любому указанному адресу, используя PROGMEM

unsigned int displayInt;
int k;    // переменная-счетчик

void setup() {
  Serial.begin(9600);
  while (!Serial);  // ждем подключения последовательного порта. Требуется для собственного USB

  for(k = 0; k < 5; k++) {
    displayInt = pgm_read_word_near(k);
    Serial.println(displayInt); 
  }
}

void loop() {
}

Выход

37900
13716
53
3072
37900

Но это не шестнадцатеричный код.

Я реализую функцию OTA (по воздуху). Я получу новую версию кода из GPRS. Это будет огромный код, поэтому я запишу его во флэш-память, используя пользовательский загрузчик, упомянутый в этой теме. Я могу записывать во флэш-память. Теперь я хотел бы прочитать данные из флэш-памяти. Для начала я хотел бы прочитать основную программу внутри моей основной программы.

, 👍0


1 ответ


Лучший ответ:

5

Интересно. Если вам нужен hex, вы должны сказать ему печатать в hex. Если я изменю вашу строку отображения на:

Serial.println(displayInt, HEX); 

Тогда я получаю:

940C
3594
35
C00
940C

Сравните это с тем, как выглядит декомпилированный файл:

   0:   0c 94 35 00     jmp 0x6a    ; 0x6a <__ctors_end>
   4:   0c 94 5d 00     jmp 0xba    ; 0xba <__bad_interrupt>
   8:   0c 94 5d 00     jmp 0xba    ; 0xba <__bad_interrupt>

Если принять во внимание порядок байтов (вы читаете слова, а не байты), то это то же самое.


Если изменить его на чтение байтов, то он будет выглядеть лучше:

void setup() {
  Serial.begin(115200);
  while (!Serial);  // ждем подключения последовательного порта. Требуется для собственного USB

  for(int k = 0; k < 12; k++) {
    byte c = pgm_read_byte(k);
    char buf [3];
    sprintf (buf, "%02X", c);
    Serial.println(buf); 
  }
}

void loop() {
}

Я увеличил скорость передачи данных до 115200 бод. Я всегда удивляюсь, когда люди используют 9600 бод. Вы тоскуете по старым временам, когда модемы на 9600 бод были самыми быстрыми, какие только можно было получить?

Это дает такой результат:

0C
94
35
00
0C
94
5D
00
0C
94
5D
00

Как видите, это совершенно верно.

,