Перейти к содержанию
    

Krom

Свой
  • Постов

    107
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о Krom

  • Звание
    Частый гость
    Частый гость
  • День рождения 21.11.1969

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array
  1. Попробую. Хорошо бы, если бы все было так просто. Интересно, как тогда все остальные собирают? Пробовал даже ягартовскими скриптами собирать - та же хрень. А ведь он собирал 4.6.2, и патчи у него к скриптам прилагаются...
  2. Я за советом и обратился :) Задача собственно в том и стоит, чтобы по определенному событию (получен пакет с командой) как-то переключится на обработчик этой команды (может, программное прерывание?), а уж потом из обработчика вернуться туда, откуда попали в прерывание. Вероятно, я не совсем точно сформулировал проблему, сорри...
  3. Ну так и сразу костыли... Программерский трюк это не костыль ;). В любом боле-менее сносном программно-аппаратном комплексе защиты ПО таких "костылей" тьма-тьмущая, и без них вообще никак, так что-же? Ну я не это предлагал обсудить... Грязные? Хаки? Чем они грязные и почему хаки? Пробовал. Хотелось бы найти хорошую диаграммку с детальным описанием, как в мануале Филипса для 51х контроллеров. А то что в гугле по Кортексам разобраться конечно можно, но проштудировав много-много разных мануалов. Просто вопрос времени. Ведь мог кто-то уже сталкиваться с подобной задачей и решить ее? Мог. Почему бы мне не спросить? Вроде для того и форум.
  4. ОСи нет, а главный цикл очень сложный, с вводами с клавиатуры и т.д., и когда дойдет очередь до обработки команды - хз. В 51х все работало на ура, и здесь будет ;), просто нигде не могу найти детального описания - что происходит при передаче управления обработчику прерывания и при выходе из него. Например, в поисании указано, что при передаче управления обработчику прерывания в стек автоматически помещается 8 регистров: R0-R3,LR,PC,xPSR. Смотрю в листингах: При входе в обработчик SysTick: 64:M1504/lpc17xx_it.c **** void SysTick_Handler(void) 65:M1504/lpc17xx_it.c **** { 200 .loc 1 65 0 201 .cfi_startproc 202 @ args = 0, pretend = 0, frame = 0 203 @ frame_needed = 1, uses_anonymous_args = 0 204 @ link register save eliminated. 205 0000 80B4 push {r7} 206 .LCFI14: 207 .cfi_def_cfa_offset 4 208 .cfi_offset 7, -4 209 0002 00AF add r7, sp, #0 При выходе: 248 .loc 1 74 0 249 0068 BD46 mov sp, r7 250 006a 80BC pop {r7} 251 006c 7047 bx lr 252 .cfi_endproc Нигде нет обработки этих самых 8 регистров в стеке. Они отрабатываюся автомачически самим контроллером или? Мне бы мануал детальный найти...
  5. В моем варианте это не подходит. Команды могут выполняться подолгу, до нескольких секунд, а прерывание UART должно жить и отвечать мастеру, что в случае выполнения обработки этой команды в прерывании невозможно.
  6. Пример: прерывание UART принимает пакет определенного формата (скажем, команду устройству, которая должна выполняться в фоновом режиме), которая должна быть обработана. Команда может выполняться долго, и обрабатываеть ее прямо в прерывании скажем так - не комильфо.
  7. Контроллер LPC1768. Задача: в определенный момент выйти из прерывания (UART) в требуемую точку, а уж оттуда потом продолжить выполнения с места, где возникло прерывание. Никаких ОС не используется. В контроллерах семейства 8051 это делалось элементарно: ; сохраняем регистр прерываний push IE ; запрещаем прерывания clr EA ; берем требуемый адрес mov DPTR,#PROCESS ; подсовываем в стек push DPH push DPL ; и выходим куда нужно reti А вот как сделать нечто подобное в Cortex M3? Как корректно передать управление нужному процессу из обработчика прерывания, да так, чтобы ничего не испортить,а затем уже из того процесса корректно вернуться в нужное место?
  8. Рабочий Makefile для сборки библиотеки CMSYS для LPC1768. Правда, для работы в линуксе. ######################################################################## # Makefile to create FirmWare Library for LPC17xx ######################################################################## TCHAIN = arm-elf TCHAIN_VER = 4.6.1 TCHAIN_ROOT = /usr/local MCU = cortex-m3 OPT = 0 CMCORE = CM3 DEVICE = LPC17xx DEBUG = dwarf-2 CSTANDARD = -std=gnu99 TARGET = lib$(DEVICE) PROJECT = DEV_LPC17xx PROJ_ROOT = ~/MPrjs/CortexM3/$(PROJECT) EXTRAINCDIRS = ######################################################################## # (FWLIB) SOURCE AND HOCEADERS LOCATIONS ######################################################################## FWLIB_ROOT =~/MPrjs/CortexM3/LPC1700CMSIS FWLIB_SRC_DIR =$(FWLIB_ROOT)/Drivers/source FWLIB_INC_DIR =$(FWLIB_ROOT)/Drivers/include ######################################################################## # (CMCORE) SOURCE AND HEADERS LOCATIONS ######################################################################## CMCORE_DIR =$(FWLIB_ROOT)/Core/$(CMCORE)/CoreSupport DEVICE_DIR =$(FWLIB_ROOT)/Core/$(CMCORE)/DeviceSupport/NXP/$(DEVICE) ######################################################################## # C-Sources ######################################################################## SRC = $(PROJ_ROOT)/lpc17xx_libcfg.c SRC += $(FWLIB_SRC_DIR)/lpc17xx_gpio.c SRC += $(FWLIB_SRC_DIR)/lpc17xx_adc.c #SRC += $(FWLIB_SRC_DIR)/lpc17xx_gpio.c SRC += $(FWLIB_SRC_DIR)/lpc17xx_nvic.c SRC += $(FWLIB_SRC_DIR)/lpc17xx_pinsel.c SRC += $(FWLIB_SRC_DIR)/lpc17xx_spi.c SRC += $(FWLIB_SRC_DIR)/lpc17xx_timer.c SRC += $(FWLIB_SRC_DIR)/lpc17xx_uart.c SRC += $(FWLIB_SRC_DIR)/lpc17xx_clkpwr.c SRC += $(FWLIB_SRC_DIR)/lpc17xx_rtc.c SRC += $(FWLIB_SRC_DIR)/lpc17xx_ssp.c SRC += $(FWLIB_SRC_DIR)/lpc17xx_systick.c ######################################################################## # Assembler-Sources ######################################################################## ASRC = #CDEFS = CDEFS = -D__BUILD_WITH_EXAMPLE__ CFLAGS = $(CDEFS) CFLAGS += -mthumb CFLAGS += -Wall CFLAGS += -O$(OPT) CFLAGS += -mapcs-frame CFLAGS += -D__thumb2__=1 CFLAGS += -msoft-float CFLAGS += -mfpu=vfp CFLAGS += -mfloat-abi=soft CFLAGS += -mno-sched-prolog CFLAGS += -fno-hosted #CFLAGS += -mtune=cortex-m3 #CFLAGS += -march=armv7-m #CFLAGS += -mfix-cortex-m3-ldrd CFLAGS += -ffunction-sections CFLAGS += -fdata-sections CFLAGS += -g$(DEBUG) CFLAGS += $(CSTANDARD) #CFLAGS += -Wstrict-prototypes #CFLAGS += -Wundef #CFLAGS += -Wa,-adhlns=$(<:%.c=%.lst) #CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) CFLAGS += -D__BUILD_WITH_EXAMPLE__=1 CFLAGS += -I $(FWLIB_INC_DIR) -I $(CMCORE_DIR) -I $(DEVICE_DIR) ASFLAGS = -Wa,-adhlns=$(<:%.S=%.lst),-g$(DEBUG) ASFLAGS += -mthumb -Dgcc -DBUILD_ALL AFLAGS += -I $(FWLIB_INC_DIR) -I $(CMCORE_INC_DIR) CC = $(TCHAIN_ROOT)/bin/$(TCHAIN)-gcc AS = $(TCHAIN_ROOT)/bin/$(TCHAIN)-as AR = $(TCHAIN_ROOT)/bin/$(TCHAIN)-ar LD = $(TCHAIN_ROOT)/bin/$(TCHAIN)-gcc NM = $(TCHAIN_ROOT)/bin/$(TCHAIN)-nm OBJDUMP = $(TCHAIN_ROOT)/bin/$(TCHAIN)-objdump OBJCOPY = $(TCHAIN_ROOT)/bin/$(TCHAIN)-objcopy READELF = $(TCHAIN_ROOT)/bin/$(TCHAIN)-readelf RANLIB = $(TCHAIN_ROOT)/bin/$(TCHAIN)-ranlib SIZE = $(TCHAIN_ROOT)/bin/$(TCHAIN)-size SHELL = /bin/sh REMOVE = /bin/rm -f REMOVEDIR = /bin/rm -rf # Define all object files. OBJ = $(SRC:%.c=%.o) $(ASRC:%.S=%.o) # Define all listing files. LST = $(SRC:%.c=%.lst) $(ASRC:%.S=%.lst) # Combine all necessary flags and optional flags. # Add target processor to flags. ALL_CFLAGS = -mcpu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) ALL_ASFLAGS = -mcpu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) # target for make all -> just create go to target lib all: lib %.o : %.c $(CC) -c $(ALL_CFLAGS) $< -o $@ %.o : %.S $(CC) -c $(ALL_ASFLAGS) $< -o $@ lib: $(OBJ) $(AR) -crs $(TARGET).a $(OBJ) # Target: clean project. clean : $(REMOVE) $(SRC:.c=.s) $(REMOVE) $(SRC:.c=.d) $(REMOVE) $(OBJ) $(REMOVE) $(LST) $(REMOVE) $(TARGET).a $(REMOVEDIR) .dep # Create object files directory # $(shell mkdir $(OBJDIR) 2>/dev/null) # Include the dependency files. -include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) # Listing of phony targets. .PHONY : all build clean lib
  9. Не зависят, но нет ощущения завершенности. Опять же собирать в двух OS это как-то совсем садо-мазо (хотя под Линукс собирается почти в два раза быстрее ;) )... Но пока выхода другого не вижу, и так чистым временем дней пять на эти эксперименты убил... В общем, могу выложить на фтп полный комплект (Эклипс со всеми плагинами и собраный тулчейн arm-elf под кортексы, включая openocd 0.4.0). Смысл есть? Нужно кому? ЗЫ. Прошу прощения за чайниковский вопрос, но все-таки - а чем в двух словах отличаются arm-elf и arm-none-eabi?
  10. В общем, так и не нашел я откуда у этой ошибки ноги растут. Пробовал собирать и под MinGW в Windows, и в Линуксе для Виндовса - результат один и то же. На версиях 4.5.3, 4.6.0 и 4.6.1. Причем все три версии под Линуксом собираются прекрасно и с первого тыка. Нифига непонятно, как у ягарто собиралось - пробовал его же скриптами, с теми же исходниками - ошибка остается. Видимо, патчик какой приныкал. Пока остановился на таком варианте: финальную сборку gcc провожу командами make all-gcc и make install-gcc (а надо бы make и install), а библиотеки подсовываю от собранной в линуксе версии. Бинарник собирал, прошивал, тестил - работает.
  11. Что интересно - под никсами и для никсов все собирается прекрасно. ЗЫ. Что еще интереснее - под никсами, но для Виндовса ( с опцией --host=i586-mingw32msvc ) таже хрень - финальная сборка gcc падает на том же месте и с той же ошибкой: -c ../../gcc-4.6.0/gcc/crtstuff.c -DCRT_BEGIN \ -o /home/krom/arm-elf-tool/fingcc-build/arm-elf/thumb/libgcc/crtbegin.o In file included from /usr/local/lib/gcc/arm-elf/4.5.1/../../../../arm-elf/sys-include/stdio.h:46:0, from ../../gcc-4.6.0/gcc/tsystem.h:87, from ../../gcc-4.6.0/gcc/crtstuff.c:61: /usr/local/lib/gcc/arm-elf/4.5.1/../../../../arm-elf/sys-include/sys/types.h:126:16: error: expected identifier or '(' before 'char' make[5]: *** [/home/krom/arm-elf-tool/fingcc-build/arm-elf/thumb/libgcc/crtbegin.o] Ошибка 1 make[5]: Leaving directory `/home/krom/arm-elf-tool/fingcc-build/gcc' make[4]: *** [gcc-extra-parts] Ошибка 2 make[4]: Leaving directory `/home/krom/arm-elf-tool/fingcc-build/arm-elf/thumb/libgcc' make[3]: *** [multi-do] Ошибка 1 make[3]: Leaving directory `/home/krom/arm-elf-tool/fingcc-build/arm-elf/libgcc' make[2]: *** [all-multi] Ошибка 2 make[2]: Leaving directory `/home/krom/arm-elf-tool/fingcc-build/arm-elf/libgcc' make[1]: *** [all-target-libgcc] Ошибка 2 make[1]: Leaving directory `/home/krom/arm-elf-tool/fingcc-build' make: *** [all] Ошибка 2 Error building gcc Что еще заметил - какого-то хрена лезет в /usr/local/lib/gcc/arm-elf/4.5.1/ - вообще непонятка, зачем ему туда
  12. В общем, практически все собрал. Open OCD тоже, прошивка через него заливается, а отладку проверить не могу. Оказывается, финальная сборка gcc до конца не проходит, и проект собрать невозможно. Для проверки заливки через собранный OpenOCD брал бинарник, собранный в никсах. А вот в Винде под MinGW финальная сборка gcc никак не идет :(. Пробовал и 4.5.3, и 4.6.0 - вылетает на этапе сборки libgcc с сообщением: In file included .../arm-elf/include/sys/types.h:126:16: error: expected identifier or '(' before 'char' ПРичем ничего такого особенного там нет: typedef long daddr_t; typedef char * caddr_t; // ругаеццо сюда С этими же скриптами собирал 4.5.1 под никсами без проблем. Кто-нить сталкивался с подобным? ПРобовал ягартовские скрипты(только собирал arm-elf, а не arm-none-eabi) - аналогично. В общей сложности дня три уже потратил :crying: Думаю, проще было бы собрать в nix-ах, но хотелось бы освоить процесс сборки именно в MinGW под вынем gcc для сборки newlib собирается вот этим скриптом: if [ "$OSTYPE" == "msys" ] then export CFLAGS=-D__USE_MINGW_ACCESS fi CFLAGS="-I$PREFIX/include" \ LDFLAGS="-L$PREFIX/lib" \ ../$GCC_SRC/configure \ --target=$TARGET --prefix=$PREFIX \ --disable-nls --disable-shared --disable-threads \ --with-gcc --with-gnu-ld --with-gnu-as --with-dwarf2 \ --enable-languages=c,c++ --enable-interwork --enable-multilib \ --with-newlib --with-headers=../newlib-$NEWLIB_VER/newlib/libc/include \ --with-gmp=$PREFIX \ --with-mffr=$PREFIX \ --with-mpc=$PREFIX \ --disable-libssp --disable-libstdcxx-pch --disable-libmudflap \ --disable-libgomp -v \ || { echo "Error configuring gcc"; exit 1; } mkdir -p libiberty libcpp fixincludes $MAKE all-gcc || { echo "Error building gcc"; exit 1; } $MAKE install-gcc || { echo "Error installing gcc"; exit 1; } сами newlib: ../$NEWLIB_SRC/configure \ --target=$TARGET --prefix=$PREFIX \ --enable-interwork --enable-multilib \ --disable-newlib-supplied-syscalls \ || { echo "Error configuring newlib"; exit 1; } $MAKE || { echo "Error building newlib"; exit 1; } $MAKE install || { echo "Error installing newlib"; exit 1; } финальная сборка gcc: if [ "$OSTYPE" == "msys" ] then export CFLAGS=-D__USE_MINGW_ACCESS fi CFLAGS="-I$PREFIX/include" \ LDFLAGS="-L$PREFIX/lib" \ ../$GCC_SRC/configure \ --target=$TARGET --prefix=$PREFIX \ --disable-nls --disable-shared --disable-threads \ --with-gcc --with-gnu-ld --with-gnu-as --with-dwarf2 \ --enable-languages=c,c++ --enable-interwork --enable-multilib \ --with-newlib --with-headers=$PREFIX/$TARGET/include \ --with-gmp=$PREFIX \ --with-mffr=$PREFIX \ --with-mpc=$PREFIX \ --disable-libssp --disable-libstdcxx-pch --disable-libmudflap \ --disable-libgomp -v \ || { echo "Error configuring gcc"; exit 1; } mkdir -p libiberty libcpp fixincludes $MAKE all || { echo "Error building gcc"; exit 1; } $MAKE install || { echo "Error installing gcc"; exit 1; } никак не въеду, где собака порылась :cranky: ЗЫ. Только тут увидел ошибку в скрипте: --with-mffr=$PREFIX \ а надо ведь --with-mpfr=$PREFIX \ Ну, сделаю еще попытку
  13. Ну надеюсь домучить это дело в ближайшие пару дней. Как только получится - распишу. В Цигвине собралось без особых проблем, но хотелось бы обойтись только MinGW. ЗЫ. Собрал, но попробовать не на чем, все на работе :(. Завтра притащу с работы какую-нить железяку и проверю на счет работоспособности.
  14. Предпочитаю собирать собственноручно :). В принципе, я уже вышел из положения - отказался от автоматизированной сборки с помощью скрипта и собрал поэтапно (геморрой еще тот я вам скажу). Осталось только разобраться как OpenOCD в MinGW собирать :)
  15. Решил-таки перебраться из Линукс в Винду, ибо много чего требуется в ней, а перегружаться туда-сюда надоело уже... Установил MinGW, пытаюсь собрать toolchain для Cortex (в Дебиан процесс освоен давно) - не выходит. Спустя минут 10 после начала сборки самого gcc (binutils собрались нормально) вываливается с ошибкой. Думал, скрипты оптимизировал под винду неверно. Взял скрипты yagarto. Результат аналогичный. Крутил и так, и эдак, пока не заметил странную вещь: в процессе сборки постоянно растет объем используемой памяти (смотрю в Диспетчере задач) и когда доходит до 1.72ГБ (+/- несколько процентов) вываливаемся с ошибкой fork: Resource temporarily unavailable или ля-ля-ля: Permission denied. Память освобождается только после перезагрузки компа. Работаю на ноутбуке, проц Core 2 Duo 2.2 ГГц T7500, ОЗУ 2 ГБ. Ось - Win XP Pro (32 бит). Манипуляции с файлом покачки не помогли - похоже, MinGW его просто не видит (пробовал отключать вообще - тоже самое). Встречался кто-нибудь с аналогичной проблемой?
×
×
  • Создать...