Изображаем терминал

dmgoldobin
Offline
Зарегистрирован: 16.02.2020

Моя первая программка для nano :) Можно прямо в терминале, например putty, смотреть ram/flash/eeprom и писать в ram (включая i/o, то есть мигать любимым светодиодом). Сдампил бутлоадер "7800 800 r", подсунул на http://disassembler.io/, медитирую

char input[20];
byte inputLength = 0;

void setup() {
  Serial.begin (57600);
  Serial.write('>');
}

void loop() {
  int v = Serial.read();
  if ((v == '\b' || v == 0x7F) && inputLength > 0) {
    --inputLength;
    Serial.print("\b \b");
  } else if(v == '\r' && inputLength > 0) {
    Serial.print("\r\n");
    input[inputLength] = 0;
    process();
    inputLength = 0;
    Serial.print("\r\n>");
  } else if (v >= ' ' && v < 0x7F && inputLength < sizeof(input) - 1) {
    input[inputLength++] = v;
    Serial.write(v);
  }  
}

void process() {
  char *p = input;
  word addr = getHex(p), len = getHex(p);
  if (*p != 'r' && *p != 'f' && *p != 'w' && *p != 'e' || p[1]) {
    Serial.print("addr count r|f|e: dump ram|flash|eeprom\r\naddr value w: write to ram\r\n");
    return;
  }
  if (*p == 'w') {
    *(byte*)addr = (byte)len;
    return;
  }
  for (word i = 0; i < len; ++i) {
    byte value = *p == 'f' ? __LPM(addr) : *p == 'e' ? eeprom_read_byte((byte*)addr) : *(byte*)addr;
    Serial.write(hex(value >> 4));
    Serial.write(hex(value));
    Serial.print(i % 32 == 31 ? "\r\n" : " ");
    ++addr;
  }
}

word getHex(char *&p) {
  word result = 0;
  while(*p >= '0' && *p <= '9' || *p >= 'A' && *p <= 'F' || *p >= 'a' && *p <= 'f') {
    result = result * 16 + (*p <= '9' ? *p - '0' : *p % 16 + 9);
    ++p;
  }
  while(*p == ' ') ++p;
  return result;
}

char hex(byte value) {
  value &= 15;
  return value < 10 ? '0' + value : 'a' + value - 10;
}
>7800 100 f
0c 94 34 3c 0c 94 51 3c 0c 94 51 3c 0c 94 51 3c 0c 94 51 3c 0c 94 51 3c 0c 94 51 3c 0c 94 51 3c
0c 94 51 3c 0c 94 51 3c 0c 94 51 3c 0c 94 51 3c 0c 94 51 3c 0c 94 51 3c 0c 94 51 3c 0c 94 51 3c
0c 94 51 3c 0c 94 51 3c 0c 94 51 3c 0c 94 51 3c 0c 94 51 3c 0c 94 51 3c 0c 94 51 3c 0c 94 51 3c
0c 94 51 3c 0c 94 51 3c 11 24 1f be cf ef d8 e0 de bf cd bf 11 e0 a0 e0 b1 e0 ec e9 ff e7 02 c0
05 90 0d 92 a2 30 b1 07 d9 f7 12 e0 a2 e0 b1 e0 01 c0 1d 92 ad 30 b1 07 e1 f7 0e 94 2d 3d 0c 94
cc 3f 0c 94 00 3c 98 2f 95 95 95 95 95 95 95 95 90 5d 8f 70 8a 30 7c f0 28 2f 29 5a 80 91 c0 00
85 ff fc cf 90 93 c6 00 80 91 c0 00 85 ff fc cf 20 93 c6 00 08 95 28 2f 20 5d f0 cf 98 2f 80 91
c0 00 85 ff fc cf 90 93 c6 00 08 95 ef 92 ff 92 0f 93 1f 93 ee 24 ff 24 87 01 80 91 c0 00 87 fd

>0 20 e
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 55 ff ff ff ff ff ff ff ff ff ff ff ff ff

>0 40 r
60 00 40 50 53 49 20 20 62 01 00 00 40 00 00 00 10 00 72 bf 01 00 20 01 18 00 81 01 f9 08 1e 00
b8 b8 b8 20 20 20 00 00 00 01 00 01 b8 b8 b8 b8 b8 b8 b8 b8 b8 06 07 07 b8 b8 b8 00 00 00 00 00

>25 20 w

>

 

 

Green
Offline
Зарегистрирован: 01.10.2015

Только не терминал, а монитор.) Какая то обратная польская запись у вас - обычно сначала команда, а затем параметры (от, до). И дамп покрасивше желательно - слева адрес и разделители кратные 4, не?