Atmel studio помогите с ошибкой

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Ср фев 23, 2022 15:40:56

Сообщение PE4ENbKA_173 »

У меня проблема при компиляции проекта в режиме Debug в Release все нормально ошибок нет.
Проблема связана с переполнением файла elf.
Изображение
СпойлерError region `text' overflowed by 52 bytes opticir 1
Error opticir.elf section `.text' will not fit in region `text' opticir 1
Спойлер$(OUTPUT_FILE_PATH): $(OBJS) $(USER_OBJS) $(OUTPUT_FILE_DEP) $(LIB_DEP) $(LINKER_SCRIPT_DEP)
@echo Building target: $@
@echo Invoking: AVR/GNU Linker : 5.4.0
$(QUOTE)C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -o$(OUTPUT_FILE_PATH_AS_ARGS) $(OBJS_AS_ARGS) $(USER_OBJS) $(LIBS) -Wl,-Map="opticir.map" -Wl,--start-group -Wl,-lm -Wl,--end-group -Wl,--gc-sections -mmcu=attiny13 -B "C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATtiny_DFP\1.8.332\gcc\dev\attiny13"
@echo Finished building target: $@
"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O ihex -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures "opticir.elf" "opticir.hex"
"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objcopy.exe" -j .eeprom --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0 --no-change-warnings -O ihex "opticir.elf" "opticir.eep" || exit 0
"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objdump.exe" -h -S "opticir.elf" > "opticir.lss"
"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O srec -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures "opticir.elf" "opticir.srec"
"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-size.exe" "opticir.elf"
Как мне решить эту проблему?
Поддержка ASCII включена.
Вложения
Безымянный.png
Иллюстрация ошибки
(3.58 КБ) 58 скачиваний
Реклама
Опытный кот
Аватара пользователя
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Сообщение Карбофос »

Если всё правильно понимаю, у вас отладочная информация не влезает во флэш ATtiny13.
А что там отлаживать?
Загружайте Release в мк.
Если-б выложили исходный текст программы, возможно, кто-то мог подсказать, как её сократить.
Ну, и, можно к опциям компилятора добавить: -ffunction-sections -fdata-sections, если таких опций нет.
Реклама
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Ср фев 23, 2022 15:40:56

Сообщение PE4ENbKA_173 »

[uquote="Карбофос",url="/forum/viewtopic.php?p=4227193#p4227193"]Если-б выложили исходный текст программы, возможно, кто-то мог подсказать, как её сократить.
Ну, и, можно к опциям компилятора добавить: -ffunction-sections -fdata-sections, если таких опций нет.[/uquote]
Я могу выложить код но он в нескольких файлах, разделен на библиотеки и файлы кода.
Скажите как добавить в опции компилятора добавить эти команды? У меня Microchip studio (он же атмел). В их настройках черт ногу сломит.
Приложил в файлы архив проекта. Просто не хочу засорять вставками сообщение, ибо потом еще хуже выловить отсюда смысл кода будет.
Вложения
opticir.zip
Проект приема ИК сигналов
(50.37 КБ) 105 скачиваний
Опытный кот
Аватара пользователя
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Сообщение Карбофос »

Я бы предложил вот-так написать функцию uart_putu и исправить ошибки.
Глядишь, может и влезет debug-версия.
Спойлер

Код: Выделить всё

void uart_putu(uint8_t x)
{
#if 0
        char buff[8] = {0};
        char* p = buff+7;
        *p-- = 0;
        do { *p-- = (x % 10) + '0'; x /= 10; } while(x);
        uart_puts(p+1);
#else
	uint8_t d = x / 10;
	uint8_t e = x % 10;
	if(d != 0)
		uart_putu(d);
	uart_putc(e + '0');
#endif
}

void uart_puts(const char *s)
{
     	while (*s) uart_putc(*s++);
}
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Ср фев 23, 2022 15:40:56

Сообщение PE4ENbKA_173 »

[uquote="Карбофос",url="/forum/viewtopic.php?p=4227541#p4227541"]
Спойлер

Код: Выделить всё

void uart_putu(uint8_t x)
{
#if 0
        char buff[8] = {0};
        char* p = buff+7;
        *p-- = 0;
        do { *p-- = (x % 10) + '0'; x /= 10; } while(x);
        uart_puts(p+1);
#else
	uint8_t d = x / 10;
	uint8_t e = x % 10;
	if(d != 0)
		uart_putu(d);
	uart_putc(e + '0');
#endif
}

void uart_puts(const char *s)
{
     	while (*s) uart_putc(*s++);
}
[/uquote]
Выполнил замену не помогло. Пробовал и так и этак, не поменялся результат. Полез в настройки оптимизации еще раз, один раз скомпилировалось а второй раз уже нет. скорее просто не отобразилось сообщение. В прочем ладно с этим. Я сейчас думаю как же компилятору в свойства добавить команды. Все облазил, не вижу.
Вот такое меню настроек проекта
Изображение
А вторая картинка это настройки билдера, вообще не густо
Изображение
Реклама
Опытный кот
Аватара пользователя
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Сообщение Карбофос »

PE4ENbKA_173 писал(а):как же компилятору в свойства добавить команды
Очевидно, на 1-ой картинке зайти "AVR GNU C Compiler" и далее по закладкам.
Сам средой не пользуюсь.
Так-же, если найдёте где, попробуйте включить "Link-time optimization" (-flto).
Можно еще ваши строки вынести во флэш память.
main.c
Спойлер

Код: Выделить всё

#include <avr/io.h>
#include <avr/pgmspace.h>
#include "ir.h"
#include "uart.h"

const char addrsz[] PROGMEM = {"addr="};
const char cmdsz [] PROGMEM = {", cmd="};
const char crlfsz[] PROGMEM = {"\r\n"};

int main(void)
{
	uint8_t addr, cmd;

	/* setup */
	IR_init();

	/* loop */
	while (1) {
		if (IR_read(&addr, &cmd) == IR_SUCCESS) {
			uart_puts_pgm(addrsz);
			uart_putu(addr);
			uart_puts_pgm(cmdsz);
			uart_putu(cmd);
			uart_puts_pgm(crlfsz);
		}
	}
}
uart.h
Спойлер

Код: Выделить всё

void uart_puts_pgm(const char *s);
uart.c
Спойлер

Код: Выделить всё

void uart_puts_pgm(const char *s)
{
	uint8_t c;
	while((c = pgm_read_byte(s++)) != 0)
		uart_putc(c);
}

Вложения
3files.rar
(3.3 КБ) 90 скачиваний
Реклама
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Ср фев 23, 2022 15:40:56

Сообщение PE4ENbKA_173 »

[uquote="Карбофос",url="/forum/viewtopic.php?p=4227587#p4227587"]
PE4ENbKA_173 писал(а):как же компилятору в свойства добавить команды
Очевидно, на 1-ой картинке зайти "AVR GNU C Compiler" и далее по закладкам.
Сам средой не пользуюсь.
Так-же, если найдёте где, попробуйте включить "Link-time optimization" (-flto).
Можно еще ваши строки вынести во флэш память.[/uquote]
кажись понимаю что делать, что ж. займусь этим уже во вторник, думаю у меня все получится.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

мой совет, как большого любителя attiny13 - забудьте о режиме компиляции без оптимизации! там не так много памяти, чтобы расходовать её на "тупое следование стандарту Си". всегда использую оптимизацию -Os, и вам советую. режим Debug по умолчанию собирается без оптимизации вообще.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Ср фев 23, 2022 15:40:56

Сообщение PE4ENbKA_173 »

Добавлено after 25 minutes 1 second:
[uquote="Карбофос",url="/forum/viewtopic.php?p=4227587#p4227587"][/code][/spoiler]
uart.c
Спойлер

Код: Выделить всё

void uart_puts_pgm(const char *s)
{
	uint8_t c;
	while((c = pgm_read_byte(s++)) != 0)
		uart_putc(c);
}

[/uquote]

у меня тут возникла проблема, указанной тут функции pgm_read_byte нет в стандартной библиотеке но есть такая: pgm_read_byte_near
Спойлер

Код: Выделить всё

void uart_puts_pgm(const char *s)
{
	uint8_t c;
	while((c = pgm_read_byte_near(s++)) != 0)
		uart_putc(c);
}
эти функции делают одно и то же или совершенно разные?
Ответить

Вернуться в «AVR»