Память заканчивается. Варианты решения.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

sadman41 пишет:
У меня ардуина первая с 16-го года.
У меня основная, для издевательств, из набора Матрёшка 14-го года. 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Без второй платы или программатора стереть загрузчик из IDE достаточно сложно. Загонять ячейки - маловероятно.

b707
Offline
Зарегистрирован: 26.05.2017

AsNik пишет:

Нельзя "личные/локальные" библиотеки проекта в отдельную папку?

можно, у меня вот так шрифты подключены:

// Fonts includes
#include "st_fonts/UkrRusArial14.h"
#include "gfx_fonts/GlametrixLight12pt7b.h"
#include "gfx_fonts/GlametrixBold12pt7b.h"

работает в любой версии Ардуино ИДЕ

Что-то вы не так делаете

b707
Offline
Зарегистрирован: 26.05.2017

Кстати, раз у нас ветка про память, точнее про обьем кода - позволю себе вопрос по теме, насчет оптимизации размера исполняемого кода в проекте.

Если взять классический пример наследования с переопределением методов родительского класса в дочернем:

class Parent
{
public:
	virtual void X()
	{
		std::cout << "Parent!";
	}
};
 
class Child : public Parent
{
public:
	void X() override
	{
		std::cout << "Child!";
	}
 
};

правильно ли я понимаю, что в машинный код будут скомпилированы оба метода X() - и родительский и дочерний, даже если в коде используется только последний? Если да - есть ли какой-то иной метод наследования. который не тащил бы в код методы родительсткого класса там, где они не нужны?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

b707 по идее не должен (и не делает - проверил), если нет ни одного экземпляра родителя ...

код-

class Parent
{
public:
  virtual void X()
  {
    Serial.println("Child");
  }
};
 
class Child : public Parent
{
public:
  void X() override
  {
    Serial.println("Child");
  }
 
};
Child ch;
void setup() {
  Serial.begin(9600);
}

void loop() {
  ch.X();
}

C:\Windows\TEMP\arduino_build_876027/sketch_dec02a.ino.elf:     file format elf32-avr


Disassembly of section .text:

00000000 <__vectors>:
__vectors():
../../../../crt1/gcrt1.S:65
   0:	0c 94 5b 00 	jmp	0xb6	; 0xb6 <__ctors_end>
../../../../crt1/gcrt1.S:67
   4:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:68
   8:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:69
   c:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:70
  10:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:71
  14:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:72
  18:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:73
  1c:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:74
  20:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:75
  24:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:76
  28:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:77
  2c:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:78
  30:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:79
  34:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:80
  38:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:81
  3c:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:82
  40:	0c 94 c6 02 	jmp	0x58c	; 0x58c <__vector_16>
../../../../crt1/gcrt1.S:83
  44:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:84
  48:	0c 94 d0 01 	jmp	0x3a0	; 0x3a0 <__vector_18>
../../../../crt1/gcrt1.S:85
  4c:	0c 94 02 02 	jmp	0x404	; 0x404 <__vector_19>
../../../../crt1/gcrt1.S:86
  50:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:87
  54:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:88
  58:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:89
  5c:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:90
  60:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:91
  64:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:92
  68:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:93
  6c:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:94
  70:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:95
  74:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:96
  78:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:97
  7c:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:98
  80:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:99
  84:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:100
  88:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:101
  8c:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:102
  90:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:103
  94:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:104
  98:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:105
  9c:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:106
  a0:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:107
  a4:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:108
  a8:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:109
  ac:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>
../../../../crt1/gcrt1.S:110
  b0:	0c 94 83 00 	jmp	0x106	; 0x106 <__bad_interrupt>

000000b4 <__ctors_start>:
__trampolines_start():
  b4:	32 02       	muls	r19, r18

000000b6 <__ctors_end>:
__dtors_end():
../../../../crt1/gcrt1.S:230
  b6:	11 24       	eor	r1, r1
../../../../crt1/gcrt1.S:231
  b8:	1f be       	out	0x3f, r1	; 63
../../../../crt1/gcrt1.S:232
  ba:	cf ef       	ldi	r28, 0xFF	; 255
../../../../crt1/gcrt1.S:241
  bc:	d8 e0       	ldi	r29, 0x08	; 8
../../../../crt1/gcrt1.S:242
  be:	de bf       	out	0x3e, r29	; 62
../../../../crt1/gcrt1.S:244
  c0:	cd bf       	out	0x3d, r28	; 61

000000c2 <__do_copy_data>:
__do_copy_data():
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2409
  c2:	11 e0       	ldi	r17, 0x01	; 1
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2410
  c4:	a0 e0       	ldi	r26, 0x00	; 0
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2411
  c6:	b1 e0       	ldi	r27, 0x01	; 1
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2412
  c8:	ec ee       	ldi	r30, 0xEC	; 236
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2413
  ca:	f6 e0       	ldi	r31, 0x06	; 6
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2414
  cc:	02 c0       	rjmp	.+4      	; 0xd2 <__do_copy_data+0x10>
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2417
  ce:	05 90       	lpm	r0, Z+
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2422
  d0:	0d 92       	st	X+, r0
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2424
  d2:	a4 32       	cpi	r26, 0x24	; 36
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2425
  d4:	b1 07       	cpc	r27, r17
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2426
  d6:	d9 f7       	brne	.-10     	; 0xce <__do_copy_data+0xc>

000000d8 <__do_clear_bss>:
__do_clear_bss():
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2441
  d8:	21 e0       	ldi	r18, 0x01	; 1
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2442
  da:	a4 e2       	ldi	r26, 0x24	; 36
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2443
  dc:	b1 e0       	ldi	r27, 0x01	; 1
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2444
  de:	01 c0       	rjmp	.+2      	; 0xe2 <.do_clear_bss_start>

000000e0 <.do_clear_bss_loop>:
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2446
  e0:	1d 92       	st	X+, r1

000000e2 <.do_clear_bss_start>:
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2448
  e2:	aa 3c       	cpi	r26, 0xCA	; 202
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2449
  e4:	b2 07       	cpc	r27, r18
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2450
  e6:	e1 f7       	brne	.-8      	; 0xe0 <.do_clear_bss_loop>

000000e8 <__do_global_ctors>:
__do_global_ctors():
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2466
  e8:	10 e0       	ldi	r17, 0x00	; 0
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2467
  ea:	cb e5       	ldi	r28, 0x5B	; 91
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2468
  ec:	d0 e0       	ldi	r29, 0x00	; 0
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2472
  ee:	04 c0       	rjmp	.+8      	; 0xf8 <__do_global_ctors+0x10>
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2474
  f0:	21 97       	sbiw	r28, 0x01	; 1
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2480
  f2:	fe 01       	movw	r30, r28
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2481
  f4:	0e 94 6e 03 	call	0x6dc	; 0x6dc <__tablejump2__>
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2483
  f8:	ca 35       	cpi	r28, 0x5A	; 90
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2484
  fa:	d1 07       	cpc	r29, r17
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2489
  fc:	c9 f7       	brne	.-14     	; 0xf0 <__do_global_ctors+0x8>
../../../../crt1/gcrt1.S:314
  fe:	0e 94 b7 02 	call	0x56e	; 0x56e <main>
../../../../crt1/gcrt1.S:315
 102:	0c 94 74 03 	jmp	0x6e8	; 0x6e8 <_exit>

00000106 <__bad_interrupt>:
__vector_38():
../../../../crt1/gcrt1.S:209
 106:	0c 94 00 00 	jmp	0	; 0x0 <__vectors>

0000010a <Child::X()>:
_ZN5Child1XEv():
C:\Windows\TEMP\arduino_modified_sketch_577453/sketch_dec02a.ino:15
class Child : public Parent
{
public:
  void X() override
  {
    Serial.println("Child");
 10a:	62 e0       	ldi	r22, 0x02	; 2
 10c:	71 e0       	ldi	r23, 0x01	; 1
 10e:	84 e2       	ldi	r24, 0x24	; 36
 110:	91 e0       	ldi	r25, 0x01	; 1
 112:	0c 94 9f 02 	jmp	0x53e	; 0x53e <Print::println(char const*)>

00000116 <setup>:
_ZN14HardwareSerial5beginEm():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.h:121
  public:
    inline HardwareSerial(
      volatile uint8_t *ubrrh, volatile uint8_t *ubrrl,
      volatile uint8_t *ucsra, volatile uint8_t *ucsrb,
      volatile uint8_t *ucsrc, volatile uint8_t *udr);
    void begin(unsigned long baud) { begin(baud, SERIAL_8N1); }
 116:	26 e0       	ldi	r18, 0x06	; 6
 118:	40 e8       	ldi	r20, 0x80	; 128
 11a:	55 e2       	ldi	r21, 0x25	; 37
 11c:	60 e0       	ldi	r22, 0x00	; 0
 11e:	70 e0       	ldi	r23, 0x00	; 0
 120:	84 e2       	ldi	r24, 0x24	; 36
 122:	91 e0       	ldi	r25, 0x01	; 1
 124:	0c 94 78 01 	jmp	0x2f0	; 0x2f0 <HardwareSerial::begin(unsigned long, unsigned char)>

00000128 <loop>:
loop():
C:\Windows\TEMP\arduino_modified_sketch_577453/sketch_dec02a.ino:25
void setup() {
  Serial.begin(9600);
}

void loop() {
  ch.X();
 128:	80 e0       	ldi	r24, 0x00	; 0
 12a:	91 e0       	ldi	r25, 0x01	; 1
 12c:	0c 94 85 00 	jmp	0x10a	; 0x10a <Child::X()>

00000130 <HardwareSerial::available()>:
_ZN14HardwareSerial9availableEv():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:150
  // clear any received data
  _rx_buffer_head = _rx_buffer_tail;
}

int HardwareSerial::available(void)
{
 130:	fc 01       	movw	r30, r24
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:151
  return ((unsigned int)(SERIAL_RX_BUFFER_SIZE + _rx_buffer_head - _rx_buffer_tail)) % SERIAL_RX_BUFFER_SIZE;
 132:	91 8d       	ldd	r25, Z+25	; 0x19
 134:	22 8d       	ldd	r18, Z+26	; 0x1a
 136:	89 2f       	mov	r24, r25
 138:	90 e0       	ldi	r25, 0x00	; 0
 13a:	80 5c       	subi	r24, 0xC0	; 192
 13c:	9f 4f       	sbci	r25, 0xFF	; 255
 13e:	82 1b       	sub	r24, r18
 140:	91 09       	sbc	r25, r1
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:152
}
 142:	8f 73       	andi	r24, 0x3F	; 63
 144:	99 27       	eor	r25, r25
 146:	08 95       	ret

00000148 <HardwareSerial::peek()>:
_ZN14HardwareSerial4peekEv():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:155

int HardwareSerial::peek(void)
{
 148:	fc 01       	movw	r30, r24
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:156
  if (_rx_buffer_head == _rx_buffer_tail) {
 14a:	91 8d       	ldd	r25, Z+25	; 0x19
 14c:	82 8d       	ldd	r24, Z+26	; 0x1a
 14e:	98 17       	cp	r25, r24
 150:	31 f0       	breq	.+12     	; 0x15e <HardwareSerial::peek()+0x16>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:159
    return -1;
  } else {
    return _rx_buffer[_rx_buffer_tail];
 152:	82 8d       	ldd	r24, Z+26	; 0x1a
 154:	e8 0f       	add	r30, r24
 156:	f1 1d       	adc	r31, r1
 158:	85 8d       	ldd	r24, Z+29	; 0x1d
 15a:	90 e0       	ldi	r25, 0x00	; 0
 15c:	08 95       	ret
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:157
}

int HardwareSerial::peek(void)
{
  if (_rx_buffer_head == _rx_buffer_tail) {
    return -1;
 15e:	8f ef       	ldi	r24, 0xFF	; 255
 160:	9f ef       	ldi	r25, 0xFF	; 255
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:161
  } else {
    return _rx_buffer[_rx_buffer_tail];
  }
}
 162:	08 95       	ret

00000164 <HardwareSerial::read()>:
_ZN14HardwareSerial4readEv():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:164

int HardwareSerial::read(void)
{
 164:	fc 01       	movw	r30, r24
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:166
  // if the head isn't ahead of the tail, we don't have any characters
  if (_rx_buffer_head == _rx_buffer_tail) {
 166:	91 8d       	ldd	r25, Z+25	; 0x19
 168:	82 8d       	ldd	r24, Z+26	; 0x1a
 16a:	98 17       	cp	r25, r24
 16c:	61 f0       	breq	.+24     	; 0x186 <HardwareSerial::read()+0x22>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:169
    return -1;
  } else {
    unsigned char c = _rx_buffer[_rx_buffer_tail];
 16e:	a2 8d       	ldd	r26, Z+26	; 0x1a
 170:	ae 0f       	add	r26, r30
 172:	bf 2f       	mov	r27, r31
 174:	b1 1d       	adc	r27, r1
 176:	5d 96       	adiw	r26, 0x1d	; 29
 178:	8c 91       	ld	r24, X
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:170
    _rx_buffer_tail = (rx_buffer_index_t)(_rx_buffer_tail + 1) % SERIAL_RX_BUFFER_SIZE;
 17a:	92 8d       	ldd	r25, Z+26	; 0x1a
 17c:	9f 5f       	subi	r25, 0xFF	; 255
 17e:	9f 73       	andi	r25, 0x3F	; 63
 180:	92 8f       	std	Z+26, r25	; 0x1a
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:171
    return c;
 182:	90 e0       	ldi	r25, 0x00	; 0
 184:	08 95       	ret
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:167

int HardwareSerial::read(void)
{
  // if the head isn't ahead of the tail, we don't have any characters
  if (_rx_buffer_head == _rx_buffer_tail) {
    return -1;
 186:	8f ef       	ldi	r24, 0xFF	; 255
 188:	9f ef       	ldi	r25, 0xFF	; 255
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:173
  } else {
    unsigned char c = _rx_buffer[_rx_buffer_tail];
    _rx_buffer_tail = (rx_buffer_index_t)(_rx_buffer_tail + 1) % SERIAL_RX_BUFFER_SIZE;
    return c;
  }
}
 18a:	08 95       	ret

0000018c <HardwareSerial::availableForWrite()>:
_ZN14HardwareSerial17availableForWriteEv():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:181
{
#if (SERIAL_TX_BUFFER_SIZE>256)
  uint8_t oldSREG = SREG;
  cli();
#endif
  tx_buffer_index_t head = _tx_buffer_head;
 18c:	fc 01       	movw	r30, r24
 18e:	53 8d       	ldd	r21, Z+27	; 0x1b
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:182
  tx_buffer_index_t tail = _tx_buffer_tail;
 190:	44 8d       	ldd	r20, Z+28	; 0x1c
 192:	25 2f       	mov	r18, r21
 194:	30 e0       	ldi	r19, 0x00	; 0
 196:	84 2f       	mov	r24, r20
 198:	90 e0       	ldi	r25, 0x00	; 0
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:186
#if (SERIAL_TX_BUFFER_SIZE>256)
  SREG = oldSREG;
#endif
  if (head >= tail) return SERIAL_TX_BUFFER_SIZE - 1 - head + tail;
 19a:	82 1b       	sub	r24, r18
 19c:	93 0b       	sbc	r25, r19
 19e:	54 17       	cp	r21, r20
 1a0:	10 f0       	brcs	.+4      	; 0x1a6 <HardwareSerial::availableForWrite()+0x1a>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:186 (discriminator 1)
 1a2:	cf 96       	adiw	r24, 0x3f	; 63
 1a4:	08 95       	ret
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:187
  return tail - head - 1;
 1a6:	01 97       	sbiw	r24, 0x01	; 1
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:188
}
 1a8:	08 95       	ret

000001aa <serialEventRun()>:
_Z14serialEventRunv():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:66
#endif

void serialEventRun(void)
{
#if defined(HAVE_HWSERIAL0)
  if (Serial0_available && serialEvent && Serial0_available()) serialEvent();
 1aa:	88 e2       	ldi	r24, 0x28	; 40
 1ac:	92 e0       	ldi	r25, 0x02	; 2
 1ae:	89 2b       	or	r24, r25
 1b0:	49 f0       	breq	.+18     	; 0x1c4 <serialEventRun()+0x1a>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:66 (discriminator 1)
 1b2:	80 e0       	ldi	r24, 0x00	; 0
 1b4:	90 e0       	ldi	r25, 0x00	; 0
 1b6:	89 2b       	or	r24, r25
 1b8:	29 f0       	breq	.+10     	; 0x1c4 <serialEventRun()+0x1a>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:66 (discriminator 3)
 1ba:	0e 94 28 02 	call	0x450	; 0x450 <Serial0_available()>
 1be:	81 11       	cpse	r24, r1
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:66
 1c0:	0e 94 00 00 	call	0	; 0x0 <__vectors>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:69
#endif
#if defined(HAVE_HWSERIAL1)
  if (Serial1_available && serialEvent1 && Serial1_available()) serialEvent1();
 1c4:	80 e0       	ldi	r24, 0x00	; 0
 1c6:	90 e0       	ldi	r25, 0x00	; 0
 1c8:	89 2b       	or	r24, r25
 1ca:	49 f0       	breq	.+18     	; 0x1de <serialEventRun()+0x34>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:69 (discriminator 1)
 1cc:	80 e0       	ldi	r24, 0x00	; 0
 1ce:	90 e0       	ldi	r25, 0x00	; 0
 1d0:	89 2b       	or	r24, r25
 1d2:	29 f0       	breq	.+10     	; 0x1de <serialEventRun()+0x34>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:69 (discriminator 3)
 1d4:	0e 94 00 00 	call	0	; 0x0 <__vectors>
 1d8:	81 11       	cpse	r24, r1
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:69
 1da:	0c 94 00 00 	jmp	0	; 0x0 <__vectors>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:77
  if (Serial2_available && serialEvent2 && Serial2_available()) serialEvent2();
#endif
#if defined(HAVE_HWSERIAL3)
  if (Serial3_available && serialEvent3 && Serial3_available()) serialEvent3();
#endif
}
 1de:	08 95       	ret

000001e0 <HardwareSerial::_tx_udr_empty_irq()>:
_ZN14HardwareSerial17_tx_udr_empty_irqEv():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:82

// Actual interrupt handlers //////////////////////////////////////////////////////////////

void HardwareSerial::_tx_udr_empty_irq(void)
{
 1e0:	fc 01       	movw	r30, r24
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:85
  // If interrupts are enabled, there must be more data in the output
  // buffer. Send the next byte
  unsigned char c = _tx_buffer[_tx_buffer_tail];
 1e2:	a4 8d       	ldd	r26, Z+28	; 0x1c
 1e4:	a8 0f       	add	r26, r24
 1e6:	b9 2f       	mov	r27, r25
 1e8:	b1 1d       	adc	r27, r1
 1ea:	a3 5a       	subi	r26, 0xA3	; 163
 1ec:	bf 4f       	sbci	r27, 0xFF	; 255
 1ee:	2c 91       	ld	r18, X
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:86
  _tx_buffer_tail = (_tx_buffer_tail + 1) % SERIAL_TX_BUFFER_SIZE;
 1f0:	84 8d       	ldd	r24, Z+28	; 0x1c
 1f2:	90 e0       	ldi	r25, 0x00	; 0
 1f4:	01 96       	adiw	r24, 0x01	; 1
 1f6:	8f 73       	andi	r24, 0x3F	; 63
 1f8:	99 27       	eor	r25, r25
 1fa:	84 8f       	std	Z+28, r24	; 0x1c
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:88

  *_udr = c;
 1fc:	a6 89       	ldd	r26, Z+22	; 0x16
 1fe:	b7 89       	ldd	r27, Z+23	; 0x17
 200:	2c 93       	st	X, r18
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:93

  // clear the TXC bit -- "can be cleared by writing a one to its bit
  // location". This makes sure flush() won't return until the bytes
  // actually got written
  *_ucsra |= _BV(TXC0);
 202:	a0 89       	ldd	r26, Z+16	; 0x10
 204:	b1 89       	ldd	r27, Z+17	; 0x11
 206:	8c 91       	ld	r24, X
 208:	80 64       	ori	r24, 0x40	; 64
 20a:	8c 93       	st	X, r24
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:95

  if (_tx_buffer_head == _tx_buffer_tail) {
 20c:	93 8d       	ldd	r25, Z+27	; 0x1b
 20e:	84 8d       	ldd	r24, Z+28	; 0x1c
 210:	98 13       	cpse	r25, r24
 212:	06 c0       	rjmp	.+12     	; 0x220 <HardwareSerial::_tx_udr_empty_irq()+0x40>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:97
    // Buffer empty, so disable interrupts
    *_ucsrb &= ~_BV(UDRIE0);
 214:	02 88       	ldd	r0, Z+18	; 0x12
 216:	f3 89       	ldd	r31, Z+19	; 0x13
 218:	e0 2d       	mov	r30, r0
 21a:	80 81       	ld	r24, Z
 21c:	8f 7d       	andi	r24, 0xDF	; 223
 21e:	80 83       	st	Z, r24
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:99
  }
}
 220:	08 95       	ret

00000222 <HardwareSerial::flush()>:
_ZN14HardwareSerial5flushEv():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:191
  if (head >= tail) return SERIAL_TX_BUFFER_SIZE - 1 - head + tail;
  return tail - head - 1;
}

void HardwareSerial::flush()
{
 222:	cf 93       	push	r28
 224:	df 93       	push	r29
 226:	ec 01       	movw	r28, r24
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:195
  // If we have never written a byte, no need to flush. This special
  // case is needed since there is no way to force the TXC (transmit
  // complete) bit to 1 during initialization
  if (!_written)
 228:	88 8d       	ldd	r24, Y+24	; 0x18
 22a:	88 23       	and	r24, r24
 22c:	b9 f0       	breq	.+46     	; 0x25c <HardwareSerial::flush()+0x3a>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:198
    return;

  while (bit_is_set(*_ucsrb, UDRIE0) || bit_is_clear(*_ucsra, TXC0)) {
 22e:	aa 89       	ldd	r26, Y+18	; 0x12
 230:	bb 89       	ldd	r27, Y+19	; 0x13
 232:	e8 89       	ldd	r30, Y+16	; 0x10
 234:	f9 89       	ldd	r31, Y+17	; 0x11
 236:	8c 91       	ld	r24, X
 238:	85 fd       	sbrc	r24, 5
 23a:	03 c0       	rjmp	.+6      	; 0x242 <HardwareSerial::flush()+0x20>
 23c:	80 81       	ld	r24, Z
 23e:	86 fd       	sbrc	r24, 6
 240:	0d c0       	rjmp	.+26     	; 0x25c <HardwareSerial::flush()+0x3a>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:199
    if (bit_is_clear(SREG, SREG_I) && bit_is_set(*_ucsrb, UDRIE0))
 242:	0f b6       	in	r0, 0x3f	; 63
 244:	07 fc       	sbrc	r0, 7
 246:	f7 cf       	rjmp	.-18     	; 0x236 <HardwareSerial::flush()+0x14>
 248:	8c 91       	ld	r24, X
 24a:	85 ff       	sbrs	r24, 5
 24c:	f2 cf       	rjmp	.-28     	; 0x232 <HardwareSerial::flush()+0x10>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:203
      // Interrupts are globally disabled, but the DR empty
      // interrupt should be enabled, so poll the DR empty flag to
      // prevent deadlock
      if (bit_is_set(*_ucsra, UDRE0))
 24e:	80 81       	ld	r24, Z
 250:	85 ff       	sbrs	r24, 5
 252:	ed cf       	rjmp	.-38     	; 0x22e <HardwareSerial::flush()+0xc>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:204
        _tx_udr_empty_irq();
 254:	ce 01       	movw	r24, r28
 256:	0e 94 f0 00 	call	0x1e0	; 0x1e0 <HardwareSerial::_tx_udr_empty_irq()>
 25a:	e9 cf       	rjmp	.-46     	; 0x22e <HardwareSerial::flush()+0xc>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:208
  }
  // If we get here, nothing is queued anymore (DRIE is disabled) and
  // the hardware finished tranmission (TXC is set).
}
 25c:	df 91       	pop	r29
 25e:	cf 91       	pop	r28
 260:	08 95       	ret

00000262 <HardwareSerial::write(unsigned char)>:
_ZN14HardwareSerial5writeEh():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:211

size_t HardwareSerial::write(uint8_t c)
{
 262:	ef 92       	push	r14
 264:	ff 92       	push	r15
 266:	0f 93       	push	r16
 268:	1f 93       	push	r17
 26a:	cf 93       	push	r28
 26c:	df 93       	push	r29
 26e:	ec 01       	movw	r28, r24
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:212
  _written = true;
 270:	81 e0       	ldi	r24, 0x01	; 1
 272:	88 8f       	std	Y+24, r24	; 0x18
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:217
  // If the buffer and the data register is empty, just write the byte
  // to the data register and be done. This shortcut helps
  // significantly improve the effective datarate at high (>
  // 500kbit/s) bitrates, where interrupt overhead becomes a slowdown.
  if (_tx_buffer_head == _tx_buffer_tail && bit_is_set(*_ucsra, UDRE0)) {
 274:	9b 8d       	ldd	r25, Y+27	; 0x1b
 276:	8c 8d       	ldd	r24, Y+28	; 0x1c
 278:	98 13       	cpse	r25, r24
 27a:	16 c0       	rjmp	.+44     	; 0x2a8 <HardwareSerial::write(unsigned char)+0x46>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:217 (discriminator 1)
 27c:	e8 89       	ldd	r30, Y+16	; 0x10
 27e:	f9 89       	ldd	r31, Y+17	; 0x11
 280:	80 81       	ld	r24, Z
 282:	85 ff       	sbrs	r24, 5
 284:	11 c0       	rjmp	.+34     	; 0x2a8 <HardwareSerial::write(unsigned char)+0x46>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:218
    *_udr = c;
 286:	ee 89       	ldd	r30, Y+22	; 0x16
 288:	ff 89       	ldd	r31, Y+23	; 0x17
 28a:	60 83       	st	Z, r22
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:219
    *_ucsra |= _BV(TXC0);
 28c:	e8 89       	ldd	r30, Y+16	; 0x10
 28e:	f9 89       	ldd	r31, Y+17	; 0x11
 290:	80 81       	ld	r24, Z
 292:	80 64       	ori	r24, 0x40	; 64
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:242
  }

  _tx_buffer[_tx_buffer_head] = c;
  _tx_buffer_head = i;

  *_ucsrb |= _BV(UDRIE0);
 294:	80 83       	st	Z, r24
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:245
  
  return 1;
}
 296:	81 e0       	ldi	r24, 0x01	; 1
 298:	90 e0       	ldi	r25, 0x00	; 0
 29a:	df 91       	pop	r29
 29c:	cf 91       	pop	r28
 29e:	1f 91       	pop	r17
 2a0:	0f 91       	pop	r16
 2a2:	ff 90       	pop	r15
 2a4:	ef 90       	pop	r14
 2a6:	08 95       	ret
 2a8:	f6 2e       	mov	r15, r22
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:222
  if (_tx_buffer_head == _tx_buffer_tail && bit_is_set(*_ucsra, UDRE0)) {
    *_udr = c;
    *_ucsra |= _BV(TXC0);
    return 1;
  }
  tx_buffer_index_t i = (_tx_buffer_head + 1) % SERIAL_TX_BUFFER_SIZE;
 2aa:	0b 8d       	ldd	r16, Y+27	; 0x1b
 2ac:	10 e0       	ldi	r17, 0x00	; 0
 2ae:	0f 5f       	subi	r16, 0xFF	; 255
 2b0:	1f 4f       	sbci	r17, 0xFF	; 255
 2b2:	0f 73       	andi	r16, 0x3F	; 63
 2b4:	11 27       	eor	r17, r17
 2b6:	e0 2e       	mov	r14, r16
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:226

  // If the output buffer is full, there's nothing for it other than to 
  // wait for the interrupt handler to empty it a bit
  while (i == _tx_buffer_tail) {
 2b8:	8c 8d       	ldd	r24, Y+28	; 0x1c
 2ba:	8e 11       	cpse	r24, r14
 2bc:	0c c0       	rjmp	.+24     	; 0x2d6 <HardwareSerial::write(unsigned char)+0x74>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:227
    if (bit_is_clear(SREG, SREG_I)) {
 2be:	0f b6       	in	r0, 0x3f	; 63
 2c0:	07 fc       	sbrc	r0, 7
 2c2:	fa cf       	rjmp	.-12     	; 0x2b8 <HardwareSerial::write(unsigned char)+0x56>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:232
      // Interrupts are disabled, so we'll have to poll the data
      // register empty flag ourselves. If it is set, pretend an
      // interrupt has happened and call the handler to free up
      // space for us.
      if(bit_is_set(*_ucsra, UDRE0))
 2c4:	e8 89       	ldd	r30, Y+16	; 0x10
 2c6:	f9 89       	ldd	r31, Y+17	; 0x11
 2c8:	80 81       	ld	r24, Z
 2ca:	85 ff       	sbrs	r24, 5
 2cc:	f5 cf       	rjmp	.-22     	; 0x2b8 <HardwareSerial::write(unsigned char)+0x56>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:233
        _tx_udr_empty_irq();
 2ce:	ce 01       	movw	r24, r28
 2d0:	0e 94 f0 00 	call	0x1e0	; 0x1e0 <HardwareSerial::_tx_udr_empty_irq()>
 2d4:	f1 cf       	rjmp	.-30     	; 0x2b8 <HardwareSerial::write(unsigned char)+0x56>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:239
    } else {
      // nop, the interrupt handler will free up space for us
    }
  }

  _tx_buffer[_tx_buffer_head] = c;
 2d6:	eb 8d       	ldd	r30, Y+27	; 0x1b
 2d8:	ec 0f       	add	r30, r28
 2da:	fd 2f       	mov	r31, r29
 2dc:	f1 1d       	adc	r31, r1
 2de:	e3 5a       	subi	r30, 0xA3	; 163
 2e0:	ff 4f       	sbci	r31, 0xFF	; 255
 2e2:	f0 82       	st	Z, r15
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:240
  _tx_buffer_head = i;
 2e4:	0b 8f       	std	Y+27, r16	; 0x1b
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:242

  *_ucsrb |= _BV(UDRIE0);
 2e6:	ea 89       	ldd	r30, Y+18	; 0x12
 2e8:	fb 89       	ldd	r31, Y+19	; 0x13
 2ea:	80 81       	ld	r24, Z
 2ec:	80 62       	ori	r24, 0x20	; 32
 2ee:	d2 cf       	rjmp	.-92     	; 0x294 <HardwareSerial::write(unsigned char)+0x32>

000002f0 <HardwareSerial::begin(unsigned long, unsigned char)>:
_ZN14HardwareSerial5beginEmh():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:104
}

// Public Methods //////////////////////////////////////////////////////////////

void HardwareSerial::begin(unsigned long baud, byte config)
{
 2f0:	cf 92       	push	r12
 2f2:	df 92       	push	r13
 2f4:	ef 92       	push	r14
 2f6:	ff 92       	push	r15
 2f8:	1f 93       	push	r17
 2fa:	cf 93       	push	r28
 2fc:	df 93       	push	r29
 2fe:	ec 01       	movw	r28, r24
 300:	6a 01       	movw	r12, r20
 302:	7b 01       	movw	r14, r22
 304:	12 2f       	mov	r17, r18
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:107
  // Try u2x mode first
  uint16_t baud_setting = (F_CPU / 4 / baud - 1) / 2;
  *_ucsra = 1 << U2X0;
 306:	e8 89       	ldd	r30, Y+16	; 0x10
 308:	f9 89       	ldd	r31, Y+17	; 0x11
 30a:	82 e0       	ldi	r24, 0x02	; 2
 30c:	80 83       	st	Z, r24
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:114
  // hardcoded exception for 57600 for compatibility with the bootloader
  // shipped with the Duemilanove and previous boards and the firmware
  // on the 8U2 on the Uno and Mega 2560. Also, The baud_setting cannot
  // be > 4095, so switch back to non-u2x mode if the baud rate is too
  // low.
  if (((F_CPU == 16000000UL) && (baud == 57600)) || (baud_setting >4095))
 30e:	c1 14       	cp	r12, r1
 310:	81 ee       	ldi	r24, 0xE1	; 225
 312:	d8 06       	cpc	r13, r24
 314:	e1 04       	cpc	r14, r1
 316:	f1 04       	cpc	r15, r1
 318:	a1 f0       	breq	.+40     	; 0x342 <HardwareSerial::begin(unsigned long, unsigned char)+0x52>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:106 (discriminator 1)
// Public Methods //////////////////////////////////////////////////////////////

void HardwareSerial::begin(unsigned long baud, byte config)
{
  // Try u2x mode first
  uint16_t baud_setting = (F_CPU / 4 / baud - 1) / 2;
 31a:	60 e0       	ldi	r22, 0x00	; 0
 31c:	79 e0       	ldi	r23, 0x09	; 9
 31e:	8d e3       	ldi	r24, 0x3D	; 61
 320:	90 e0       	ldi	r25, 0x00	; 0
 322:	a7 01       	movw	r20, r14
 324:	96 01       	movw	r18, r12
 326:	0e 94 4c 03 	call	0x698	; 0x698 <__udivmodsi4>
 32a:	21 50       	subi	r18, 0x01	; 1
 32c:	31 09       	sbc	r19, r1
 32e:	41 09       	sbc	r20, r1
 330:	51 09       	sbc	r21, r1
 332:	56 95       	lsr	r21
 334:	47 95       	ror	r20
 336:	37 95       	ror	r19
 338:	27 95       	ror	r18
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:114 (discriminator 1)
  // hardcoded exception for 57600 for compatibility with the bootloader
  // shipped with the Duemilanove and previous boards and the firmware
  // on the 8U2 on the Uno and Mega 2560. Also, The baud_setting cannot
  // be > 4095, so switch back to non-u2x mode if the baud rate is too
  // low.
  if (((F_CPU == 16000000UL) && (baud == 57600)) || (baud_setting >4095))
 33a:	21 15       	cp	r18, r1
 33c:	80 e1       	ldi	r24, 0x10	; 16
 33e:	38 07       	cpc	r19, r24
 340:	98 f0       	brcs	.+38     	; 0x368 <HardwareSerial::begin(unsigned long, unsigned char)+0x78>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:116
  {
    *_ucsra = 0;
 342:	e8 89       	ldd	r30, Y+16	; 0x10
 344:	f9 89       	ldd	r31, Y+17	; 0x11
 346:	10 82       	st	Z, r1
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:117
    baud_setting = (F_CPU / 8 / baud - 1) / 2;
 348:	60 e8       	ldi	r22, 0x80	; 128
 34a:	74 e8       	ldi	r23, 0x84	; 132
 34c:	8e e1       	ldi	r24, 0x1E	; 30
 34e:	90 e0       	ldi	r25, 0x00	; 0
 350:	a7 01       	movw	r20, r14
 352:	96 01       	movw	r18, r12
 354:	0e 94 4c 03 	call	0x698	; 0x698 <__udivmodsi4>
 358:	21 50       	subi	r18, 0x01	; 1
 35a:	31 09       	sbc	r19, r1
 35c:	41 09       	sbc	r20, r1
 35e:	51 09       	sbc	r21, r1
 360:	56 95       	lsr	r21
 362:	47 95       	ror	r20
 364:	37 95       	ror	r19
 366:	27 95       	ror	r18
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:121
  }

  // assign the baud_setting, a.k.a. ubrr (USART Baud Rate Register)
  *_ubrrh = baud_setting >> 8;
 368:	ec 85       	ldd	r30, Y+12	; 0x0c
 36a:	fd 85       	ldd	r31, Y+13	; 0x0d
 36c:	30 83       	st	Z, r19
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:122
  *_ubrrl = baud_setting;
 36e:	ee 85       	ldd	r30, Y+14	; 0x0e
 370:	ff 85       	ldd	r31, Y+15	; 0x0f
 372:	20 83       	st	Z, r18
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:124

  _written = false;
 374:	18 8e       	std	Y+24, r1	; 0x18
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:132
#if defined(__AVR_ATmega8__) || defined(__AVR_ATmega8515__) || defined(__AVR_ATmega162__) \
|| defined(__AVR_ATmega8535__) || defined(__AVR_ATmega16__)|| defined(__AVR_ATmega32__)   \
|| defined(__AVR_ATmega162__)
  config |= 0x80; // select UCSRC register (shared with UBRRH)
#endif
  *_ucsrc = config;
 376:	ec 89       	ldd	r30, Y+20	; 0x14
 378:	fd 89       	ldd	r31, Y+21	; 0x15
 37a:	10 83       	st	Z, r17
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:134
  
  *_ucsrb |= _BV(RXEN0) | _BV(TXEN0) | _BV(RXCIE0);
 37c:	ea 89       	ldd	r30, Y+18	; 0x12
 37e:	fb 89       	ldd	r31, Y+19	; 0x13
 380:	80 81       	ld	r24, Z
 382:	88 69       	ori	r24, 0x98	; 152
 384:	80 83       	st	Z, r24
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:135
  *_ucsrb &= ~_BV(UDRIE0);
 386:	ea 89       	ldd	r30, Y+18	; 0x12
 388:	fb 89       	ldd	r31, Y+19	; 0x13
 38a:	80 81       	ld	r24, Z
 38c:	8f 7d       	andi	r24, 0xDF	; 223
 38e:	80 83       	st	Z, r24
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial.cpp:136
}
 390:	df 91       	pop	r29
 392:	cf 91       	pop	r28
 394:	1f 91       	pop	r17
 396:	ff 90       	pop	r15
 398:	ef 90       	pop	r14
 39a:	df 90       	pop	r13
 39c:	cf 90       	pop	r12
 39e:	08 95       	ret

000003a0 <__vector_18>:
__vector_18():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial0.cpp:50
#elif defined(USART_RXC_vect)
  ISR(USART_RXC_vect)
#else
  #error "Don't know what the Data Received vector is called for Serial"
#endif
  {
 3a0:	1f 92       	push	r1
 3a2:	0f 92       	push	r0
 3a4:	0f b6       	in	r0, 0x3f	; 63
 3a6:	0f 92       	push	r0
 3a8:	11 24       	eor	r1, r1
 3aa:	2f 93       	push	r18
 3ac:	8f 93       	push	r24
 3ae:	9f 93       	push	r25
 3b0:	ef 93       	push	r30
 3b2:	ff 93       	push	r31
_ZN14HardwareSerial16_rx_complete_irqEv():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial_private.h:103

// Actual interrupt handlers //////////////////////////////////////////////////////////////

void HardwareSerial::_rx_complete_irq(void)
{
  if (bit_is_clear(*_ucsra, UPE0)) {
 3b4:	e0 91 34 01 	lds	r30, 0x0134	; 0x800134 <__data_end+0x10>
 3b8:	f0 91 35 01 	lds	r31, 0x0135	; 0x800135 <__data_end+0x11>
 3bc:	80 81       	ld	r24, Z
 3be:	e0 91 3a 01 	lds	r30, 0x013A	; 0x80013a <__data_end+0x16>
 3c2:	f0 91 3b 01 	lds	r31, 0x013B	; 0x80013b <__data_end+0x17>
 3c6:	82 fd       	sbrc	r24, 2
 3c8:	1b c0       	rjmp	.+54     	; 0x400 <__EEPROM_REGION_LENGTH__>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial_private.h:106
    // No Parity error, read byte and store it in the buffer if there is
    // room
    unsigned char c = *_udr;
 3ca:	90 81       	ld	r25, Z
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial_private.h:107
    rx_buffer_index_t i = (unsigned int)(_rx_buffer_head + 1) % SERIAL_RX_BUFFER_SIZE;
 3cc:	80 91 3d 01 	lds	r24, 0x013D	; 0x80013d <__data_end+0x19>
 3d0:	8f 5f       	subi	r24, 0xFF	; 255
 3d2:	8f 73       	andi	r24, 0x3F	; 63
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial_private.h:113

    // if we should be storing the received character into the location
    // just before the tail (meaning that the head would advance to the
    // current location of the tail), we're about to overflow the buffer
    // and so we don't write the character or advance the head.
    if (i != _rx_buffer_tail) {
 3d4:	20 91 3e 01 	lds	r18, 0x013E	; 0x80013e <__data_end+0x1a>
 3d8:	82 17       	cp	r24, r18
 3da:	41 f0       	breq	.+16     	; 0x3ec <__vector_18+0x4c>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial_private.h:114
      _rx_buffer[_rx_buffer_head] = c;
 3dc:	e0 91 3d 01 	lds	r30, 0x013D	; 0x80013d <__data_end+0x19>
 3e0:	f0 e0       	ldi	r31, 0x00	; 0
 3e2:	ec 5d       	subi	r30, 0xDC	; 220
 3e4:	fe 4f       	sbci	r31, 0xFE	; 254
 3e6:	95 8f       	std	Z+29, r25	; 0x1d
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial_private.h:115
      _rx_buffer_head = i;
 3e8:	80 93 3d 01 	sts	0x013D, r24	; 0x80013d <__data_end+0x19>
__vector_18():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial0.cpp:52
    Serial._rx_complete_irq();
  }
 3ec:	ff 91       	pop	r31
 3ee:	ef 91       	pop	r30
 3f0:	9f 91       	pop	r25
 3f2:	8f 91       	pop	r24
 3f4:	2f 91       	pop	r18
 3f6:	0f 90       	pop	r0
 3f8:	0f be       	out	0x3f, r0	; 63
 3fa:	0f 90       	pop	r0
 3fc:	1f 90       	pop	r1
 3fe:	18 95       	reti
_ZN14HardwareSerial16_rx_complete_irqEv():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial_private.h:119
    }
  } else {
    // Parity error, read byte but discard it
    *_udr;
 400:	80 81       	ld	r24, Z
__vector_18():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial0.cpp:52
 402:	f4 cf       	rjmp	.-24     	; 0x3ec <__vector_18+0x4c>

00000404 <__vector_19>:
__vector_19():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial0.cpp:63
#elif defined(USART0_UDRE_vect)
ISR(USART0_UDRE_vect)
#else
  #error "Don't know what the Data Register Empty vector is called for Serial"
#endif
{
 404:	1f 92       	push	r1
 406:	0f 92       	push	r0
 408:	0f b6       	in	r0, 0x3f	; 63
 40a:	0f 92       	push	r0
 40c:	11 24       	eor	r1, r1
 40e:	2f 93       	push	r18
 410:	3f 93       	push	r19
 412:	4f 93       	push	r20
 414:	5f 93       	push	r21
 416:	6f 93       	push	r22
 418:	7f 93       	push	r23
 41a:	8f 93       	push	r24
 41c:	9f 93       	push	r25
 41e:	af 93       	push	r26
 420:	bf 93       	push	r27
 422:	ef 93       	push	r30
 424:	ff 93       	push	r31
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial0.cpp:64
  Serial._tx_udr_empty_irq();
 426:	84 e2       	ldi	r24, 0x24	; 36
 428:	91 e0       	ldi	r25, 0x01	; 1
 42a:	0e 94 f0 00 	call	0x1e0	; 0x1e0 <HardwareSerial::_tx_udr_empty_irq()>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial0.cpp:65
}
 42e:	ff 91       	pop	r31
 430:	ef 91       	pop	r30
 432:	bf 91       	pop	r27
 434:	af 91       	pop	r26
 436:	9f 91       	pop	r25
 438:	8f 91       	pop	r24
 43a:	7f 91       	pop	r23
 43c:	6f 91       	pop	r22
 43e:	5f 91       	pop	r21
 440:	4f 91       	pop	r20
 442:	3f 91       	pop	r19
 444:	2f 91       	pop	r18
 446:	0f 90       	pop	r0
 448:	0f be       	out	0x3f, r0	; 63
 44a:	0f 90       	pop	r0
 44c:	1f 90       	pop	r1
 44e:	18 95       	reti

00000450 <Serial0_available()>:
_Z17Serial0_availablev():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial0.cpp:76
#endif

// Function that can be weakly referenced by serialEventRun to prevent
// pulling in this file if it's not otherwise used.
bool Serial0_available() {
  return Serial.available();
 450:	84 e2       	ldi	r24, 0x24	; 36
 452:	91 e0       	ldi	r25, 0x01	; 1
 454:	0e 94 98 00 	call	0x130	; 0x130 <HardwareSerial::available()>
 458:	21 e0       	ldi	r18, 0x01	; 1
 45a:	89 2b       	or	r24, r25
 45c:	09 f4       	brne	.+2      	; 0x460 <Serial0_available()+0x10>
 45e:	20 e0       	ldi	r18, 0x00	; 0
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial0.cpp:77
}
 460:	82 2f       	mov	r24, r18
 462:	08 95       	ret

00000464 <_GLOBAL__sub_I___vector_18>:
_ZN5PrintC4Ev():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/Print.h:46
    size_t printNumber(unsigned long, uint8_t);
    size_t printFloat(double, uint8_t);
  protected:
    void setWriteError(int err = 1) { write_error = err; }
  public:
    Print() : write_error(0) {}
 464:	e4 e2       	ldi	r30, 0x24	; 36
 466:	f1 e0       	ldi	r31, 0x01	; 1
 468:	13 82       	std	Z+3, r1	; 0x03
 46a:	12 82       	std	Z+2, r1	; 0x02
_ZN6StreamC4Ev():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/Stream.h:63
  public:
    virtual int available() = 0;
    virtual int read() = 0;
    virtual int peek() = 0;

    Stream() {_timeout=1000;}
 46c:	88 ee       	ldi	r24, 0xE8	; 232
 46e:	93 e0       	ldi	r25, 0x03	; 3
 470:	a0 e0       	ldi	r26, 0x00	; 0
 472:	b0 e0       	ldi	r27, 0x00	; 0
 474:	84 83       	std	Z+4, r24	; 0x04
 476:	95 83       	std	Z+5, r25	; 0x05
 478:	a6 83       	std	Z+6, r26	; 0x06
 47a:	b7 83       	std	Z+7, r27	; 0x07
_ZN14HardwareSerialC4EPVhS1_S1_S1_S1_S1_():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial_private.h:95
  volatile uint8_t *ucsrc, volatile uint8_t *udr) :
    _ubrrh(ubrrh), _ubrrl(ubrrl),
    _ucsra(ucsra), _ucsrb(ucsrb), _ucsrc(ucsrc),
    _udr(udr),
    _rx_buffer_head(0), _rx_buffer_tail(0),
    _tx_buffer_head(0), _tx_buffer_tail(0)
 47c:	82 e1       	ldi	r24, 0x12	; 18
 47e:	91 e0       	ldi	r25, 0x01	; 1
 480:	91 83       	std	Z+1, r25	; 0x01
 482:	80 83       	st	Z, r24
 484:	85 ec       	ldi	r24, 0xC5	; 197
 486:	90 e0       	ldi	r25, 0x00	; 0
 488:	95 87       	std	Z+13, r25	; 0x0d
 48a:	84 87       	std	Z+12, r24	; 0x0c
 48c:	84 ec       	ldi	r24, 0xC4	; 196
 48e:	90 e0       	ldi	r25, 0x00	; 0
 490:	97 87       	std	Z+15, r25	; 0x0f
 492:	86 87       	std	Z+14, r24	; 0x0e
 494:	80 ec       	ldi	r24, 0xC0	; 192
 496:	90 e0       	ldi	r25, 0x00	; 0
 498:	91 8b       	std	Z+17, r25	; 0x11
 49a:	80 8b       	std	Z+16, r24	; 0x10
 49c:	81 ec       	ldi	r24, 0xC1	; 193
 49e:	90 e0       	ldi	r25, 0x00	; 0
 4a0:	93 8b       	std	Z+19, r25	; 0x13
 4a2:	82 8b       	std	Z+18, r24	; 0x12
 4a4:	82 ec       	ldi	r24, 0xC2	; 194
 4a6:	90 e0       	ldi	r25, 0x00	; 0
 4a8:	95 8b       	std	Z+21, r25	; 0x15
 4aa:	84 8b       	std	Z+20, r24	; 0x14
 4ac:	86 ec       	ldi	r24, 0xC6	; 198
 4ae:	90 e0       	ldi	r25, 0x00	; 0
 4b0:	97 8b       	std	Z+23, r25	; 0x17
 4b2:	86 8b       	std	Z+22, r24	; 0x16
 4b4:	11 8e       	std	Z+25, r1	; 0x19
 4b6:	12 8e       	std	Z+26, r1	; 0x1a
 4b8:	13 8e       	std	Z+27, r1	; 0x1b
 4ba:	14 8e       	std	Z+28, r1	; 0x1c
_GLOBAL__sub_I___vector_18():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/HardwareSerial0.cpp:77
 4bc:	08 95       	ret

000004be <Print::write(unsigned char const*, unsigned int)>:
_ZN5Print5writeEPKhj():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/Print.cpp:136
size_t Print::println(const String &s)
{
  size_t n = print(s);
  n += println();
  return n;
}
 4be:	af 92       	push	r10
 4c0:	bf 92       	push	r11
 4c2:	cf 92       	push	r12
 4c4:	df 92       	push	r13
 4c6:	ef 92       	push	r14
 4c8:	ff 92       	push	r15
 4ca:	0f 93       	push	r16
 4cc:	1f 93       	push	r17
 4ce:	cf 93       	push	r28
 4d0:	df 93       	push	r29
 4d2:	6c 01       	movw	r12, r24
 4d4:	7b 01       	movw	r14, r22
 4d6:	8b 01       	movw	r16, r22
 4d8:	04 0f       	add	r16, r20
 4da:	15 1f       	adc	r17, r21
 4dc:	eb 01       	movw	r28, r22
 4de:	5e 01       	movw	r10, r28
 4e0:	ae 18       	sub	r10, r14
 4e2:	bf 08       	sbc	r11, r15
 4e4:	c0 17       	cp	r28, r16
 4e6:	d1 07       	cpc	r29, r17
 4e8:	59 f0       	breq	.+22     	; 0x500 <Print::write(unsigned char const*, unsigned int)+0x42>
 4ea:	69 91       	ld	r22, Y+
 4ec:	d6 01       	movw	r26, r12
 4ee:	ed 91       	ld	r30, X+
 4f0:	fc 91       	ld	r31, X
 4f2:	01 90       	ld	r0, Z+
 4f4:	f0 81       	ld	r31, Z
 4f6:	e0 2d       	mov	r30, r0
 4f8:	c6 01       	movw	r24, r12
 4fa:	09 95       	icall
 4fc:	89 2b       	or	r24, r25
 4fe:	79 f7       	brne	.-34     	; 0x4de <Print::write(unsigned char const*, unsigned int)+0x20>
 500:	c5 01       	movw	r24, r10
 502:	df 91       	pop	r29
 504:	cf 91       	pop	r28
 506:	1f 91       	pop	r17
 508:	0f 91       	pop	r16
 50a:	ff 90       	pop	r15
 50c:	ef 90       	pop	r14
 50e:	df 90       	pop	r13
 510:	cf 90       	pop	r12
 512:	bf 90       	pop	r11
 514:	af 90       	pop	r10
 516:	08 95       	ret

00000518 <Print::write(char const*) [clone .part.2]>:
_ZN5Print5writeEPKc():
 518:	fb 01       	movw	r30, r22
 51a:	01 90       	ld	r0, Z+
 51c:	00 20       	and	r0, r0
 51e:	e9 f7       	brne	.-6      	; 0x51a <Print::write(char const*) [clone .part.2]+0x2>
 520:	31 97       	sbiw	r30, 0x01	; 1
 522:	af 01       	movw	r20, r30
 524:	46 1b       	sub	r20, r22
 526:	57 0b       	sbc	r21, r23
 528:	dc 01       	movw	r26, r24
 52a:	ed 91       	ld	r30, X+
 52c:	fc 91       	ld	r31, X
 52e:	02 80       	ldd	r0, Z+2	; 0x02
 530:	f3 81       	ldd	r31, Z+3	; 0x03
 532:	e0 2d       	mov	r30, r0
 534:	09 94       	ijmp

00000536 <Print::println()>:
 536:	60 e2       	ldi	r22, 0x20	; 32
 538:	71 e0       	ldi	r23, 0x01	; 1
 53a:	0c 94 8c 02 	jmp	0x518	; 0x518 <Print::write(char const*) [clone .part.2]>

0000053e <Print::println(char const*)>:
_ZN5Print7printlnEPKc():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/Print.cpp:139

size_t Print::println(const char c[])
{
 53e:	0f 93       	push	r16
 540:	1f 93       	push	r17
 542:	cf 93       	push	r28
 544:	df 93       	push	r29
 546:	8c 01       	movw	r16, r24
_ZN5Print5writeEPKc():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/Print.h:53
    int getWriteError() { return write_error; }
    void clearWriteError() { setWriteError(0); }
  
    virtual size_t write(uint8_t) = 0;
    size_t write(const char *str) {
      if (str == NULL) return 0;
 548:	d0 e0       	ldi	r29, 0x00	; 0
 54a:	c0 e0       	ldi	r28, 0x00	; 0
 54c:	61 15       	cp	r22, r1
 54e:	71 05       	cpc	r23, r1
 550:	19 f0       	breq	.+6      	; 0x558 <Print::println(char const*)+0x1a>
 552:	0e 94 8c 02 	call	0x518	; 0x518 <Print::write(char const*) [clone .part.2]>
 556:	ec 01       	movw	r28, r24
_ZN5Print7printlnEPKc():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/Print.cpp:141
  size_t n = print(c);
  n += println();
 558:	c8 01       	movw	r24, r16
 55a:	0e 94 9b 02 	call	0x536	; 0x536 <Print::println()>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/Print.cpp:143
  return n;
}
 55e:	8c 0f       	add	r24, r28
 560:	9d 1f       	adc	r25, r29
 562:	df 91       	pop	r29
 564:	cf 91       	pop	r28
 566:	1f 91       	pop	r17
 568:	0f 91       	pop	r16
 56a:	08 95       	ret

0000056c <initVariant>:
initVariant():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/main.cpp:28
int atexit(void (* /*func*/ )()) { return 0; }

// Weak empty variant initialization function.
// May be redefined by variant files.
void initVariant() __attribute__((weak));
void initVariant() { }
 56c:	08 95       	ret

0000056e <main>:
main():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/main.cpp:35
//void setupUSB() __attribute__((weak));
//void setupUSB() { }

int main(void)
{
  init();
 56e:	0e 94 10 03 	call	0x620	; 0x620 <init>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/main.cpp:37

  initVariant();
 572:	0e 94 b6 02 	call	0x56c	; 0x56c <initVariant>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/main.cpp:43

#if defined(USBCON)
  USBDevice.attach();
#endif
  
  setup();
 576:	0e 94 8b 00 	call	0x116	; 0x116 <setup>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/main.cpp:47
    
  for (;;) {
    loop();
    if (serialEventRun) serialEventRun();
 57a:	c5 ed       	ldi	r28, 0xD5	; 213
 57c:	d0 e0       	ldi	r29, 0x00	; 0
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/main.cpp:46
#endif
  
  setup();
    
  for (;;) {
    loop();
 57e:	0e 94 94 00 	call	0x128	; 0x128 <loop>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/main.cpp:47
    if (serialEventRun) serialEventRun();
 582:	20 97       	sbiw	r28, 0x00	; 0
 584:	e1 f3       	breq	.-8      	; 0x57e <main+0x10>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/main.cpp:47 (discriminator 1)
 586:	0e 94 d5 00 	call	0x1aa	; 0x1aa <serialEventRun()>
 58a:	f9 cf       	rjmp	.-14     	; 0x57e <main+0x10>

0000058c <__vector_16>:
__vector_16():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/wiring.c:606
    "   brne 1b"                     // 2 cycles
    : /* no outputs */
    : "w" (us)
  );
  // return = 4 cycles
}
 58c:	1f 92       	push	r1
 58e:	0f 92       	push	r0
 590:	0f b6       	in	r0, 0x3f	; 63
 592:	0f 92       	push	r0
 594:	11 24       	eor	r1, r1
 596:	2f 93       	push	r18
 598:	3f 93       	push	r19
 59a:	8f 93       	push	r24
 59c:	9f 93       	push	r25
 59e:	af 93       	push	r26
 5a0:	bf 93       	push	r27
 5a2:	80 91 c2 01 	lds	r24, 0x01C2	; 0x8001c2 <timer0_millis>
 5a6:	90 91 c3 01 	lds	r25, 0x01C3	; 0x8001c3 <timer0_millis+0x1>
 5aa:	a0 91 c4 01 	lds	r26, 0x01C4	; 0x8001c4 <timer0_millis+0x2>
 5ae:	b0 91 c5 01 	lds	r27, 0x01C5	; 0x8001c5 <timer0_millis+0x3>
 5b2:	30 91 c1 01 	lds	r19, 0x01C1	; 0x8001c1 <timer0_fract>
 5b6:	23 e0       	ldi	r18, 0x03	; 3
 5b8:	23 0f       	add	r18, r19
 5ba:	2d 37       	cpi	r18, 0x7D	; 125
 5bc:	58 f5       	brcc	.+86     	; 0x614 <__vector_16+0x88>
 5be:	01 96       	adiw	r24, 0x01	; 1
 5c0:	a1 1d       	adc	r26, r1
 5c2:	b1 1d       	adc	r27, r1
 5c4:	20 93 c1 01 	sts	0x01C1, r18	; 0x8001c1 <timer0_fract>
 5c8:	80 93 c2 01 	sts	0x01C2, r24	; 0x8001c2 <timer0_millis>
 5cc:	90 93 c3 01 	sts	0x01C3, r25	; 0x8001c3 <timer0_millis+0x1>
 5d0:	a0 93 c4 01 	sts	0x01C4, r26	; 0x8001c4 <timer0_millis+0x2>
 5d4:	b0 93 c5 01 	sts	0x01C5, r27	; 0x8001c5 <timer0_millis+0x3>
 5d8:	80 91 c6 01 	lds	r24, 0x01C6	; 0x8001c6 <timer0_overflow_count>
 5dc:	90 91 c7 01 	lds	r25, 0x01C7	; 0x8001c7 <timer0_overflow_count+0x1>
 5e0:	a0 91 c8 01 	lds	r26, 0x01C8	; 0x8001c8 <timer0_overflow_count+0x2>
 5e4:	b0 91 c9 01 	lds	r27, 0x01C9	; 0x8001c9 <timer0_overflow_count+0x3>
 5e8:	01 96       	adiw	r24, 0x01	; 1
 5ea:	a1 1d       	adc	r26, r1
 5ec:	b1 1d       	adc	r27, r1
 5ee:	80 93 c6 01 	sts	0x01C6, r24	; 0x8001c6 <timer0_overflow_count>
 5f2:	90 93 c7 01 	sts	0x01C7, r25	; 0x8001c7 <timer0_overflow_count+0x1>
 5f6:	a0 93 c8 01 	sts	0x01C8, r26	; 0x8001c8 <timer0_overflow_count+0x2>
 5fa:	b0 93 c9 01 	sts	0x01C9, r27	; 0x8001c9 <timer0_overflow_count+0x3>
 5fe:	bf 91       	pop	r27
 600:	af 91       	pop	r26
 602:	9f 91       	pop	r25
 604:	8f 91       	pop	r24
 606:	3f 91       	pop	r19
 608:	2f 91       	pop	r18
 60a:	0f 90       	pop	r0
 60c:	0f be       	out	0x3f, r0	; 63
 60e:	0f 90       	pop	r0
 610:	1f 90       	pop	r1
 612:	18 95       	reti
 614:	26 e8       	ldi	r18, 0x86	; 134
 616:	23 0f       	add	r18, r19
 618:	02 96       	adiw	r24, 0x02	; 2
 61a:	a1 1d       	adc	r26, r1
 61c:	b1 1d       	adc	r27, r1
 61e:	d2 cf       	rjmp	.-92     	; 0x5c4 <__vector_16+0x38>

00000620 <init>:
init():
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/wiring.c:612

void init()
{
  // this needs to be called before setup() or some functions won't
  // work there
  sei();
 620:	78 94       	sei
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/wiring.c:624

  // On the ATmega168, timer 0 is also used for fast hardware pwm
  // (using phase-correct PWM would mean that timer 0 overflowed half as often
  // resulting in different millis() behavior on the ATmega8 and ATmega168)
#if defined(TCCR0A) && defined(WGM01)
  TCCR0A |= _BV(WGM01) | _BV(WGM00);
 622:	84 b5       	in	r24, 0x24	; 36
 624:	83 60       	ori	r24, 0x03	; 3
 626:	84 bd       	out	0x24, r24	; 36
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/wiring.c:639
  #if defined(WGM00) && defined(WGM01) // The ATmega8 doesn't have WGM00 and WGM01
    TCCR0 |= _BV(WGM01) | _BV(WGM00);
  #endif
#elif defined(TCCR0B) && defined(CS01) && defined(CS00)
  // This combination is for the standard 168/328/640/1280/1281/2560/2561
  TCCR0B |= _BV(CS01) | _BV(CS00);
 628:	85 b5       	in	r24, 0x25	; 37
 62a:	83 60       	ori	r24, 0x03	; 3
 62c:	85 bd       	out	0x25, r24	; 37
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/wiring.c:651

// Enable timer 0 overflow interrupt
#if defined(TIMSK) && defined(TOIE0)
  TIMSK |= _BV(TOIE0);
#elif defined(TIMSK0) && defined(TOIE0)
  TIMSK0 |= _BV(TOIE0);
 62e:	ee e6       	ldi	r30, 0x6E	; 110
 630:	f0 e0       	ldi	r31, 0x00	; 0
 632:	80 81       	ld	r24, Z
 634:	81 60       	ori	r24, 0x01	; 1
 636:	80 83       	st	Z, r24
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/wiring.c:662
// this is better for motors as it ensures an even waveform
// note, however, that fast pwm mode can achieve a frequency of up
// 8 MHz (with a 16 MHz clock) at 50% duty cycle

#if defined(TCCR1B) && defined(CS11) && defined(CS10)
  TCCR1B = _BV(CS11); // Set timer 1 prescale factor to 64
 638:	e1 e8       	ldi	r30, 0x81	; 129
 63a:	f0 e0       	ldi	r31, 0x00	; 0
 63c:	82 e0       	ldi	r24, 0x02	; 2
 63e:	80 83       	st	Z, r24
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/wiring.c:664
#if F_CPU >= 8000000L
  TCCR1B |= _BV(CS10);
 640:	80 81       	ld	r24, Z
 642:	81 60       	ori	r24, 0x01	; 1
 644:	80 83       	st	Z, r24
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/wiring.c:673
#if F_CPU >= 8000000L
  TCCR1 |= _BV(CS10);
#endif
#endif
#if defined(TCCR1A) && defined(WGM10)
  TCCR1A |= _BV(WGM10); // Put timer 1 in 8-bit phase correct pwm mode
 646:	e0 e8       	ldi	r30, 0x80	; 128
 648:	f0 e0       	ldi	r31, 0x00	; 0
 64a:	80 81       	ld	r24, Z
 64c:	81 60       	ori	r24, 0x01	; 1
 64e:	80 83       	st	Z, r24
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/wiring.c:680

// Set timer 2 prescale factor to 64
#if defined(TCCR2) && defined(CS22)
  TCCR2 |= _BV(CS22);
#elif defined(TCCR2B) && defined(CS22)
  TCCR2B |= _BV(CS22);
 650:	e1 eb       	ldi	r30, 0xB1	; 177
 652:	f0 e0       	ldi	r31, 0x00	; 0
 654:	80 81       	ld	r24, Z
 656:	84 60       	ori	r24, 0x04	; 4
 658:	80 83       	st	Z, r24
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/wiring.c:689

// Configure timer 2 for phase correct pwm (8-bit)
#if defined(TCCR2) && defined(WGM20)
  TCCR2 |= _BV(WGM20);
#elif defined(TCCR2A) && defined(WGM20)
  TCCR2A |= _BV(WGM20);
 65a:	e0 eb       	ldi	r30, 0xB0	; 176
 65c:	f0 e0       	ldi	r31, 0x00	; 0
 65e:	80 81       	ld	r24, Z
 660:	81 60       	ori	r24, 0x01	; 1
 662:	80 83       	st	Z, r24
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/wiring.c:695
//#else
  // Timer 2 not finished (may not be present on this CPU)
#endif

#if defined(TCCR3B) && defined(CS31) && defined(WGM30)
  TCCR3B |= _BV(CS31) | _BV(CS30); // Set timer 3 prescale factor to 64
 664:	e1 e9       	ldi	r30, 0x91	; 145
 666:	f0 e0       	ldi	r31, 0x00	; 0
 668:	80 81       	ld	r24, Z
 66a:	83 60       	ori	r24, 0x03	; 3
 66c:	80 83       	st	Z, r24
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/wiring.c:696
  TCCR3A |= _BV(WGM30);            // Put timer 3 in 8-bit phase correct pwm mode
 66e:	e0 e9       	ldi	r30, 0x90	; 144
 670:	f0 e0       	ldi	r31, 0x00	; 0
 672:	80 81       	ld	r24, Z
 674:	81 60       	ori	r24, 0x01	; 1
 676:	80 83       	st	Z, r24
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/wiring.c:705
  TCCR4B |= _BV(CS42) | _BV(CS41) | _BV(CS40); // Set timer 4 prescale factor to 64
  TCCR4D |= _BV(WGM40);                        // Put timer 4 in phase- and frequency-correct PWM mode 
  TCCR4A |= _BV(PWM4A);                        // Enable PWM mode for comparator OCR4A
  TCCR4C |= _BV(PWM4D);                        // Enable PWM mode for comparator OCR4D 
#elif defined(TCCR4B) && defined(CS41) && defined(WGM40)
  TCCR4B |= _BV(CS41) | _BV(CS40); // Set timer 4 prescale factor to 64
 678:	e1 ea       	ldi	r30, 0xA1	; 161
 67a:	f0 e0       	ldi	r31, 0x00	; 0
 67c:	80 81       	ld	r24, Z
 67e:	83 60       	ori	r24, 0x03	; 3
 680:	80 83       	st	Z, r24
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/wiring.c:706
  TCCR4A |= _BV(WGM40);            // Put timer 4 in 8-bit phase correct pwm mode
 682:	e0 ea       	ldi	r30, 0xA0	; 160
 684:	f0 e0       	ldi	r31, 0x00	; 0
 686:	80 81       	ld	r24, Z
 688:	81 60       	ori	r24, 0x01	; 1
 68a:	80 83       	st	Z, r24
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/wiring.c:717
#endif

#if defined(ADCSRA)
  // set a2d prescaler so we are inside the desired 50-200 KHz range.
  #if F_CPU >= 16000000 // 16 MHz / 128 = 125 KHz
    ADCSRA = _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0) | _BV(ADEN);
 68c:	87 e8       	ldi	r24, 0x87	; 135
 68e:	80 93 7a 00 	sts	0x007A, r24	; 0x80007a <__TEXT_REGION_LENGTH__+0x7f807a>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/wiring.c:737
  // here so they can be used as normal digital i/o; they will be
  // reconnected in Serial.begin()
#if defined(UCSRB)
  UCSRB = 0;
#elif defined(UCSR0B)
  UCSR0B = 0;
 692:	10 92 c1 00 	sts	0x00C1, r1	; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7f80c1>
D:\SoftWare\arduino-1.8.13\portable\packages\MiniCore\hardware\avr\2.0.7\cores\MCUdude_corefiles/wiring.c:739
#endif
}
 696:	08 95       	ret

00000698 <__udivmodsi4>:
__udivmodsi4():
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1638
 698:	a1 e2       	ldi	r26, 0x21	; 33
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1639
 69a:	1a 2e       	mov	r1, r26
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1640
 69c:	aa 1b       	sub	r26, r26
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1641
 69e:	bb 1b       	sub	r27, r27
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1642
 6a0:	fd 01       	movw	r30, r26
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1644
 6a2:	0d c0       	rjmp	.+26     	; 0x6be <__udivmodsi4_ep>

000006a4 <__udivmodsi4_loop>:
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1646
 6a4:	aa 1f       	adc	r26, r26
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1647
 6a6:	bb 1f       	adc	r27, r27
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1648
 6a8:	ee 1f       	adc	r30, r30
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1649
 6aa:	ff 1f       	adc	r31, r31
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1650
 6ac:	a2 17       	cp	r26, r18
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1651
 6ae:	b3 07       	cpc	r27, r19
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1652
 6b0:	e4 07       	cpc	r30, r20
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1653
 6b2:	f5 07       	cpc	r31, r21
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1654
 6b4:	20 f0       	brcs	.+8      	; 0x6be <__udivmodsi4_ep>
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1655
 6b6:	a2 1b       	sub	r26, r18
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1656
 6b8:	b3 0b       	sbc	r27, r19
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1657
 6ba:	e4 0b       	sbc	r30, r20
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1658
 6bc:	f5 0b       	sbc	r31, r21

000006be <__udivmodsi4_ep>:
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1660
 6be:	66 1f       	adc	r22, r22
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1661
 6c0:	77 1f       	adc	r23, r23
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1662
 6c2:	88 1f       	adc	r24, r24
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1663
 6c4:	99 1f       	adc	r25, r25
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1664
 6c6:	1a 94       	dec	r1
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1665
 6c8:	69 f7       	brne	.-38     	; 0x6a4 <__udivmodsi4_loop>
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1667
 6ca:	60 95       	com	r22
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1668
 6cc:	70 95       	com	r23
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1669
 6ce:	80 95       	com	r24
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1670
 6d0:	90 95       	com	r25
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1672
 6d2:	9b 01       	movw	r18, r22
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1674
 6d4:	ac 01       	movw	r20, r24
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1676
 6d6:	bd 01       	movw	r22, r26
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1678
 6d8:	cf 01       	movw	r24, r30
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:1680
 6da:	08 95       	ret

000006dc <__tablejump2__>:
__tablejump2__():
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2296
 6dc:	ee 0f       	add	r30, r30
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2297
 6de:	ff 1f       	adc	r31, r31
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2328
 6e0:	05 90       	lpm	r0, Z+
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2329
 6e2:	f4 91       	lpm	r31, Z
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2330
 6e4:	e0 2d       	mov	r30, r0
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2331
 6e6:	09 94       	ijmp

000006e8 <_exit>:
exit():
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2278
 6e8:	f8 94       	cli

000006ea <__stop_program>:
__stop_program():
/home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr5/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2280
 6ea:	ff cf       	rjmp	.-2      	; 0x6ea <__stop_program>

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Komandir пишет:
если нет ни одного экземпляра родителя ...

И ты в своей функции не вызываешь родительскую вручную

b707
Offline
Зарегистрирован: 26.05.2017

Komandir пишет:

b707 по идее не должен (и не делает - проверил),

спасибо.

А чем дизассемблируешь?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

У меня установлен пакет MiniCore и в нем свой platform.txt. Во временной папке (где IDE всё варит) сразу есть lst !!!

rkit
Offline
Зарегистрирован: 23.11.2016

b707 пишет:

правильно ли я понимаю, что в машинный код будут скомпилированы оба метода X() - и родительский и дочерний, даже если в коде используется только последний? Если да - есть ли какой-то иной метод наследования. который не тащил бы в код методы родительсткого класса там, где они не нужны?

Правильно. А вот компоновщик неиспользованное выкинет, если его запустить с адекватными флагами.

b707
Offline
Зарегистрирован: 26.05.2017

Komandir пишет:

в нем свой platform.txt. Во временной папке сразу есть lst !!!

а можешь выложить?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

# Arduino AVR Core and platform.
# ------------------------------
#
# For more info:
# https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5-3rd-party-Hardware-specification

name=MiniCore
version=2.0.5

# AVR compile variables
# ---------------------

compiler.warning_flags=-w
compiler.warning_flags.none=-w
compiler.warning_flags.default=
compiler.warning_flags.more=-Wall
compiler.warning_flags.all=-Wall -Wextra

# Default "compiler.path" is correct, change only if you want to override the initial value
compiler.path={runtime.tools.avr-gcc.path}/bin/
compiler.c.cmd=avr-gcc
compiler.c.flags=-c -g -Os {compiler.warning_flags} -std=gnu11 -ffunction-sections -fdata-sections -MMD
compiler.c.elf.flags={compiler.warning_flags} -Os -Wl,--gc-sections
compiler.c.elf.cmd=avr-gcc
compiler.S.flags=-c -g -x assembler-with-cpp
compiler.cpp.cmd=avr-g++
compiler.cpp.flags=-c -g -Os {compiler.warning_flags} -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD
compiler.ar.cmd={ltoarcmd}
compiler.ar.flags=rcs
compiler.objcopy.cmd=avr-objcopy
compiler.objcopy.eep.flags=-O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0
compiler.objdump.cmd=avr-objdump
compiler.objdump.flags=--disassemble --source --line-numbers --demangle --section=.text
compiler.elf2hex.flags=-O ihex -R .eeprom
compiler.elf2hex.bin.flags=-O binary -R .eeprom
compiler.elf2hex.cmd=avr-objcopy
compiler.ldflags=
compiler.size.cmd=avr-size

# This can be overridden in boards.txt
build.extra_flags=

# These can be overridden in platform.local.txt
compiler.c.extra_flags=
compiler.c.elf.extra_flags=
compiler.S.extra_flags=
compiler.cpp.extra_flags=
compiler.ar.extra_flags=
compiler.objcopy.eep.extra_flags=
compiler.elf2hex.extra_flags=

# AVR compile patterns
# --------------------

## Compile c files
recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.c.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"

## Compile c++ files
recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"

## Compile S files
recipe.S.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.S.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.S.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"

## Create archives
# archive_file_path is needed for backwards compatibility with IDE 1.6.5 or older, IDE 1.6.6 or newer overrides this value
archive_file_path={build.path}/{archive_file}
recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{archive_file_path}" "{object_file}"

## Combine gc-sections, archives, and objects
recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} -mmcu={build.mcu} {compiler.c.elf.extra_flags} -o "{build.path}/{build.project_name}.elf" {object_files} "{build.path}/{archive_file}" "-L{build.path}" -lm

## Create output files (.eep and .hex)
recipe.objcopy.eep.pattern="{compiler.path}{compiler.objcopy.cmd}" {compiler.objcopy.eep.flags} {compiler.objcopy.eep.extra_flags} "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}.eep"
recipe.objcopy.hex.pattern="{compiler.path}{compiler.elf2hex.cmd}" {compiler.elf2hex.flags} {compiler.elf2hex.extra_flags} "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}.hex"

## Save disassembler listing
recipe.hooks.objcopy.postobjcopy.1.pattern.windows=cmd /C "{compiler.path}{compiler.objdump.cmd}" {compiler.objdump.flags} "{build.path}/{build.project_name}.elf" > "{build.path}/{build.project_name}.lst"
recipe.hooks.objcopy.postobjcopy.1.pattern.linux=chmod +x "{runtime.platform.path}/scripts/create_disassembler_listing.sh"
recipe.hooks.objcopy.postobjcopy.1.pattern.macosx=chmod +x "{runtime.platform.path}/scripts/create_disassembler_listing.sh"
recipe.hooks.objcopy.postobjcopy.2.pattern.linux="{runtime.platform.path}/scripts/create_disassembler_listing.sh" "{compiler.path}{compiler.objdump.cmd}" "{compiler.objdump.flags}" "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}_{build.mcu}_{build.f_cpu}.lst"
recipe.hooks.objcopy.postobjcopy.2.pattern.macosx="{runtime.platform.path}/scripts/create_disassembler_listing.sh" "{compiler.path}{compiler.objdump.cmd}" "{compiler.objdump.flags}" "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}_{build.mcu}_{build.f_cpu}.lst"

## Save compiled hex
recipe.output.tmp_file={build.project_name}.hex
recipe.output.save_file={build.project_name}_{build.mcu}_{build.f_cpu}.hex

## Save hex
recipe.hooks.savehex.presavehex.1.pattern.windows="{runtime.platform.path}/scripts/delete_merged_output.bat" {build.export_merged_output} "{build.path}\{build.project_name}.with_bootloader.hex"
recipe.hooks.savehex.presavehex.2.pattern.windows=cmd /C copy "{build.path}\{build.project_name}_{build.mcu}_{build.f_cpu}.lst" "{sketch_path}"
recipe.hooks.savehex.presavehex.1.pattern.linux=chmod +x "{runtime.platform.path}/scripts/delete_merged_output.sh"
recipe.hooks.savehex.presavehex.2.pattern.linux="{runtime.platform.path}/scripts/delete_merged_output.sh" {build.export_merged_output} "{build.path}/{build.project_name}.with_bootloader.hex"
recipe.hooks.savehex.presavehex.3.pattern.linux=cp "{build.path}/{build.project_name}_{build.mcu}_{build.f_cpu}.lst" "{sketch_path}"
recipe.hooks.savehex.presavehex.1.pattern.macosx=chmod +x "{runtime.platform.path}/scripts/delete_merged_output.sh"
recipe.hooks.savehex.presavehex.2.pattern.macosx="{runtime.platform.path}/scripts/delete_merged_output.sh" {build.export_merged_output} "{build.path}/{build.project_name}.with_bootloader.hex"
recipe.hooks.savehex.presavehex.3.pattern.macosx=cp "{build.path}/{build.project_name}_{build.mcu}_{build.f_cpu}.lst" "{sketch_path}"

## Compute size
recipe.size.pattern="{compiler.path}{compiler.size.cmd}" -A "{build.path}/{build.project_name}.elf"
recipe.size.regex=^(?:\.text|\.data|\.bootloader)\s+([0-9]+).*
recipe.size.regex.data=^(?:\.data|\.bss|\.noinit)\s+([0-9]+).*
recipe.size.regex.eeprom=^(?:\.eeprom)\s+([0-9]+).*

## Preprocessor
preproc.includes.flags=-w -x c++ -M -MG -MP
recipe.preproc.includes="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} {preproc.includes.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {includes} "{source_file}"

preproc.macros.flags=-w -x c++ -E -CC
recipe.preproc.macros="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} {preproc.macros.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{preprocessed_file_path}"

# AVR Uploader/Programmers tools
# ------------------------------

tools.avrdude.path={runtime.tools.avrdude.path}
tools.avrdude.cmd.path={path}/bin/avrdude
tools.avrdude.config.path={runtime.platform.path}/avrdude.conf

tools.avrdude.upload.params.verbose=-v
tools.avrdude.upload.params.quiet=-q -q
# tools.avrdude.upload.verify is needed for backwards compatibility with AVRDUDE 6.3.0 and IDE 1.6.8 or older, IDE 1.6.9 or newer overrides this value
tools.avrdude.upload.verify=
tools.avrdude.upload.params.noverify=-V
tools.avrdude.upload.pattern="{cmd.path}" "-C{config.path}" {upload.verbose} {upload.verify} -p{build.mcu} -c{upload.protocol} -P{serial.port} -b{upload.speed} -D "-Uflash:w:{build.path}/{build.project_name}.hex:i"

tools.avrdude.program.params.verbose=-v
tools.avrdude.program.params.quiet=-q -q
tools.avrdude.program.params.noverify=-V
tools.avrdude.program.pattern="{cmd.path}" "-C{config.path}" {program.verbose} {program.verify} -p{build.mcu} -c{protocol} {program.extra_params} "-Uflash:w:{build.path}/{build.project_name}.with_bootloader.hex:i"

tools.avrdude.erase.params.verbose=-v
tools.avrdude.erase.params.quiet=-q -q
tools.avrdude.erase.pattern="{cmd.path}" "-C{config.path}" -v -p{build.mcu} -c{protocol} {program.extra_params} -e -Ulock:w:{bootloader.unlock_bits}:m -Uefuse:w:{bootloader.extended_fuses}:m -Uhfuse:w:{bootloader.high_fuses}:m -Ulfuse:w:{bootloader.low_fuses}:m

tools.avrdude.bootloader.params.verbose=-v
tools.avrdude.bootloader.params.quiet=-q -q
tools.avrdude.bootloader.pattern="{cmd.path}" "-C{config.path}" -v -p{build.mcu} -c{protocol} {program.extra_params} "-Uflash:w:{runtime.platform.path}/bootloaders/{bootloader.file}:i" -Ulock:w:{bootloader.lock_bits}:m

tools.avrdude_remote.upload.pattern=/usr/bin/run-avrdude /tmp/sketch.hex {upload.verbose} -p{build.mcu}

# USB Default Flags
# Default blank usb manufacturer will be filled in at compile time
# - from numeric vendor ID, set to Unknown otherwise
build.usb_manufacturer="Unknown"
build.usb_flags=-DUSB_VID={build.vid} -DUSB_PID={build.pid} '-DUSB_MANUFACTURER={build.usb_manufacturer}' '-DUSB_PRODUCT={build.usb_product}'

Видно что используется objdump ...

b707
Offline
Зарегистрирован: 26.05.2017

Komandir пишет:
Видно что используется objdump ...

точнее avr-objdump

Спасибо.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

b707 пишет:
тащил бы в код методы родительсткого класса там, где они не нужны?

В Ардуино - не стоит напрягаться. Это обеспечивает опция -lto "Линк Тайм Оптимамизейшн"  - на руглище ;).

Помнишь тут года 4 назад битвы были про -lto? Типа выкидывает, что ни попадя. Так вот это про неё, родную. Если захочешь погрузиться в вопрос, то есть много статей на аглицком про LTO в GCC. Вот прям так и находятся в гугле.

Если пользоваться вне среды Ардуино, то опция -flto должна быть включена как для компиляции, так и для линка. Компилятор создает таблицу символов, которую линковщик использует и может выкинуть ненужное.

При правильном использовании LTO позволяет напихать все полезные методы в класс, а линковщик выкинет из кода ненужное. ;)) Это сильно упрощая, но так можно понимать.

b707
Offline
Зарегистрирован: 26.05.2017

wdrakula. спасибо, -flto знаю

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

b707 пишет:

А чем дизассемблируешь?

В VS есть Disassembled View

AsNik
Offline
Зарегистрирован: 24.10.2020

Ардуина("дохлая") через ICSP шьется. Загрузчик через Arduino ISP пишется. Пробовал и от нано и от уно... Правда так и не понял как указать конкретный загрузчик, например скачал с гитхаба оптибут 8.0, но так и не понял как его вшить... :(

Архив(точнее из него одни hex'ы) распаковал по инструкции, в папку (hardware\arduino\avr\bootloaders\Optiboot-8.0)... Манипуляции с boards.txt вообще ни к чему не приводят. Я этот файл даже удалял, а в ИДЕ все равно ничего не меняется....

Заметил только если шить загрузчик от уно, то свободной памяти становится 32кб, а если нано - то 30...

И еще вопрос, если шить программу через Arduino ISP (т.е. одну нану через вторую, "загрузить через программатор") - загрузчик тоже пишется? Иначе почему при загрузке через ICSP пишет что "Скетч использует 24580 байт (80%) памяти устройства. Всего доступно 30720 байт." Или я уже запутался(

 
Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

AsNik Установите пакет MiniCore. В нём есть загрузчик optiboot. Выберите свою плату среди плат пакета MiniCore и залейте загрузчик через вторую плату.

AsNik
Offline
Зарегистрирован: 24.10.2020

Komandir пишет:

Без второй платы или программатора стереть загрузчик из IDE достаточно сложно. Загонять ячейки - маловероятно.

А может что-то случится с USB - > UART? Странно она себя ведет... вроде и начинает загружаться, мк перезагружается и на этом висит... Затем в лог вот это выдает(при загрузка пустого скеча):

Скетч использует 444 байт (1%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x0a
Problem uploading to board.  See https://support.arduino.cc/hc/en-us/sections/360003198300 for suggestions.

Информацию о плате выдает.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Может вы залили загрузчик ожидающий данные на другой скорости ?!

AsNik
Offline
Зарегистрирован: 24.10.2020

Komandir пишет:

AsNik Установите пакет MiniCore. В нём есть загрузчик optiboot. Выберите свою плату среди плат пакета MiniCore и залейте загрузчик через вторую плату.

https://github.com/MCUdude/MiniCore

? Установил, появилось несколько новых меню.... разбираюсь. Спасибо. Сейчас буду пробовать ставить эксперименты на полудохлой нане...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

загрузчик из комплекта miniCore должен решить проблему и памяти будет доступно 32к и загружать будет на 115200

b707
Offline
Зарегистрирован: 26.05.2017

AsNik пишет:

почему при загрузке через ICSP пишет что "Скетч использует 24580 байт (80%) памяти устройства. Всего доступно 30720 байт." Или я уже запутался(

эта надпись никак не связана с реальным обьемом памяти в системе - эти цифры читаются из boards.txt. Какие цифры в файле напишете, такие и будут. Можете хоть 16 гиг написать :)

AsNik
Offline
Зарегистрирован: 24.10.2020

Komandir пишет:

Может вы залили загрузчик ожидающий данные на другой скорости ?!

Может... Но как это определить?

Я заливал только стандартные из поставки Ардуино ИДЕ. Единственный нестандартный вариант - это Оптибут 8, но с ним у меня ничего не получилось.

Про файл boards.txt - я писал выше. Вернул его прежним на место, экспериментировал с его копией...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

AsNik пишет:

Про файл boards.txt - я писал выше. Вернул его прежним на место, экспериментировал с его копией...

к чему эти извращения, всё делается двумя-тремя тычками мышки по менюшкам IDE

AsNik
Offline
Зарегистрирован: 24.10.2020

b707 пишет:

эти цифры читаются из boards.txt. Какие цифры в файле напишете, такие и будут. Можете хоть 16 гиг написать :)

Да вот что-то никаких результатов с изменением данного файла... Я пробовал имя менять nano.menu.cpu.atmega328old=ATmega328P (Old TEST Bootloader) (нана только через него до этого грузилась OLD, но потом пробовал и "новым") - ничего в меню не меняется

b707
Offline
Зарегистрирован: 26.05.2017

AsNik пишет:

Да вот что-то никаких результатов с изменением данного файла... Я пробовал имя менять nano.menu.cpu.atmega328old=ATmega328P (Old TEST Bootloader) (нана только через него до этого грузилась OLD, но потом пробовал и "новым") - ничего в меню не меняется

если меню не меняется - значит у вас на компе несколько boards.txt и вы правите не тот

AsNik
Offline
Зарегистрирован: 24.10.2020

ua6em пишет:

к чему эти извращения, всё делается двумя-тремя тычками мышки по менюшкам IDE

Да нет, это я уже тоже делал, ну только не с миникорэ, а со стандартными.... потом и полез в этот файл...

МИНИкорэ установил, буду пробовать его. Спасибо

b707
Offline
Зарегистрирован: 26.05.2017

AsNik пишет:

МИНИкорэ установил, буду пробовать его. Спасибо

вместо того чтобы ставить все новые пакеты - разберитесь лучше как это все работает. А то, на мой взгляд, вы тыркаетесь вслепую.

От установки кучи копий Ардуино ИДЕ будет только вред - будет непонятно, где правильные конфиги и что от чего зависит.

AsNik
Offline
Зарегистрирован: 24.10.2020

b707 пишет:

если меню не меняется - значит у вас на компе несколько boards.txt и вы правите не тот

[/quote]

Несколько. У меня нет установленных ИДЕ. Только зипы распакованные несколько штук... Но я правлю тот, откуда стартует arduino.exe.... И даже пробовал другие папки с версиями ардуины убирать в другую папку...

Но возможно где-то в реестр (хотя и там искал) есть что-то... В общем тоже подумал про вариант с boards.txt, но... незнаю. ИДЕ Должен читать из своих потрахов этот файл

b707
Offline
Зарегистрирован: 26.05.2017

К чему все эти манипуляции с загрузчиками? испортить бутлоадер операциями с кодом вы никак не могли. Думаю. проблема аппаратная, например частыми втыканиями кабеля расшатали USB разъем на плате и пайка треснула... или что-то подобное.

Возьмите другую ардуину и попробуйте

AsNik
Offline
Зарегистрирован: 24.10.2020

b707 пишет:

AsNik пишет:

МИНИкорэ установил, буду пробовать его. Спасибо

вместо того чтобы ставить все новые пакеты

Поздно :)

Цитата:

разберитесь лучше как это все работает. А то, на мой взгляд, вы тыркаетесь вслепую.

Ну не совсем в слепую. На делфи писал в свое время и системные вещи, немного помню как это все крутится на ПК. А так, да я всегда стараюсь разобраться в том, что делаю.

Цитата:

От установки кучи копий Ардуино ИДЕ будет только вред - будет непонятно, где правильные конфиги и что от чего зависит.

Ну тут от ПО конечно еще зависит.... если написано криво и конфиг используется не свой, то да.... проблемка)

AsNik
Offline
Зарегистрирован: 24.10.2020

b707 пишет:

К чему все эти манипуляции с загрузчиками? испортить бутлоадер операциями с кодом вы никак не могли. Думаю. проблема аппаратная, например частыми втыканиями кабеля расшатали USB разъем на плате и пайка треснула... или что-то подобное.

Возьмите другую ардуину и попробуйте

Вообще не расшатывал да и не втыкаю часто... по крайней мере пока пишу для нее вот как была в макетке так и торчит там не вынимаясь... Я в этом плане (разъемы и их втыкания очень аккуратен)

Ну раз испортить не мог программно, то скорее всего тогда что-то сгорело, но уж точно не отпаялось... Ладно, если с МИНИКОРЭ не получится ничего, буду ее через ICSP шить.... Жаль, а версия про неправильную скорость в параметрах мне была по душе

b707
Offline
Зарегистрирован: 26.05.2017

AsNik пишет:

Ну тут от ПО конечно еще зависит.... если написано криво и конфиг используется не свой, то да.... проблемка)

какой используется конфиг, узнать очень просто, при запущенной IDE открываете настройки и смотрите самую нижнюю строчку(большая красная стрелка):

Файл boards ищите где-то в той же директории

(на верхнюю красную стрелку не обращать внимания, картинка не моя :)

AsNik
Offline
Зарегистрирован: 24.10.2020

Ok, забыл я про этот аппдата... Давно еще хотел спросить про этот преференсес.тхт

Буду смотреть там чего хранит ИДЕ, Но уже миникоре там нашел... значит точно все версии имеющихся ИДЕ используют общую папку Ардуино15. Спасибо

AsNik
Offline
Зарегистрирован: 24.10.2020

С MiniCore через другую ардуину тоже прошивается, бутлоадер загружается... После прошивки загрузчика светодиод начинает моргать два раза пауза два раза пауза и т.д. При подсоединении через USB при загрузке (Blink) ошибка:

Arduino: 1.8.16 (Windows 10), Плата:"ATmega328, Yes (UART0), EEPROM retained, 328P / 328PA, BOD 2.7V, LTO disabled, External 16 MHz"

Скетч использует 1030 байт (3%) памяти устройства. Всего доступно 32256 байт.

Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0xdd

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0xdd

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0xdd

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0xdd

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0xdd

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0xdd

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0xdd

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0xdd

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0xdd

avrdude: stk500_recv(): programmer is not responding

avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0xdd

Problem uploading to board.  See https://support.arduino.cc/hc/en-us/sections/360003198300 for suggestions.

Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"

В настройках выбрано ВСЕ сообщения от компилятора, ничего нового он не показывает

По предложенной ссылке смотрел, ничего там не понял.

Всё, помер USB? Или все таки где-то что-то я не доглядываю?  Ведь при начале загрузки светодиоды начинают мыргать как и обычно, но недолго.... потом снова два мырга пауза... А в ИДЕ пишет, что идет загрузка и через несколько минут  - ошибка.

AsNik
Offline
Зарегистрирован: 24.10.2020

И мой код в МиниКорэ не компилится:

invalid conversion from 'const char*' to 'char*' [-fpermissive]
 
Наверное нужно что-то где-то настраивать или переделывать...
Вернулся пока на стандартное ядро, хотя плюсы миникорэ понравились...
Выкинуть нанку жалко, работает же через внутрисхемное программирование, но не удобно...
 
Как узнать на какой скорости принимает загрузчик? Ведь они там вроде в хексе:
 
## Arduino Nano w/ ATmega328P (old bootloader)
## --------------------------
nano.menu.cpu.atmega328old=ATmega328P (Old Bootloader)

nano.menu.cpu.atmega328old.upload.maximum_size=30720
nano.menu.cpu.atmega328old.upload.maximum_data_size=2048
#nano.menu.cpu.atmega328old.upload.speed=57600   <--- Было
nano.menu.cpu.atmega328old.upload.speed=19200    В ATmegaBOOT_168.c подглядел, остальные hex

nano.menu.cpu.atmega328old.bootloader.low_fuses=0xFF
nano.menu.cpu.atmega328old.bootloader.high_fuses=0xDA
nano.menu.cpu.atmega328old.bootloader.extended_fuses=0xFD
nano.menu.cpu.atmega328old.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex

Но с 19200 тоже не работает. Но повторяюсь, при начале загрузке, сразу после компиляции, ардуина перезагружается, начинают мигать светодиоды, как обычно при загрузке - не долго, но когда ардуина загружается, то в ней начинает работать программа прошитая через ICSP а ИДЕ висит и затем ошибку выдает

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Залей блинк через вторую плату и проверь с какой частотой моргает.

AsNik
Offline
Зарегистрирован: 24.10.2020

Komandir пишет:
Залей блинк через вторую плату и проверь с какой частотой моргает.

Сейчас еще раз попробую, но помоему (уже заливал) как положено один герц...

ADD

Да, частота один герц. Секунду горит, секунду нет.

И кстати через ICSP загружается с обычным загрузчиком, через USB эта нанка грузилась только с Old Bootloader...

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Если моргает не раз в секунду - сбил фьюзы.
Если моргает раз в секунду - залей скетч с Serial.println и проверь есть ли вывод в порт.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Мог снести резисторы на дорожках от usb-uart к atmega.

AsNik
Offline
Зарегистрирован: 24.10.2020

Komandir пишет:
Мог снести резисторы на дорожках от usb-uart к atmega.

Да нет) Я ее вообще не трогаю, торчит она себе в макетке и торчит...

Сейчас попробую с портом....

Нет, в Serial ничего не летит, но светодиоды горят Pow(понятно) и Tx постоянно...

Но... кстати, если что-то посылать в ардуину (в мониторе порта), то на ардуине вспыхивает Rx

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Я бы с лупой изучил линию Tx. И макетку прозвонить на вопрос кз по тх на плюс и землю.

AsNik
Offline
Зарегистрирован: 24.10.2020

Komandir пишет:
Я бы с лупой изучил линию Tx.

Опа.... Вытащил из макетки, и с другой стороны один резистор, я его ногтем поддел - он и отвалился, не знаю на какой он линии.... сейчас поищу в интернете. Находится рядом с микросхемой USB (там их два(резистора) рядом... Возможно Вы правы. Но тогда это заводской(китайский) брак... Но нанка уже больше года торчит в этой макетке....

Наминал резистора не увидел, он сразу потерялся.... Ну слепой я уже(  А тот, который остался, на нем тоже ни черта не видно... Но хуже всего - у меня смдшных нет и в своем городе вряд ли найду(

Есть еще пару жареных ардуин, мож с них чего подойдет...

AsNik
Offline
Зарегистрирован: 24.10.2020

Вот на обратной стороне его красной стрелкой указал. Наверное на 1 кОм

AsNik
Offline
Зарегистрирован: 24.10.2020

Запаял я этот резистор. Такого мелкого не нашел, пришлось припаять чуть больше. Одну сторону на пятак, второй пятак оказался под резистором, пришлось проводок и на ногу Tx. Все равно не шьется через USB, но теперь хоть в порт шлет. Т.е. по ICSP прошил тестовую прошивку в сериал пишет раз в секунду, в мониторе порта видно. А если нажать загрузить скеч (пустой ) (через USB ), то в логе практически через две секунды после компиляции и начала загрузки:

Скетч использует 444 байт (1%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.
Произошла ошибка при загрузке скетча
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x00
 
Может слепыми глазами где соплю повесил, хотя вроде мультиком прозвонил.... Или из-за проводка... Всё, сил больше нет сегодня ее реанимировать...
Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Напишите эхо скетч для Serial

Пока не сможете из терминала посылать и принимать назад - надо разбираться с железом.

AsNik
Offline
Зарегистрирован: 24.10.2020

Тут свежем взглядом посмотрел. Т.н. тестером померил верхний резистор - он 10кОм (мультик показал 11.8 кОм)

Перепаял нижний на 10 и в дип корпусе Удобнее кстати и без провода... Но теперь и через ICSP ошибка при загрузке:

avrdude: Yikes!  Invalid device signature.
         Double check connections and try again, or use -F to override
         this check.
 
Произошла ошибка при загрузке скетча
 
Хотя в интернете в схемах наны вроде как по 1 ком эти резисторы.... На том, который остался не видно надписи.
 
Хотел эхо скеч залить) 
Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

У вас же несколько плат ... Эти резисторы для защиты и они 1 кOm скорее всего. На 10 кОм сигнал потеряется...

AsNik
Offline
Зарегистрирован: 24.10.2020

Komandir пишет:

У вас же несколько плат ... 

дело в том что на них(резисторах) не видно ничего... Тестером меряю, который рядом с отвалившимся на нем 11кОм. Сейчас доступны мне полуживая нана и уно(которая пока программатор ISP) Остальные наны в другом месте, за ними ехать надо)

В общем я перепаял на 1 кОм тоже в дип, получилось куда аккуратнее чем с смд.

Подключаю через ISP, загружаю - таже ошибка. А потом смотрю, старый я дурак, перепутал RESET с MISO

В итоге залил Эхо через ICSP:

void setup() {
  Serial.begin(115200); Serial.print("Start");
}

void loop() {
  if (Serial.available() > 0) {
    byte bb = Serial.read();
    Serial.print((char)bb);
  }
}

Start в мониторе вижу и всё...

поменял на всякий случай

void setup() {
  Serial.begin(115200); Serial.println("Start");
}

void loop() {
  if (Serial.available() > 0) {
    byte bb = Serial.read();
    Serial.println((char)bb);
  }
  delay(1000);
  Serial.println("Second");
}

Вижу Start и потом Second'ы идут каждую секунду...

На отправку не реагирует.
Нет смысла впаивать 10 кОм и еще раз пробовать? Я понимаю, что вроде везде в схемах указаны 1 кОм, но китайцы... Да и тестер показывает у "верхнего"  11...(
 
ADD: Хотя при отправки из монитора (нажатие энтер) Led Rx вспыхивает, не ярко, но примерно так же как и Tx каждую секунду...
AsNik
Offline
Зарегистрирован: 24.10.2020

Или может верхний резистор, чего того не того, может его тоже заменить на килоом? Сейчас еще раз его померил (и прошлый раз и сейчас не выпаивал) - 12 с копейками показал. Странно( Хотя нижний, который впаял(дип) меряю - 1 кОм кажет.