На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
    > avr-gcc & ATMega128 , или жЁстко глючит или я чё-то не понимаю
      Такая ситуация:
      делаю прогу под сабжевый Atmel AVR микроконтроллер.
      Прога на C, и как принято, состоит из нескольких файлов:
      file1.c, file2.c, ..., main.c. Компиляю, зашиваю, - как-то работает.
      Затем - хочу чё-нить изменить - добавляю к примеру функцию,
      причем вношу просто определение тела функции и описываю её прототип в одном из
      заголовков:
      file1.h:
      ExpandedWrap disabled
        extern void func (char, char);
      file1.c:
      ExpandedWrap disabled
        void func (char a, char b)
           {
           if (b == 1) PORTG |= 0x10;
           else PORTG &= ~0x10;
           /*
           ...
           */
           }
      Добавленная функция по ходу исполнения программы нигде не вызывается.

      После всех внесённых изменений программа полностью рушится и не работает никак.
      Как так может быть ? или компилятор кривой (avr-gcc 3.3 20030113) или что?
      Сообщение отредактировано: trainer -
        Цитата chomb, 28.10.04, 14:03
        или компилятор кривой
        Возможно и такое.

        Кстати, для функций писать extern не обязательно
          а убрать как было, работает?
            ДА. Если убрать как было работает.
            Сам код добавленной функции тоже никаких сомнений не вызывает.
              M
              Тема перенесена из Hardware (аппаратные средства)
                В качестве варианта могу предположить, что модель памяти неверная. Компилятор пытается засунуть локальные переменные или стек во внешнюю память, которой нет.

                Dice - промазал, надо было в "Чистый C/C++" :)
                  M
                  Тема перенесена из C/C++ -> Visual C++ / MFC / WTL / WinAPI
                    Цитата
                    В качестве варианта могу предположить, что модель памяти неверная. Компилятор пытается засунуть локальные переменные или стек во внешнюю память, которой нет.


                    Тоже такое возникает ощущение.
                    Хуже всего, что отладочных средств почти никаких- под отладчиком это дело
                    вообще ни в каком виде не работает. Есть какие-нибудь варианты косвенного
                    подтверждения/опровержения этой гипотезы?


                    Цитата
                    Dice - промазал, надо было в "Чистый C/C++"


                    Модераторам : Хорош уже мазать да двигать меня туда-сюда !
                      Цитата chomb, 28.10.04, 15:36
                      Есть какие-нибудь варианты косвенного
                      подтверждения/опровержения этой гипотезы?
                      Карту памяти его линкер создавать умеет? Если умеет - то можно посмотреть там.

                      Умеет. Ключик -Map для линкера, создает карту памяти.
                      Сообщение отредактировано: trainer -
                        Цитата

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


                        Тоже такое возникает ощущение.
                        Хуже всего, что отладочных средств почти никаких- под отладчиком это дело
                        вообще ни в каком виде не работает. Есть какие-нибудь варианты косвенного
                        подтверждения/опровержения этой гипотезы?


                        не передавать в ф-ю никаких парвметров
                        extern void func (void);
                        ну а в теле самой ф-и напиши что нибудь
                          Цитата
                          не передавать в ф-ю никаких парвметров
                          extern void func (void);
                          ну а в теле самой ф-и напиши что нибудь


                          Помогло, хотя размер кода даже увеличился. Не выход,
                          т. к. всё равно нужны будут функции, в которые передаются аргументы.
                          И потом это ничего не говорит о причине проблемы, которая так и остаётся.
                            Цитата

                            И потом это ничего не говорит о причине проблемы, которая так и остаётся.

                            это как раз и говорит о причине, тебе ее сказал до меня trainer
                            с данным компилятором к сожалению не работал
                            рекомендую внимательно просмотреть свой мак файл
                              Цитата chomb, 29.10.04, 08:14
                              И потом это ничего не говорит о причине проблемы, которая так и остаётся.
                              Покажи свой make-файл и сгенери и посмотри содержимое файла-карты памяти.
                                Даю 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:
                                  я бы для начала отключил оптимизацию
                                  Цитата

                                  CPFLAGS = -g -O0-Wall -Wstrict-prototypes -Wa,-ahlms=$(<:.c=.lst)
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,0378 ]   [ 15 queries used ]   [ Generated: 27.04.24, 17:49 GMT ]