Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[13.58.137.218] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Такая ситуация:
делаю прогу под сабжевый Atmel AVR микроконтроллер. Прога на C, и как принято, состоит из нескольких файлов: file1.c, file2.c, ..., main.c. Компиляю, зашиваю, - как-то работает. Затем - хочу чё-нить изменить - добавляю к примеру функцию, причем вношу просто определение тела функции и описываю её прототип в одном из заголовков: file1.h: extern void func (char, char); void func (char a, char b) { if (b == 1) PORTG |= 0x10; else PORTG &= ~0x10; /* ... */ } После всех внесённых изменений программа полностью рушится и не работает никак. Как так может быть ? или компилятор кривой (avr-gcc 3.3 20030113) или что? |
Сообщ.
#2
,
|
|
|
Цитата chomb, 28.10.04, 14:03 Возможно и такое.или компилятор кривой Кстати, для функций писать extern не обязательно |
Сообщ.
#3
,
|
|
|
а убрать как было, работает?
|
Сообщ.
#4
,
|
|
|
ДА. Если убрать как было работает.
Сам код добавленной функции тоже никаких сомнений не вызывает. |
Сообщ.
#5
,
|
|
|
M Тема перенесена из Hardware (аппаратные средства) |
Сообщ.
#6
,
|
|
|
В качестве варианта могу предположить, что модель памяти неверная. Компилятор пытается засунуть локальные переменные или стек во внешнюю память, которой нет.
Dice - промазал, надо было в "Чистый C/C++" |
Сообщ.
#7
,
|
|
|
M Тема перенесена из C/C++ -> Visual C++ / MFC / WTL / WinAPI |
Сообщ.
#8
,
|
|
|
Цитата В качестве варианта могу предположить, что модель памяти неверная. Компилятор пытается засунуть локальные переменные или стек во внешнюю память, которой нет. Тоже такое возникает ощущение. Хуже всего, что отладочных средств почти никаких- под отладчиком это дело вообще ни в каком виде не работает. Есть какие-нибудь варианты косвенного подтверждения/опровержения этой гипотезы? Цитата Dice - промазал, надо было в "Чистый C/C++" Модераторам : Хорош уже мазать да двигать меня туда-сюда ! |
Сообщ.
#9
,
|
|
|
Цитата chomb, 28.10.04, 15:36 Карту памяти его линкер создавать умеет? Если умеет - то можно посмотреть там.Есть какие-нибудь варианты косвенного подтверждения/опровержения этой гипотезы? Умеет. Ключик -Map для линкера, создает карту памяти. |
Сообщ.
#10
,
|
|
|
Цитата Цитата В качестве варианта могу предположить, что модель памяти неверная. Компилятор пытается засунуть локальные переменные или стек во внешнюю память, которой нет. Тоже такое возникает ощущение. Хуже всего, что отладочных средств почти никаких- под отладчиком это дело вообще ни в каком виде не работает. Есть какие-нибудь варианты косвенного подтверждения/опровержения этой гипотезы? не передавать в ф-ю никаких парвметров extern void func (void); ну а в теле самой ф-и напиши что нибудь |
Сообщ.
#11
,
|
|
|
Цитата не передавать в ф-ю никаких парвметров extern void func (void); ну а в теле самой ф-и напиши что нибудь Помогло, хотя размер кода даже увеличился. Не выход, т. к. всё равно нужны будут функции, в которые передаются аргументы. И потом это ничего не говорит о причине проблемы, которая так и остаётся. |
Сообщ.
#12
,
|
|
|
Цитата И потом это ничего не говорит о причине проблемы, которая так и остаётся. это как раз и говорит о причине, тебе ее сказал до меня trainer с данным компилятором к сожалению не работал рекомендую внимательно просмотреть свой мак файл |
Сообщ.
#13
,
|
|
|
Цитата chomb, 29.10.04, 08:14 Покажи свой make-файл и сгенери и посмотри содержимое файла-карты памяти. И потом это ничего не говорит о причине проблемы, которая так и остаётся. |
Сообщ.
#14
,
|
|
|
Даю makefile (я дико извиняюсь, но прикрепление чё-то не работает)
Цитата # Define directories. DIRAVR = c:/winavr DIRAVRBIN = $(DIRAVR)/bin DIRAVRUTILS = $(DIRAVR)/utils/bin DIRINC = . AVRINC = $(DIRAVR)/avr/include/avr DIRLIB = $(DIRAVR)/avr/lib # Define programs. SHELL = sh COMPILE = avr-gcc ASSEMBLE = avr-gcc -x assembler-with-cpp REMOVE = rm -f COPY = cp OBJCOPY = avr-objcopy OBJDUMP = avr-objdump ELFCOFF = objtool HEXSIZE = @avr-size --target=$(FORMAT) $(TARGET).hex ELFSIZE = @avr-size $(TARGET).elf FINISH = @echo Errors: none BEGIN = @echo -------- begin -------- END = @echo -------- end -------- # MCU name MCU = atmega128 # Output format. Can be [srec|ihex]. FORMAT = ihex # Target file name (without extension). TARGET = test # List C source files here. SRC = main.c ct8022.c serial.c vm.c socket.c # List Assembler source files here. ASRC = # Compiler flags. # CPFLAGS = -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=$(<:.c=.lst) # CPFLAGS = -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=$(<:.c=.lst) CPFLAGS = -g -O2 -Wall -Wstrict-prototypes -Wa,-ahlms=$(<:.c=.lst) # Assembler flags. ASFLAGS = -Wa,-ahlms=$(<:.s=.lst), -gstabs # Linker flags (passed via GCC). LDFLAGS = -Wl,-Map=$(TARGET).map,--cref # Additional library flags (-lm = math library). LIBFLAGS = -lm # Define all project specific object files. OBJ = $(SRC:.c=.o) $(ASRC:.s=.o) # Define all listing files. LST = $(ASRC:.s=.lst) $(SRC:.c=.lst) # Add target processor to flags. CPFLAGS += -mmcu=$(MCU) ASFLAGS += -mmcu=$(MCU) LDFLAGS += -mmcu=$(MCU) # Default target. .PHONY : all all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep $(TARGET).lss $(TARGET).cof sizeafter finished end # Eye candy. .PHONY : begin begin: $(BEGIN) .PHONY : finish finished: $(FINISH) .PHONY : end end: $(END) # Display size of file. .PHONY : sizebefore sizebefore: @echo Size before: -$(HEXSIZE) .PHONY : sizeafter sizeafter: @echo Size after: $(HEXSIZE) # Display compiler version information. .PHONY : gccversion gccversion : $(COMPILE) --version # Create AVROBJ format file from ELF output file. (Future release) #%.obj: %.elf # $(OBJCOPY) -O avrobj -R .eeprom $< $@ # Create COFF format file from ELF output file. %.cof: %.elf $(ELFCOFF) loadelf $< mapfile $*.map writecof $@ # Create final output files (.hex, .eep) from ELF output file. %.hex: %.elf $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ %.eep: %.elf -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O $(FORMAT) $< $@ # Create extended listing file from ELF output file. %.lss: %.elf $(OBJDUMP) -h -S $< > $@ # Link: create ELF output file from object files. .SECONDARY : $(TRG).elf .PRECIOUS : $(OBJ) %.elf: $(OBJ) $(COMPILE) $(LDFLAGS) $(OBJ) $(LIBFLAGS) --output $@ # Compile: create object files from C source files. %.o : %.c $(COMPILE) -c $(CPFLAGS) -I$(AVRINC) -I$(DIRINC) $< -o $@ # Assemble: create object files from assembler files. %.o : %.s $(ASSEMBLE) -c $(ASFLAGS) -I$(AVRINC) -I$(DIRINC) $< -o $@ # Target: clean project. .PHONY : clean clean: begin clean_list finished end .PHONY : clean_list clean_list : $(REMOVE) $(TARGET).hex $(REMOVE) $(TARGET).eep $(REMOVE) $(TARGET).obj $(REMOVE) $(TARGET).cof $(REMOVE) $(TARGET).elf $(REMOVE) $(TARGET).map $(REMOVE) $(TARGET).obj $(REMOVE) $(TARGET).a90 $(REMOVE) $(TARGET).sym $(REMOVE) $(TARGET).lnk $(REMOVE) $(TARGET).lss $(REMOVE) $(OBJ) $(REMOVE) $(LST) $(REMOVE) $(SRC:.c=.s) $(REMOVE) $(SRC:.c=.d) $(REMOVE) *.bak # Automatically generate C source code dependencies. (Code taken from the GNU make user manual.) # Note that this will work with sh (bash) and sed that is shipped with WinAVR (see the SHELL variable defined above). # This may not work with other shells or other seds. %.d: %.c set -e; $(COMPILE) -MM $(CPFLAGS) $< \ | sed 's/\($*\)\.o[ :]*/\1.o $@ : /g' > $@; \ [ -s $@ ] || rm -f $@ include $(SRC:.c=.d) # List assembly only source file dependencies here: |
Сообщ.
#15
,
|
|
|
я бы для начала отключил оптимизацию
Цитата CPFLAGS = -g -O0-Wall -Wstrict-prototypes -Wa,-ahlms=$(<:.c=.lst) |