Sign in to follow this  
carlogulliani

Как Подключить Файлы В Makefile?

2 posts in this topic

Добрый день, подскажите, есть директория с проектом и библиотеками

структура директории

/---------------------
main.c
lib
|
|-------cmsis
|-------mylib
                |
                |--------led
                                |
                                |-------- led.h
                                |-------- led.c
|-------STM32F4xx_StdPeriph_Driver
build
Makefile

Как подключить папку led к линковщику

// led.h
#include <stdio.h>
#include "stm32f4xx.h"
void turnOn();
void turnOff();

// led.c
#include "led.h"
void turnOn()
{
GPIO_SetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
}
void turnOff()
{
GPIO_ResetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
}

// main.c
#include <stdio.h>
#include "stm32f4xx.h"
#include "led.h"
...
// init gpio
...
extern void turnOn();
extern void turnOff();
...
// init sys clock
...
int main(void) {
setSysTick();
while(1)
{
//check the push button
turnOn();
Delay(500);
turnOff();
}
return 0;
}

описание файла Makefile для линковщика и компилятора

# Makefile
# STM32F4-Discovery Makefile for Mac OSX

SRCS=$(wildcard *.c)

# Add assembly source files here or use $(wildcard *.s) for all .s files
S_SRCS = CortexM4asmOps.s


# Project name
PROJ_NAME = test
OUTPATH = build

OUTPATH := $(abspath $(OUTPATH))
BASEDIR := $(abspath ./)
MKDIR_P = mkdir -p


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

# Check for valid float argument
# NOTE that you have to run make clan after
# changing these as hardfloat and softfloat are not
# binary compatible
ifneq ($(FLOAT_TYPE), hard)
ifneq ($(FLOAT_TYPE), soft)
#override FLOAT_TYPE = hard
override FLOAT_TYPE = soft
endif
endif

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

AS=$(BINPATH)arm-none-eabi-as
CC=$(BINPATH)arm-none-eabi-gcc
LD=$(BINPATH)arm-none-eabi-gcc
OBJCOPY=$(BINPATH)arm-none-eabi-objcopy
OBJDUMP=$(BINPATH)arm-none-eabi-objdump
SIZE=$(BINPATH)arm-none-eabi-size

LINKER_SCRIPT = stm32_flash.ld

CPU = -mcpu=cortex-m4 -mthumb

CFLAGS = $(CPU) -c -std=gnu99 -g -O2 -Wall
LDFLAGS = $(CPU) -mlittle-endian -mthumb-interwork -nostartfiles -Wl,--gc-sections,-Map=$(OUTPATH)/$(PROJ_NAME).map,--cref --specs=nano.specs

ifeq ($(FLOAT_TYPE), hard)
CFLAGS += -fsingle-precision-constant -Wdouble-promotion
CFLAGS += -mfpu=fpv4-sp-d16 -mfloat-abi=hard
else
CFLAGS += -msoft-float
endif

# Default to STM32F40_41xxx if no device is passed
ifeq ($(DEVICE_DEF), )
DEVICE_DEF = STM32F40_41xxx
endif

CFLAGS += -D$(DEVICE_DEF)

vpath %.a lib
vpath %.c lib/mylib


# Includes
INCLUDE_PATHS = -I$(BASEDIR)/inc -I$(BASEDIR)/lib/cmsis/stm32f4xx -I$(BASEDIR)/lib/cmsis/include -I$(BASEDIR)
INCLUDE_PATHS += -I$(BASEDIR)/lib/Conf
INCLUDE_PATHS += -I$(BASEDIR)/lib/STM32F4xx_StdPeriph_Driver/inc

INCLUDE_PATHS += -I$(BASEDIR)/mylib/im
INCLUDE_PATHS += -I$(BASEDIR)/mylib/im/led

# Library paths
LIBPATHS = -L$(BASEDIR)/lib/STM32F4xx_StdPeriph_Driver

# Libraries to link
LIBS = -lstdperiph -lc -lgcc -lnosys

OBJS = $(SRCS:.c=.o)
OBJS += $(S_SRCS:.s=.o)

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

.PHONY: lib proj

all: dir lib proj
$(SIZE) $(OUTPATH)/$(PROJ_NAME).elf

lib:
$(MAKE) -C lib FLOAT_TYPE=$(FLOAT_TYPE) BINPATH=$(BINPATH) DEVICE_DEF=$(DEVICE_DEF) BASEDIR=$(BASEDIR)

proj: $(OUTPATH)/$(PROJ_NAME).elf

.s.o:
$(AS) $(CPU) -o $(addprefix $(OUTPATH)/, $@) $<

.c.o:
$(CC) $(CFLAGS) -std=gnu99 $(INCLUDE_PATHS) -o $(addprefix $(OUTPATH)/, $@) $<

$(OUTPATH)/$(PROJ_NAME).elf: $(OBJS)
$(LD) $(LDFLAGS) -T$(LINKER_SCRIPT) $(LIBPATHS) -o $@ $(addprefix $(OUTPATH)/, $^) $(LIBS) $(LD_SYS_LIBS)
$(OBJCOPY) -O ihex $(OUTPATH)/$(PROJ_NAME).elf $(OUTPATH)/$(PROJ_NAME).hex
$(OBJCOPY) -O binary $(OUTPATH)/$(PROJ_NAME).elf $(OUTPATH)/$(PROJ_NAME).bin
$(OBJDUMP) -S --disassemble $(OUTPATH)/$(PROJ_NAME).elf > $(OUTPATH)/$(PROJ_NAME).dis

dir:
$(MKDIR_P) $(OUTPATH)

clean:
rm -f $(OUTPATH)/*.o
rm -f $(OUTPATH)/$(PROJ_NAME).elf
rm -f $(OUTPATH)/$(PROJ_NAME).hex
rm -f $(OUTPATH)/$(PROJ_NAME).bin
rm -f $(OUTPATH)/$(PROJ_NAME).dis
rm -f $(OUTPATH)/$(PROJ_NAME).map
# Remove the following line if you don't want to clean the Libraries as well
$(MAKE) clean -C lib

flash:
st-flash write build/$(PROJ_NAME).bin 0x08000000

компилирую библиотеки

make lib
make[1]: `mylib' is up to date.

собираю бинарник

make

выдает ошибку

build/main.o: In function `main':
main.c:37: undefined reference to `turnOn'
main.c:39: undefined reference to `turnOff'
collect2: error: ld returned 1 exit status
make: *** [build/test.elf] Error 1

Если файлы из lib/mylib/led перенести в корень (на уровень, что и main.c), тогда все собирается хорошо

Пробовал также добавить

SRCS=$(wildcard lib/mylib/led/*.c)
ассемблер ругается что нет .o файла
Assembler messages:
Fatal error: can't create /lib/mylib/led/led.o: No such file or directory
make: *** [lib/mylib/led/led.o] Error 1

пытаюсь скомпилировать .o файл

gcc -g -o -c led.c

не может подтянуть другие хедеры

In file included from led.c:1:
./led.h:2:10: fatal error: 'stm32f4xx.h' file not found
#include "stm32f4xx.h"

Edited by carlogulliani

Share this post


Link to post
Share on other sites
snn_krs    58

В комплекте с MDK 5.15 есть описание команд линковщика, вот что там есть

--libpath=pathlist это для стандартных библиотек

--userlibpath=pathlist для пользовательских библиотек

похоже в секцию

# Library paths

LIBPATHS = -L$(BASEDIR)/lib/STM32F4xx_StdPeriph_Driver

надо добавить

userlibpath=pathlist по анологии с

LIBPATHS

Edited by snn_krs

Share this post


Link to post
Share on other sites

Your content will need to be approved by a moderator

Guest
You are commenting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoticons maximum are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Similar Content

    • By admin
      В ролике показано как скомпилировать и установить библиотеку OpenCV 4.1.0 на Raspberry Pi 3.
      Используйте промокод CXEMNET и получите скидку 10% в магазине https://www.seeedstudio.com/ при покупке от 150$!
      https://www.seeedstudio.com/category/Raspberry-pi-c-1010/Raspberry-Pi-3-Model-B--p-3037.html малинка
      https://www.seeedstudio.com/category/Raspberry-pi-c-1010/Raspberry-PI-VGA666-DPI-dtoverlays-Module.html модуль vga666
      https://www.seeedstudio.com/category/Raspberry-pi-c-1010/Raspberry-Pi-Camera-Module-V2-p-2800.html камера
      Команды из видео.
      Открыть настройки raspberry Pi: 
      sudo raspi-config
      Далее выбираем Advanced Options → Expand Filesystem. Перезагружаемся.

      Установка требуемых пакетов:
      sudo apt-get install cmake cmake-curses-gui libgtk2.0-dev
      sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libx264-dev libxvidcore-dev
      sudo apt-get install libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev
      sudo apt-get install gfortran libatlas-base-dev
      Увеличение размера файла подкачки. 
      sudo nano /etc/dphys-swapfile
      Находим строчку CONF_SWAPSIZE=100
      И увеличиваем число например до 1024.
      Перезапускаем службу.
      sudo /etc/init.d/dphys-swapfile stop
      sudo /etc/init.d/dphys-swapfile start
      Создаем папку opencv в домашнем каталоге и переходим в нее
      cd /home/pi
      mkdir opencv
      cd opencv
      Скачиваем архивы с исходниками с помощью утилиты wget
      wget https://github.com/opencv/opencv/archive/4.1.0.zip -O opencv_source.zip
      wget https://github.com/opencv/opencv_contrib/archive/4.1.0.zip -O opencv_contrib.zip
      Распаковываем архивы.
      unzip opencv_source.zip
      unzip opencv_contrib.zip
      И теперь можно их удалить
      rm opencv_source.zip
      rm opencv_contrib.zip
      Теперь переходим в папку opencv-4.1.0 и создаем в ней папку build
      cd opencv-4.1.0
      mkdir build
      cd build
      Настраиваем параметры сборки. Обратите внимание на путь до дополнительных модулей!
      cmake -D CMAKE_BUILD_TYPE=RELEASE \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D INSTALL_C_EXAMPLES=OFF \
      -D INSTALL_PYTHON_EXAMPLES=ON \
      -D OPENCV_EXTRA_MODULES_PATH=/home/pi/opencv/opencv_contrib-4.1.0/modules \
      -D BUILD_EXAMPLES=ON \
      -D BUILD_DOCS=ON \
      -D ENABLE_NEON=ON ..
      Компиляция в 1 поток
      make -j1

      Компиляция в 4 потока (только если у вас хорошее охлаждение малинки)
      make -j4

      Установка библиотеки
      sudo make install

      Настройка динамического связывания
      sudo ldconfig

      Проверка работоспособности библиотеки.
      python3
      import cv2
      cv2.__version__

      В результате, библиотека должна выдать номер версии, которую вы установили.
    • By rmatveev
      Вливаюсь в среду программирования MBED OS с платой STM32F429I-DISC1 и вот что заметил:
      1) Почему-то PWM у меня нормально заработал только на ножке PF_6. Я перебрал, конечно, не все порты, которые поддерживают работу с PWM, но другие, которые я попробовал, не заработали.
      2) Пытался сконфигурировать некоторые порты в качестве цифрового выходи и тоже фигушки. Нормально заработали только те, что подключены к зеленому и красному светодиодам (PG_13 и PG_14). На некоторых ножках был какой-то неведомый мне меандр, какие-то не захотели переходить в низкоомное состояние.

      В качестве базы я использовал код DISCO-F429ZI_LCDTS_demo (это из примеров по этой плате с работой ЖК индикатора и тачскрина).

      Что может быть не так? Может быть какие-нибудь библиотеки, подключаемые при работе тачскрина и/или дисплея занимают большую часть портов и не позволяют их использовать по усмотрению программиста? Или я еще что-то не понимаю в архитектуре ARM? (Сам я прихожу из AVR-ов)
    • Guest Александр
      By Guest Александр
      Добрый день
      Проблема с оценочной платой STM32F4-DISCOVERY в части работы USART
      суть вопроса
      по USART шлется и принимается блоки данных по 3 байта (в принципе сколько угодно) при этом если подключен USB разъем ST-LINKа то все работает должным образом (данные снуют туда сюда без проблем), но при отключении USB ST-LINKа данные из платы STM32F4-DISCOVERY идут а вот принимать данные плата отказывается (естественно подаю внешнее питание +5 вольт на одноименный контакт). Если кто сталкивался с подобной проблемой прошу хотя бы направить в сторону железа или софта.
      На плате STM32F4-DISCOVERY убраны перемычки SB11(T_NRST) и SB12(T_SWO) а так же отпаян резистор R68 (MCO). Плата при этом прошивается без проблем, и стартует при внешнем питании(не от USB ST-LINKа) тоже без каких то заморочек.
      код прикладывать на данный момент не вижу смысла там все просто, при чем при подключении USB ST-LINKа программа работает.
      Проект пишется на IARe, конфигурация формируется в STM32Cube.
      Заранее спасибо за ответ
    • By admin
      Честный обзор миникомпьютера OMEGA 2. Характеристики, подключение и работа с командной строкой. Отправляем твит и компилируем свое приложение прямо на миникомпьютере.
      Ссылка на миникомпьютер: https://www.indiegogo.com/projects/omega2-5-linux-computer-with-wi-fi-made-for-iot
      Ссылка на документацию: https://docs.onion.io/omega2-docs/
      Ссылка на opkg пакеты: http://repo.onion.io/omega2/
    • By Wishmaster
      Здравствуйте, подскажите, как можно получить 3.3В для питания МК STM32F4 от Li-Ion аккумулятора? Использовать какой-нибудь понижающий преобразователь? Если да, то какой? 
  • Сообщения

    • Я поясню, почему нет смысла спорить по статье в ссылке: - Для того, чтобы написать статью в негативном свете, нужно  доходчиво обьяснить  причину быстрого износа тех или иных узлов или деталей и аргументированно обьяснить, почему это произошло при эксплуатации на газу и почему этого не происходит на бензине.  И с этими обьяснениями сложно спорить  потому, что факты предьявляются простые и всем понятные -  раньше присутствовала смазка за счет несгоревших смол, а теперь ее нет итд.  Но все эти износы и прогары на практике не происходят и ходят детали в полтора-два раза дольше.  Поэтому спор будет не о том, что клапан не смазывается, а о том, чтобы такой пострадавший от газа клапан был вообще в природе. И зазоры не уходят. На вазах нет компенсаторов и поэтому ответственные люди приезжают на регламентные работы строго по пробегу, а им говорят, чтобы еще столько же поездили, тогда и можно будет подрегулировать и масло поменять(полтора-двойной пробег). Свечи еще гораздо реже менялись. Про экономию бензина нет смысла говорить. Если кто спросит, а какие все-таки недостатки у газа, ведь без них ничего не бывает, то скажу, что это запах (для некоторых, мне пофиг), немногочисленность заправок  и невозможно с собой в канистре взять. Но у меня одним разьемом подключался второй баллон. Зимой его не снимал для загрузки задней оси.  В день проезжал 65-70 км на работу, заправки хватало на месяц.
    • Кому такая дурь известна? Если только в палате номер 6? АМ имеет плохую помехозащищённость, если в радиовещании  -  соглашусь. Но в остальном полнейшая ересь.    Осциллограммы где?? Что что то там "звучит" это никому не интересно. Где осциллограммы? И тупить не надо. Цитатами и вырезками решил стрелки перевести. ОСЦИЛЛОГРАММЫ ДАВАЙ!
    • Нормальные. Сюда пойдут. Почти похожи на мотороллы MJ15003 - понизкочастотнее, но крепкие. Всем кажется, что так лучше. Но это не факт. При однополярке не нужна защита АС от постоянки на выходе например. В этой схеме уже есть стабилизатор. А выходной каскад не так чуствивтелен к пульсациям.
    • Аллилуйя!
      Идите...... и не грешите больше!

      А мы, сирые , уж как нибудь.
    • Ничего такого в моем ЧМ-демодуляторе нет. АМ не пригодна для качественного звука-это всем известно. кроме некоторых отвязавшихся.. У меня уже все изготовлено и отлично работает. Седни слушал и сравнивал с SONY ST-SA5ES который с ФАПЧ, ну... на уровне оба. Записал семплов и еще запишу. Sony дает отличное разделение каналов и там хитро...ная микруха CXA1064 с пьезорезонатором. Запишу видео и звук подклею. А то на эту сони нормальных видосов нет. Не позорился бы со своими АМ-детекторами, когда космические корабли бороздят...эфир.    
    • Нахожусь в процессе изучения темы... Тяжело с самого начала "въехать". Видимо первая страница на самом деле не самая первая, уже на ней ссылаются на какую-то версию 4.42... Ну и видимо первые страниц 10 хорошо пропололи.. непонятные ссылки, какие-то скачки.. но неудивительно, сколько лет прошло.. Что понял из пока прочитанного: защита от обрыва - излишество. Событие шибко редкое, таких событий (приводящих к подъему напряжения) может быть много, от всех не перестрахуешься. Тем более обрыв вот прямо в процессе... А в остальных случаях по вольтметру сразу видно. Так что себе ее точно делать не буду. Далее. Светодиоды в управлении... Думаю это неправильно. Всего пара транзисторов добавляется и исчезают проблемы. Кроме риска выхода из строя самих светодиодов (и как следствие подъем напряжения) имеем разную их яркость (особенно если они разного цвета и даже марки). Так что для себя выбрал вариант без светодиодов в управлении. Далее. Термозащита.. Считаю ее не должно быть в составе платы управления. Есть много вариантов реализации, к тому же система управления кулером все равно обязательно будет, вот она-же будет заодно выполнять функцию  термозащиты. Это сервисная функция и нечего ей делать в составе управления. Но возможность ее подключения должна быть. В связи с наличием тумблера оперативного отключения (считаю это нужно) появилась мысль... Не силен я в этих вещах, поэтому попробую по деревенски изложить, авось поймете. Ввести в схему некий элемент (реле, тиристор, оптрон или та-же ТЛка) назовем его Х, который при внешнем сигнале будет отключать силовую часть (так как сейчас действовать будет добавленная кнопка отключения.) А вот включение этого элемента через развязывающие диоды может происходить от разных сигналов. Сейчас одна Тлка управляется термозащитой, другая - тумблером отключения, третья защитой и все они ведут к одному действию - отключению силовой части. так вот пускай это будет один элемент (Х) управляемый разными сигналами. Тогда систему термозащиты можно делать какую угодно (отдельно) и ее сигнал будет приходить на Х, отключая блок. К этому-же элементу Х через свой диод подключен тумблер отключения. На него-же может приходить сигнал от любого другого устройства (хоть от часов, хоть от датчика фазы луны) и все они через этот элемент будут приводить к одному действию - отключению. Да хоть фотодатчик подключить и блок будет включаться утром и отключаться вечером. Примерно так когда-то  мы проектировали системы аварийных блокировок для спецтехники, когда разные события приводят к одному результату. Или это глупости и не стоит усложнять схему? Это просто мысль вслух, лирическое отступление, не более. Возникающие вопросы пока записываю, если не найду ответов, буду спрашивать. Пока неясен момент с радиаторами для 7815 и транзистора опорного. Какие там токи? Нужен реальный радиатор или достаточно куска пластины. Почти на всех схемах написано "U3 - защита входа", но пока нигде не нашел пояснения защита чего, от чего и как работает. Видимо описание поэлементно когда-то было, но осталось где-то в предисловии, которое не попало сюда. И еще: если светодиоды не в управлении, а они питаются от генератора тока - то выходит нет возможности регулировать по отдельности яркость каждого? Даже если резистор последовательно поставить, то ток все равно будет тот-же. А если светодиоды разные?  Ну например один сверхяркий 3мм красный, а другой например простой 10 мм зеленый - естественно яркость будет разная). Или их нужно одинаковые ставить? А если один из них будет моргающий? Может в их питании нужен не генератор тока, а стаб напряжения? Тогда можно последовательно с каждым ставить свой резистор, тем самым изменяя яркость? В любом случае большое спасибо Владимиру, автору этой весьма удачной конструкции, который поддерживает тему уже много  много лет...
    • Я знаю, что такое правильный УНЧ, а вот вы и близко не знаете. Если УНЧ начинает вносить искажения в звук - это гамно, а не УНЧ, и место ему на помойке. Единственный случай, когда такой УНЧ имеет право на жизнь - это когда кривизна звука УНЧ компенсирует кривизну звука АС.   Ну да. Есть нормальные люди, которые слушают музыку, а есть не совсем нормальные, которые слушают искажения УНЧ. Лично у меня собран JLH, который имеет линейную АЧХ во всем диапазоне (смотрел лично практически от нуля и 20КГц). И он дает шикарный, собраный низ, высокую детализацию, хорошую сцену. И при этом всем имеет высокую верность воспроизведения, чего не скажешь ни о лампах, ни о германии. Еще раз повторюсь, УНЧ должен УСИЛИВАТЬ, а не звучать. "Звучание" УНЧ замашки аудиофилов, не более.