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

Krom

Свой
  • Постов

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

  • Посещение

Весь контент Krom


  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 его просто не видит (пробовал отключать вообще - тоже самое). Встречался кто-нибудь с аналогичной проблемой?
  16. Блин, тоже все перепахали черти :angry2: Очень много чего поменяли. Ладно, конфигурацию выводов сделали по человечески, это еще могу понять, ну нафига все имена менять? :cranky: Как новая версия, так начинаются пляски с бубном. Поубывав бы :maniac:
  17. И 0.4.0, и самые свежие со старыми скриптами у мну дружить не хотят. ругаются на reset_halt. Eсли вместо reset_halt поставить две последовательные команды reset и halt - отладка запускается, а шить флеш не хочет. В рабочей сборке ocd при прошивке флеши устройство сбрасывается на все время прошивки (видно по очистке индикатора) и перезапускается после загрузки, то в новых версиях со сбросом и остановом творится черт знает что. Может запустится секунд через 5 (как тогда идет прошивка?), или не перезапуститься после загрузки флеш... Пробовал на разных JTAG - Amontec JTagKey и Olimex ARM-USB-TINY - результат один и тот же.
  18. А чем вот это не устраивает? А что будет прикомпилировано к пректу, как раз и задется в lpc17xx_libcfg.h
  19. Я так и не подружился с новыми версиями. Ни с последней из репозитария, ни с 0.4.0. Собирается, отладка идет, а с записью во флеш LPC1768 траблы. Старый скрипт не работает, ругается на команду reset_halt, хотя в мануале такая команда присутствует. Все попытки замены ее чем-либо приводят к неоднозначным результатам - то запишется, то не запишется...
  20. Возникла необходимость освежить версию gcc. До этого была версия 4.3.4, собрал версию 4.5.1. Проект собирается, грузится, даже запускается, выводит ссобщение на индикатор и подвисает :(. Под отладчиком вижу, что подвисает при включении первого же прерывания (TIMER1_IRQHandler), а дальше посмотерть не могу, Эклипс выбрасывает окошко ссообщением No source available for "g_pfnVectors() ". Первое что пришло в голову - проблема с файлом startup_LPC17xx.c (хотя с другой стороны - reset судя по всему проходит, стек настраивается). Содержимое startup_LPC17xx.c: #include "LPC17xx.h" #define WEAK __attribute__ ((weak)) //***************************************************************************** // // Forward declaration of the default fault handlers. // //***************************************************************************** /* System exception vector handler */ void WEAK Reset_Handler(void); /* Reset Handler */ void WEAK NMI_Handler(void); /* NMI Handler */ void WEAK HardFault_Handler(void); /* Hard Fault Handler */ void WEAK MemManage_Handler(void); /* MPU Fault Handler */ void WEAK BusFault_Handler(void); /* Bus Fault Handler */ void WEAK UsageFault_Handler(void); /* Usage Fault Handler */ void WEAK SVC_Handler(void); /* SVCall Handler */ void WEAK DebugMon_Handler(void); /* Debug Monitor Handler */ void WEAK PendSV_Handler(void); /* PendSV Handler */ void WEAK SysTick_Handler(void); /* SysTick Handler */ /* External interrupt vector handler */ void WEAK WDT_IRQHandler(void); /* Watchdog Timer */ void WEAK TIMER0_IRQHandler(void); /* Timer0 */ void WEAK TIMER1_IRQHandler(void); /* Timer1 */ void WEAK TIMER2_IRQHandler(void); /* Timer2 */ void WEAK TIMER3_IRQHandler(void); /* Timer3 */ void WEAK UART0_IRQHandler(void); /* UART0 */ void WEAK UART1_IRQHandler(void); /* UART1 */ void WEAK UART2_IRQHandler(void); /* UART2 */ void WEAK UART3_IRQHandler(void); /* UART3 */ void WEAK PWM1_IRQHandler(void); /* PWM1 */ void WEAK I2C0_IRQHandler(void); /* I2C0 */ void WEAK I2C1_IRQHandler(void); /* I2C1 */ void WEAK I2C2_IRQHandler(void); /* I2C2 */ void WEAK SPI_IRQHandler(void); /* SPI */ void WEAK SSP0_IRQHandler(void); /* SSP0 */ void WEAK SSP1_IRQHandler(void); /* SSP1 */ void WEAK PLL0_IRQHandler(void); /* PLL0 (Main PLL) */ void WEAK RTC_IRQHandler(void); /* Real Time Clock */ void WEAK EINT0_IRQHandler(void); /* External Interrupt 0 */ void WEAK EINT1_IRQHandler(void); /* External Interrupt 1 */ void WEAK EINT2_IRQHandler(void); /* External Interrupt 2 */ void WEAK EINT3_IRQHandler(void); /* External Interrupt 3 */ void WEAK ADC_IRQHandler(void); /* A/D Converter */ void WEAK BOD_IRQHandler(void); /* Brown Out Detect */ void WEAK USB_IRQHandler(void); /* USB */ void WEAK CAN_IRQHandler(void); /* CAN */ void WEAK DMA_IRQHandler(void); /* GP DMA */ void WEAK I2S_IRQHandler(void); /* I2S */ void WEAK ENET_IRQHandler(void); /* Ethernet */ void WEAK RIT_IRQHandler(void); /* Repetitive Interrupt Timer */ void WEAK MCPWM_IRQHandler(void); /* Motor Control PWM */ void WEAK QEI_IRQHandler(void); /* Quadrature Encoder Interface */ void WEAK PLL1_IRQHandler(void); /* PLL1 (USB PLL) */ /* Exported types --------------------------------------------------------------*/ /* Exported constants --------------------------------------------------------*/ extern unsigned long _etext; extern unsigned long _sidata; /* start address for the initialization values of the .data section. defined in linker script */ extern unsigned long _sdata; /* start address for the .data section. defined in linker script */ extern unsigned long _edata; /* end address for the .data section. defined in linker script */ extern unsigned long _sbss; /* start address for the .bss section. defined in linker script */ extern unsigned long _ebss; /* end address for the .bss section. defined in linker script */ extern void _estack; /* init value for the stack pointer. defined in linker script */ /* Private typedef -----------------------------------------------------------*/ /* function prototypes ------------------------------------------------------*/ void Reset_Handler(void) __attribute__((__interrupt__)); extern int main(void); /****************************************************************************** * * The minimal vector table for a Cortex M3. Note that the proper constructs * must be placed on this to ensure that it ends up at physical address * 0x0000.0000. * ******************************************************************************/ #define STACK_SIZE 0x00000400 __attribute__ ((section(".stackarea"))) /*static*/ unsigned long pulStack[sTACK_SIZE]; __attribute__ ((section(".isr_vector"))) void (* const g_pfnVectors[])(void) = { //&_estack, // The initial stack pointer (void (*)(void))((unsigned long)pulStack + sizeof(pulStack)), // The initial stack pointer Reset_Handler, /* Reset Handler */ NMI_Handler, /* NMI Handler */ HardFault_Handler, /* Hard Fault Handler */ MemManage_Handler, /* MPU Fault Handler */ BusFault_Handler, /* Bus Fault Handler */ UsageFault_Handler, /* Usage Fault Handler */ 0, /* Reserved */ 0, /* Reserved */ 0, /* Reserved */ 0, /* Reserved */ SVC_Handler, /* SVCall Handler */ DebugMon_Handler, /* Debug Monitor Handler */ 0, /* Reserved */ PendSV_Handler, /* PendSV Handler */ SysTick_Handler, /* SysTick Handler */ // External Interrupts WDT_IRQHandler, /* Watchdog Timer */ TIMER0_IRQHandler, /* Timer0 */ TIMER1_IRQHandler, /* Timer1 */ TIMER2_IRQHandler, /* Timer2 */ TIMER3_IRQHandler, /* Timer3 */ UART0_IRQHandler, /* UART0 */ UART1_IRQHandler, /* UART1 */ UART2_IRQHandler, /* UART2 */ UART3_IRQHandler, /* UART3 */ PWM1_IRQHandler, /* PWM1 */ I2C0_IRQHandler, /* I2C0 */ I2C1_IRQHandler, /* I2C1 */ I2C2_IRQHandler, /* I2C2 */ SPI_IRQHandler, /* SPI */ SSP0_IRQHandler, /* SSP0 */ SSP1_IRQHandler, /* SSP1 */ PLL0_IRQHandler, /* PLL0 (Main PLL) */ RTC_IRQHandler, /* Real Time Clock */ EINT0_IRQHandler, /* External Interrupt 0 */ EINT1_IRQHandler, /* External Interrupt 1 */ EINT2_IRQHandler, /* External Interrupt 2 */ EINT3_IRQHandler, /* External Interrupt 3 */ ADC_IRQHandler, /* A/D Converter */ BOD_IRQHandler, /* Brown Out Detect */ USB_IRQHandler, /* USB */ CAN_IRQHandler, /* CAN */ DMA_IRQHandler, /* GP DMA */ I2S_IRQHandler, /* I2S */ ENET_IRQHandler, /* Ethernet */ RIT_IRQHandler, /* Repetitive Interrupt Timer */ MCPWM_IRQHandler, /* Motor Control PWM */ QEI_IRQHandler, /* Quadrature Encoder Interface */ PLL1_IRQHandler, /* PLL1 (USB PLL) */ }; /******************************************************************************* * Function Name : Reset_Handler * Description : This is the code that gets called when the processor first starts execution * following a reset event. Only the absolutely necessary set is performed, * after which the application supplied main() routine is called. * Input : * Output : * Return : *******************************************************************************/ void Reset_Handler(void) { unsigned long *pulSrc, *pulDest; // // Copy the data segment initializers from flash to SRAM in ROM mode // #if (__RAM_MODE__==0) pulSrc = &_sidata; for(pulDest = &_sdata; pulDest < &_edata; ) { *(pulDest++) = *(pulSrc++); } #endif // // Zero fill the bss segment. // for(pulDest = &_sbss; pulDest < &_ebss; ) { *(pulDest++) = 0; } // // Call the application's entry point. // main(); } //***************************************************************************** // // Provide weak aliases for each Exception handler to the Default_Handler. // As they are weak aliases, any function with the same name will override // this definition. // //***************************************************************************** #pragma weak MemManage_Handler = Default_Handler /* MPU Fault Handler */ #pragma weak BusFault_Handler = Default_Handler /* Bus Fault Handler */ #pragma weak UsageFault_Handler = Default_Handler /* Usage Fault Handler */ #pragma weak SVC_Handler = Default_Handler /* SVCall Handler */ #pragma weak DebugMon_Handler = Default_Handler /* Debug Monitor Handler */ #pragma weak PendSV_Handler = Default_Handler /* PendSV Handler */ #pragma weak SysTick_Handler = Default_Handler /* SysTick Handler */ /* External interrupt vector handler */ #pragma weak WDT_IRQHandler = Default_Handler /* Watchdog Timer */ #pragma weak TIMER0_IRQHandler = Default_Handler /* Timer0 */ #pragma weak TIMER1_IRQHandler = Default_Handler /* Timer1 */ #pragma weak TIMER2_IRQHandler = Default_Handler /* Timer2 */ #pragma weak TIMER3_IRQHandler = Default_Handler /* Timer3 */ #pragma weak UART0_IRQHandler = Default_Handler /* UART0 */ #pragma weak UART1_IRQHandler = Default_Handler /* UART1 */ #pragma weak UART2_IRQHandler = Default_Handler /* UART2 */ #pragma weak UART3_IRQHandler = Default_Handler /* UART3 */ #pragma weak PWM1_IRQHandler = Default_Handler /* PWM1 */ #pragma weak I2C0_IRQHandler = Default_Handler /* I2C0 */ #pragma weak I2C1_IRQHandler = Default_Handler /* I2C1 */ #pragma weak I2C2_IRQHandler = Default_Handler /* I2C2 */ #pragma weak SPI_IRQHandler = Default_Handler /* SPI */ #pragma weak SSP0_IRQHandler = Default_Handler /* SSP0 */ #pragma weak SSP1_IRQHandler = Default_Handler /* SSP1 */ #pragma weak PLL0_IRQHandler = Default_Handler /* PLL0 (Main PLL) */ #pragma weak RTC_IRQHandler = Default_Handler /* Real Time Clock */ #pragma weak EINT0_IRQHandler = Default_Handler /* External Interrupt 0 */ #pragma weak EINT1_IRQHandler = Default_Handler /* External Interrupt 1 */ #pragma weak EINT2_IRQHandler = Default_Handler /* External Interrupt 2 */ #pragma weak EINT3_IRQHandler = Default_Handler /* External Interrupt 3 */ #pragma weak ADC_IRQHandler = Default_Handler /* A/D Converter */ #pragma weak BOD_IRQHandler = Default_Handler /* Brown Out Detect */ #pragma weak USB_IRQHandler = Default_Handler /* USB */ #pragma weak CAN_IRQHandler = Default_Handler /* CAN */ #pragma weak DMA_IRQHandler = Default_Handler /* GP DMA */ #pragma weak I2S_IRQHandler = Default_Handler /* I2S */ #pragma weak ENET_IRQHandler = Default_Handler /* Ethernet */ #pragma weak RIT_IRQHandler = Default_Handler /* Repetitive Interrupt Timer */ #pragma weak MCPWM_IRQHandler = Default_Handler /* Motor Control PWM */ #pragma weak QEI_IRQHandler = Default_Handler /* Quadrature Encoder Interface */ #pragma weak PLL1_IRQHandler = Default_Handler /* PLL1 (USB PLL) */ //***************************************************************************** // // This is the code that gets called when the processor receives an unexpected // interrupt. This simply enters an infinite loop, preserving the system state // for examination by a debugger. // //***************************************************************************** void Default_Handler(void) { // Go into an infinite loop. // while (1) { } } Тот же проект с помощью gcc 4.3.4 собирается, работает и отлаживается без проблем. Нет ни у кого идей - в чем могут быть грабли? А, скрипт чуть не забыл: MEMORY { /* On-chip ROM is a readable ®, executable region (x) */ IROM (rx) : ORIGIN = 0x00000000, LENGTH = 256k /* On-chip SRAM is a readable ®, writable (w) and */ /* executable region (x) */ IRAM0 (rwx) : ORIGIN = 0x10000000, LENGTH = 32k /* * Used for Ethernet RAM section * IRAM1 (rwx) : ORIGIN = 0x2007C000, LENGTH = 16k */ /* * Used for USB RAM section * */ IRAM2 (rwx) : ORIGIN = 0x20080000, LENGTH = 16k } /* SECTION command : Define mapping of input sections */ /* into output sections. */ SECTIONS { /******************************************/ /* code section */ .text : { KEEP(*(.isr_vector .isr_vector.*)) *(.text .text.*) *(.gnu.linkonce.t.*) *(.glue_7) *(.glue_7t) *(.gcc_except_table) *(.rodata .rodata*) *(.gnu.linkonce.r.*) . = ALIGN(4); } >IROM /******************************************/ /* .ctors .dtors are used for c++ constructors/destructors */ .ctors : { . = ALIGN(4); PROVIDE(__ctors_start = .); KEEP(*(SORT(.ctors.*))) KEEP(*(.ctors)) PROVIDE(__ctors_end = .); } >IROM .dtors : { . = ALIGN(4); PROVIDE(__dtors_start = .); KEEP(*(SORT(.dtors.*))) KEEP(*(.dtors)) PROVIDE(__dtors_end = .); . = ALIGN(4); /* End Of .text section */ _etext = .; _sidata = .; } >IROM /******************************************/ /* This used for USB RAM section */ .usb_ram (NOLOAD): { *.o (USB_RAM) } > IRAM2 /* data section */ .data : AT (_sidata) { . = ALIGN(4); _sdata = .; *(vtable vtable.*) *(.data .data.*) *(.gnu.linkonce.d*) . = ALIGN(4); _edata = .; } >IRAM0 /******************************************/ /* For no-init variables section */ .bss (NOLOAD) : { . = ALIGN(4); _sbss = .; *(.bss .bss.*) *(.gnu.linkonce.b*) *(COMMON) . = ALIGN(4); _ebss = .; } >IRAM0 /******************************************/ /* For stack section */ .stackarea (NOLOAD) : { . = ALIGN(8); _sstack = .; *(.stackarea .stackarea.*) . = ALIGN(8); _estack = .; . = ALIGN(4); _end = .; PROVIDE (end = .); } > IRAM0 /******************************************/ /* Stabs debugging sections. */ .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } .stab.excl 0 : { *(.stab.excl) } .stab.exclstr 0 : { *(.stab.exclstr) } .stab.index 0 : { *(.stab.index) } .stab.indexstr 0 : { *(.stab.indexstr) } /* .comment 0 : { *(.comment) } */ /* DWARF debug sections. Symbols in the DWARF debugging sections are relative to the beginning of the section so we begin them at 0. */ /* DWARF 1 */ .debug 0 : { *(.debug) } .line 0 : { *(.line) } /* GNU DWARF 1 extensions */ .debug_srcinfo 0 : { *(.debug_srcinfo) } .debug_sfnames 0 : { *(.debug_sfnames) } /* DWARF 1.1 and DWARF 2 */ .debug_aranges 0 : { *(.debug_aranges) } .debug_pubnames 0 : { *(.debug_pubnames) } /* DWARF 2 */ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } .debug_abbrev 0 : { *(.debug_abbrev) } .debug_line 0 : { *(.debug_line) } .debug_frame 0 : { *(.debug_frame) } .debug_str 0 : { *(.debug_str) } .debug_loc 0 : { *(.debug_loc) } .debug_macinfo 0 : { *(.debug_macinfo) } /* SGI/MIPS DWARF 2 extensions */ .debug_weaknames 0 : { *(.debug_weaknames) } .debug_funcnames 0 : { *(.debug_funcnames) } .debug_typenames 0 : { *(.debug_typenames) } .debug_varnames 0 : { *(.debug_varnames) } }
  21. Как запущу все окончательно, обязательно распишу. Так вроде все протестил, вроде работает, но при попытке использовать билиотечные функции начинает ругаться: /usr/local/arm/lib/gcc/arm-elf/4.3.4/../../../../arm-elf/bin/ld: /usr/local/arm/lib/gcc/arm-elf/4.3.4/../../../../arm-elf/lib/libc.a(lib_a-strncmp.o)(strncmp): warning: interworking not enabled. first occurrence: main.o: Thumb call to ARM /usr/local/arm/lib/gcc/arm-elf/4.3.4/../../../../arm-elf/bin/ld: /usr/local/arm/lib/gcc/arm-elf/4.3.4/../../../../arm-elf/lib/libc.a(lib_a-strncmp.o)(strncmp): warning: interworking not enabled. first occurrence: main.o: Thumb call to ARM Какого ему надо не пойму. Опция -mthumb задана. Почему берет библиотеку /usr/local/arm/arm-elf/lib/libc.a а не /usr/local/arm/arm-elf/lib/thumb/libc.a нифига не понимаю. Опцию чтоли забыл какую-нить задать? С этим вроде разобрался, но сомневаюсь, что сделал правильно, развейте, плиз, сомнения. Я тупо вставил в мэйкфайд следующую строку: LDFLAGS += -L /usr/local/arm/arm-elf/lib/thumb -lc Это правильно или есть более верные способы?
  22. На 4.4 я забил, так как он оказывается unstable. Собрал 4.3.4, последние версии binutils и newlib и openocd. 5 дней плясок с бубном, но в итоге все заработало. Больше всего времени ушло на openocd, там много чего поменялось по сравнению с 747й версией,но в итоге и с ним разобрался. Если кому интересно, могу расписать как и что.
  23. Сконфигурировано со следующими опциями: configure --target=$TARGET --prefix=$PREFIX\ --with-newlib --with-gnu-as --with-gnu-ld --disable-shared\ --enable-languages=c --enable-interwork --enable-multilib\ --disable-nls --disable-win32-registry --disable-werror\ --without-headers где TARGET=arm-elf PREFIX=/usr/local/arm При сборке после минут так это двадцати работы выдает следующую ошибку: /tmp/cc2Pmx1O.s: Assembler messages: /tmp/cc2Pmx1O.s:78: Internal error! Assertion failure in make_mapping_symbol at .././gas/config/tc-arm.c line 2492. Please report this bug. make[5]: *** [/usr/local/arm/build/gcc/arm-elf/thumb/libgcc/crtend.o] Ошибка 1 make[5]: Leaving directory `/usr/local/arm/build/gcc/gcc' make[4]: *** [gcc-extra-parts] Ошибка 2 make[4]: Leaving directory `/usr/local/arm/build/gcc/arm-elf/thumb/libgcc' make[3]: *** [multi-do] Ошибка 1 make[3]: Leaving directory `/usr/local/arm/build/gcc/arm-elf/libgcc' make[2]: *** [all-multi] Ошибка 2 make[2]: Leaving directory `/usr/local/arm/build/gcc/arm-elf/libgcc' make[1]: *** [all-target-libgcc] Ошибка 2 make[1]: Leaving directory `/usr/local/arm/build/gcc' make: *** [all] Ошибка 2 ЧТо бы это могло быть? Кто-нибудь собирал 4.4? Куда сообщать об ошибке?
  24. STM32, gcc, тип long long

    Тулчейн самосборный. Может, где и накосячил чего при его сборке, однако же все кроме этого работает... ПОпробую собрать че-ниь посвежее :07:
  25. STM32, gcc, тип long long

    Есть необходимость использование типа long long (64 бита). Возникает проблема при попытке деления (сложение, вычитание, умножение выполняются нормально), а при попытке использовать деление на этапе сборки проекта выдается следующее сообщение: collect2: ld terminated with signal 11 [segmentation fault] /usr/local/arm/lib/gcc/arm-elf/4.3.1/../../../../arm-elf/bin/ld: /usr/local/arm/lib/gcc/arm-elf/4.3.1/libgcc.a(_divdi3.o)(__divdi3): warning: interworking not enabled. first occurrence: main.o: thumb call to arm /usr/local/arm/lib/gcc/arm-elf/4.3.1/../../../../arm-elf/bin/ld: BFD (GNU Binutils) 2.18.0.20080103 assertion fail /usr/local/arm/src/binutils-2.18.1/bfd/elf32-arm.c:6538 main.o: In function `main': /home/user/Project/STM32/P150/main.c:171: dangerous relocation: make: *** [main.elf] Ошибка 1 Пробовал собирать с опцией -mthumb-interwork -результат тот же. И при использовании функции lldiv тоже самое. Не могу въехать, почему умножать умножает, а делить не хочет? Все собирал с опцией --enable-interwork, в чем может быть проблема, есть идеи?
×
×
  • Создать...