Под поимот накрсно-преведување (во оригинал на англиски: Cross-compilling) се подразбира постапка во која програмски код напишан за една хардверска платформа се преведува за извршување на друга платформа со користење на преведувач способен да генерира извршен код за целниот хардвер. Резулатот од преводот ќе може да се изврши само на хардвеорт за кој е наменет, но не и на хардверот на кој што е направено преведувањето. Оваа кратко упатство се однесува за накрсно преведување на C/C++ програми за Microchip AVR8 микроуправувачи со користење на: GNU avr-gcc или Microchip XC8 преведувач на Linux PC.
За накрсно преведување на C/C++ проект за Microchip AVR8 платформа со помош на CMake и соодветен преведувач потребни се три состојки:
- ланец од алатки (оригинално: tool chain) за целната платформа, достапни на платформата домаќин на преведувањето. Во овој случај станува збор за GNU avr-gcc преведувач за C/C++ код, avr-libc библиотека и придружни алатки за создавање и работа со бинарни фајлови за Microchip AVR8 мокроуправувачи. Како алтернатива може да послужи и преведувачот Microchip XC8. За домаќин на преведувачкиот процес избран компјутер со Ubuntu оперативен систем, но тоа може да биде било кој друг Linux систем.
- CMake конфигурациски фајл CMakeLists.txt, кој го опишува преведувачкиот процес и му кажува на CMake како да ги создаде фајловите со правилата за превод;
- CMake "tool chain file".
Кај Ubuntu оперативен систем како домаќин на преведувањето, ланецот од алатки за Microchip AVR8 e достапен во стандардните складишта за софтверски пакети. Станува збор за пакетите: avr-libc, binutils-avr and gcc-avr, кои на Ubuntu оперативен систем се инсталираат со наредбата:
#sudo apt install avr-libc binutils-avr gcc-avr
Microchip нуди верзија на својот преведувач за Linux системи и истата е достапна на официјалната страна на Microchip XC8.
Овој фајл му кажува на CMake сe што треба да знае за целната платформа на која ќе треба да се извршува преводот, за да може да го подготви преведувањето 1; ги дефинира преведувачите за C/C++ код од ланецот на алатки за AVR8 архитектура. Овој проект нуди два конфигурациски фајла за ланец со алатки:
- avr_gcc_toolchain.cmake - за GNU avr-gcc преведувач;
- microchip_xc8_toolchain.cmake - за Microchip XC8 преведувач;
Microchip AVR8 микроуправувачите немаат инсталиран оперативен систем кој подржува вчитување на дополнителни библиотеки при извршување на програми. Тоа е битен податок кој CMake мора да го знае при подготовката на преведувањето. За таа цел, во конфигурацискиот фајл за ланец со алатки се наведува конфигурациската поставка CMAKE_SYSTEM_NAME со врдност: Generic1.
set(CMAKE_SYSTEM_NAME Generic)
CMake променливите: CMAKE_C_COMPILER и CMAKE_CXX_COMPILER се задолжени за дефинирање на C/C++ предедувачот соодветно. Притоа нивните вредности претставуваат апсолутни патеки до извршните фајлви на преведувачите.
Дефиниција на преведувачите во avr_gcc_toolchain.cmake:
set(CMAKE_C_COMPILER /usr/bin/avr-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/avr-g++)
Дефиниција на преведувачите во microchip_xc8_toolchain.cmake:
set(CMAKE_C_COMPILER /opt/microchip/xc8/v2.40/bin/xc8-cc)
set(CMAKE_CXX_COMPILER /opt/microchip/xc8/v2.40/bin/xc8-cc)
Преводот на AVR8 код бара користење на опции за предедувачот кои се разликуваат од оние кои што се наведени при превод на код со gcc преведувач, кога целната платформа е системот домаќин. И овие опции се дел од конфигурацискиот фајл за ланецот со алатки преку поставките:
#Define the compiler flags for AVR8 platform
set(FLAGS "-Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields")
#Clear all the default flags set by CMake
unset(CMAKE_C_FLAGS CACHE)
unset(CMAKE_CXX_FLAGS CACHE)
#Apply the wanted flags for AVR8
set(CMAKE_CXX_FLAGS ${FLAGS} CACHE STRING "" FORCE)
set(CMAKE_C_FLAGS ${FLAGS} CACHE STRING "" FORCE)
Microchip XC8 преведувачот ќе пријави грешка кога типот на микроуправувачот не е проследен како еден од неговите аргументи. При проверка на дефиницијата за преведувачот, CMake ќе се обиде да го стартува преведувачот наведен во конфигурацискиот фајл, но без обезбеден модел на миктроуправувач, тестот ќе завржи неуспешно и CMake ќе пријави грешка. За избегнување на таквата ситуација, моделот на микроуправувачот е зададен директно во конфигурацискиот фајл преку променливата AVR8_MCU.
Станува збор за стандарден CMake конфигурациски фајл кој по ништо не се разликува од истиот таков фајл за превод на C/C++ код на PC платформа со gcc/g++ преведувач. Истиот ги поддржува и двата конфигурациски фајлови за преведувачите: GNU avr-gcc/g++ и Mcirochip XC8. Дополнителен урнек(ци) за CMakeLists.txt можат да се најадт во папката examples:
- CMakeLists_static_lib.txt претставува пример за CMakeLists.txt наменет за креирање на библиотека за AVR8 MCU;
- CMakeLists_link_with_static_lib.txt е пример за поврзување на проектот со статична библиотека.
Резулутатот од преводот е firmware фајл во ELF формат. Овој формат не е поддржан од AVR8 миктоконтролери и како таков не може да се вчита/запише во микроуправувачот за негово извршување, туку мора првин да се преобрази во Intel HEX формат. За таа цел, во CMakeLists.txt фајлот е дефиниран дополнителен чекор кој ќе се изврши автоматски по успешниот превод на кодот и ќе направи неопходната преобразба. Ново добиениот фајл е firmware-от кој може да се запише во FLASH меморијата на микроуправувачот со помош на алатката avrdude и соодветен програматор.
add_custom_command(
TARGET ${PROJECT_NAME}.elf
POST_BUILD
COMMAND avr-objcopy -j .text -j .data -O ihex ${PROJECT_NAME}.elf ${PROJECT_NAME}.hex
)
Microchip XC8 се споделува со негова сопствена верзија на алатката: avr-objcopy чија што дефиниција исто така е дел од microchip_xc8_toolchian.cmake.
Во CMakeLists.txt се дефинирани два аргументи кои служат за проследување на подолнителни информации до CMake и тоа:
- MCU - ја дефинира вредноста на -mmcu аргументот при повик на avr-gcc. Со него се наведува моделот на целниот микроуправувач за да може преведувачот да генерира соодветен код. Иако сите AVR8 микроуправувачи имаат иста харверска архитетура не сите микроуправувачи имаат иста хардверска конфигурација. Доколку не е наведен, подразбирливата вредност за овој аргумент е: "atmega32"(комплетна листа од поддржани вредности на -mmcu). Вредноста на овој аргумент не се зема во предвид во случај на Microchip XC8 бидејќи моделот на микроуправувачот веќе е зададен во конфигурацискиот фајл за ланецот со алатки преку променливата AVR8_MCU.
- CPU_FREQ - работна фрекфенција на микроуправувачот. Неговата вредност е неопходна за превод на некои функции од avr-lib библиотеката, како на пример оние за временско доцнење. Подразбирлива вредност: 16MHz.
Креирај засебна папка за превод на кодот во папката на проектот:
#mkdir build && cd build
Креирај ги фајловите со наредби за превод на кодот со помош на CMake:
#cmake -DCMAKE_TOOLCHAIN_FILE=../avr8_toolchain.cmake -DMCU=attiny2313 -DCPU_FREQ=20000000L ..
за GNU avr-gcc преведувач, или:
#cmake -DCMAKE_TOOLCHAIN_FILE=../microchip_xc8_toolchain.cmake -DCPU_FREQ=20000000L ..
за преведувачот Microchip XC8. При тоа, моделот на микроуправувачот е зададен во microchip_xc8_toolchain фалот.
Во овој случај, кодот ќе биде преведен за ATtiny2313 микроуправувач со работна фрекфенција од 20МHz. Направи го преводот на кодот со:
#make
Како резултат на преводот, во build папката ќе бидат креирани два бинарни фајлови: .elf и firmware фајл со наставка .hex.
Изворниот код е достапен каков што е, без никаква гаранција за неговата функционалност и содржина. Користете го на сопствен ризик! Авторот на кодот не презема никава одговорност за штети кои можеби би биле предизвикани со користење на овој код.
Изворниот кодот е резултат на хоби дејност и авторот не е поврзан ниту пак е во партнерство со некој од прозводителите на уреди/електронски компоненти/софтверски алатки спомнати во кодот, документацијата или описот на овој проект. Авторот не искажува никаква поврзаност со, претензија или сопственост врз трговските имиња наведени во проектот. Сите трговски имиња и заштитни знаци се во сопсвеност на нивните иматели.