Как прочитать основной код внутри основного кода в 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. Это будет огромный код, поэтому я запишу его во флэш-память, используя пользовательский загрузчик, упомянутый в этой теме. Я могу записывать во флэш-память. Теперь я хотел бы прочитать данные из флэш-памяти. Для начала я хотел бы прочитать основную программу внутри моей основной программы.
1 ответ
Лучший ответ:
Интересно. Если вам нужен 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
Как видите, это совершенно верно.
- Получить доступ к EEPROM ATtiny с помощью кода Arduino?
- Выделение строковой памяти Arduino
- Как очистить кучу памяти в esp32
- Когда использовать PROGMEM?
- Есть ли способ подключить оперативную память компьютера к Arduino?
- Последовательная печать из флэш-памяти (F() macro, PROGMEM, sprintf_P, SPTR)
- Альтернатива SoftwareSerial с низким объемом памяти?
- Функция freeMemory() из библиотеки memoryfree не возвращает уменьшенное значение в arduino UNO