Вот уже несколько лет пользуюсь CMake-ом, чтобы собирать проекты под AVR. Сподвиг на этом конечно же вышедший осенью 2014 Jetbrains CLion, который как оказалось идеально подходит для написания кода под Atmel AVR. Короче, рекомендую.
Возможно, для корректной работы нужно будет установить переменную среды AVR_FIND_ROOT_PATH — на папку с avr (содержащую lib и include), а так же папка с avr-gcc, avr-g++, avr-objcopy, avr-size должны находиться в PATH. Ну или доработать напильником generic-gcc-avr.cmake
В общем, шаблон тут: https://github.com/bevice/avr_cmake_template
Ну а для удобства простейший скрипт, который скачает, отвяжет от github и переименует проект:
#!/bin/bash git clone git@github.com:bevice/avr_cmake_template.git $1 cd $1 git remote remove origin sed -i '' -e "s/avr_project_template/$1/g" CMakeLists.txt |
bevice@host ~/tmp$ create_avr_project helloworld Cloning into 'helloworld'... remote: Counting objects: 43, done. remote: Total 43 (delta 0), reused 0 (delta 0), pack-reused 43 Receiving objects: 100% (43/43), 8.30 KiB | 0 bytes/s, done. Resolving deltas: 100% (22/22), done. bevice@host ~/tmp$ tree helloworld/ helloworld/ ├── CMakeLists.txt ├── generic-gcc-avr.cmake ├── readme.md └── src ├── main.c └── main.h 1 directory, 5 files |
Настройка проекта производится в файле CMakeLists.txt:
set(AVR_PROGRAMMER usbasp) # прошиватор set(AVR_UPLOADTOOL_PORT usb) # порт set(AVR_MCU atmega328p) # Чип set(AVR_H_FUSE 0xDA) # H-Fuse set(AVR_L_FUSE 0xFF) # L-Fuse set(AVR_EX_FUSE 0×05) # Ex-Fuse set(MCU_SPEED "16000000UL") # Частота кварца (F_CPU)
Поддерживается загрузка avrdude. Байты фьюзов ровно такие, какие видит avrdude и которые можно быстро прикинуть тут: engbedded.com.
Ну и сборка:
bevice@host ~/tmp/helloworld/build (master *)$ cmake .. -- Current uploadtool is: avrdude -- Current programmer is: usbasp -- Current upload port is: usb -- Current uploadtool options are: -- Current MCU is set to: atmega328p -- Current H_FUSE is set to: 0xDA -- Current L_FUSE is set to: 0xFF -- Set CMAKE_FIND_ROOT_PATH to /usr/local/opt/avr-libc/avr -- Set CMAKE_SYSTEM_INCLUDE_PATH to /usr/local/opt/avr-libc/avr/include -- Set CMAKE_SYSTEM_LIBRARY_PATH to /usr/local/opt/avr-libc/avr/lib -- The C compiler identification is GNU 6.2.0 -- The CXX compiler identification is GNU 6.2.0 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- avr-libc: /usr/local/opt/avr-libc/avr/lib/libc.a -- Configuring done -- Generating done -- Build files have been written to: /Users/bevice/tmp/helloworld/build bevice@host ~/tmp/helloworld/build (master *)$ make Scanning dependencies of target helloworld-atmega328p.elf [ 20%] Building C object CMakeFiles/helloworld-atmega328p.elf.dir/src/main.c.obj [ 40%] Linking C executable helloworld-atmega328p.elf [ 40%] Built target helloworld-atmega328p.elf Scanning dependencies of target helloworld [ 60%] Generating helloworld-atmega328p.hex text data bss dec hex filename 132 0 0 132 84 helloworld-atmega328p.elf [ 80%] Generating helloworld-atmega328p-eeprom.hex [100%] Generating helloworld-atmega328p.bin text data bss dec hex filename 132 0 0 132 84 helloworld-atmega328p.elf [100%] Built target helloworld bevice@host ~/tmp/helloworld/build (master *)$ ls -1 CMakeCache.txt CMakeFiles Makefile cmake_install.cmake helloworld-atmega328p-eeprom.hex helloworld-atmega328p.bin helloworld-atmega328p.elf helloworld-atmega328p.hex helloworld-atmega328p.map |
Все команды можно глянуть
make help |
там их довольно много.