Доделать скетч на ардуино

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

telect - если серьезно, твоя логика бы работала, если бы тут сидела куча голодных безработных программистов, готовых ухватится за любой заказ. Однако в реальности ситуация другая - заказов на рынке больше, чем желающих их выполнять. Так что у меня есть возможность выбирать и назначать свою цену.

Назначенная мной вилка - 5-10 штук - абсолютно в рынке. я даже думаю что многие коллеги попеняют мне, что я демпингую. Так что твои 1000р - ничего кроме смеха не вызывают. Нет денег - иди мимо.

telect
Offline
Зарегистрирован: 28.01.2016

Да мне канава не нужна и не я на деньги жалуюсь, так что не передергивай.

Хотел еще продолжить срач, но стер. Лениво уже стало отвечать

telect
Offline
Зарегистрирован: 28.01.2016

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


Ну тут просто кто-то найти деньги не может на канаву, вот я и написал. Ну если у вас всё так хорошо, то супер. Я ж не знал. Тут только дальнейшего процветания пожелать остается

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

DetSimen пишет:

telect пишет:
Кстати, подобные устройства на алике стоят 2 тысячи, так что глупо тут ожидать, что кто-то заплатит 10 тысяч.

Готовый пинжак тоже 2000р стоит, а попробуй заказать сшить по фигуре.  За 1000 точно не получится. 

 у нас только работа - 10тыр. )))

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

telect пишет:
Хотел еще продолжить срач, но стер. Лениво уже стало отвечать

А что, до пятницы не продержишься? Жаль!

andyparker
Offline
Зарегистрирован: 20.12.2020

Обесценивать работу в той сфере, в которой мало что понимаешь - обычное дело. Забавно было читать как про 1000р (с утра подняло настроение), так и про цену устройства ПРОМЫШЛЕННОЙ РАЗРАБОТКИ.

Morroc
Offline
Зарегистрирован: 24.10.2016

telect пишет:
За эти 10 тысяч я себе курсы оплачу и научусь, чем кому-то другому эти курсы оплачивать, чтоб он мне работу сделал.

Нафига ? Оплатите себе курсы трейдинга и гребите миллионы лопатой на акциях )

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

1м3 копания траншеи вручную на самом легком грунте (а таких, как известно, не бывает) стоит от 500р. При этом человек, который будет выполнять эту работу должен знать только что такое лопата.

Для программирования микроконтроллера исполнитель должен знать си++, структуру МК, схемотехнику, английский язык в достаточном для чтения даташитов объеме. Так что 1000р для такого человека - это, как было сказано выше, программа на уровне "блинк без дэлей". Делать что-то большее за эти деньги - это просто неуважение к себе.

Бывают случаи, когда самому интересно или есть практически готовые (свои) наработки. Но это - частные случаи.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

А с чего наработки должны снижать стоимость работы ? Такие "частные случаи" - скорее теория. Может быть продажа готового кода без листинга.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

brokly пишет:

А с чего наработки должны снижать стоимость работы ? 

Согласен. Но можно снизить предоставляя только машинный код. Только, типа, прошивка. А дальше гребись в ассемблере. Забавно...

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

Вообще, такие слова как листинг - это что то явно из прошлого.)

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Green пишет:

Вообще, такие слова как листинг - это что то явно из прошлого.)

Гы - это из реалии микроконтролеров. К яве и питону это никак не относится.

sadman41
Offline
Зарегистрирован: 19.10.2016

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

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

mykaida пишет:

Гы - это из реалии микроконтролеров. К яве и питону это никак не относится.


Какие такие реалии?
Листинг был на асме, при распечатывании результата после трансляции.
Ну да, можно и сейчас получить из elf-а, только кому он нафиг нужен. И разве это имелось ввиду?

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

sadman41 пишет:
В бейсике была команда LIST, по-моему. Так что к языкам уровнем повыше асма тоже можно применить понятие "листинг", полагаю.

Это просто команда. В данном случае, команда "смотреть исходный текст".

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B3#:~:text=%D0%9B%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B3%20(%D1%86%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%20%D0%B1%D1%83%D0%BC%D0%B0%D0%B3%D0%B8)%20%E2%80%94%20%D0%B2%D0%BD%D0%B5%D1%81%D0%B5%D0%BD%D0%B8%D0%B5,%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D0%BE%D0%B9%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B%20%D0%B8%D0%BB%D0%B8%20%D0%B5%D1%91%20%D1%87%D0%B0%D1%81%D1%82%D0%B8.

это то что говорит википедия

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

Вот именно: "бумажная распечатка текста компьютерной программы или её части."

rst
Offline
Зарегистрирован: 25.06.2018

Green пишет:
Листинг был на асме, при распечатывании результата после трансляции.

Ну да, можно и сейчас получить из elf-а, только кому он нафиг нужен. И разве это имелось ввиду?

Он не "был", он "есть". И не только "на асме", си-компилятор тоже вполне нормально генерит листинги. И весьма полезен. Но для практиков, а не для теоретиков.

И из elf-a - сильно сомневаюсь что его можно получить. Из elf-а - только дизасм. Путаете "листинг" с "дизассемблером".

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

rst пишет:

Green пишет:
Листинг был на асме, при распечатывании результата после трансляции.

Ну да, можно и сейчас получить из elf-а, только кому он нафиг нужен. И разве это имелось ввиду?

Он не "был", он "есть". И не только "на асме", си-компилятор тоже вполне нормально генерит листинги. И весьма полезен. Но для практиков, а не для теоретиков.

И из elf-a - сильно сомневаюсь что его можно получить. Из elf-а - только дизасм. Путаете "листинг" с "дизассемблером".

В ардуинке - можно. Компилятор сохраняет в эльфе номера строк исходника.

Вот такая команда:

/home/wlad/ArduinoIDE/hardware/tools/avr/bin/avr-objdump -S Blink.ino.elf >> 1.txt

Тут путь для линукса, для винды  иначе.

и вот такой файл получается для штатного Блинка из примеров:


Blink.ino.elf:     file format elf32-avr


Disassembly of section .text:

00000000 <__vectors>:
   0:	0c 94 5c 00 	jmp	0xb8	; 0xb8 <__ctors_end>
   4:	0c 94 6e 00 	jmp	0xdc	; 0xdc <__bad_interrupt>
   8:	0c 94 6e 00 	jmp	0xdc	; 0xdc <__bad_interrupt>
   c:	0c 94 6e 00 	jmp	0xdc	; 0xdc <__bad_interrupt>
  10:	0c 94 6e 00 	jmp	0xdc	; 0xdc <__bad_interrupt>
  14:	0c 94 6e 00 	jmp	0xdc	; 0xdc <__bad_interrupt>
  18:	0c 94 6e 00 	jmp	0xdc	; 0xdc <__bad_interrupt>
  1c:	0c 94 6e 00 	jmp	0xdc	; 0xdc <__bad_interrupt>
  20:	0c 94 6e 00 	jmp	0xdc	; 0xdc <__bad_interrupt>
  24:	0c 94 6e 00 	jmp	0xdc	; 0xdc <__bad_interrupt>
  28:	0c 94 6e 00 	jmp	0xdc	; 0xdc <__bad_interrupt>
  2c:	0c 94 6e 00 	jmp	0xdc	; 0xdc <__bad_interrupt>
  30:	0c 94 6e 00 	jmp	0xdc	; 0xdc <__bad_interrupt>
  34:	0c 94 6e 00 	jmp	0xdc	; 0xdc <__bad_interrupt>
  38:	0c 94 6e 00 	jmp	0xdc	; 0xdc <__bad_interrupt>
  3c:	0c 94 6e 00 	jmp	0xdc	; 0xdc <__bad_interrupt>
  40:	0c 94 17 01 	jmp	0x22e	; 0x22e <__vector_16>
  44:	0c 94 6e 00 	jmp	0xdc	; 0xdc <__bad_interrupt>
  48:	0c 94 6e 00 	jmp	0xdc	; 0xdc <__bad_interrupt>
  4c:	0c 94 6e 00 	jmp	0xdc	; 0xdc <__bad_interrupt>
  50:	0c 94 6e 00 	jmp	0xdc	; 0xdc <__bad_interrupt>
  54:	0c 94 6e 00 	jmp	0xdc	; 0xdc <__bad_interrupt>
  58:	0c 94 6e 00 	jmp	0xdc	; 0xdc <__bad_interrupt>
  5c:	0c 94 6e 00 	jmp	0xdc	; 0xdc <__bad_interrupt>
  60:	0c 94 6e 00 	jmp	0xdc	; 0xdc <__bad_interrupt>
  64:	0c 94 6e 00 	jmp	0xdc	; 0xdc <__bad_interrupt>

00000068 <__trampolines_end>:
  68:	00 00       	nop
  6a:	00 08       	sbc	r0, r0
  6c:	00 02       	muls	r16, r16
  6e:	01 00       	.word	0x0001	; ????
  70:	00 03       	mulsu	r16, r16
  72:	04 07       	cpc	r16, r20
	...

0000007c <port_to_output_PGM>:
  7c:	00 00 00 00 25 00 28 00 2b 00                       ....%.(.+.

00000086 <port_to_mode_PGM>:
  86:	00 00 00 00 24 00 27 00 2a 00                       ....$.'.*.

00000090 <digital_pin_to_port_PGM>:
  90:	04 04 04 04 04 04 04 04 02 02 02 02 02 02 03 03     ................
  a0:	03 03 03 03                                         ....

000000a4 <digital_pin_to_bit_mask_PGM>:
  a4:	01 02 04 08 10 20 40 80 01 02 04 08 10 20 01 02     ..... @...... ..
  b4:	04 08 10 20                                         ... 

000000b8 <__ctors_end>:
  b8:	11 24       	eor	r1, r1
  ba:	1f be       	out	0x3f, r1	; 63
  bc:	cf ef       	ldi	r28, 0xFF	; 255
  be:	d8 e0       	ldi	r29, 0x08	; 8
  c0:	de bf       	out	0x3e, r29	; 62
  c2:	cd bf       	out	0x3d, r28	; 61

000000c4 <__do_clear_bss>:
  c4:	21 e0       	ldi	r18, 0x01	; 1
  c6:	a0 e0       	ldi	r26, 0x00	; 0
  c8:	b1 e0       	ldi	r27, 0x01	; 1
  ca:	01 c0       	rjmp	.+2      	; 0xce <.do_clear_bss_start>

000000cc <.do_clear_bss_loop>:
  cc:	1d 92       	st	X+, r1

000000ce <.do_clear_bss_start>:
  ce:	a9 30       	cpi	r26, 0x09	; 9
  d0:	b2 07       	cpc	r27, r18
  d2:	e1 f7       	brne	.-8      	; 0xcc <.do_clear_bss_loop>
  d4:	0e 94 61 01 	call	0x2c2	; 0x2c2 <main>
  d8:	0c 94 d2 01 	jmp	0x3a4	; 0x3a4 <_exit>

000000dc <__bad_interrupt>:
  dc:	0c 94 00 00 	jmp	0	; 0x0 <__vectors>

000000e0 <digitalWrite>:
	}
}

void digitalWrite(uint8_t pin, uint8_t val)
{
	uint8_t timer = digitalPinToTimer(pin);
  e0:	90 e0       	ldi	r25, 0x00	; 0
  e2:	fc 01       	movw	r30, r24
  e4:	e8 59       	subi	r30, 0x98	; 152
  e6:	ff 4f       	sbci	r31, 0xFF	; 255
  e8:	24 91       	lpm	r18, Z
	uint8_t bit = digitalPinToBitMask(pin);
  ea:	fc 01       	movw	r30, r24
  ec:	ec 55       	subi	r30, 0x5C	; 92
  ee:	ff 4f       	sbci	r31, 0xFF	; 255
  f0:	34 91       	lpm	r19, Z
	uint8_t port = digitalPinToPort(pin);
  f2:	fc 01       	movw	r30, r24
  f4:	e0 57       	subi	r30, 0x70	; 112
  f6:	ff 4f       	sbci	r31, 0xFF	; 255
  f8:	e4 91       	lpm	r30, Z
	volatile uint8_t *out;

	if (port == NOT_A_PIN) return;
  fa:	ee 23       	and	r30, r30
  fc:	c9 f0       	breq	.+50     	; 0x130 <digitalWrite+0x50>

	// If the pin that support PWM output, we need to turn it off
	// before doing a digital write.
	if (timer != NOT_ON_TIMER) turnOffPWM(timer);
  fe:	22 23       	and	r18, r18
 100:	39 f0       	breq	.+14     	; 0x110 <digitalWrite+0x30>
//
//static inline void turnOffPWM(uint8_t timer) __attribute__ ((always_inline));
//static inline void turnOffPWM(uint8_t timer)
static void turnOffPWM(uint8_t timer)
{
	switch (timer)
 102:	23 30       	cpi	r18, 0x03	; 3
 104:	01 f1       	breq	.+64     	; 0x146 <digitalWrite+0x66>
 106:	a8 f4       	brcc	.+42     	; 0x132 <digitalWrite+0x52>
 108:	21 30       	cpi	r18, 0x01	; 1
 10a:	19 f1       	breq	.+70     	; 0x152 <digitalWrite+0x72>
 10c:	22 30       	cpi	r18, 0x02	; 2
 10e:	29 f1       	breq	.+74     	; 0x15a <digitalWrite+0x7a>

	// If the pin that support PWM output, we need to turn it off
	// before doing a digital write.
	if (timer != NOT_ON_TIMER) turnOffPWM(timer);

	out = portOutputRegister(port);
 110:	f0 e0       	ldi	r31, 0x00	; 0
 112:	ee 0f       	add	r30, r30
 114:	ff 1f       	adc	r31, r31
 116:	e4 58       	subi	r30, 0x84	; 132
 118:	ff 4f       	sbci	r31, 0xFF	; 255
 11a:	a5 91       	lpm	r26, Z+
 11c:	b4 91       	lpm	r27, Z

	uint8_t oldSREG = SREG;
 11e:	8f b7       	in	r24, 0x3f	; 63
	cli();
 120:	f8 94       	cli

	if (val == LOW) {
		*out &= ~bit;
 122:	ec 91       	ld	r30, X
	out = portOutputRegister(port);

	uint8_t oldSREG = SREG;
	cli();

	if (val == LOW) {
 124:	61 11       	cpse	r22, r1
 126:	26 c0       	rjmp	.+76     	; 0x174 <digitalWrite+0x94>
		*out &= ~bit;
 128:	30 95       	com	r19
 12a:	3e 23       	and	r19, r30
	} else {
		*out |= bit;
 12c:	3c 93       	st	X, r19
	}

	SREG = oldSREG;
 12e:	8f bf       	out	0x3f, r24	; 63
}
 130:	08 95       	ret
//
//static inline void turnOffPWM(uint8_t timer) __attribute__ ((always_inline));
//static inline void turnOffPWM(uint8_t timer)
static void turnOffPWM(uint8_t timer)
{
	switch (timer)
 132:	27 30       	cpi	r18, 0x07	; 7
 134:	a9 f0       	breq	.+42     	; 0x160 <digitalWrite+0x80>
 136:	28 30       	cpi	r18, 0x08	; 8
 138:	c9 f0       	breq	.+50     	; 0x16c <digitalWrite+0x8c>
 13a:	24 30       	cpi	r18, 0x04	; 4
 13c:	49 f7       	brne	.-46     	; 0x110 <digitalWrite+0x30>
	{
		#if defined(TCCR1A) && defined(COM1A1)
		case TIMER1A:   cbi(TCCR1A, COM1A1);    break;
		#endif
		#if defined(TCCR1A) && defined(COM1B1)
		case TIMER1B:   cbi(TCCR1A, COM1B1);    break;
 13e:	80 91 80 00 	lds	r24, 0x0080	; 0x800080 <__DATA_REGION_ORIGIN__+0x20>
 142:	8f 7d       	andi	r24, 0xDF	; 223
 144:	03 c0       	rjmp	.+6      	; 0x14c <digitalWrite+0x6c>
static void turnOffPWM(uint8_t timer)
{
	switch (timer)
	{
		#if defined(TCCR1A) && defined(COM1A1)
		case TIMER1A:   cbi(TCCR1A, COM1A1);    break;
 146:	80 91 80 00 	lds	r24, 0x0080	; 0x800080 <__DATA_REGION_ORIGIN__+0x20>
 14a:	8f 77       	andi	r24, 0x7F	; 127
		#endif
		#if defined(TCCR1A) && defined(COM1B1)
		case TIMER1B:   cbi(TCCR1A, COM1B1);    break;
 14c:	80 93 80 00 	sts	0x0080, r24	; 0x800080 <__DATA_REGION_ORIGIN__+0x20>
 150:	df cf       	rjmp	.-66     	; 0x110 <digitalWrite+0x30>
		#if defined(TCCR2) && defined(COM21)
		case  TIMER2:   cbi(TCCR2, COM21);      break;
		#endif
		
		#if defined(TCCR0A) && defined(COM0A1)
		case  TIMER0A:  cbi(TCCR0A, COM0A1);    break;
 152:	84 b5       	in	r24, 0x24	; 36
 154:	8f 77       	andi	r24, 0x7F	; 127
		#endif
		
		#if defined(TCCR0A) && defined(COM0B1)
		case  TIMER0B:  cbi(TCCR0A, COM0B1);    break;
 156:	84 bd       	out	0x24, r24	; 36
 158:	db cf       	rjmp	.-74     	; 0x110 <digitalWrite+0x30>
 15a:	84 b5       	in	r24, 0x24	; 36
 15c:	8f 7d       	andi	r24, 0xDF	; 223
 15e:	fb cf       	rjmp	.-10     	; 0x156 <digitalWrite+0x76>
		#endif
		#if defined(TCCR2A) && defined(COM2A1)
		case  TIMER2A:  cbi(TCCR2A, COM2A1);    break;
 160:	80 91 b0 00 	lds	r24, 0x00B0	; 0x8000b0 <__DATA_REGION_ORIGIN__+0x50>
 164:	8f 77       	andi	r24, 0x7F	; 127
		#endif
		#if defined(TCCR2A) && defined(COM2B1)
		case  TIMER2B:  cbi(TCCR2A, COM2B1);    break;
 166:	80 93 b0 00 	sts	0x00B0, r24	; 0x8000b0 <__DATA_REGION_ORIGIN__+0x50>
 16a:	d2 cf       	rjmp	.-92     	; 0x110 <digitalWrite+0x30>
 16c:	80 91 b0 00 	lds	r24, 0x00B0	; 0x8000b0 <__DATA_REGION_ORIGIN__+0x50>
 170:	8f 7d       	andi	r24, 0xDF	; 223
 172:	f9 cf       	rjmp	.-14     	; 0x166 <digitalWrite+0x86>
	cli();

	if (val == LOW) {
		*out &= ~bit;
	} else {
		*out |= bit;
 174:	3e 2b       	or	r19, r30
 176:	da cf       	rjmp	.-76     	; 0x12c <digitalWrite+0x4c>

00000178 <micros>:
	return m;
}

unsigned long micros() {
	unsigned long m;
	uint8_t oldSREG = SREG, t;
 178:	3f b7       	in	r19, 0x3f	; 63
	
	cli();
 17a:	f8 94       	cli
	m = timer0_overflow_count;
 17c:	80 91 05 01 	lds	r24, 0x0105	; 0x800105 <timer0_overflow_count>
 180:	90 91 06 01 	lds	r25, 0x0106	; 0x800106 <timer0_overflow_count+0x1>
 184:	a0 91 07 01 	lds	r26, 0x0107	; 0x800107 <timer0_overflow_count+0x2>
 188:	b0 91 08 01 	lds	r27, 0x0108	; 0x800108 <timer0_overflow_count+0x3>
#if defined(TCNT0)
	t = TCNT0;
 18c:	26 b5       	in	r18, 0x26	; 38
#else
	#error TIMER 0 not defined
#endif

#ifdef TIFR0
	if ((TIFR0 & _BV(TOV0)) && (t < 255))
 18e:	a8 9b       	sbis	0x15, 0	; 21
 190:	05 c0       	rjmp	.+10     	; 0x19c <micros+0x24>
 192:	2f 3f       	cpi	r18, 0xFF	; 255
 194:	19 f0       	breq	.+6      	; 0x19c <micros+0x24>
		m++;
 196:	01 96       	adiw	r24, 0x01	; 1
 198:	a1 1d       	adc	r26, r1
 19a:	b1 1d       	adc	r27, r1
#else
	if ((TIFR & _BV(TOV0)) && (t < 255))
		m++;
#endif

	SREG = oldSREG;
 19c:	3f bf       	out	0x3f, r19	; 63
	
	return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond());
 19e:	ba 2f       	mov	r27, r26
 1a0:	a9 2f       	mov	r26, r25
 1a2:	98 2f       	mov	r25, r24
 1a4:	88 27       	eor	r24, r24
 1a6:	bc 01       	movw	r22, r24
 1a8:	cd 01       	movw	r24, r26
 1aa:	62 0f       	add	r22, r18
 1ac:	71 1d       	adc	r23, r1
 1ae:	81 1d       	adc	r24, r1
 1b0:	91 1d       	adc	r25, r1
 1b2:	42 e0       	ldi	r20, 0x02	; 2
 1b4:	66 0f       	add	r22, r22
 1b6:	77 1f       	adc	r23, r23
 1b8:	88 1f       	adc	r24, r24
 1ba:	99 1f       	adc	r25, r25
 1bc:	4a 95       	dec	r20
 1be:	d1 f7       	brne	.-12     	; 0x1b4 <micros+0x3c>
}
 1c0:	08 95       	ret

000001c2 <delay.constprop.0>:

void delay(unsigned long ms)
 1c2:	8f 92       	push	r8
 1c4:	9f 92       	push	r9
 1c6:	af 92       	push	r10
 1c8:	bf 92       	push	r11
 1ca:	cf 92       	push	r12
 1cc:	df 92       	push	r13
 1ce:	ef 92       	push	r14
 1d0:	ff 92       	push	r15
{
	uint32_t start = micros();
 1d2:	0e 94 bc 00 	call	0x178	; 0x178 <micros>
 1d6:	4b 01       	movw	r8, r22
 1d8:	5c 01       	movw	r10, r24
 1da:	88 ee       	ldi	r24, 0xE8	; 232
 1dc:	c8 2e       	mov	r12, r24
 1de:	83 e0       	ldi	r24, 0x03	; 3
 1e0:	d8 2e       	mov	r13, r24
 1e2:	e1 2c       	mov	r14, r1
 1e4:	f1 2c       	mov	r15, r1

	while (ms > 0) {
		yield();
		while ( ms > 0 && (micros() - start) >= 1000) {
 1e6:	0e 94 bc 00 	call	0x178	; 0x178 <micros>
 1ea:	68 19       	sub	r22, r8
 1ec:	79 09       	sbc	r23, r9
 1ee:	8a 09       	sbc	r24, r10
 1f0:	9b 09       	sbc	r25, r11
 1f2:	68 3e       	cpi	r22, 0xE8	; 232
 1f4:	73 40       	sbci	r23, 0x03	; 3
 1f6:	81 05       	cpc	r24, r1
 1f8:	91 05       	cpc	r25, r1
 1fa:	a8 f3       	brcs	.-22     	; 0x1e6 <delay.constprop.0+0x24>
			ms--;
 1fc:	21 e0       	ldi	r18, 0x01	; 1
 1fe:	c2 1a       	sub	r12, r18
 200:	d1 08       	sbc	r13, r1
 202:	e1 08       	sbc	r14, r1
 204:	f1 08       	sbc	r15, r1
			start += 1000;
 206:	88 ee       	ldi	r24, 0xE8	; 232
 208:	88 0e       	add	r8, r24
 20a:	83 e0       	ldi	r24, 0x03	; 3
 20c:	98 1e       	adc	r9, r24
 20e:	a1 1c       	adc	r10, r1
 210:	b1 1c       	adc	r11, r1
{
	uint32_t start = micros();

	while (ms > 0) {
		yield();
		while ( ms > 0 && (micros() - start) >= 1000) {
 212:	c1 14       	cp	r12, r1
 214:	d1 04       	cpc	r13, r1
 216:	e1 04       	cpc	r14, r1
 218:	f1 04       	cpc	r15, r1
 21a:	29 f7       	brne	.-54     	; 0x1e6 <delay.constprop.0+0x24>
			ms--;
			start += 1000;
		}
	}
}
 21c:	ff 90       	pop	r15
 21e:	ef 90       	pop	r14
 220:	df 90       	pop	r13
 222:	cf 90       	pop	r12
 224:	bf 90       	pop	r11
 226:	af 90       	pop	r10
 228:	9f 90       	pop	r9
 22a:	8f 90       	pop	r8
 22c:	08 95       	ret

0000022e <__vector_16>:
#if defined(TIM0_OVF_vect)
ISR(TIM0_OVF_vect)
#else
ISR(TIMER0_OVF_vect)
#endif
{
 22e:	1f 92       	push	r1
 230:	0f 92       	push	r0
 232:	0f b6       	in	r0, 0x3f	; 63
 234:	0f 92       	push	r0
 236:	11 24       	eor	r1, r1
 238:	2f 93       	push	r18
 23a:	3f 93       	push	r19
 23c:	8f 93       	push	r24
 23e:	9f 93       	push	r25
 240:	af 93       	push	r26
 242:	bf 93       	push	r27
	// copy these to local variables so they can be stored in registers
	// (volatile variables must be read from memory on every access)
	unsigned long m = timer0_millis;
 244:	80 91 01 01 	lds	r24, 0x0101	; 0x800101 <timer0_millis>
 248:	90 91 02 01 	lds	r25, 0x0102	; 0x800102 <timer0_millis+0x1>
 24c:	a0 91 03 01 	lds	r26, 0x0103	; 0x800103 <timer0_millis+0x2>
 250:	b0 91 04 01 	lds	r27, 0x0104	; 0x800104 <timer0_millis+0x3>
	unsigned char f = timer0_fract;
 254:	30 91 00 01 	lds	r19, 0x0100	; 0x800100 <_edata>

	m += MILLIS_INC;
	f += FRACT_INC;
 258:	23 e0       	ldi	r18, 0x03	; 3
 25a:	23 0f       	add	r18, r19
	if (f >= FRACT_MAX) {
 25c:	2d 37       	cpi	r18, 0x7D	; 125
 25e:	58 f5       	brcc	.+86     	; 0x2b6 <__vector_16+0x88>
	// copy these to local variables so they can be stored in registers
	// (volatile variables must be read from memory on every access)
	unsigned long m = timer0_millis;
	unsigned char f = timer0_fract;

	m += MILLIS_INC;
 260:	01 96       	adiw	r24, 0x01	; 1
 262:	a1 1d       	adc	r26, r1
 264:	b1 1d       	adc	r27, r1
	if (f >= FRACT_MAX) {
		f -= FRACT_MAX;
		m += 1;
	}

	timer0_fract = f;
 266:	20 93 00 01 	sts	0x0100, r18	; 0x800100 <_edata>
	timer0_millis = m;
 26a:	80 93 01 01 	sts	0x0101, r24	; 0x800101 <timer0_millis>
 26e:	90 93 02 01 	sts	0x0102, r25	; 0x800102 <timer0_millis+0x1>
 272:	a0 93 03 01 	sts	0x0103, r26	; 0x800103 <timer0_millis+0x2>
 276:	b0 93 04 01 	sts	0x0104, r27	; 0x800104 <timer0_millis+0x3>
	timer0_overflow_count++;
 27a:	80 91 05 01 	lds	r24, 0x0105	; 0x800105 <timer0_overflow_count>
 27e:	90 91 06 01 	lds	r25, 0x0106	; 0x800106 <timer0_overflow_count+0x1>
 282:	a0 91 07 01 	lds	r26, 0x0107	; 0x800107 <timer0_overflow_count+0x2>
 286:	b0 91 08 01 	lds	r27, 0x0108	; 0x800108 <timer0_overflow_count+0x3>
 28a:	01 96       	adiw	r24, 0x01	; 1
 28c:	a1 1d       	adc	r26, r1
 28e:	b1 1d       	adc	r27, r1
 290:	80 93 05 01 	sts	0x0105, r24	; 0x800105 <timer0_overflow_count>
 294:	90 93 06 01 	sts	0x0106, r25	; 0x800106 <timer0_overflow_count+0x1>
 298:	a0 93 07 01 	sts	0x0107, r26	; 0x800107 <timer0_overflow_count+0x2>
 29c:	b0 93 08 01 	sts	0x0108, r27	; 0x800108 <timer0_overflow_count+0x3>
}
 2a0:	bf 91       	pop	r27
 2a2:	af 91       	pop	r26
 2a4:	9f 91       	pop	r25
 2a6:	8f 91       	pop	r24
 2a8:	3f 91       	pop	r19
 2aa:	2f 91       	pop	r18
 2ac:	0f 90       	pop	r0
 2ae:	0f be       	out	0x3f, r0	; 63
 2b0:	0f 90       	pop	r0
 2b2:	1f 90       	pop	r1
 2b4:	18 95       	reti
	unsigned char f = timer0_fract;

	m += MILLIS_INC;
	f += FRACT_INC;
	if (f >= FRACT_MAX) {
		f -= FRACT_MAX;
 2b6:	26 e8       	ldi	r18, 0x86	; 134
 2b8:	23 0f       	add	r18, r19
		m += 1;
 2ba:	02 96       	adiw	r24, 0x02	; 2
 2bc:	a1 1d       	adc	r26, r1
 2be:	b1 1d       	adc	r27, r1
 2c0:	d2 cf       	rjmp	.-92     	; 0x266 <__vector_16+0x38>

000002c2 <main>:

void init()
{
	// this needs to be called before setup() or some functions won't
	// work there
	sei();
 2c2:	78 94       	sei
	
	// 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)
	sbi(TCCR0A, WGM01);
 2c4:	84 b5       	in	r24, 0x24	; 36
 2c6:	82 60       	ori	r24, 0x02	; 2
 2c8:	84 bd       	out	0x24, r24	; 36
	sbi(TCCR0A, WGM00);
 2ca:	84 b5       	in	r24, 0x24	; 36
 2cc:	81 60       	ori	r24, 0x01	; 1
 2ce:	84 bd       	out	0x24, r24	; 36
	// this combination is for the standard atmega8
	sbi(TCCR0, CS01);
	sbi(TCCR0, CS00);
#elif defined(TCCR0B) && defined(CS01) && defined(CS00)
	// this combination is for the standard 168/328/1280/2560
	sbi(TCCR0B, CS01);
 2d0:	85 b5       	in	r24, 0x25	; 37
 2d2:	82 60       	ori	r24, 0x02	; 2
 2d4:	85 bd       	out	0x25, r24	; 37
	sbi(TCCR0B, CS00);
 2d6:	85 b5       	in	r24, 0x25	; 37
 2d8:	81 60       	ori	r24, 0x01	; 1
 2da:	85 bd       	out	0x25, r24	; 37

	// enable timer 0 overflow interrupt
#if defined(TIMSK) && defined(TOIE0)
	sbi(TIMSK, TOIE0);
#elif defined(TIMSK0) && defined(TOIE0)
	sbi(TIMSK0, TOIE0);
 2dc:	80 91 6e 00 	lds	r24, 0x006E	; 0x80006e <__DATA_REGION_ORIGIN__+0xe>
 2e0:	81 60       	ori	r24, 0x01	; 1
 2e2:	80 93 6e 00 	sts	0x006E, r24	; 0x80006e <__DATA_REGION_ORIGIN__+0xe>
	// 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 = 0;
 2e6:	10 92 81 00 	sts	0x0081, r1	; 0x800081 <__DATA_REGION_ORIGIN__+0x21>

	// set timer 1 prescale factor to 64
	sbi(TCCR1B, CS11);
 2ea:	80 91 81 00 	lds	r24, 0x0081	; 0x800081 <__DATA_REGION_ORIGIN__+0x21>
 2ee:	82 60       	ori	r24, 0x02	; 2
 2f0:	80 93 81 00 	sts	0x0081, r24	; 0x800081 <__DATA_REGION_ORIGIN__+0x21>
#if F_CPU >= 8000000L
	sbi(TCCR1B, CS10);
 2f4:	80 91 81 00 	lds	r24, 0x0081	; 0x800081 <__DATA_REGION_ORIGIN__+0x21>
 2f8:	81 60       	ori	r24, 0x01	; 1
 2fa:	80 93 81 00 	sts	0x0081, r24	; 0x800081 <__DATA_REGION_ORIGIN__+0x21>
	sbi(TCCR1, CS10);
#endif
#endif
	// put timer 1 in 8-bit phase correct pwm mode
#if defined(TCCR1A) && defined(WGM10)
	sbi(TCCR1A, WGM10);
 2fe:	80 91 80 00 	lds	r24, 0x0080	; 0x800080 <__DATA_REGION_ORIGIN__+0x20>
 302:	81 60       	ori	r24, 0x01	; 1
 304:	80 93 80 00 	sts	0x0080, r24	; 0x800080 <__DATA_REGION_ORIGIN__+0x20>

	// set timer 2 prescale factor to 64
#if defined(TCCR2) && defined(CS22)
	sbi(TCCR2, CS22);
#elif defined(TCCR2B) && defined(CS22)
	sbi(TCCR2B, CS22);
 308:	80 91 b1 00 	lds	r24, 0x00B1	; 0x8000b1 <__DATA_REGION_ORIGIN__+0x51>
 30c:	84 60       	ori	r24, 0x04	; 4
 30e:	80 93 b1 00 	sts	0x00B1, r24	; 0x8000b1 <__DATA_REGION_ORIGIN__+0x51>

	// configure timer 2 for phase correct pwm (8-bit)
#if defined(TCCR2) && defined(WGM20)
	sbi(TCCR2, WGM20);
#elif defined(TCCR2A) && defined(WGM20)
	sbi(TCCR2A, WGM20);
 312:	80 91 b0 00 	lds	r24, 0x00B0	; 0x8000b0 <__DATA_REGION_ORIGIN__+0x50>
 316:	81 60       	ori	r24, 0x01	; 1
 318:	80 93 b0 00 	sts	0x00B0, r24	; 0x8000b0 <__DATA_REGION_ORIGIN__+0x50>
#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
		sbi(ADCSRA, ADPS2);
 31c:	80 91 7a 00 	lds	r24, 0x007A	; 0x80007a <__DATA_REGION_ORIGIN__+0x1a>
 320:	84 60       	ori	r24, 0x04	; 4
 322:	80 93 7a 00 	sts	0x007A, r24	; 0x80007a <__DATA_REGION_ORIGIN__+0x1a>
		sbi(ADCSRA, ADPS1);
 326:	80 91 7a 00 	lds	r24, 0x007A	; 0x80007a <__DATA_REGION_ORIGIN__+0x1a>
 32a:	82 60       	ori	r24, 0x02	; 2
 32c:	80 93 7a 00 	sts	0x007A, r24	; 0x80007a <__DATA_REGION_ORIGIN__+0x1a>
		sbi(ADCSRA, ADPS0);
 330:	80 91 7a 00 	lds	r24, 0x007A	; 0x80007a <__DATA_REGION_ORIGIN__+0x1a>
 334:	81 60       	ori	r24, 0x01	; 1
 336:	80 93 7a 00 	sts	0x007A, r24	; 0x80007a <__DATA_REGION_ORIGIN__+0x1a>
		cbi(ADCSRA, ADPS2);
		cbi(ADCSRA, ADPS1);
		sbi(ADCSRA, ADPS0);
	#endif
	// enable a2d conversions
	sbi(ADCSRA, ADEN);
 33a:	80 91 7a 00 	lds	r24, 0x007A	; 0x80007a <__DATA_REGION_ORIGIN__+0x1a>
 33e:	80 68       	ori	r24, 0x80	; 128
 340:	80 93 7a 00 	sts	0x007A, r24	; 0x80007a <__DATA_REGION_ORIGIN__+0x1a>
	// 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;
 344:	10 92 c1 00 	sts	0x00C1, r1	; 0x8000c1 <__DATA_REGION_ORIGIN__+0x61>
#include "wiring_private.h"
#include "pins_arduino.h"

void pinMode(uint8_t pin, uint8_t mode)
{
	uint8_t bit = digitalPinToBitMask(pin);
 348:	e1 eb       	ldi	r30, 0xB1	; 177
 34a:	f0 e0       	ldi	r31, 0x00	; 0
 34c:	24 91       	lpm	r18, Z
	uint8_t port = digitalPinToPort(pin);
 34e:	ed e9       	ldi	r30, 0x9D	; 157
 350:	f0 e0       	ldi	r31, 0x00	; 0
 352:	84 91       	lpm	r24, Z
	volatile uint8_t *reg, *out;

	if (port == NOT_A_PIN) return;
 354:	88 23       	and	r24, r24
 356:	99 f0       	breq	.+38     	; 0x37e <main+0xbc>

	// JWS: can I let the optimizer do this?
	reg = portModeRegister(port);
 358:	90 e0       	ldi	r25, 0x00	; 0
 35a:	88 0f       	add	r24, r24
 35c:	99 1f       	adc	r25, r25
 35e:	fc 01       	movw	r30, r24
 360:	ea 57       	subi	r30, 0x7A	; 122
 362:	ff 4f       	sbci	r31, 0xFF	; 255
 364:	a5 91       	lpm	r26, Z+
 366:	b4 91       	lpm	r27, Z
	out = portOutputRegister(port);
 368:	fc 01       	movw	r30, r24
 36a:	e4 58       	subi	r30, 0x84	; 132
 36c:	ff 4f       	sbci	r31, 0xFF	; 255
 36e:	85 91       	lpm	r24, Z+
 370:	94 91       	lpm	r25, Z
                cli();
		*reg &= ~bit;
		*out |= bit;
		SREG = oldSREG;
	} else {
		uint8_t oldSREG = SREG;
 372:	8f b7       	in	r24, 0x3f	; 63
                cli();
 374:	f8 94       	cli
		*reg |= bit;
 376:	ec 91       	ld	r30, X
 378:	e2 2b       	or	r30, r18
 37a:	ec 93       	st	X, r30
		SREG = oldSREG;
 37c:	8f bf       	out	0x3f, r24	; 63
	
	setup();
    
	for (;;) {
		loop();
		if (serialEventRun) serialEventRun();
 37e:	c0 e0       	ldi	r28, 0x00	; 0
 380:	d0 e0       	ldi	r29, 0x00	; 0
  pinMode(led, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
 382:	61 e0       	ldi	r22, 0x01	; 1
 384:	8d e0       	ldi	r24, 0x0D	; 13
 386:	0e 94 70 00 	call	0xe0	; 0xe0 <digitalWrite>
  delay(1000);               // wait for a second
 38a:	0e 94 e1 00 	call	0x1c2	; 0x1c2 <delay.constprop.0>
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
 38e:	60 e0       	ldi	r22, 0x00	; 0
 390:	8d e0       	ldi	r24, 0x0D	; 13
 392:	0e 94 70 00 	call	0xe0	; 0xe0 <digitalWrite>
  delay(1000);               // wait for a second
 396:	0e 94 e1 00 	call	0x1c2	; 0x1c2 <delay.constprop.0>
 39a:	20 97       	sbiw	r28, 0x00	; 0
 39c:	91 f3       	breq	.-28     	; 0x382 <main+0xc0>
 39e:	0e 94 00 00 	call	0	; 0x0 <__vectors>
 3a2:	ef cf       	rjmp	.-34     	; 0x382 <main+0xc0>

000003a4 <_exit>:
 3a4:	f8 94       	cli

000003a6 <__stop_program>:
 3a6:	ff cf       	rjmp	.-2      	; 0x3a6 <__stop_program>

 

rst
Offline
Зарегистрирован: 25.06.2018

wdrakula пишет:
В ардуинке - можно. Компилятор сохраняет в эльфе номера строк исходника.

"Номера строк исходника" - это хорошо. Но эта функция - для пошаговой отладки. Для привязки строк исходника к результирующему коду отладчиком. При имеющемся в наличии оригинальном файле исходника.

Если в наличии исходника нет, то сами номера строк (без их содержимого) - малоинформативны.

Или в ардуине в elf и содержимое строк исходника может сохраняться? Но ведь в обсуждаемом случае (когда автор не хочет отдавать исходник), а значит - автор кода позаботится о том, чтобы этих строк в .elf не было. Так что: из .elf только дизасм.

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

rst пишет:

И из elf-a - сильно сомневаюсь что его можно получить. Из elf-а - только дизасм. Путаете "листинг" с "дизассемблером".


Теоретики... практики...  Ну да.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Green пишет:

Вот именно: "бумажная распечатка текста компьютерной программы или её части."

Не придирайся. Признайся, что не понимал что это такое .

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

Это да. Ну не понимаю я эту современную молодёжь.)