From f4f07d3c0cd1272dc3cb25a16664f7f694e9426a Mon Sep 17 00:00:00 2001 From: Max Paperno Date: Thu, 12 Jan 2017 15:32:36 -0500 Subject: [PATCH] [build] Add comprehensive firmware size reporting scripts for ARM MCUs. (#4218) * [build] Add comprehensive firmware size reporting scripts for ARM MCUs. * [build] Add firmware size reports to commit-tests.sh. * [build] Set permissions on new scripts. * [build] Add -Wno-error option to commit-tests.sh. * [build] Revert firmware size report to using `arm-none-eabi-size` if bash not found (eg. on Windows). * [git] Add .gitattributes to force line endings on UNIX shell scripts. --- .gitattributes | 1 + radio/src/CMakeLists.txt | 19 ++- radio/src/targets/horus/CMakeLists.txt | 3 + radio/src/targets/sky9x/CMakeLists.txt | 19 ++- radio/src/targets/taranis/CMakeLists.txt | 4 + radio/util/elf-size-compare.awk | 70 +++++++++ radio/util/elf-size-report.awk | 105 ++++++++++++++ radio/util/elf-size-report.sh | 175 +++++++++++++++++++++++ tools/commit-tests.sh | 38 +++-- 9 files changed, 409 insertions(+), 25 deletions(-) create mode 100644 .gitattributes create mode 100755 radio/util/elf-size-compare.awk create mode 100755 radio/util/elf-size-report.awk create mode 100755 radio/util/elf-size-report.sh diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..50ca329f2 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.sh eol=lf diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 42242645e..3652962a7 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -451,11 +451,20 @@ if(NOT MSVC) WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) - add_custom_target(firmware-size - COMMAND arm-none-eabi-size firmware.elf - DEPENDS firmware - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - ) + find_program(BASH bash HINTS "c:/cygwin/bin/" DOC "bash shell for firmware size report (eg. c:/cygwin/bin/bash.exe on Windows).") + if (BASH) + add_custom_target(firmware-size + COMMAND ${BASH} -kc '${RADIO_DIRECTORY}/util/elf-size-report.sh --mcu=${CPU_TYPE_FULL} ${SIZE_TARGET_MEM_DEFINE} firmware.elf' + DEPENDS firmware + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) + else() + add_custom_target(firmware-size + COMMAND arm-none-eabi-size -A firmware.elf + DEPENDS firmware + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) + endif() else() # AVR diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index 0800e3da4..f8ce7c50c 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -25,6 +25,9 @@ set(FLAVOUR horus) set(RAMBACKUP YES) set(LUA YES) set(PPM_LIMITS_SYMETRICAL YES) +# for size report script +set(CPU_TYPE_FULL STM32F429xI) +set(SIZE_TARGET_MEM_DEFINE "MEM_SIZE_SDRAM2=8192") if(SPLASH STREQUAL OFF) message(FATAL_ERROR "Option SPLASH=OFF not supported on Horus") diff --git a/radio/src/targets/sky9x/CMakeLists.txt b/radio/src/targets/sky9x/CMakeLists.txt index 9f401810a..3d6c3b95e 100644 --- a/radio/src/targets/sky9x/CMakeLists.txt +++ b/radio/src/targets/sky9x/CMakeLists.txt @@ -15,6 +15,7 @@ if(PCB STREQUAL 9XRPRO) set(LINKER_SCRIPT targets/sky9x/sam3s8c_flash.ld) set(TARGET_SRC ${TARGET_SRC} rtc_driver.cpp) set(OPENRC_BOOTLOADER bootflash8.lbm) + set(CPU_TYPE_FULL ATSAM3S8C) # for size report elseif(PCB STREQUAL AR9X) add_definitions(-Dat91sam3s8 -DAR9X -DSOFTWARE_VOLUME) set(FLAVOUR ar9x) @@ -23,20 +24,28 @@ elseif(PCB STREQUAL AR9X) set(TARGET_SRC ${TARGET_SRC} i2c_driver.cpp rtc_ds3231_driver.cpp) set(LINKER_SCRIPT targets/sky9x/sam3s8c_flash.ld) set(OPENRC_BOOTLOADER bootflash8.lbm) + set(CPU_TYPE_FULL ATSAM3S8C) # for size report else() set(FLAVOUR sky9x) - option(PCBREV "PCB Revision" REVC) + set(PCBREV "REVC" CACHE STRING "PCB Revision (REVA/REVB/REVC)") + set_property(CACHE PCBREV PROPERTY STRINGS "REVA" "REVB" "REVC") set(TARGET_SRC ${TARGET_SRC} coproc_driver.cpp rotenc_driver.cpp rtc_driver.cpp) set(OPENRC_BOOTLOADER bootflash4.lbm) if(PCBREV STREQUAL REVA) add_definitions(-DDREVA) set(LINKER_SCRIPT targets/sky9x/sam3s2c_flash.ld) - elseif(PCBREV STREQUAL REVB) - add_definitions(-DDREVB -DCOPROCESSOR) - set(LINKER_SCRIPT targets/sky9x/sam3s4c_flash.ld) + set(CPU_TYPE_FULL ATSAM3S2C) # for size report else() - add_definitions(-DDREVC -DCOPROCESSOR) + if(PCBREV STREQUAL REVB) + add_definitions(-DDREVB) + elseif(PCBREV STREQUAL REVC) + add_definitions(-DDREVC) + else() + message(SEND_ERROR "Unknown PCB Revision '${PCBREV}'") + endif() + add_definitions(-DCOPROCESSOR) set(LINKER_SCRIPT targets/sky9x/sam3s4c_flash.ld) + set(CPU_TYPE_FULL ATSAM3S4C) # for size report endif() endif() diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 456cd57c7..fa3e1a908 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -5,6 +5,7 @@ option(TARANIS_INTERNAL_PPM "Taranis internal module hack to output PPM" OFF) if(PCB STREQUAL X9E) set(STICKS "STANDARD" CACHE STRING "Sticks type (STANDARD/HORUS)") set(CPU_TYPE STM32F4) + set(CPU_TYPE_FULL STM32F407xE) # for size report set(LINKER_SCRIPT targets/taranis/stm32f4_flash.ld) set(HAPTIC YES) set(LUA_EXPORT lua_export_x9e) @@ -28,6 +29,7 @@ if(PCB STREQUAL X9E) set(GVAR_SCREEN model_gvars.cpp) elseif(PCB STREQUAL X9D+) set(CPU_TYPE STM32F2) + set(CPU_TYPE_FULL STM32F205xE) # for size report set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) set(HAPTIC YES) set(LUA_EXPORT lua_export_x9d) @@ -42,6 +44,7 @@ elseif(PCB STREQUAL X9D+) set(GVAR_SCREEN model_gvars.cpp) elseif(PCB STREQUAL X9D) set(CPU_TYPE STM32F2) + set(CPU_TYPE_FULL STM32F205xE) # for size report set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) option(HAPTIC "Haptic support" OFF) set(LUA_EXPORT lua_export_x9d) @@ -56,6 +59,7 @@ elseif(PCB STREQUAL X9D) set(GVAR_SCREEN model_gvars.cpp) elseif(PCB STREQUAL X7) set(CPU_TYPE STM32F2) + set(CPU_TYPE_FULL STM32F205xE) # for size report set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) set(HAPTIC YES) set(LUA_EXPORT lua_export_x7) diff --git a/radio/util/elf-size-compare.awk b/radio/util/elf-size-compare.awk new file mode 100755 index 000000000..be2487cf0 --- /dev/null +++ b/radio/util/elf-size-compare.awk @@ -0,0 +1,70 @@ +#!/usr/bin/awk -nf +# +# Parses the output of elf-size-report.awk and calculates segment memory usage deltas between the analyzed elf files. +# +# License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html +# Copyright (c)2016 Maxim Paperno +# Copyright (c)2017 OpenTX +# + + +BEGIN { + in_ttls = 0; + elf_cnt = 0; + sec_cnt = 0; +} +{ + if ($1 == "----" && NF > 5 && $5 ~ /\.elf$/) { + fname[elf_cnt] = $5; + } + else if (tolower($1) ~ /totals/) { + in_ttls = 1; + elf_cnt++; + } + else if (in_ttls && NF != 5) { + in_ttls = 0; + } + else if (in_ttls) { + if (elf_cnt == 1) + a[++sec_cnt] = $1; + d[elf_cnt][$1]["total"] = $2; + } +} +END { + printf("\n---- Comparing results of %d files ----\n\n", elf_cnt); + PROCINFO["sorted_in"] = "@ind_num_asc" + for (j in d) { + if (length(fname[j-1])) + printf("file %d: %s\n", j, fname[j-1]) + } + printf("\n%-8s ", "Section"); + for (j in d) { + printf("%8s ", "file " j); + if (j > 1) + printf("(%7s) ", "\xCE\x94 vs f1"); + if (j > 2) + printf("(%7s) ", "\xCE\x94 vs f" j-1); + } + printf("\n"); + for (i in a) { + n = a[i]; + printf("%8s ", n); + for (j in d) { + printf("%8.2f ", d[j][n]["total"]); + if (j > 1) + printDelta(d[j][n]["total"] - d[1][n]["total"]); + if (j > 2) + printDelta(d[j][n]["total"] - d[j-1][n]["total"]); + } + printf("\n"); + } + printf("\n"); +} + +function printDelta(dlta) { + if (dlta) + printf("(%+7.2f) ", dlta); + else + printf("(%7s) ", "--.--"); +} + diff --git a/radio/util/elf-size-report.awk b/radio/util/elf-size-report.awk new file mode 100755 index 000000000..aedfb8e48 --- /dev/null +++ b/radio/util/elf-size-report.awk @@ -0,0 +1,105 @@ +#!/usr/bin/awk -nf +# +# Process gcc binutils 'size -A' output to show more specific and summarized information about memory segment usage. +# +# This script expects some variables to be set on the command line with -v: +# names : list of segment names ("Flash", "RAM" etc.) +# addrs : list of segment start addresses in hex/oct/dec (in same order as names) +# sizes : list of segment sizes in KB (in same order as names) +# elf : name of elf file (optional, for display only) +# mcu : name of MCU (optional, for display only) +# skip_data : skip duplicate .data in Flash (0/1 default: 0) +# +# NOTE: The memory segments should be specified in increasing address order (low to high). +# +# Usage example: +# arm-none-eabi-size -A -x firmware.elf | ./elf-size-report.awk \ +# -v elf="firmware.elf" \ +# -v mcu="STM32F401VG" \ +# -v names="Flash RAM" \ +# -v addrs "0x08000000 0x100000000" \ +# -v sizes "512 128" +# +# License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html +# Copyright (c)2016 Maxim Paperno +# Copyright (c)2017 OpenTX +# + + +BEGIN { + err = 0; + len = split(names, a_names, " "); + alen = split(addrs, a_addrs, " "); + slen = split(sizes, a_sizes, " "); + if (!len || len != alen || len != slen) { + print "Error: No segment data provided or array sizes mismatch, exiting."; + exit err = 1; + } + flash_name = "Flash"; + for (i in a_names) { + n = a_names[i]; + a[i] = n; d[n]["addr"] = a_addrs[i]; d[n]["size"] = a_sizes[i]; d[n]["sum"] = 0; + if (tolower(n) ~ /flash/) + flash_name = n; + } + flmax = d[flash_name]["addr"]; + fmtstr = "%-20s %7d 0x%08x %s\n"; + + printf("\n---- Size report"); + if (length(elf)) printf(" for %s", elf); + if (length(mcu)) printf(" (MCU: %s)", mcu); + printf(" ----\n\n"); + printf("Section Details:\n"); + printf("%-20s %7s %10s %s\n", "section", "size(B)", "addr", "loc"); +} +# Process each line of 'size' output listing the program's sections, +# skip line if sections size or address are zero. +NR > 2 && $2 != 0 && $3 != 0 { + if ($1 == ".data") { + # .data section is always in Flash but 'size' reports it only in RAM (sometimes twice) + d[flash_name]["sum"] += $2; + printf(fmtstr, $1 " (added)", $2, flmax, flash_name); + flmax += $3; + if (skip_data) { next; } + } + # Walk over each specified memory segment looking for a match + # note: (this assumes segments were passed in ascending memory order) + PROCINFO["sorted_in"] = "@ind_num_desc" + addr = d[a[len]]["addr"]; + for (i in a) { + n = a[i]; + if ($3 >= addr) { + # check for overflow into contigious region + t = d[n]["sum"] + $2 - (d[n]["size"] * 1024); + if (t > 0 && i < len && d[a[i+1]]["addr"] = d[n]["addr"] + d[n]["size"] + 1) { + d[n]["sum"] += $2 - t; + d[a[i+1]]["sum"] += t; + seg = n "+" a[i+1]; + } + else { + d[n]["sum"] += $2; + seg = n; + } + printf(fmtstr, $1, $2, $3, seg); + # track maximum flash address used + if (n == flash_name) + flmax += $2; + break; + } + else if (i > 1) + addr = d[a[i-1]]["addr"]; + } +} +END { + if (err) exit err; + fmtstr = "%7s: %8.2f %6.2f%% %6d\t%7.2f\n"; + printf("\nTotals %8s usage of ttl\tKB free\n", "KB"); + PROCINFO["sorted_in"] = "@ind_num_asc" + for (i in a) { + n = a[i]; + if (d[n]["size"] > 0) + printf(fmtstr, n, d[n]["sum"]/1024, d[n]["sum"]/(d[n]["size"]*1024)*100, d[n]["size"], d[n]["size"] - d[n]["sum"]/1024 ); + } + printf("\n"); +} + diff --git a/radio/util/elf-size-report.sh b/radio/util/elf-size-report.sh new file mode 100755 index 000000000..6eb1c52d0 --- /dev/null +++ b/radio/util/elf-size-report.sh @@ -0,0 +1,175 @@ +#!/bin/bash +# +# This is a wrapper for the elf-size-report.awk script which prints a detailed report +# of memory segment allocations and usage in a given ELF file, based on gcc 'size' output. +# This script sets up memory segment information needed by the awk script. +# If more than one .elf file is given, then a comparison (delta memory use) report is +# also performed using elf-size-compare.awk. +# Currently supports some STMicro & Atmel ARM MCUs. May not work with all placement strategies. +# +# Usage: +# [VAR=value] ./elf-memory-report.sh [options] [file.elf] [file2.elf] [...] +# +# Where VAR is any of the CAPITALIZED variables below. More than one can be specified, +# and any VAR can also be set in the environment. +# SIZE : gcc binutils 'size' command to use, default is "arm-none-eabi-size". +# MCU : +# Specifies MCU model on which to base default segment location/size parameters. Also see "--mcu=" option. +# MEM_START_ & MEM_SIZE_ : (read code below for defaults) +# Allows specifying additional/custom segment information, eg. MEM_SIZE_FLASH=768 +# +# Options can be one or more of the following: +# --mcu= +# Set MCU type. Same as setting the MCU env. variable, and overrides it. +# --skip-data +# Some linker scripts duplicate .data in the output (eg: .data and .data_run). +# Set this option to skip .data from being counted in RAM a 2nd time +# (it is always shown as being in Flash). +# --compare-only +# When specifying multiple elf files, only show the final comparison report. +# --no-compare +# Opposite and exclusive of previous option, that is, do NOT show comparison report (only size reports). +# +# If an elf file is not specified on the command line, this script will prompt for one. +# +# Examples: +# MCU="STM32F439xI" MEM_SIZE_SDRAM2=8192 ./elf-memory-report.sh path/to/firmware.elf +# ./elf-memory-report.sh --mcu ATSAM3S4C --compare-only firmware_new.elf firmware_old.elf +# set -k && ./elf-memory-report.sh MCU=STM32F427VG --skip-data firmware.elf +# (the -k switch allows variable assignment anywhere on the command line) +# c:\cygwin\bin\bash -kc './elf-memory-report.sh --mcu ATSAM3S8C "c:\windows\path\with spaces\firmware.elf"' +# +# License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html +# Copyright (c)2016 Maxim Paperno +# Copyright (c)2017 OpenTX +# + +# -- gcc binutils 'size' command to use +: ${SIZE:="arm-none-eabi-size"} + +# -- MCU type, if defined will set certain memory defaults +# e.g. STM32F205xE or ATSAM3S4C +: ${MCU:="unknown"} + +# -- process options +compare=2 +skip_data=0 +for i in "$@" ; do + case $i in + --mcu=*) MCU="${i#*=}"; shift;; + --skip-data) skip_data=1; shift;; + --compare-only) compare=1; shift;; + --no-compare) compare=0; shift;; + esac +done + +# -- defaults which may change based on MCU +default_flash_addr=0x08000000 +default_flash_sz=1024 # KB +default_ccm_sz=0 +default_ram1_sz=128 +default_ram2_sz=0 +default_ram3_sz=0 +# -- Set defaults based on MCU type +if [[ $MCU != "unknown" ]] ; then + mcu_brand=${MCU:0:2} # ST or AT + if [[ $mcu_brand == "ST" && ${#MCU} -ge 7 ]] ; then + # e.g.: STM32F427VG + stm_series=${MCU:6:1} # 4 + stm_ser_ex=${MCU:7:1} # 2 + stm_flash=${MCU:10:1} # G + default_ram1_sz=112 + default_ram2_sz=16 + case $stm_flash in + "I") default_flash_sz=2048;; + "G") default_flash_sz=1024;; + "E") default_flash_sz=512;; + "C") default_flash_sz=256;; + esac + if (( $stm_series == 4 )) ; then + default_ccm_sz=64 + if (( $stm_ser_ex >= 2 )) ; then + default_ram3_sz=64 + fi + fi + elif [[ $mcu_brand == "AT" && ${#MCU} -ge 9 ]] ; then + # e.g.: ATSAM3S4C + atm_series=${MCU:5:4} # 3S4C + default_flash_addr=0x00400000 + case $atm_series in + "3S8C") default_flash_sz=512; default_ram1_sz=64;; + "3S4C") default_flash_sz=256; default_ram1_sz=48;; + "3S2C") default_flash_sz=128; default_ram1_sz=32;; + esac + else + echo "MCU type unrecognized, exiting." + exit 1 + fi +fi + +# -- target memory locations in hex +: ${MEM_START_FLASH:=$default_flash_addr} +: ${MEM_START_CCRAM:=0x10000000} +: ${MEM_START_SRAM1:=0x20000000} +: ${MEM_START_SRAM2:=0x2001c000} +: ${MEM_START_SRAM3:=0x20020000} +: ${MEM_START_PSRAM1:=0x60000000} +: ${MEM_START_SDRAM1:=0xC0000000} +: ${MEM_START_SDRAM2:=0xD0000000} + +# -- target memory sizes in KB +: ${MEM_SIZE_FLASH:=$default_flash_sz} +: ${MEM_SIZE_CCRAM:=$default_ccm_sz} +: ${MEM_SIZE_SRAM1:=$default_ram1_sz} +: ${MEM_SIZE_SRAM2:=$default_ram2_sz} +: ${MEM_SIZE_SRAM3:=$default_ram3_sz} +: ${MEM_SIZE_PSRAM1:=0} +: ${MEM_SIZE_SDRAM1:=0} +: ${MEM_SIZE_SDRAM2:=0} + +# -- prompt for elf file if not on command line +if [[ -z "$@" ]] ; then + read -p "Elf file(s): " ELF_FILES +else + ELF_FILES=$@ +fi + +# -- Set arrays for awk script. The segments should be in increasing address order. +names=("Flash" "CCRAM" "SRAM1" "SRAM2" "SRAM3" "PSRAM1" "SDRAM1" "SDRAM2") +addrs=(${MEM_START_FLASH} ${MEM_START_CCRAM} ${MEM_START_SRAM1} ${MEM_START_SRAM2} ${MEM_START_SRAM3} \ + ${MEM_START_PSRAM1} ${MEM_START_SDRAM1} ${MEM_START_SDRAM2}) +sizes=(${MEM_SIZE_FLASH} ${MEM_SIZE_CCRAM} ${MEM_SIZE_SRAM1} ${MEM_SIZE_SRAM2} ${MEM_SIZE_SRAM3} \ + ${MEM_SIZE_PSRAM1} ${MEM_SIZE_SDRAM1} ${MEM_SIZE_SDRAM2}) + +base_dir="$(dirname "$BASH_SOURCE")" +base_dir="${base_dir%%[[:space:]]}" # sometimes we get trailing \n + +# -- run the ARM size command for each elf file and send output to awk script +all_output="" +file_cnt=0 +for elf in "$@"; do + if [[ ! -f "$elf" ]] ; then + echo "ELF file \"$elf\" not found." + continue + fi + #${SIZE} -A -x ${elf} + escelf="${elf//\\//}" + output=`${SIZE} -A -x ${elf} | "${base_dir}/elf-size-report.awk" \ + -v mcu="${MCU}" \ + -v elf="${escelf}" \ + -v skip_data=${skip_data} \ + -v names="${names[*]}" \ + -v addrs="${addrs[*]}" \ + -v sizes="${sizes[*]}"` + if (( compare != 1 )) ; then + echo "$output" + echo + fi + file_cnt+=1 + all_output+="${output}\n" +done +# -- if more than one elf file was given, also run a comparison report +if (( file_cnt > 1 && compare )) ; then + echo "$all_output" | "${base_dir}/elf-size-compare.awk" +fi + diff --git a/tools/commit-tests.sh b/tools/commit-tests.sh index f71d155f7..e48bff9b8 100755 --- a/tools/commit-tests.sh +++ b/tools/commit-tests.sh @@ -5,7 +5,9 @@ set -e set -x # Allow variable core usage, default uses two cores, to set 8 cores for example : commit-tests.sh -j8 +# Default build treats warnings as errors, set -Wno-error to override, e.g.: commit-tests.sh -Wno-error CORES=2 +WERROR=1 for i in "$@" do case $i in @@ -17,6 +19,10 @@ case $i in CORES="${i#*j}" shift ;; + -Wno-error) + WERROR=0 + shift + ;; esac done @@ -27,7 +33,9 @@ else fi SRCDIR=$(dirname "$SCRIPT")/.. -COMMON_OPTIONS="-DCMAKE_BUILD_TYPE=Debug -DCMAKE_PREFIX_PATH=/opt/qt55 -DTRACE_SIMPGMSPACE=NO -DWARNINGS_AS_ERRORS=YES -DVERBOSE_CMAKELISTS=YES -DCMAKE_RULE_MESSAGES=OFF -Wno-dev" +COMMON_OPTIONS="-DCMAKE_BUILD_TYPE=Debug -DCMAKE_PREFIX_PATH=/opt/qt55 -DTRACE_SIMPGMSPACE=NO -DVERBOSE_CMAKELISTS=YES -DCMAKE_RULE_MESSAGES=OFF -Wno-dev" +if (( $WERROR )); then COMMON_OPTIONS+=" -DWARNINGS_AS_ERRORS=YES"; fi +FIRMARE_TARGET="firmware-size" mkdir build || true cd build @@ -35,94 +43,94 @@ cd build # OpenTX on 9X stock with FrSky telemetry rm -rf * cmake ${COMMON_OPTIONS} -DPCB=9X -DHELI=YES -DTEMPLATES=YES -DTELEMETRY=FRSKY ${SRCDIR} -make -j${CORES} firmware +make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} simu make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure # OpenTX on 9X stock with Ardupilot telemetry rm -rf * cmake ${COMMON_OPTIONS} -DPCB=9X -DHELI=YES -DTEMPLATES=YES -DTELEMETRY=ARDUPILOT ${SRCDIR} -make -j${CORES} firmware +make -j${CORES} ${FIRMARE_TARGET} # OpenTX on 9X stock with JETI telemetry rm -rf * cmake ${COMMON_OPTIONS} -DPCB=9X -DHELI=YES -DTEMPLATES=YES -DTELEMETRY=JETI ${SRCDIR} -make -j${CORES} firmware +make -j${CORES} ${FIRMARE_TARGET} # OpenTX on Mega2560 rm -rf * cmake ${COMMON_OPTIONS} -DPCB=MEGA2560 -DTEMPLATES=YES -DHELI=YES ${SRCDIR} -make -j${CORES} firmware +make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} simu make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure # OpenTX on Mega2560 with Mavlink telemetry rm -rf * cmake ${COMMON_OPTIONS} -DPCB=MEGA2560 -DTELEMETRY=MAVLINK -DHELI=YES -DTEMPLATES=YES -DAUDIO=YES -DVOICE=YES ${SRCDIR} -make -j${CORES} firmware +make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} simu make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure # OpenTX on gruvin9x board rm -rf * cmake ${COMMON_OPTIONS} -DPCB=GRUVIN9X -DHELI=YES -DTEMPLATES=YES -DAUDIO=YES -DVOICE=YES ${SRCDIR} -make -j${CORES} firmware +make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} simu make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure # OpenTX on Sky9x rm -rf * cmake ${COMMON_OPTIONS} -DPCB=SKY9X -DHELI=YES ${SRCDIR} -make -j${CORES} firmware +make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} simu make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure # OpenTX on AR9X rm -rf * cmake ${COMMON_OPTIONS} -DPCB=AR9X -DHELI=YES ${SRCDIR} -make -j${CORES} firmware +make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} simu make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure # OpenTX on X7 rm -rf * cmake ${COMMON_OPTIONS} -DPCB=X7 -DHELI=YES ${SRCDIR} -make -j${CORES} firmware +make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} simu make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure # OpenTX on X9D rm -rf * cmake ${COMMON_OPTIONS} -DPCB=X9D -DHELI=YES -DLUA=YES -DGVARS=YES ${SRCDIR} -make -j${CORES} firmware +make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} simu make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure # OpenTX on X9D+ rm -rf * cmake ${COMMON_OPTIONS} -DPCB=X9D+ -DHELI=YES -DLUA=YES -DGVARS=YES ${SRCDIR} -make -j${CORES} firmware +make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} simu make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure # OpenTX on Taranis X9E rm -rf * cmake ${COMMON_OPTIONS} -DPCB=X9E -DHELI=YES -DLUA=YES -DGVARS=YES -DPPM_UNIT=PERCENT_PREC1 ${SRCDIR} -make -j${CORES} firmware +make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} simu make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure # OpenTX on Horus beta boards rm -rf * cmake ${COMMON_OPTIONS} -DPCB=HORUS -DPCBREV=10 -DHELI=YES -DLUA=YES -DGVARS=YES ${SRCDIR} -make -j${CORES} firmware +make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} simu make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure # OpenTX on Horus rm -rf * cmake ${COMMON_OPTIONS} -DPCB=HORUS -DHELI=YES -DLUA=YES -DGVARS=YES ${SRCDIR} -make -j${CORES} firmware +make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} simu make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure