Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Непонятки с WINAVR из AVRStudio
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
011119xx
Честно говоря такие вопросы задавать стыдно, но все же может ответ на поверхности. Работаю в WINAVR из AVRStudio. Например есть 3 файла исходников на Си. Один главный в котором функция main и 2 с подпрограммами. Из главного вызываются подпрограммы, описанные в 2 других файлах. Так вот когда запускаю симуляцию по шагам, то в подпрограммы, расположенные в первом файле вход происходит и можно посмотреть что делается в них по шагам. А вот в подпрограммы, расположенные во втором файле вход не происходит, как будто подается команда на выполнения шага без захода в подпрограмму. Хидеры в главном файле объявлены. Что можно сделать, или это глюк такой у WINAVR? WINAVR у меня 20060421, AVRStudio 4.13, система XP.
TechMike
Цитата(011119xx @ Jan 27 2009, 09:51) *
Честно говоря такие вопросы задавать стыдно, но все же может ответ на поверхности. Работаю в WINAVR из AVRStudio. Например есть 3 файла исходников на Си. Один главный в котором функция main и 2 с подпрограммами. Из главного вызываются подпрограммы, описанные в 2 других файлах. Так вот когда запускаю симуляцию по шагам, то в подпрограммы, расположенные в первом файле вход происходит и можно посмотреть что делается в них по шагам. А вот в подпрограммы, расположенные во втором файле вход не происходит, как будто подается команда на выполнения шага без захода в подпрограмму. Хидеры в главном файле объявлены. Что можно сделать, или это глюк такой у WINAVR? WINAVR у меня 20060421, AVRStudio 4.13, система XP.


Makefile покажите. Было такое при включенной оптимизации в значение 3.
011119xx
Make файл

###############################################################################
# Makefile for the project MP3_Player_2
###############################################################################

## General Flags
PROJECT = MP3_Player_2
MCU = atmega128
TARGET = MP3_Player_2.elf
CC = avr-gcc.exe

## Options common to compile, link and assembly rules
COMMON = -mmcu=$(MCU)

## Compile options common for all C compilation units.
CFLAGS = $(COMMON)
CFLAGS += -Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d

## Assembly specific flags
ASMFLAGS = $(COMMON)
ASMFLAGS += $(CFLAGS)
ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2

## Linker flags
LDFLAGS = $(COMMON)
LDFLAGS += -Wl,-Map=MP3_Player_2.map


## Intel Hex file production flags
HEX_FLASH_FLAGS = -R .eeprom

HEX_EEPROM_FLAGS = -j .eeprom
HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load"
HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0 --no-change-warnings


## Objects that must be built in order to link
OBJECTS = MP3_Player_2.o fat.o glcd.o id3.o mmc.o playlist.o skin.o vs1011.o

## Objects explicitly added by the user
LINKONLYOBJECTS =

## Build
all: $(TARGET) MP3_Player_2.hex MP3_Player_2.eep MP3_Player_2.lss size

## Compile
MP3_Player_2.o: ../MP3_Player_2.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<

fat.o: ../fat.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<

glcd.o: ../glcd.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<

id3.o: ../id3.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<

mmc.o: ../mmc.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<

playlist.o: ../playlist.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<

skin.o: ../skin.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<

vs1011.o: ../vs1011.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<

##Link
$(TARGET): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) -o $(TARGET)

%.hex: $(TARGET)
avr-objcopy -O ihex $(HEX_FLASH_FLAGS) $< $@

%.eep: $(TARGET)
-avr-objcopy $(HEX_EEPROM_FLAGS) -O ihex $< $@ || exit 0

%.lss: $(TARGET)
avr-objdump -h -S $< > $@

size: ${TARGET}
@echo
@avr-size -C --mcu=${MCU} ${TARGET}

## Clean target
.PHONY: clean
clean:
-rm -rf $(OBJECTS) MP3_Player_2.elf dep/* MP3_Player_2.hex MP3_Player_2.eep MP3_Player_2.lss MP3_Player_2.map


## Other dependencies
-include $(shell mkdir dep 2>/dev/null) $(wildcard dep/*)
_Pasha
Пользуйтесь окном дизасемблера, хоть это и неудобно.

Причина в том, что функции, просмотреть которые нельзя, просто проинлайнены, ввиду того, что вызываются небольшое число раз. Можете, конечно, запретить инлайнить на время отладки атрибутом или в ком строке.
011119xx
Как запретить инлайнить на время отладки атрибутом или в ком строке.
demiurg_spb
Читайте об аттрибутах в:
C:/WinAVR/doc/gcc/HTML/gcc-4.3.2/gcc/Function-Attributes.html
Код
extern void foobar (void) __attribute__((noinline));
011119xx
Это не помогло.
Сергей Борщ
Цитата(011119xx @ Jan 27 2009, 12:21) *
Это не помогло.
А в листинг вы смотрели? Проблема действительно во встраивании? Если да, то куда вы применяли атрибут? Сделайте и выложите сюда минимальный проект из одного main() и двух функций a() и b() в разных файлах, на котором эффект наблюдается. Только весь проект, в виде архива.
011119xx
Отправить файл не получается. Но тем не менее, на маленьком проекте все работает и без атрибутов.
С большим проектом тоже разобрался. Возможно глючит WINAVR периодически.
Сергей Борщ
Цитата(011119xx @ Jan 27 2009, 13:24) *
Возможно глючит WINAVR периодически.
Даю 99.9%, что WinAVR в вашем случае не глючит даже периодически, а виноват недостаток знаний. Приведите отрывок исходника и листинга, где он "сглючил", будем разбираться. Пока нет доказательства в виде листинга вероятность источника глюков примерно такова: 99% - кривые руки и 1% - положение звезд на небе. По поводу последней цифры агрументация примерно как у вас: "возможно".
ARV
несколько раз натыкался на подобное, когда над одним и тем же комплектов исходников работал из разных сред - AVR Studio и Eclipse. Студия по умолчанию делает несколько упрощенный make-файл и бывает так, что не компилируя прилинковывает объектники, ранее сгенерированные без отладочной информации. т.е. В этом случае заход в функции, о которых нет отладочной инфы, не получается...

хотя судя по первому посту, это не та ситуация...
011119xx
Цитата(Сергей Борщ @ Jan 27 2009, 20:15) *
Даю 99.9%, что WinAVR в вашем случае не глючит даже периодически, а виноват недостаток знаний. Приведите отрывок исходника и листинга, где он "сглючил", будем разбираться. Пока нет доказательства в виде листинга вероятность источника глюков примерно такова: 99% - кривые руки и 1% - положение звезд на небе. По поводу последней цифры агрументация примерно как у вас: "возможно".

Руки как раз не такие уж и кривые. Проблема была решена так: был создан новый проект и все файлы исходников были созданы заново, а их исходные тексты скопированы из "условно глючных". Все заработало. Замечена еще одна странность: после изменения текста в каком-либо файле и последующем его сохранении в папке с проектом появляется некий файл имя которого начинается с имени сохраняемого файла, далее в имени идут цифры, а его расширение "TMP". Чтобы это значило? Причем потом этот файл нельзя удалить даже после закрытия AVR Studio. Есть подозрения что проблема с операционкой.
Goodefine
Цитата(011119xx @ Jan 28 2009, 06:13) *
появляется некий файл имя которого начинается с имени сохраняемого файла, далее в имени идут цифры, а его расширение "TMP". Чтобы это значило? Причем потом этот файл нельзя удалить даже после закрытия AVR Studio. Есть подозрения что проблема с операционкой.

Есть подозрения что проблема с вирусом. Который плодит тмп-шки, не давая их удалять. Проверьте машину...
Сергей Борщ
Цитата(011119xx @ Jan 28 2009, 05:13) *
их исходные тексты скопированы из "условно глючных".
"Казалось бы, при чем здесь Лужков?" Т.е. при чем тут компилятор? Вы нашли что же именно в этих "условно глючных" файлах приводит к сбою и не передается копировальным путем? Причина так и не установлена, но свалить вину на компилятор как бы за между прочим - нормальное дело.
IgorKossak
Цитата(011119xx @ Jan 28 2009, 05:13) *
...Проблема была решена так: был создан новый проект и все файлы исходников были созданы заново, а их исходные тексты скопированы из "условно глючных"....

На мой взгляд было бы вполне достаточно просто пересоздать проект, а не морочиться с копированием текстов. ARV об этом намекал, хотя и сделал неверный вывод.
ARV
Цитата(IgorKossak @ Jan 28 2009, 12:40) *
На мой взгляд было бы вполне достаточно просто пересоздать проект, а не морочиться с копированием текстов. ARV об этом намекал, хотя и сделал неверный вывод.

Clean Project и потом Build All
ermilovd
Я пользуюсь AVRStudio_4.15b619 + WinAVR_20081124rc3, ОС WinXP_sp2. Таких проблем никогда не было.
_Pasha
Наступил на те же грабли. Winavr2008 - который последний.

Тут не только попытки инлайнить вызываемые функции (довольно большие), но и инлайнится for(),  и если первое убрал расстановкой атрибута noinline, то второе проявляется случайным образом. 20071221 так не хулиганил. В общем, было 2180 байт после расстановки  noinline стало 1180. Не мало. Я так понимаю, теперь при -Os что-то еще по умолчанию подключено, а что может быть - не могу найти. Помогите, плз
aesok
Попробуйте --param inline-call-cost=N, с N = 4, 5 или 6.

Также функции которые используются только в одном модуле, должны быть объявлены как static.

Анатолий.
_Pasha
Цитата(aesok @ Jan 30 2009, 18:07) *
Попробуйте --param inline-call-cost=N, с N = 4, 5 или 6.
Анатолий.
Спасибо! Но это только вложенные вызовы. А оно затронет циклы? Пока не на чем проверить...
aesok
Извините но я не знаю термина "инлайнится <цикл> for(), ", пример привидите.


Анатолий.
MrYuran
Цитата(aesok @ Jan 30 2009, 21:26) *
Извините но я не знаю термина "инлайнится <циклы> for(), ", пример привидите.

Это называется "unrolling loops", когда небольшие циклы "разматываются" в линейный код
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.