Настройка компиляции в Arduino IDE

Jeka_M
Jeka_M аватар
Онлайн
Зарегистрирован: 06.07.2014

Добрый всем вечер.

Собственно захотелось поиграться с настройкой компиляции. В частности с уровнями оптимизации (O1, Os) и вытащить ассемблерный листинг avr-objdump'ом из файла ELF.

Не нашел, где записана строка с параметрами вызова avr-gcc и можно ли добавить вызов avr-objdump (кроме avr-gcc ещё вызывается avr-objcopy). Пока приходится вручную запускать avr-objdump и скармливать ему ELF.

Может кто знает? Спасибо.

Jeka_M
Jeka_M аватар
Онлайн
Зарегистрирован: 06.07.2014

Такое ощущение, что это где-то захардкожено...

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Jeka_M пишет:

строка с параметрами вызова avr-gcc и 

У меня

<корень IDE>\hardware\arduino\avr\platform.txt

Jeka_M пишет:

можно ли добавить вызов avr-objdump 

Не знаю, я отдельно запускал.

Jeka_M
Jeka_M аватар
Онлайн
Зарегистрирован: 06.07.2014

ЕвгенийП пишет:

У меня

<корень IDE>\hardware\arduino\avr\platform.txt

Вот спасибо. Похоже эту возможность добавили в новых версиях, начиная с 1.5.*. В старых версиях 1.0.* такого нет. 

С уровнем оптимизации разобрался, а вот вызов objdump пока не получилось добавить.

Jeka_M
Jeka_M аватар
Онлайн
Зарегистрирован: 06.07.2014

В общем разобрался со всем. Расскажу, может ещё кому пригодится. Как уже упоминалось, всё настраивается в файле <корень IDE>\hardware\arduino\avr\platform.txt

1) Уровень оптимизации меняется в строках compiler.c.flagscompiler.c.elf.flagscompiler.cpp.flags. По умолчанию стоит -Os

2) Автоматический вывод ассемблерного листинга в файл с помощью утилиты avr-objdump делается через хуки (hooks). В platform.txt в секции AVR compile variables добавляем новые строки:

compiler.objdump.cmd=avr-objdump.bat
compiler.objdump.flags={compiler.path}, {build.path}\{build.project_name}.elf, {build.path}\{build.project_name}.lst

В секции AVR compile patterns, подсекции Create output files (.eep and .hex) добавляем строку: 

recipe.hooks.objcopy.postobjcopy.1.pattern="{compiler.path}{compiler.objdump.cmd}" {compiler.objdump.flags}

(Описание всех хуков ЗДЕСЬ)

Теперь в папке <корень IDE>\hardware\tools\avr\bin\ делаем батник с именем avr-objdump.bat и следующим содержимым: 
@echo off
%1avr-objdump -h -S %2 > %3

Всё, теперь после компиляции во временной папке что-то типа C:\Users\User\AppData\Local\Temp\build28f38fc51e0bd2ba8c700ba028289fe6.tmp\ рядом с файлами *.hex и *.elf появится файл *.lst с ассемблерным листингом (обычный текстовый файл, кому не нравится расширение - можно поменять на *.txt в строке compiler.objdump.flags).

P.S. По поводу костыля с батником. Утилиту avr-objdump можно вызывать напрямую из среды и передавать её параметры. Но Arduino IDE не обрабатывает символ вывода в файл ">" (который работает в виндовой консоли) и тупо ругается на него. Поэтому пришлось вызывать батник, передавать ему параметры, а уже он вызывает утилиту и делает вывод в файл.

P.P.S. Проверял на Arduino IDE версии 1.6.6. Хуки добавили с версии 1.6.5. А на старых версиях меньше 1.5.* файла platform.txt вообще нет.

Jeka_M
Jeka_M аватар
Онлайн
Зарегистрирован: 06.07.2014

Прикладываю свои файлы platform.txt и avr-objdump.bat

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Пасибки, полезно.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Жека, а чем objdump удобнее, чем если сразу компилятору сказать, чтобы ассемблерный код выдал?

Jeka_M
Jeka_M аватар
Онлайн
Зарегистрирован: 06.07.2014

Вы про опцию  -Wa,-ahls=file.lst  ? У меня почему-то не получилось, запутался в хитросплетениях формирования всей строки с параметрами для avr-gcc. Да и проверил эту опцию в Atmel Studio - не понравился вид представления информации и форматирование. В общем, вывод objdump мне понравился больше. Но это так, с моей "любительской" точки зрения :)

Для сравнения, objdump:

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .data         00000000  00800100  00800100  0000013c  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  1 .text         000000e8  00000000  00000000  00000054  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  2 .comment      00000030  00000000  00000000  0000013c  2**0
                  CONTENTS, READONLY
  3 .note.gnu.avr.deviceinfo 00000040  00000000  00000000  0000016c  2**2
                  CONTENTS, READONLY
  4 .debug_aranges 00000028  00000000  00000000  000001ac  2**0
                  CONTENTS, READONLY, DEBUGGING
  5 .debug_info   000001e8  00000000  00000000  000001d4  2**0
                  CONTENTS, READONLY, DEBUGGING
  6 .debug_abbrev 000000e5  00000000  00000000  000003bc  2**0
                  CONTENTS, READONLY, DEBUGGING
  7 .debug_line   000001b8  00000000  00000000  000004a1  2**0
                  CONTENTS, READONLY, DEBUGGING
  8 .debug_frame  00000034  00000000  00000000  0000065c  2**2
                  CONTENTS, READONLY, DEBUGGING
  9 .debug_str    000001a2  00000000  00000000  00000690  2**0
                  CONTENTS, READONLY, DEBUGGING
 10 .debug_ranges 00000018  00000000  00000000  00000832  2**0
                  CONTENTS, READONLY, DEBUGGING

Disassembly of section .text:

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

00000068 <__ctors_end>:
  68:	11 24       	eor	r1, r1
  6a:	1f be       	out	0x3f, r1	; 63
  6c:	cf ef       	ldi	r28, 0xFF	; 255
  6e:	d8 e0       	ldi	r29, 0x08	; 8
  70:	de bf       	out	0x3e, r29	; 62
  72:	cd bf       	out	0x3d, r28	; 61
  74:	0e 94 47 00 	call	0x8e	; 0x8e <main>
  78:	0c 94 72 00 	jmp	0xe4	; 0xe4 <_exit>

0000007c <__bad_interrupt>:
  7c:	0c 94 00 00 	jmp	0	; 0x0 <__vectors>

00000080 <setup>:
#include <avr/io.h>
#include <util/delay.h>

void setup()
{
	DDRB |= ((1<<5)|(1<<4));
  80:	84 b1       	in	r24, 0x04	; 4
  82:	80 63       	ori	r24, 0x30	; 48
  84:	84 b9       	out	0x04, r24	; 4
	PORTB &= ~((1<<5)|(1<<4));
  86:	85 b1       	in	r24, 0x05	; 5
  88:	8f 7c       	andi	r24, 0xCF	; 207
  8a:	85 b9       	out	0x05, r24	; 5
  8c:	08 95       	ret

0000008e <main>:
}

int main(void)
{
    setup();
  8e:	0e 94 40 00 	call	0x80	; 0x80 <setup>
    while (1) 
    {
		PORTB |= (1<<5); //PB5, D13
  92:	2d 9a       	sbi	0x05, 5	; 5
		asm volatile("sbi %0, 4" :: "I" (_SFR_IO_ADDR(PORTB))); //PB4, D12
  94:	2c 9a       	sbi	0x05, 4	; 5
	#else
		//round up by default
		__ticks_dc = (uint32_t)(ceil(fabs(__tmp)));
	#endif

	__builtin_avr_delay_cycles(__ticks_dc);
  96:	8f e3       	ldi	r24, 0x3F	; 63
  98:	9c e9       	ldi	r25, 0x9C	; 156
  9a:	01 97       	sbiw	r24, 0x01	; 1
  9c:	f1 f7       	brne	.-4      	; 0x9a <main+0xc>
  9e:	00 c0       	rjmp	.+0      	; 0xa0 <main+0x12>
  a0:	00 00       	nop
		_delay_ms(10);
		PORTB &= ~(1<<5); //PB5, D13
  a2:	2d 98       	cbi	0x05, 5	; 5
		asm volatile("cbi %0, 4" :: "I" (_SFR_IO_ADDR(PORTB))); //PB4, D12
  a4:	2c 98       	cbi	0x05, 4	; 5
  a6:	8f e3       	ldi	r24, 0x3F	; 63
  a8:	9c e9       	ldi	r25, 0x9C	; 156
  aa:	01 97       	sbiw	r24, 0x01	; 1
  ac:	f1 f7       	brne	.-4      	; 0xaa <main+0x1c>
  ae:	00 c0       	rjmp	.+0      	; 0xb0 <main+0x22>
  b0:	00 00       	nop
		_delay_ms(10);
		PORTB |= ((1<<5)|(1<<4)); //Set PB5, PB4
  b2:	85 b1       	in	r24, 0x05	; 5
  b4:	80 63       	ori	r24, 0x30	; 48
  b6:	85 b9       	out	0x05, r24	; 5
		asm volatile("in R24, %0 \n andi R24, 0b11001111 \n out %0, R24" :: "I" (_SFR_IO_ADDR(PORTB))); //Clear PB5, PB4
  b8:	85 b1       	in	r24, 0x05	; 5
  ba:	8f 7c       	andi	r24, 0xCF	; 207
  bc:	85 b9       	out	0x05, r24	; 5
  be:	8f e3       	ldi	r24, 0x3F	; 63
  c0:	9c e9       	ldi	r25, 0x9C	; 156
  c2:	01 97       	sbiw	r24, 0x01	; 1
  c4:	f1 f7       	brne	.-4      	; 0xc2 <main+0x34>
  c6:	00 c0       	rjmp	.+0      	; 0xc8 <main+0x3a>
  c8:	00 00       	nop
		_delay_ms(10);
		asm volatile("in R24, %0 \n ori R24, 0b00110000 \n out %0, R24" :: "I" (_SFR_IO_ADDR(PORTB))); //Set PB5, PB4
  ca:	85 b1       	in	r24, 0x05	; 5
  cc:	80 63       	ori	r24, 0x30	; 48
  ce:	85 b9       	out	0x05, r24	; 5
		PORTB &= ~((1<<5)|(1<<4)); //Clear PB5, PB4
  d0:	85 b1       	in	r24, 0x05	; 5
  d2:	8f 7c       	andi	r24, 0xCF	; 207
  d4:	85 b9       	out	0x05, r24	; 5
  d6:	8f e3       	ldi	r24, 0x3F	; 63
  d8:	9c e9       	ldi	r25, 0x9C	; 156
  da:	01 97       	sbiw	r24, 0x01	; 1
  dc:	f1 f7       	brne	.-4      	; 0xda <main+0x4c>
  de:	00 c0       	rjmp	.+0      	; 0xe0 <main+0x52>
  e0:	00 00       	nop
  e2:	d7 cf       	rjmp	.-82     	; 0x92 <main+0x4>

000000e4 <_exit>:
  e4:	f8 94       	cli

000000e6 <__stop_program>:
  e6:	ff cf       	rjmp	.-2      	; 0xe6 <__stop_program>

avr-gcc:

   1               		.file	"main.c"
   2               	__SP_H__ = 0x3e
   3               	__SP_L__ = 0x3d
   4               	__SREG__ = 0x3f
   5               	__tmp_reg__ = 0
   6               	__zero_reg__ = 1
   7               		.text
   8               	.Ltext0:
   9               		.cfi_sections	.debug_frame
  10               		.section	.text.setup,"ax",@progbits
  11               	.global	setup
  12               		.type	setup, @function
  13               	setup:
  14               	.LFB6:
  15               		.file 1 ".././main.c"
  16               		.loc 1 13 0
  17               		.cfi_startproc
  18               	/* prologue: function */
  19               	/* frame size = 0 */
  20               	/* stack size = 0 */
  21               	.L__stack_usage = 0
  22               		.loc 1 14 0
  23 0000 84B1      		in r24,0x4
  24 0002 8063      		ori r24,lo8(48)
  25 0004 84B9      		out 0x4,r24
  26               		.loc 1 15 0
  27 0006 85B1      		in r24,0x5
  28 0008 8F7C      		andi r24,lo8(-49)
  29 000a 85B9      		out 0x5,r24
  30 000c 0895      		ret
  31               		.cfi_endproc
  32               	.LFE6:
  33               		.size	setup, .-setup
  34               		.section	.text.main,"ax",@progbits
  35               	.global	main
  36               		.type	main, @function
  37               	main:
  38               	.LFB7:
  39               		.loc 1 19 0
  40               		.cfi_startproc
  41               	/* prologue: function */
  42               	/* frame size = 0 */
  43               	/* stack size = 0 */
  44               	.L__stack_usage = 0
  45               		.loc 1 20 0
  46 0000 0E94 0000 		call setup
  47               	.LVL0:
  48               	.L3:
  49               		.loc 1 23 0 discriminator 1
  50 0004 2D9A      		sbi 0x5,5
  51               		.loc 1 24 0 discriminator 1
  52               	/* #APP */
  53               	 ;  24 ".././main.c" 1
  54 0006 2C9A      		sbi 5, 4
  55               	 ;  0 "" 2
  56               	.LVL1:
  57               	/* #NOAPP */
GAS LISTING C:\Users\Jeka\AppData\Local\Temp\cca99u0m.s 			page 2


  58               	.LBB10:
  59               	.LBB11:
  60               		.file 2 "c:\\program files\\atmel\\atmel studio 7.0\\7.0\\toolchain\\avr8\\avr8-gnu-toolchain\\avr
  61               		.loc 2 187 0 discriminator 1
  62 0008 8FE3      		ldi r24,lo8(-25537)
  63 000a 9CE9      		ldi r25,hi8(-25537)
  64 000c 0197      	1:	sbiw r24,1
  65 000e 01F4      		brne 1b
  66 0010 00C0      		rjmp .
  67 0012 0000      		nop
  68               	.LBE11:
  69               	.LBE10:
  70               		.loc 1 26 0 discriminator 1
  71 0014 2D98      		cbi 0x5,5
  72               		.loc 1 27 0 discriminator 1
  73               	/* #APP */
  74               	 ;  27 ".././main.c" 1
  75 0016 2C98      		cbi 5, 4
  76               	 ;  0 "" 2
  77               	.LVL2:
  78               	/* #NOAPP */
  79               	.LBB12:
  80               	.LBB13:
  81               		.loc 2 187 0 discriminator 1
  82 0018 8FE3      		ldi r24,lo8(-25537)
  83 001a 9CE9      		ldi r25,hi8(-25537)
  84 001c 0197      	1:	sbiw r24,1
  85 001e 01F4      		brne 1b
  86 0020 00C0      		rjmp .
  87 0022 0000      		nop
  88               	.LBE13:
  89               	.LBE12:
  90               		.loc 1 29 0 discriminator 1
  91 0024 85B1      		in r24,0x5
  92 0026 8063      		ori r24,lo8(48)
  93 0028 85B9      		out 0x5,r24
  94               		.loc 1 30 0 discriminator 1
  95               	/* #APP */
  96               	 ;  30 ".././main.c" 1
  97 002a 85B1      		in R24, 5 
  98 002c 8F7C      	 andi R24, 0b11001111 
  99 002e 85B9      	 out 5, R24
 100               	 ;  0 "" 2
 101               	.LVL3:
 102               	/* #NOAPP */
 103               	.LBB14:
 104               	.LBB15:
 105               		.loc 2 187 0 discriminator 1
 106 0030 8FE3      		ldi r24,lo8(-25537)
 107 0032 9CE9      		ldi r25,hi8(-25537)
 108 0034 0197      	1:	sbiw r24,1
 109 0036 01F4      		brne 1b
 110 0038 00C0      		rjmp .
 111 003a 0000      		nop
 112               	.LBE15:
 113               	.LBE14:
 114               		.loc 1 32 0 discriminator 1
GAS LISTING C:\Users\Jeka\AppData\Local\Temp\cca99u0m.s 			page 3


 115               	/* #APP */
 116               	 ;  32 ".././main.c" 1
 117 003c 85B1      		in R24, 5 
 118 003e 8063      	 ori R24, 0b00110000 
 119 0040 85B9      	 out 5, R24
 120               	 ;  0 "" 2
 121               		.loc 1 33 0 discriminator 1
 122               	/* #NOAPP */
 123 0042 85B1      		in r24,0x5
 124 0044 8F7C      		andi r24,lo8(-49)
 125 0046 85B9      		out 0x5,r24
 126               	.LVL4:
 127               	.LBB16:
 128               	.LBB17:
 129               		.loc 2 187 0 discriminator 1
 130 0048 8FE3      		ldi r24,lo8(-25537)
 131 004a 9CE9      		ldi r25,hi8(-25537)
 132 004c 0197      	1:	sbiw r24,1
 133 004e 01F4      		brne 1b
 134 0050 00C0      		rjmp .
 135 0052 0000      		nop
 136 0054 00C0      		rjmp .L3

 

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Jeka_M пишет:

Вы про опцию  -Wa,-ahls=file.lst  ? 

я пишу вот так (в bat-айле):

-Wa,-a=C:\Arduino\build\%1.asm

Вроде, работает.

Сравнил Ваши листинги. objdump понравился больше. Попробую.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Лично мне objdump интересней тем, что его можно, когда нужно, запустить отдельным командником и получить асм листинг, а на постоянке оно нафиг не нужно. ИМХО, конечно же.

Jeka_M
Jeka_M аватар
Онлайн
Зарегистрирован: 06.07.2014

kisoft пишет:
а на постоянке оно нафиг не нужно. ИМХО, конечно же.

В принципе согласен. Но смысл был в том, чтобы один раз сделать и забыть. Если вдруг понадобился листинг - просто залез во временную папку и посмотрел. Оно же не хранится постоянно на ПК - после закрытия IDE временная папка со всеми файлами удаляется.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Jeka_M пишет:

kisoft пишет:
а на постоянке оно нафиг не нужно. ИМХО, конечно же.

В принципе согласен. Но смысл был в том, чтобы один раз сделать и забыть. Если вдруг понадобился листинг - просто залез во временную папку и посмотрел. Оно же не хранится постоянно на ПК - после закрытия IDE временная папка со всеми файлами удаляется.

Да не вопрос, каждый волен поступать так, как ему хочется. Я же не осуждаю ;)

Вот только у меня большие сомнения, на счет фразы "один раз сделать и забыть", еще не факт, что в IDE что либо не поменяется, а командник он с IDE вообще не связан, он срабатывает на расширение файла и вызывает objdump. Разумеется, objdump могут переместить в другое место в IDE.

Уфф, кажется только отнимаю время у всех, я закончил. :)

 

DeGlucker
Онлайн
Зарегистрирован: 23.07.2014

А вот кусок листинга, сделанного IDA PRO 6.5

; TimerProc(void)
		; public _Z9TimerProcv
_Z9TimerProcv:				; DATA XREF: .text.setup:0000012Do
					; .text.setup:0000012Eo
		push	r24
		push	r25
		push	r0
		lds	r24, flags
		sbrs	r24, 0
		rjmp	loc_2D5
		ldi	r25, 0
		cbi	PORTD, PORTD2
		ldi	r24, 2
		call	_Z7delay_xh	; delay_x(uchar)
		sbi	PORTD, PORTD2
		lds	r24, flags
		sbrs	r24, 1
		rjmp	loc_29A
		sbi	PORTD, PORTD6
		lds	r24, delay1
		call	_Z7delay_xh	; delay_x(uchar)
		cbi	PORTD, PORTD6
		rjmp	loc_2D0
; ---------------------------------------------------------------------------

loc_29A:				; CODE XREF: .text._Z9TimerProcv:00000292j
		lds	r24, flags
		sbrs	r24, 5
		rjmp	loc_2D0
		in	r24, SPCR
		andi	r24, 0xBF
		out	SPCR, r24
		cbi	PORTD, PORTD5
		sbi	PORTC, PORTC3
		cbi	PORTB, PORTB2
		lds	r24, delay2
		call	_Z7delay_xh	; delay_x(uchar)
		ldi	r24, 3

loc_2A9:				; CODE XREF: .text._Z9TimerProcv:000002B1j
		sbi	PORTB, PORTB5
		nop
		nop
		nop
		nop
		cbi	PORTB, PORTB5
		nop
		subi	r24, 1
		brne	loc_2A9
		sbi	PORTD, PORTD5
		cbi	PORTC, PORTC3
		ldi	r24, 4

loc_2B5:				; CODE XREF: .text._Z9TimerProcv:000002BDj
		sbi	PORTB, PORTB5
		in	r0, PINB
		ror	r0
		rol	r25
		nop
		cbi	PORTB, PORTB5
		nop
		subi	r24, 1
		brne	loc_2B5
		sts	ADdata+1, r25
		ldi	r24, 8

loc_2C1:				; CODE XREF: .text._Z9TimerProcv:000002C9j
		sbi	PORTB, PORTB5
		in	r0, PINB
		ror	r0
		rol	r25
		nop
		cbi	PORTB, PORTB5
		nop
		subi	r24, 1
		brne	loc_2C1
		sts	ADdata,	r25
		sbi	PORTB, PORTB2
		in	r24, SPCR
		ori	r24, 0x40
		out	SPCR, r24

loc_2D0:				; CODE XREF: .text._Z9TimerProcv:00000299j
					; .text._Z9TimerProcv:0000029Dj
		lds	r24, flags
		ori	r24, 8
		sts	flags, r24

loc_2D5:				; CODE XREF: .text._Z9TimerProcv:00000288j
		pop	r0
		pop	r25
		pop	r24
		ret
; End of function TimerProc(void)

 

Jeka_M
Jeka_M аватар
Онлайн
Зарегистрирован: 06.07.2014

kisoft пишет:

еще не факт, что в IDE что либо не поменяется

С этим согласен, в IDE периодически вносят довольно большие изменения.

kisoft пишет:

а командник он с IDE вообще не связан, он срабатывает на расширение файла и вызывает objdump. Разумеется, objdump могут переместить в другое место в IDE.

Вот тут есть положительный момент: в platform.txt не используются абсолютные пути. Путь к objdump и *.elf подставляется автоматически: {compiler.path}, {build.path}. Название файла тоже: {build.project_name}. Хотя название можно и не использовать, а только путь к папке. А в батнике сделать срабатывание на расширение файла, как Вы и написали (но смысла в этом не вижу).

Objdump если и перенесут, то явно вместе с остальными утилитами и компиляторм, поэтому {compiler.path} будет всё так же работать.

P.S. я не ради спора, просто уточнил некоторые моменты.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

На вкус и цвет все фломастеры разные ;) Думаю на том и сойдемся, я никогда не буду включать objdump в сборку, а Вы не будете писать командник, вот и все дела. И в этом нет ничего особенного, каждый прав по-своему.

 

nik182
Offline
Зарегистрирован: 04.05.2015

Скажите как правильно в файл platform.txt добавить дефайн типа { #define NOMORE }  ,  что бы он использовался только при компиляции .с файлов? Может быть куда то в строку compiler.c.flags ? 

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

1. Скоро в Песочнице будет об этом материал.

2. НУ НУЖНО ничего менять в системных каталогах.

3. Ниже последовательность действий. Пример для Наны, есть токости, если у самого не получится со своей платой - пиши сюда - я помогу.

ИТАК (я описываю свой пример, который только что проверил):

1. в скетчбуке создаеи папку hardware, скорее всего она у тебя уже есть.

2. в ней папку wlad_nano;

3. в ней папку avr;

4. в ней файл boards.txt вот такой:

wnano.name=Arduino Nano by Wlad

wnano.upload.tool=arduino:avrdude
wnano.upload.protocol=arduino
wnano.upload.maximum_size=30720
wnano.upload.maximum_data_size=2048
wnano.upload.speed=57600

wnano.bootloader.tool=avrdude
wnano.bootloader.unlock_bits=0x3F
wnano.bootloader.lock_bits=0x0F
wnano.bootloader.low_fuses=0xFF
wnano.bootloader.high_fuses=0xDA
wnano.bootloader.extended_fuses=0xFD
wnano.bootloader.file=optiboot/optiboot_atmega328.hex

wnano.build.mcu=atmega328p
wnano.build.f_cpu=16000000L
wnano.build.board=AVR_NANO
wnano.build.core=arduino:arduino
wnano.build.variant=arduino:eightanaloginputs

wnano.build.extra_flags=-DWLAD=1

Это просто копия из системного про нано, ВАЖНЫЕ ДОБАВЛЕНИЯ:

а) "arduino:" - добавлено в трех местах, будь внимателен, это отсылка к общим настройкам.

б) ТО САМОЕ, ЧТО ТЫ ХОТЕЛ - последняя строчка определяет имя WLAD.

все это проверяем, выбирая при сборке плату: "Arduino Nano by Wlad".

вот проверочный скетч:

 
void setup() {
    Serial.begin(57600); 
    while(!Serial);

#ifdef    WLAD
Serial.println("WLAD defined!");
#endif
}
 
 
void loop() {
 
}

Если тебе нужны другие РЕЦЕПТЫ компиляции, то это сложнее, нужно создавать новую ПЛАТФОРМУ. Подожди тогда до статьи в Песочнице.

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

wdrakula пишет:
2. НУ НУЖНО ничего менять в системных каталогах.
Но добавлять то platform.local.txt можно :-)
При выполнении сборки, порой требуется сначала выполнить дополнительные действия, например выполнить преобразования файлов перед сборкой.
В platform.local.txt добавляю

recipe.hooks.sketch.prebuild.0.pattern={runtime.platform.path}/prebuild.local {build.source.path} {build.path} {build.project_name}

Рядышком с platform.local.txt положил тот самый prebuild.local, который выполнит prebuild в директории со скетчем если он там присутствует.

#!/bin/bash
# проверяем наличие файла prebuild в исходной директории со скетчем
if [ -e "$1/prebuild" ]
then
  # переходим в исходную директорию со скетчем
  cd $1
  # выполняем prebuild передавая путь ко временной директории созданной ардуиной для билда и название проекта
  ./prebuild $2 $3
fi

 

atlet65
Offline
Зарегистрирован: 29.11.2020

Здравствуйте. Сделал как написано в статье, но выскочила ошибка .... bin/avr-objdump.bat": file does not exist.

Подскажите как преодолеть эту проблему. у мене Aeduino IDE 1.8.12 версия.

atlet65
Offline
Зарегистрирован: 29.11.2020

Да, ярлык с админ правами не помог.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Написано же - Файл отсутствует. 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

atlet65 пишет:

Здравствуйте. Сделал как написано в статье, но выскочила ошибка .... bin/avr-objdump.bat": file does not exist.

Подскажите как преодолеть эту проблему. у мене Aeduino IDE 1.8.12 версия.

Так надо добавить путь к bin в PATH

atlet65
Offline
Зарегистрирован: 29.11.2020

Спасибо. Разобрался. .bat файл нужно разместить в папку bin: c:\Users\<your name>\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino5\bin\.

Корень Arduino IDE это ведь в Programms Files(x86).