LINUX.ORG.RU

линкер выдает нечто странное. STM32F3Discovery

 ,


0

1

Доброго времени суток!

Пишу прогу для взаимодействия STM32F3Discovery с компом по USB. На этапе линковки ld выдает следующее:

/usr/local/src/STM32F3-Discovery_FW_V1.1.0/inst/libstm32f3.a(usb_core.o): In function `Standard_SetConfiguration':
/usr/local/src/STM32F3-Discovery_FW_V1.1.0/Libraries/STM32_USB-FS-Device_Driver/src/usb_core.c:99: undefined reference to `Device_Table'
/usr/local/src/STM32F3-Discovery_FW_V1.1.0/inst/libstm32f3.a(usb_core.o): In function `Standard_ClearFeature':
/usr/local/src/STM32F3-Discovery_FW_V1.1.0/Libraries/STM32_USB-FS-Device_Driver/src/usb_core.c:322: undefined reference to `Device_Table'
/usr/local/src/STM32F3-Discovery_FW_V1.1.0/Libraries/STM32_USB-FS-Device_Driver/src/usb_core.c:322: undefined reference to `Device_Property'

And so on

При сборке libstm32f3.a проблем с линковкой не возникало, но судя по вышеприведенному выводу, именно libstm32f3.a не правильно слинковалась. Или я что-то забыл подключить...

Вот часть Makefile моего приложения, ответственная за сборку:

SRCS = main.c system_stm32f30x.c hw_config.c stm32f30x_it.c usb_desc.c usb_endp.c usb_istr.c usb_prop.c usb_pwr.c

# all the files will be generated with this name (main.elf, main.bin, main.hex, etc)
PROJ_NAME=usb_client

# Location of the Libraries folder from the STM32F0xx Standard Peripheral Library
STD_PERIPH_LIB = /usr/local/src/STM32F3-Discovery_FW_V1.1.0/inst

# Location of the linker scripts
LDSCRIPT_INC=Device/ldscripts

# location of OpenOCD Board .cfg files (only used with 'make program')
OPENOCD_BOARD_DIR=board

# Configuration (cfg) file containing programming directives for OpenOCD
OPENOCD_PROC_FILE=extra/stm32f3-openocd.cfg

# that's it, no need to change anything below this line!

###################################################

PREFIX	=	arm-none-eabi-
CC=$(PREFIX)gcc
AR=$(PREFIX)ar
GDB=$(PREFIX)gdb
OBJCOPY=$(PREFIX)objcopy
OBJDUMP=$(PREFIX)objdump
SIZE=$(PREFIX)size

CFLAGS  = -Wall -std=c99 -Os  
CFLAGS += -mlittle-endian -mcpu=cortex-m4  -march=armv7e-m -mthumb
CFLAGS += -mfpu=fpv4-sp-d16 -mfloat-abi=hard
CFLAGS += -ffunction-sections -fdata-sections

LDFLAGS += -Wl,--gc-sections -Wl,-Map=$(PROJ_NAME).map

###################################################

vpath %.a $(STD_PERIPH_LIB)

CFLAGS += -include $(STD_PERIPH_LIB)/stm32f30x_conf.h -I $(STD_PERIPH_LIB) 

STARTUP = Device/startup_stm32f30x.s # add startup file to build

# need if you want to build with -DUSE_CMSIS 
#SRCS += stm32f0_discovery.c
#SRCS += stm32f0_discovery.c stm32f0xx_it.c

OBJS = $(addprefix objs/,$(SRCS:.c=.o))
DEPS = $(addprefix deps/,$(SRCS:.c=.d))

###################################################

.PHONY: all proj program debug clean reallyclean

all: proj

-include $(DEPS)

proj: 	$(PROJ_NAME).elf

dirs: deps objs
deps objs:
	@mkdir -p $@

objs/%.o : src/%.c dirs
	$(CC) $(CFLAGS) -c -o $@ $< -MMD -MF deps/$(*F).d

$(PROJ_NAME).elf: $(OBJS)
	$(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@ $(STARTUP) -L$(STD_PERIPH_LIB) -lstm32f3 -L$(LDSCRIPT_INC) -Tstm32f3.ld
	$(OBJCOPY) -O ihex $(PROJ_NAME).elf $(PROJ_NAME).hex
	$(OBJCOPY) -O binary $(PROJ_NAME).elf $(PROJ_NAME).bin
	$(OBJDUMP) -St $(PROJ_NAME).elf >$(PROJ_NAME).lst
	$(SIZE) $(PROJ_NAME).elf

В интернетах нашел следующее: http://ravenium.ru/stm32-и-usb-hid-это-просто/

Но что я все-таки не включил?

★★
Ответ на: комментарий от aido

Разобрался. Лечится удалением extern-ов в usb_core.h в самом конце и ребилдом библиотеки. в частности, стало так:

DEVICE_PROP Device_Property;
USER_STANDARD_REQUESTS User_Standard_Requests;
 DEVICE  Device_Table;
DEVICE_INFO Device_Info;

aido ★★
() автор топика
Ответ на: комментарий от aido

Хотя extern DEVICE Device_Table; следует оставить

aido ★★
() автор топика

Не по теме: ты с F3Discovery намучаешься, помяни моё слово. Примеров в инете с ней мало, в основном под 1xx и 4xx серию примеры только. И даже SPL там от других серий отличается.

По теме: попробуй в makefile

-L$(STD_PERIPH_LIB)
и другие параметры для линковки в самом конце после всех указывать, вдруг поможет.

По теме 2: возьми makefile из стандартых примеров, слегка перепили под себя.

WRG ★★★★
()
Ответ на: комментарий от WRG

не по теме: «опыт - сын ошибок трудных», как говаривал еще товарищ Пушкин.

по теме: очевидную-невероятную магию с перестановкой опций GCC я че-то забыл проверить=). Ну я и брал Makefile от cj_heath.

aido ★★
() автор топика
Ответ на: комментарий от WRG

Встречный вопрос:

под ядро никогда не писал, но, видимо, время пришло: конфигурировать периферию под STM - дело ужасно муторное, поэтому, пришла в голову (не знаю, насколько светлая, но) идея: использовать make menuconfig для сборки недо-ядра. Недо-ядро - потому, что скорее оно будет похоже на статическую библиотеку (или объектный файл) с единственной функцией Init, которая будет нужна только для включения портов/USB/гироскопа и прочей шелухи+перенаправления сигналов с USB/пинов. Был вариант нечто подобное сделать на связке bison/flex/gcc, но зачем изобретать велосипед, когда есть ядро со всеми драйверами и удобным конфигуратором?

Про проект ucLinux уже слышал. Поиск портированных на STM32F3 решений результатов не дал, но, может быть, буду использовать его в качестве основы.

aido ★★
() автор топика
Ответ на: комментарий от aido

Linux на микроконтроллере это оверхэд. Он тебе никак не поможет проще настраивать порты, т.к. это не задача ОС. Но если все же хочешь ОС, чтоб не запариваться написанием автоматов на каждое действие, то глянь FreeRTOS.

WRG ★★★★
()
Ответ на: комментарий от WRG

да не ОС мне нужна, а простой удобный конфигуратор портов и устройств. Чтобы как в ядре - наставил галочек, скомпилил, и больше не выносить себе мозг с настройкой периферии. Счас вон ловлю баг в прошивке, смысл которой - принимать сигналы по USB, включать/выключать светодиод с номером, который пришел в сообщении. Вроде все просто (и под STM32F1 уже есть готовый проект), но там такая гора параметров в дескрипторах USB HID, + хостовое приложение реализовано на режущем глаза MFC... Но дескрипторы вроде уже норм работают - устройство определяется. А вот посылка/прием сообщений пока не взлетают - видимо намудрил с конечными точками. Как обычно, остается курить маны=)

aido ★★
() автор топика
Ответ на: комментарий от aido

да не ОС мне нужна, а простой удобный конфигуратор портов и устройств. Чтобы как в ядре - наставил галочек, скомпилил, и больше не выносить себе мозг с настройкой периферии.

Есть такое, ОС называется.

anonymous
()
Ответ на: комментарий от aido

простой удобный конфигуратор портов и устройств

попробуй вместо SPL использовать libopencm3, Eddy_Em говорил, что она не на столько упоротая, хотя сам я не пробовал.

WRG ★★★★
()
Ответ на: комментарий от WRG

А это уже очень полезная ссылка!

aido ★★
() автор топика
Ответ на: комментарий от WRG

От SPL сами STM'щики отказались и пилят теперь еще большее дерьмо — HAL + Qube.

Примеры Makefile'ов для opencm3 можно у меня в репах на гитхабе-сосфорже-битбакете-гитлабе найти (ir-controller и stm32samples).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от aido

Есть такое. Автор как-то просил потестить, но мне проще вручную Makefile накарябать, нежели разбираться с kmake.

Eddy_Em ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.