CMSIS2000  0.0.7
 Указатель Структуры данных Файлы Функции Переменные Определения типов Перечисления Элементы перечислений Макросы Группы Страницы
Использование CMAKE для сборки проектов

Создание нового проекта CMAKE

Создание нового проекта происходит путём составления файла CMakeLists.txt.

Настройка готового проекта под микроконтроллер и плату производится путём запуска утилиты CMAKE перед компиляцией проекта c указанием трёх основных параметров-переменных:

  • Микроконтроллер
  • Плата
  • Вариант размещения кода (FLASH, RAM, EXTERNAL RAM)

Примеры проектов с CMAKE

Примеры проектов с CMAKE могут быть найдены в директориях :

  • Device/NXP/LPC2xxx/templates/empty_main/cmake
  • Device/NXP/Drivers/Examples/UART/Interrupt/GCC_CMAKE
  • Device/NXP/Drivers/Examples/Project_Template/CMAKE_CMSIS2000/GCC_CMAKE

Рассмотрим пример запуска системы CMAKE в командной строке –

cmake . -DCMAKE_TOOLCHAIN_FILE=../../../../../../../CMAKE/CMSIS.cmake -DCMAKE_BUILD_TYPE=Debug -DMCU=LPC1768 -DBSP_BRD_DEF=EA_v1_1 -DLINKAGE=FLASH -G "CodeBlocks - MinGW Makefiles"

слудуюшая строка:

-DCMAKE_TOOLCHAIN_FILE=../../../../../../../CMAKE/CMSIS.cmake

указывает CMAKE файл с правилами для компиляции под МК ARM

-DMCU=LPC1768

устанавливает марку микроконтроллера

-DBSP_BRD_DEF=EA_v1_1

задаёт имя платы

-DLINKAGE=FLASH

указывает что программа должна быть размещена во FLASH! см. Выбор варианта сборки

-G "CodeBlocks - MinGW Makefiles"

устанавливает для CMAKE вариант для генерации файлов. Возможно Вам подойдут варианты:

  • MinGW Makefiles = Generates a make file for use with mingw32-make.
  • Unix Makefiles = Generates standard UNIX makefiles.
  • CodeBlocks - MinGW Makefiles= Generates CodeBlocks project files.
  • CodeBlocks - Unix Makefiles = Generates CodeBlocks project files.
  • Eclipse CDT4 - MinGW Makefiles Generates Eclipse CDT 4.0 project files.
  • Eclipse CDT4 - Unix Makefiles = Generates Eclipse CDT 4.0 project files.

Дополнительные опции к CMAKE устанавливают тип сборки Релиз/Отладка

-DCMAKE_BUILD_TYPE=Debug
-DCMAKE_BUILD_TYPE=Release

Настройки СMAKE

Выбор варианта сборки

Вариант сборки указывается в опцией -DLINKAGE="вариант сборки". Существует три варианта сборки:

  • FLASH
  • RAM
  • ONE_SECT

FLASH – образ программы располагается во FLASH, программа выполняется из FLASH, секции данных и некоторый код(.text.ram_code) загружаются во внутреннюю RAM

RAM – образ программы располагается во FLASH, секция постоянных данных (.rodata) и некоторый код (.text.rom_code) располагается во FLASH , секции кода и данных загружаются во внутреннюю RAM

ONE_SECT – весь образ программы располагается в виде одной секции, которая располагается по умолчанию во внутренней RAM. Начало секции и длина задаётся, переменными ONE_SEC_START и ONE_SEC_LENGTH.

\сode -DLINKAGE=ONE_SECT -DONE_SEC_START=0xa0400000 -DONE_SEC_LENGTH=0x10000

Каждый вариант сборки порождает свой скрипт сборки (FLASH.ld, ONE.ld, RAM.ld).

Другие Настройки CMAKE

Опция для определения контроллера MCU и платы BSP_BRD_DEF

-DMCU=LPC1768

устанавливает марку микроконтроллера, создаёт файл mcu_id.h c указанием типа ядра процессора, модели контроллера

-DBSP_BRD_DEF=EA_v1_1

устанавливает плату на которой установлен микроконтроллер, ищет в папке bsp файл с именем EA_v1_1 и создаёт файл bsp_board_def.h, в который вставляет строку include "bps_board_EA_v1_1" добавляет опцию -D_HASBSPBRD=1 к компилятору.

Дополнительные опции для компилятора COMMON_FLAGS

Можно указать дополнительные опции сборки для компилятора С. Данный пример задаёт оптимизацию по размеру.

-DCMAKE_BUILD_TYPE=Debug -DCOMMON_FLAGS=-Os

Также поддерживаются переменные на каждый тип языка COMMON_C_FLAGS, COMMON_CXX_FLAGS, COMMON_ASM_FLAGS , и COMMON_LD_FLAGS для сборки.

Размеры стеков в STARTAP_INIT_STACK_FILE_H

Указатель стека устанавливается на конец памяти чипа. Для подробной информации См. файл файл линкера и файл запуска на ассемблере.

STARTAP_INIT_STACK_FILE_H

Переменная STARTAP_INIT_STACK_FILE_H – указывает на файл с настройками размеров стеков, по умолчанию используется startup_lpc_stack_generic.h.in

-DAVOID_LINKER_SECTIONS=1

Убирает -ffunction-sections -fdata-sections из опций компиляции

Режим запуска функции main (только ARM7).

Режим запуска функции main – это состояние регистр статуса в момент запуска main. Функция main() может быть запущена в различном режиме (USER,SYSTEM,SWI).

STARTUP_ARM_MODE_MAIN

определяет значение регистра статуса. По умолчанию задано как MODE_SYS, однако если установлена переменная TARGET_HAS_RTOS, то значение устанавливается в (MODE_SVC|I_BIT|F_BIT), что запрещает прерывания до запуска планировщика. Переменная TARGET_HAS_RTOS устанавливается автоматический в 1 если в корне проекта или на уровень выше или на два уровня выше по директории есть файл "FreeRTOSConfig.h" или "iConfig.h"

нано-описание языка CMAKE

Язык cmake – lisp-подобный язык. Переменные устанавливаются с помощью команды set. Регистр команд не важен.

if(NOT DOXY_EXAMPLE_PATH)
set(DOXY_EXAMPLE_PATH ${DOXYGEN_INPUT_SOURCE_DIR})
endif(NOT DOXY_EXAMPLE_PATH)

Значение переменной получается с помощью фигурных скобок как в Bash в отличие от круглых скобок в Makefiles. Переменные в CMAKE являются списками то есть могут содержать много элементов.

В CMAKE поддерживает if() else() endif() как в bash. Поддерживаются макросы и функции.

Операция конкатенации производиться следующим образом:

set(prj_sources ${prj_sources} ${MB_SLAVE1_SRC})

Файл CMakeLists.txt

Файл CMakeLists.txt для CMAKE содержит :

  • имя проекта
  • список исходных файлов проекта
  • имена целей сборки а также их зависимостей (библиотек)
  • дополнительные команды вставки файлов с готовыми исходым кодом CMAKE

Пример файла CMakeLists.txt из Device/NXP/LPC2xxx/templates/empty_main/cmake

Пример файла CMakeLists.txt из Device/NXP/Drivers/Examples/UART/Interrupt/GCC_CMAKE

## CMSIS2000
## CMSIS-like sources for LPC2xxx series MCUs
##
## This file is public domain you may use it as you wish
##
## Do not be lasy! For the latest version see http://irtos.sourceforge.net .
##
#set(STARTUP_ARM_MODE_MAIN "(MODE_SYS|I_BIT|F_BIT)")
project (uart_interrupt C ASM)
cmake_minimum_required(VERSION 2.8.4)
#add YOUR *.c and *.h files to you project here!!!!
set (exmpl_sources
../${CMAKE_PROJECT_NAME}_test.c
)
#There is directory with config files????
set(PROJECT_CONFIG_DIR "../")
include_directories(${PROJECT_CONFIG_DIR})
#for arch/interrupt and etc functions
include_directories("${CMSIS_ROOT_DIR}/2000/Include")
#Periphiral library
include(${CMSIS_ROOT_DIR}/Device/${MCU_VENDOR}/Drivers/CMAKE/periph_library.txt)
#Executables
add_executable(${CMAKE_PROJECT_NAME}.elf ${exmpl_sources})
#Libraries
target_link_libraries(${CMAKE_PROJECT_NAME}.elf
cmsis.crt0
${PERIPH_LIBRARY_NAME}
)
#Test CMAKE VARIABLES
include(${CMSIS_CMAKE_DIR}/test_system.cmake)
#CUSTOM FEATURES -- HEX BIN LST
add_custom_target(${CMAKE_PROJECT_NAME}.hex DEPENDS ${CMAKE_PROJECT_NAME}.elf COMMAND ${CMAKE_OBJCOPY} -Oihex ${CMAKE_PROJECT_NAME}.elf ${CMAKE_PROJECT_NAME}.hex)
add_custom_target(${CMAKE_PROJECT_NAME}.bin DEPENDS ${CMAKE_PROJECT_NAME}.elf COMMAND ${CMAKE_OBJCOPY} -Obinary ${CMAKE_PROJECT_NAME}.elf ${CMAKE_PROJECT_NAME}.bin)
add_custom_target(${CMAKE_PROJECT_NAME}.lst DEPENDS ${CMAKE_PROJECT_NAME}.elf COMMAND ${CMAKE_OBJDUMP} -D ${CMAKE_PROJECT_NAME}.elf > ${CMAKE_PROJECT_NAME}.lst)

Для изучающих английский комментарии излишни!

Особенности работы CMAKE

Система создаёт в пути запуска служебные файлы (CMakeCache.txt, Makefile) и директорию CMakeFiles. Директория CMakeFiles используется для сборки и хранения всех промежуточных результатов, таким образом, в пути основных исходников все ''мусорные'' файлы (*.obj, *.o, *.d и т. д.) не создаются.

При создании проекта для CodeBlocks в список целей автоматически включаются все библиотеки и исполняемые файлы. К сожалению при кросс-компиляции для CodeBlock не указывается компилятор, поэтому рекомендую перед изменением компилятора проекта с MinGW на ARM копировать создаваемый проект *.cbp в *2.cbp.

Некоторые фишки при работе с CMAKE

  • make VERBOSE=1 даст больший ввод–вывод при компиляции
  • make help даст список всего того что можно скомпилировать в том числе и библиотеки и hex файл