Название: [РЕШЕНО]Qt Creator + stm32
Отправлено: Larry от Февраль 16, 2017, 09:52
Добрый день, форумчане. Возникли вопросы по скрещиванию Qt Creator и stm32. Взял пример с хабра: https://habrahabr.ru/post/222877/ (https://habrahabr.ru/post/222877/) Проект собрался, но файл .elf вышел ~475kb ??? Кроме того постоянно выдает warning "Property 'linkerScripts' is not declared"...Куда он делся из модуля cpp? Помогите пожалуйста разобраться. Хотелось бы заменить IDE на Qt Creator для работы с микроконтроллерами, т.к. после креатора остальные IDE не камильфо. Спасибо.
Название: Re: Qt Creator + stm32
Отправлено: kuzulis от Февраль 16, 2017, 12:02
но файл .elf вышел ~475kb И что? Вы думаете что к этому причастен Qt Creator? Я вот думаю, что это не так, смотрите опции линковки и компиляции. Куда он делся из модуля cpp? Вроде никуда не девался.
Название: Re: Qt Creator + stm32
Отправлено: Larry от Февраль 16, 2017, 12:11
Куда он делся из модуля cpp? Вроде никуда не девался. Тогда почему появляется предупреждение, что не найдено это свойство? опции вот: cpp.commonCompilerFlags: [ "-mcpu=cortex-m4", "-mthumb", "-mfpu=fpv4-sp-d16", "-mfloat-abi=softfp" ] cpp.linkerFlags: [ "-mcpu=cortex-m4", "-mthumb", "-mfpu=fpv4-sp-d16", "-mfloat-abi=softfp", ]
Название: Re: Qt Creator + stm32
Отправлено: Larry от Февраль 16, 2017, 16:07
Проверил .elf в CooCox и Embitz, то действительно файл выходит больших размеров - значит это норма. Собрал свой проект с qbs - зажигаю сегмент семисегментника, но в линковке выкидывает ошибки: In function `zero_loop': <artificial>:(.text+0x4e0): undefined reference to `_sidata' <artificial>:(.text+0x4e4): undefined reference to `_sdata' <artificial>:(.text+0x4e8): undefined reference to `_edata' In function `Default_Handler': <artificial>:(.text+0x4f4): undefined reference to `_sbss' <artificial>:(.text+0x4f8): undefined reference to `_ebss' Проверил в стартап объявлены...Что может быть? Вот qbs: import qbs
Project { name: "qbs"
Product { type: "application" Depends { name: "cpp" }
cpp.executableSuffix: ".elf" cpp.defines: "STM32F10X_LD_VL" cpp.positionIndependentCode: false cpp.debugInformation: true cpp.commonCompilerFlags: [ "-mthumb", "-mcpu=cortex-m3", "-msoft-float", "-mfpu=vfp", "-O0", "-fdata-sections", "-ffunction-sections", "-fno-inline", // "-std=c++11", "-flto" ]
cpp.linkerFlags: [ "-flto", "-mthumb", "-mcpu=cortex-m3", "-msoft-float", "-mfpu=vfp", "-specs=nano.specs", "-Wl,--start-group", "-T" + path + "/src/linker/stm32f100c4_flash.ld", "-lnosys", "-lc", "-lstdc++", "-lm" ]
cpp.includePaths: [ "src", "src/cmsis", "src/inc", "src/linker", "src/startup" ]
files: [ "*.cpp", "src/cmsis/*.c", "src/cmsis/*.h", "src/inc/*.c", "src/inc/*.h", "src/startup/*.c" ]
Properties { condition: qbs.buildVariant === "debug" cpp.defines: outer.concat(["DEBUG=1"]) }
Group { qbs.install: true fileTagsFilter: "application" } } }
Название: Re: Qt Creator + stm32
Отправлено: kuzulis от Февраль 16, 2017, 18:19
Тогда почему появляется предупреждение, что не найдено это свойство? Теперь оно называется по-другому (см. linkerscript (http://doc.qt.io/qbs/cpp-module.html))Ах, не, кажется, теперь просто можно указывать ld скрипты как обычные файлы в списке (как исходники, заголовочные и прочее). UPD: Или все-таки указывать теги скриптов явно Group { name: "linker scripts" files: ["linkerscript1", "linkerscript2"] fileTags: ["linkerscript"] }
см. сорцы QBS: qbs\tests\auto\blackbox\testdata\linkerscripts\
Название: Re: Qt Creator + stm32
Отправлено: Larry от Февраль 16, 2017, 18:33
Спасибо большое. .elf теперь собирается. Перегнал его в .hex, но пока не заработала прошивка :)...буду дальше разбираться.
Название: Re: Qt Creator + stm32
Отправлено: Larry от Февраль 17, 2017, 15:06
Так и не получил рабочую прошивку... Собрал в EmBitz, то все работает (загорается сегмент семисегментника). Размер прошивки ~4kb. Собрал в Qt Creator, то размер прошивки 9kb, но после заливки не хочет работать. GDB пока не прикрутил, поэтому посмотреть, где затык не могу. Вложил проект...может есть ли у кого возможность проверить у себя :) Спасибо.
P.S.: грешу все на тот же файл линковки..
Название: Re: Qt Creator + stm32
Отправлено: Larry от Февраль 18, 2017, 09:02
Скачал проект для микроконтроллеров Миландра, то все собралось без проблем...не было ошибок и предупреждений... По тому же скрипту (там как раз cortex-m3) собираю для stm32 и получаю кучу ошибок (вчера самостоятельно писал по мануалам qbs без использования модуля срр и получал те же ошибки) ???. Уже не знаю куда копать...перечитал уже все статьи по этой теме (у всех получается) и использую их скрипты переделанные под свою структуру проекта и постоянно, то прошивка не работает в камне, либо ошибки... Вот qbs-скрипт (без использования модуля срр): import qbs Project { name: "simple" Product { name: "micro" type: "hex" Group { name: "sources" files: ["*.c", "*.h", "*.S"] fileTags: ['c'] } Rule { inputs: ["c"] Artifact { fileTags: ['obj'] filePath: input.fileName + '.o' } prepare: { var args = []; args.push("-mcpu=cortex-m3") args.push("-mthumb") args.push("-g") args.push("-ffunction-sections") args.push("-O0") args.push("-Wall") args.push("-Wunused") args.push("-DM3") args.push('-c'); args.push(input.filePath); args.push('-o'); args.push(output.filePath); var compilerPath = "c:/development/gcc-arm/bin/arm-none-eabi-gcc.exe" var cmd = new Command(compilerPath, args); cmd.description = 'compiling ' + input.fileName; cmd.highlight = 'compiler'; cmd.silent = false; return cmd; } } Rule{ multiplex: true inputs: ['obj'] Artifact{ fileTags:['elf'] filePath: project.name + '.elf' } prepare:{ var args = [] args.push("-mcpu=cortex-m3") args.push("-mthumb") args.push("-g") args.push("-nostartfiles") args.push("-O0") args.push("-Wl,--gc-sections") for(i in inputs['obj']) args.push(inputs["obj"][i].filePath); args.push("-Td:/work/workspace/uc/qbs_c/stm32f10x_flash.ld") args.push('-o'); args.push(output.filePath); var compilerPath = "c:/development/gcc-arm/bin/arm-none-eabi-gcc.exe" var cmd = new Command(compilerPath,args); cmd.description = "linking"+project.name return cmd; } } Rule{ inputs: ['elf'] Artifact{ fileTags:['hex'] filePath: project.name + '.hex' } prepare:{ var args = [] args.push("-O") args.push("ihex") args.push(input.filePath) args.push(output.filePath) var hexcreator = "c:/development/gcc-arm/bin/arm-none-eabi-objcopy.exe" var cmd = new Command(hexcreator,args); cmd.description = 'create_hex'+project.name return cmd; } } } } Ошибки которые вылазят: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'void' __attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void) error: expected '=', ',', ';', 'asm' or '__attribute__' before 'void' __attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void) error: unknown type name '__STATIC_INLINE' __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CONTROL(void) и в том же роде
Название: Re: Qt Creator + stm32
Отправлено: GraninDm от Февраль 18, 2017, 10:24
А вот тут не смотрели https://habrahabr.ru/post/258467/ (https://habrahabr.ru/post/258467/) Я по этой статье пытался на днях сделать компиляцию для ардуино. Пока тоже не получилось. Валятся ошибки... И еще, как вариант Вот для того inputs: ['elf'] Artifact{ fileTags:['hex'] filePath: project.name + '.hex' }
Наверное лучше использовать Transformer, а не Rule Цитата Transformer предназначен для срабатывания только на один фаил, с заранее определенным именем. Например, прошивальщик или какой-нибудь хитрый скрипт.
Название: Re: Qt Creator + stm32
Отправлено: Larry от Февраль 18, 2017, 10:37
Да по этому тоже смотрел и делал :) Можно попробовать и через Trasformer, но думаю не в этом дело, но как вариант. Если использовать модуль срр, то все собирается, но в камне не работает.
Название: Re: Qt Creator + stm32
Отправлено: Larry от Февраль 18, 2017, 11:32
подключил отладчик, но при запуске зависает на строке .long TIM1_UP_TIM16_IRQHandler // TIM1 Update and TIM16 в стартапе, и просто висит
Название: Re: Qt Creator + stm32
Отправлено: kuzulis от Февраль 18, 2017, 17:32
У меня вообще не получилось сейчас запустить отладку, используя QtCreator с OpenOCD в режимах Startup Mode или "PIPE" или "TCP/IP". Работает только отладка если ручками запустить OpenOCD сервер, а Startup Mode установить в "None".
Что-то опять поломали :-[.. Никто это не тестит, т.к. никому не нужно Bare Metal, поэтому и возникают такие плюхи.
PS: Я пробовал проект https://github.com/alekseysidorov/te-stm32f407-qbs-template
Название: Re: Qt Creator + stm32
Отправлено: Larry от Февраль 18, 2017, 19:54
Видать поломали, т.к. где-то читал, что всплывали такие же ошибки как у меня в новых версиях. Хотя собирал один из примеров, но для микроконтроллера Миландр, то собрался вообще без проблем. Я сейчас читаю доки по qbs, может че-нить вычитаю ;D Есть еще предположение: я использую С++. Может в этом проблема?! Буду пробовать, т.к. Qt Creator мне очень удобен.
Название: Re: Qt Creator + stm32
Отправлено: 987654 от Февраль 19, 2017, 15:28
Приветствую. У меня платка l1, однако возможно вам помочь получится. как вариант 1) сдувайте прокат libopencm3 + libopencm3 examples компилятором прогоняйте и то и другое. Затем в папке с нужным вам тестовым бинарником делайте arm-none-eabi-objcopy -Obinary name.elf name.bin Как вариант можно сразу запустить построение бинарников с "make bin" для примеров 2) Есть такой проект "stm32l152-discovery-qbs-cubemx-master" В qbs нужно будет заменить строку // cpp.linkerScripts: [
// //"../TrueSTUDIO/F1032/libs.ld", // ]
#на строку Group { name: "linker scripts" files: ["../STM32L152RB_FLASH.ld",] fileTags: ["linkerscript"] } а итоговый выходной файл так же прогнать через arm-none-eabi-objcopy Может быть второй вариант потребует небольшие переделки от вас. 3) Тот которым работал изначально - это использовать 1 вариант + редактирование проекта в папке с примерами ( то есть в libopencm3 examples ) + ручные параметры сборки ( shell скрипт )
Название: Re: Qt Creator + stm32
Отправлено: Larry от Февраль 19, 2017, 16:31
Спасибо большое. Гляну, может что и получится.
Название: Re: Qt Creator + stm32
Отправлено: kuzulis от Февраль 19, 2017, 16:48
Я представил патч для криэйтора, исправляющий запуск OpenOCD в Windows в режиме TCP/IP: https://bugreports.qt.io/browse/QTCREATORBUG-17765 У меня вроде работает, но посмотрим что скажут.
UPD: О, и режим PIPE заработал, см. QTCREATORBUG-17765
Название: Re: Qt Creator + stm32
Отправлено: Larry от Февраль 19, 2017, 16:53
Спасибо большое за информацию.
Название: Re: Qt Creator + stm32
Отправлено: GraninDm от Февраль 21, 2017, 09:52
Подскажите, почему у меня такое происходит Взял за основу проект выше import qbs Project { name: "simple" Product { name: "micro" type: "obj" Group { name: "sources" files: ["*.c", "*.h", "*.S"] fileTags: ['c'] } Rule { inputs: ["c"] Artifact { fileTags: ['obj'] filePath: input.fileName + '.o' } prepare: { var args = []; args.push("-g") args.push("-Os") args.push("-w") args.push("-fno-exceptions") args.push("-ffunction-sections") args.push("-fdata-sections") args.push("-MMD") args.push("-mmcu=atmega328p") args.push("-DF_CPU=16000000L") args.push("-DARDUINO=152") args.push("-IC:/Programs/arduino/hardware/arduino/avr/cores/arduino") args.push("-IC:/Programs/arduino/hardware/arduino/avr/variants/standard") args.push("-c") args.push(input.fileName) args.push("-o") args.push(input.fileName + ".o") var compilerPath = "C:/Programs/arduino/hardware/tools/avr/bin/avr-g++.exe" var cmd = new Command(compilerPath, args); cmd.description = 'compiling ' + input.fileName; cmd.highlight = 'compiler'; cmd.silent = false; return cmd; } } } } Получаю compiling main.c C:/Programs/arduino/hardware/tools/avr/bin/avr-g++.exe -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -MMD "-mmcu=atmega328p" "-DF_CPU=16000000L" "-DARDUINO=152" -IC:/Programs/arduino/hardware/arduino/avr/cores/arduino -IC:/Programs/arduino/hardware/arduino/avr/variants/standard -c main.c -o main.c.o avr-g++.exe: main.c: No such file or directory avr-g++.exe: no input files Почему входных файлов нет? Файл main.c в командную строку подставляется, в проекте присутствует, в директории проекта есть. Что не так?
Название: Re: Qt Creator + stm32
Отправлено: Larry от Февраль 21, 2017, 21:01
А где у Вас путь к исходникам? Добавьте в группу prefix Group { name: "sources" prefix: "src/**/" // или где там у Вас расположены исходники files: ["*.c", "*.h", "*.S"] fileTags: ['c'] }
Название: Re: Qt Creator + stm32
Отправлено: GraninDm от Февраль 22, 2017, 09:35
Сегодня почему-то заработало. Хотя ничего не менял. Видимо, пока экспериментировал вчера у Creator текущий путь сбился.
Название: Re: Qt Creator + stm32
Отправлено: Larry от Февраль 22, 2017, 13:47
Только объектные файлы скомпилились? Или Вы добавляли правила и на создание .elf?
Вопрос: я использую компилятор arm-none-eabi-g++ для всех файлов, все компилирутся...может это не правильно и ядро core_cm3 и system_<device> надо компилить gcc?
Название: Re: Qt Creator + stm32
Отправлено: GraninDm от Февраль 22, 2017, 14:59
Только один obj Я посмотрел как avr собирается... Что-то грустно стало.
Правда сейчас можно стало arduino.exe c параметрами запускать. Экзешник сам все сделает и зальет в плату если нужно. Единственное - у меня не получилось, чтобы он консоль процесс сборки выводил. Вроде есть парамерт --verbose-build, но он ничего в консоль не выводит.
Название: Re: Qt Creator + stm32
Отправлено: Larry от Февраль 22, 2017, 20:24
а у меня до сих пор никак не получается сладить с линкером...кучу ошибок выдает...
Название: Re: Qt Creator + stm32
Отправлено: Larry от Февраль 23, 2017, 23:11
Переписал все заново без использования cpp-модуля, и сделал раздельную компиляцию для исходников си, c++ и asm. Все компилится, но собрать с помощью линкера arm-none-eabi-ld, делал через arm-none-eabi-gcc...при заливке в камень, снова молчит...уже не знаю куда копать...пните пожалуйста в нужном направлении... import qbs
Project { name: "stm32"
Product { type: ["hex", "bin"]
property string c_compilerPath: "c:/development/gcc-arm/bin/arm-none-eabi-gcc.exe" property string cpp_compilerPath: "c:/development/gcc-arm/bin/arm-none-eabi-g++.exe" property string asm_compilerPath: "c:/development/gcc-arm/bin/arm-none-eabi-as.exe" property string linkerPath: "c:/development/gcc-arm/bin/arm-none-eabi-ld.exe" property string objcpyPath: "c:/development/gcc-arm/bin/arm-none-eabi-objcopy.exe"
Group { name: "source_cpp" prefix: "./" files: ["*.cpp"] fileTags: ["cpp"] }
Group { name: "source_c" prefix: "./" files: ["*.c"] fileTags: ["c"] }
Group { name: "source_asm" prefix: "./" files: ["*.s"] fileTags: ["asm"] }
Rule { inputs: ["cpp"]
Artifact { filePath: project.path + "/.obj/" + input.fileName + ".o" fileTags: ["obj"] }
prepare: { var args = [];
args.push("-mcpu=cortex-m3"); args.push("-mthumb"); args.push("-O0"); args.push("--specs=nosys.specs"); args.push("-finline-functions"); args.push("-ffunction-sections"); args.push("-fdata-sections"); args.push("-fno-exceptions"); args.push("-fno-unwind-tables"); args.push("-fno-asynchronous-unwind-tables"); args.push("-c"); args.push("-DSTM32F10X_LD_VL"); args.push(project.path + "/" + input.fileName); args.push("-o"); args.push(project.path + "/.obj/" + output.fileName);
var cmd = new Command(product.cpp_compilerPath, args);
cmd.description = "compiling: " + input.fileName; cmd.highlight = "compiler"; cmd.silent = false;
return cmd; } }
Rule { inputs: ["c"]
Artifact { filePath: project.path + "/.obj/" + input.fileName + ".o" fileTags: ["obj"] }
prepare: { var args = [];
args.push("-mcpu=cortex-m3"); args.push("-mthumb"); args.push("-O0"); args.push("--specs=nosys.specs"); args.push("-finline-functions"); args.push("-ffunction-sections"); args.push("-fdata-sections"); args.push("-fno-exceptions"); args.push("-fno-unwind-tables"); args.push("-fno-asynchronous-unwind-tables"); args.push("-c"); args.push("-DSTM32F10X_LD_VL"); args.push(project.path + "/" + input.fileName); args.push("-o"); args.push(project.path + "/.obj/" + output.fileName);
var cmd = new Command(product.c_compilerPath, args);
cmd.description = "compiling: " + input.fileName; cmd.highlight = "compiler"; cmd.silent = false;
return cmd; } }
Rule { inputs: ["asm"]
Artifact { filePath: project.path + "/.obj/" + input.fileName + ".o" fileTags: ["obj"] }
prepare: { var args = [];
args.push("-mcpu=cortex-m3"); args.push("-mthumb"); args.push("-c"); args.push(project.path + "/" + input.fileName); args.push("-o"); args.push(project.path + "/.obj/" + output.fileName);
var cmd = new Command(product.asm_compilerPath, args);
cmd.description = "compiling: " + input.fileName; cmd.highlight = "compiler"; cmd.silent = false;
return cmd; } }
Rule { multiplex: true inputs: ["obj"]
Artifact { filePath: project.path + "/bin/" + project.name + ".elf"; fileTags: ["elf"] }
prepare: { var args = [];
args.push("-mcpu=cortex-m3"); args.push("-mthumb"); args.push("--specs=nosys.specs"); args.push("-finline-functions"); args.push("-ffunction-sections"); args.push("-fdata-sections"); args.push("-nostartfiles"); args.push("-fno-exceptions"); args.push("-fno-unwind-tables"); args.push("-fno-asynchronous-unwind-tables"); args.push("-T" + project.path + "/" + "stm32f10x_flash.ld");
for(i in inputs["obj"]) args.push(inputs["obj"][i].filePath);
args.push("-o"); args.push(output.filePath);
var cmd = new Command(product.c_compilerPath, args);
cmd.description = "linking project: " + project.name; cmd.highlight = "linker"; cmd.silent = false;
return cmd; } }
Rule { inputs: ["elf"]
Artifact { filePath: project.path + "/bin/" + project.name + ".hex"; fileTags: ["hex"] }
prepare: { var args = [];
args.push("-O"); args.push("ihex"); args.push(input.filePath); args.push(output.filePath);
var cmd = new Command(product.objcpyPath, args);
cmd.description = "convert to hex"; cmd.highlight = "codegen"; cmd.silent = false;
return cmd; } }
Rule { inputs: ["elf"]
Artifact { filePath: project.path + "/bin/" + project.name + ".bin"; fileTags: ["bin"] }
prepare: { var args = [];
args.push("-O"); args.push("binary"); args.push(input.filePath); args.push(output.filePath);
var cmd = new Command(product.objcpyPath, args);
cmd.description = "convert to bin"; cmd.highlight = "codegen"; cmd.silent = false;
return cmd; } } } }
Название: Re: Qt Creator + stm32
Отправлено: 987654 от Февраль 26, 2017, 01:16
Приветствую! Молчание камня достаточно часто происходило. Думается мне что проблема в ликере и в том что он цепляет. У меня сейчас есть исправленный qbs ( за основу взяты проекты местных умельцев ). выходной бинарник полностью работоспособный Вам нужно поправить мои флаги архитектуры на свои, вот на эти FP_FLAGS ?= -mfloat-abi=hard -mfpu=fpv4-sp-d16 ARCH_FLAGS = -mthumb -mcpu=cortex-m4 $(FP_FLAGS) и заменить путь к скрипту, на путь к stm32f4-discovery.ld. я так думаю что после этого должно взлететь. Ниже то что у меня работает с stm32l152. Комменты откуда взят флаг приложил import qbs import qbs.Environment
Project { CppApplication { Depends { name: "cpp" }
// Взято с форума type: "bin" name: "firmware"
property string workDirectory: Environment.getEnv("FIRMWARES_WORKDIR") property string hexExtractor: cpp.toolchainInstallPath + "/" + cpp.toolchainPrefix + "objcopy";
cpp.cxxFlags: [ "-std=c++11", "-msoft-float", // берется из рутовой папки примеров из ( Makefile.include ) libopencm3/examples/stm32/l1/ "-mthumb", // берется из рутовой папки примеров из ( Makefile.include ) libopencm3/examples/stm32/l1/ "-mcpu=cortex-m3", // берется из рутовой папки примеров из ( Makefile.include ) libopencm3/examples/stm32/l1/ "-mfix-cortex-m3-ldrd", // берется из рутовой папки примеров из ( Makefile.include ) libopencm3/examples/stm32/l1/ "-extra", // главный Makefile в корне libopencm3 "-shadow", // главный Makefile в корне libopencm3 "-implicit-function-declaration", // главный Makefile в корне libopencm3 "-redundant-decls", // главный Makefile в корне libopencm3 "-missing-prototypes", // главный Makefile в корне libopencm3 "-strict-prototypes", // главный Makefile в корне libopencm3 "-fno-common", // главный Makefile в корне libopencm3 "-ffunction-sections", // главный Makefile в корне libopencm3 "-fdata-sections",] // главный Makefile в корне libopencm3
cpp.cFlags: [ "-std=gnu99", "-msoft-float", // берется из рутовой папки примеров из ( Makefile.include ) libopencm3/examples/stm32/l1/ "-mthumb", // берется из рутовой папки примеров из ( Makefile.include ) libopencm3/examples/stm32/l1/ "-mcpu=cortex-m3", // берется из рутовой папки примеров из ( Makefile.include ) libopencm3/examples/stm32/l1/ "-mfix-cortex-m3-ldrd", // берется из рутовой папки примеров из ( Makefile.include ) libopencm3/examples/stm32/l1/ "-extra", // главный Makefile в корне libopencm3 "-effc++", // главный Makefile в корне libopencm3 "-fno-common", // главный Makefile в корне libopencm3 "-ffunction-sections", // главный Makefile в корне libopencm3 "-fdata-sections" ] // главный Makefile в корне libopencm3 cpp.warningLevel: "all" cpp.linkerFlags: [ "-msoft-float", // берется из рутовой папки примеров из ( Makefile.include ) libopencm3/examples/stm32/l1/ "-mthumb", // берется из рутовой папки примеров из ( Makefile.include ) libopencm3/examples/stm32/l1/ "-mcpu=cortex-m3", // берется из рутовой папки примеров из ( Makefile.include ) libopencm3/examples/stm32/l1/ "-mfix-cortex-m3-ldrd", // берется из рутовой папки примеров из ( Makefile.include ) libopencm3/examples/stm32/l1/ "-lc", // главный Makefile в корне libopencm3 "-lgcc", // главный Makefile в корне libopencm3 "-lnosys", // главный Makefile в корне libopencm3 "-static", // главный Makefile в корне libopencm3 "-nostartfiles" // главный Makefile в корне libopencm3 ]
cpp.includePaths: [ "../libopencm3/libopencm3/include/", ]
cpp.libraryPaths: [ "../libopencm3/libopencm3/lib/", ]
cpp.staticLibraries: [ "opencm3_stm32l1", "c", "gcc", "nosys" ]
Group { name: "linker scripts" files: ["../libopencm3/libopencm3/lib/stm32/l1/stm32l15xxb.ld" ] // Берется из make файла в любом живом примере из libopencm3/examples/stm32/l1/stm32l-discovery/lcd-display/ fileTags: ["linkerscript"] }
cpp.defines: [ "STM32L1" ]
Group { name: "src" files: [ "src/*.c", "src/*.cpp", "src/*.h" ] }
Group { qbs.install: true fileTagsFilter: ["application", "bin"] }
Rule { id: hex inputs: ["application"] Artifact { fileTags: ['bin'] filePath: product.name + '.bin' } prepare: { var args = []; args.push("-j") args.push(".text") args.push("-j") args.push(".data") args.push("-O") args.push("binary") args.push(input.filePath); args.push(output.filePath); var extractorPath = product.hexExtractor; var cmd = new Command(extractorPath, args); return cmd; } } } }
Название: Re: Qt Creator + stm32
Отправлено: alex312 от Февраль 26, 2017, 11:54
Приветствую! Молчание камня достаточно часто происходило. Думается мне что проблема в ликере и в том что он цепляет. У меня сейчас есть исправленный qbs ( за основу взяты проекты местных умельцев ). выходной бинарник полностью работоспособный
Советую обратить внимание на следующие свойства модуля cpp для уменьшения дублирования: driverFlags commonCompilerFlags Пример: ... cpp.commonCompilerFlags: ["-fdata-sections","-ffunction-sections", "-flto"] cpp.driverFlags:["-mthumb", "-mcpu=cortex-m4","-mfloat-abi=hard","-mfpu=fpv4-sp-d16"]
Р.S. И в опциях линкера у вас не хватает --gc-sections
Название: Re: Qt Creator + stm32
Отправлено: Larry от Февраль 26, 2017, 14:33
Да, спасибо, учту. Уже все работает, затык был в линкер-скрипте...брал из разных источников :), но добрые люди подсказали, теперь компилится и работает в железе нормально. Как причешу скрипт, то здесь помещу, чтобы самому не забыть :).
Название: Re: Qt Creator + stm32
Отправлено: Larry от Февраль 26, 2017, 15:05
А подскажите, кто знает, как в Qt creator сделать так, чтобы не было большого количества каталогов...типа такого: \Debug\qtc_stm32f1x_02ef0d3e-debug\stm32.qtc-stm32f1x-02ef0d3e.956871f1\ Неудобно очень. Спасибо.
Название: Re: Qt Creator + stm32
Отправлено: 987654 от Февраль 26, 2017, 20:34
...
Спасибо! qbs впервые вижу =)
Название: Re: Qt Creator + stm32
Отправлено: Larry от Февраль 27, 2017, 22:24
Как и собирался, выкладываю qbs-скрипт. Bin не генерил, только hex...и сразу заливает прошивку...Это так, чтобы самому не забыть :) Единственное, что не нравится, то после прошивки выскакивает ошибка target state: halted, так и не понял почему... import qbs
Product { type: ["application", "flash"] Depends { name: "cpp" }
cpp.defines: ["STM32F10X_LD_VL"] cpp.positionIndependentCode: false cpp.enableExceptions: false cpp.executableSuffix: ".elf" cpp.driverFlags: [ "-mthumb", "-mcpu=cortex-m3", "-mfloat-abi=soft", "-fno-strict-aliasing", "-g3", "-Wall", "-mfpu=vfp", "-O0", "-flto", ]
cpp.commonCompilerFlags: [ "-fdata-sections", "-ffunction-sections", "-fno-inline", "-std=c++11", "-flto" ]
cpp.linkerFlags: [ "--specs=nano.specs", "-Wl,--start-group", "-Wl,--gc-sections", "-T" + path + "/src/system/linker/stm32f10x_flash.ld", "-lnosys", "-lgcc", "-lc", "-lstdc++", "-lm" ]
cpp.includePaths: [ "src/system/cmsis", "src/system/cmsis_boot", "src/system/cmsis_boot/statup" ]
files: [ "src/system/cmsis/*.h", "src/system/cmsis/*.h", "src/system/cmsis_boot/*.h", "src/system/cmsis_boot/*.c", "src/system/cmsis_boot/startup/*.c", "src/main.cpp" ]
Properties { condition: qbs.buildVariant === "debug" cpp.defines: outer.concat(["DEBUG=1"]) cpp.debugInformation: true cpp.optimization: "none" }
Properties { condition: qbs.buildVariant === "release" cpp.debugInformation: false cpp.optimization: "small" }
Rule { inputs: ["application"]
Artifact { filePath: project.path + "/debug/bin/" + input.baseName + ".hex" fileTags: "flash" }
prepare: { var sizePath = "c:/development/gcc-arm/bin/arm-none-eabi-size.exe"; var objcopyPath = "c:/development/gcc-arm/bin/arm-none-eabi-objcopy.exe"; var configStlinkPath = "c:/development/openocd_0_10_0/scripts/interface/stlink-v2.cfg"; var configStm32Path = "c:/development/openocd_0_10_0/scripts/target/stm32f1x.cfg"; var flashPath = "c:/development/openocd_0_10_0/bin/openocd.exe";
var argsSize = [input.filePath]; var argsObjcopy = ["-O", "ihex", input.filePath, output.filePath];
var argsFlashing = [ "-f", configStlinkPath, "-f", configStm32Path, "-c", "init", "-c", "halt", "-c", "flash write_image erase " + input.filePath, "-c", "reset", "-c", "shutdown" ];
var cmdSize = new Command(sizePath, argsSize); var cmdObjcopy = new Command(objcopyPath, argsObjcopy); var cmdFlash = new Command(flashPath, argsFlashing);
cmdSize.description = "Size of sections:"; cmdSize.highlight = "linker";
cmdObjcopy.description = "convert to bin..."; cmdObjcopy.highlight = "linker";
cmdFlash.description = "download firmware to uC..."; cmdFlash.highlight = "linker";
return [cmdSize, cmdObjcopy, cmdFlash]; } } }
Название: Re: Qt Creator + stm32
Отправлено: lit-uriy от Февраль 28, 2017, 14:47
вообще QBS+BareMetal - это ересь какая-то, лучшеб обеспечили работу qmake, создав какой-нибудь подходящий конфиг (mkspec).
Я до появления креатора, с помощью qmake генерил makefile для AVR GCC, что-то поплясать тогда пришлось с mkspec и конфигами qmake-а, но потом сильно жизнь облегчало.
Название: Re: Qt Creator + stm32
Отправлено: Larry от Февраль 28, 2017, 15:13
По мне так qbs попонятней будет (по синтаксису) :) Но после всех IDE при работе с микроконтроллерами, то Qt Creator превосходит их на голову :) (в плане удобств, но это мое субъективное мнение). Теперь все проекты в одной IDE...
Название: Re: Qt Creator + stm32
Отправлено: lit-uriy от Март 01, 2017, 06:21
>>По мне так qbs попонятней будет (по синтаксису) не увидел преимуществ в ни понятности ни в краткости qbs-а перед qmake-ом qmake: Bash TEMPLATE = app INCLUDEPATH += "src" INCLUDEPATH += "src/cmsis" INCLUDEPATH += "src/inc" INCLUDEPATH += "src/linker" INCLUDEPATH += "src/startup" SOURCE += "*.cpp" SOURCE += "src/cmsis/*.c" SOURCE += "src/inc/*.c" SOURCE += "src/startup/*.c" HEADERS+= "src/cmsis/*.h" HEADERS += "src/inc/*.h"
qbs: Bash Project { name: "qbs" Product { type: "application" Depends { name: "cpp" } ... cpp.includePaths: [ "src", "src/cmsis", "src/inc", "src/linker", "src/startup" ] files: [ "*.cpp", "src/cmsis/*.c", "src/cmsis/*.h", "src/inc/*.c", "src/inc/*.h", "src/startup/*.c" ] ...
Название: Re: Qt Creator + stm32
Отправлено: kuzulis от Март 01, 2017, 09:27
Ну, как бы, понятность наступает когда появляется необходимость слинковаться с чем-то. qmake: DEPENDPATH += /path/to/lib1/
LIBS += -L/path/to/lib1 -lmylib1 // статика LIBS += -L/path/to/lib2 -lmylib2 LIBS += -L/path/to/lib3 -lmylib3
win32:PRE_TARGETDEPS += /path/to/lib1/mylib1.lib else:unix:PRE_TARGETDEPS += /path/to/lib1/mylib1.a
qbs: Depends { name: MyLib1} Depends { name: MyLib2} Depends { name: MyLib3}
Название: Re: [РЕШЕНО]Qt Creator + stm32
Отправлено: lit-uriy от Март 03, 2017, 06:18
MyLibX, как я понимаю, описана в отдельном QBS-е. Для qmake я использую include, т.е.
include(path/to/mylib1.pri)
и т.д., а чаще
include($$(LIBS)/mylib1.pri)
где LIBS - переменная окружения
|