From 5722541b6443d11bee06da7efbe8e82bc99b3955 Mon Sep 17 00:00:00 2001 From: M Starch Date: Wed, 7 Aug 2024 15:54:45 -0700 Subject: [PATCH 1/5] Atmega128 build --- cmake/toolchain/ATmega128.cmake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmake/toolchain/ATmega128.cmake b/cmake/toolchain/ATmega128.cmake index 52cfc89..08a363c 100644 --- a/cmake/toolchain/ATmega128.cmake +++ b/cmake/toolchain/ATmega128.cmake @@ -14,10 +14,12 @@ set(CMAKE_CROSSCOMPILING 1) set(FPRIME_PLATFORM "ArduinoFw") set(FPRIME_USE_BAREMETAL_SCHEDULER ON) # set(ARDUINO_LIBRARIES "SPI.h" "Wire.h" "TimerOne.h") -# set(ARDUINO_BUILD_PROPERTIES "build.extra_flags=-DTIMER1_A_PIN=13 -DTIMSK1=TIMSK") +set(ARDUINO_BUILD_PROPERTIES "build.extra_flags=-DTIMER1_A_PIN=13 -DTIMSK1=TIMSK") set(ARDUINO_FQBN "MegaCore:avr:128") add_compile_options(-DATMEGA) # Run the base arduino setup which should detect settings! include("${CMAKE_CURRENT_LIST_DIR}/support/arduino-support.cmake") +SET(CMAKE_RANLIB "${CMAKE_CXX_COMPILER_RANLIB}") + # include_directories("${CMAKE_CURRENT_LIST_DIR}/../../ATmega/vendor/libraries/TimerOne") From 1efa71306870c6b913186f14d051328ff9e711ab Mon Sep 17 00:00:00 2001 From: Nathan Cheek Date: Fri, 23 Aug 2024 23:10:55 -0700 Subject: [PATCH 2/5] ATmega128 clock speed option, ranlib wrapper comment --- cmake/toolchain/ATmega128.cmake | 6 ++++-- cmake/toolchain/support/arduino-support.cmake | 8 +++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/cmake/toolchain/ATmega128.cmake b/cmake/toolchain/ATmega128.cmake index 08a363c..e43c25f 100644 --- a/cmake/toolchain/ATmega128.cmake +++ b/cmake/toolchain/ATmega128.cmake @@ -2,7 +2,7 @@ # ATmega128.cmake: # # Arduino MegaCore ATmega128 support file. This file ensures that the -# ATmega128 can be useds as a target for the CMake system's output. This +# ATmega128 can be used as a target for the CMake system's output. This # sets the Arduino target to be the MegaCore ATmega128. #### @@ -14,12 +14,14 @@ set(CMAKE_CROSSCOMPILING 1) set(FPRIME_PLATFORM "ArduinoFw") set(FPRIME_USE_BAREMETAL_SCHEDULER ON) # set(ARDUINO_LIBRARIES "SPI.h" "Wire.h" "TimerOne.h") -set(ARDUINO_BUILD_PROPERTIES "build.extra_flags=-DTIMER1_A_PIN=13 -DTIMSK1=TIMSK") +# set(ARDUINO_BUILD_PROPERTIES "build.extra_flags=-DTIMER1_A_PIN=13 -DTIMSK1=TIMSK") +set(ARDUINO_BOARD_OPTIONS "clock=7_3728MHz_external") set(ARDUINO_FQBN "MegaCore:avr:128") add_compile_options(-DATMEGA) # Run the base arduino setup which should detect settings! include("${CMAKE_CURRENT_LIST_DIR}/support/arduino-support.cmake") +# Use the ranlib wrapper which adds the appropriate --plugin option for the compiler SET(CMAKE_RANLIB "${CMAKE_CXX_COMPILER_RANLIB}") # include_directories("${CMAKE_CURRENT_LIST_DIR}/../../ATmega/vendor/libraries/TimerOne") diff --git a/cmake/toolchain/support/arduino-support.cmake b/cmake/toolchain/support/arduino-support.cmake index 3b83ac7..080202c 100644 --- a/cmake/toolchain/support/arduino-support.cmake +++ b/cmake/toolchain/support/arduino-support.cmake @@ -40,7 +40,7 @@ function(set_arduino_build_settings) # If it was not found, generate it if (NOT FOUND_LOCATION) set(FOUND_LOCATION "${ARDUINO_WRAPPER_JSON_OUTPUT}") - run_arduino_wrapper("-b" "${ARDUINO_FQBN}" "--properties" ${ARDUINO_BUILD_PROPERTIES} -j "${FOUND_LOCATION}") + run_arduino_wrapper("-b" "${ARDUINO_FQBN}" "--properties" ${ARDUINO_BUILD_PROPERTIES} "--board-options" ${ARDUINO_BOARD_OPTIONS} -j "${FOUND_LOCATION}") endif() file(READ "${FOUND_LOCATION}" WRAPPER_OUTPUT) # Compilers detection @@ -116,7 +116,9 @@ function(setup_arduino_libraries) prevent_prescan(${ARDUINO_LIBRARY_LIST_LOCAL} fprime_arduino_patcher fprime_arduino_loose_object_library) run_arduino_wrapper( -b "${ARDUINO_FQBN}" - --properties ${ARDUINO_BUILD_PROPERTIES} -j "${ARDUINO_WRAPPER_JSON_OUTPUT}" + --properties ${ARDUINO_BUILD_PROPERTIES} + --board-options ${ARDUINO_BOARD_OPTIONS} + -j "${ARDUINO_WRAPPER_JSON_OUTPUT}" --generate-code --libraries ${ARDUINO_LIBRARY_LIST_LOCAL} ) @@ -134,7 +136,7 @@ function(setup_arduino_libraries) set_property(TARGET fprime_arduino_patcher PROPERTY LINK_LIBRARIES ${TARGET_LIBRARIES}) endif() - # Setup library to capture loose object files from arduino-cli compile + # Setup library to capture loose object files from arduino-cli compile if (NOT TARGET fprime_arduino_loose_object_library) add_library(fprime_arduino_loose_object_library OBJECT IMPORTED GLOBAL) set_target_properties(fprime_arduino_loose_object_library PROPERTIES IMPORTED_OBJECTS "${OBJECTS}") From 45417ad656bff53f74eeb3ececd71026ba41ed02 Mon Sep 17 00:00:00 2001 From: Nathan Cheek Date: Thu, 15 Aug 2024 13:00:42 -0700 Subject: [PATCH 3/5] ATmega128 linker and compiler flags, spelling fixes --- Arduino/Drv/HardwareRateDriver/HardwareRateDriver.hpp | 4 ++-- cmake/toolchain/ATmega128.cmake | 3 ++- cmake/toolchain/support/arduino-support.cmake | 5 +++++ cmake/toolchain/support/arduino-wrapper.cmake | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Arduino/Drv/HardwareRateDriver/HardwareRateDriver.hpp b/Arduino/Drv/HardwareRateDriver/HardwareRateDriver.hpp index 6666cc5..b1209f7 100644 --- a/Arduino/Drv/HardwareRateDriver/HardwareRateDriver.hpp +++ b/Arduino/Drv/HardwareRateDriver/HardwareRateDriver.hpp @@ -14,13 +14,13 @@ namespace Arduino { public: /** * Construct the rate driver. Takes in a name (if configured) and a - * rate at witch to drive. + * rate at which to drive. * \param const char* compName: name of the component (only supply if configured) */ HardwareRateDriver(const char* compName); /** - * Configure theis component with the interval time in milliseconds. + * Configure this component with the interval time in milliseconds. * \param U32 intervalMs: interval to ping in milliseconds */ void configure(U32 intervalMs); diff --git a/cmake/toolchain/ATmega128.cmake b/cmake/toolchain/ATmega128.cmake index e43c25f..ea9dd3e 100644 --- a/cmake/toolchain/ATmega128.cmake +++ b/cmake/toolchain/ATmega128.cmake @@ -14,8 +14,9 @@ set(CMAKE_CROSSCOMPILING 1) set(FPRIME_PLATFORM "ArduinoFw") set(FPRIME_USE_BAREMETAL_SCHEDULER ON) # set(ARDUINO_LIBRARIES "SPI.h" "Wire.h" "TimerOne.h") -# set(ARDUINO_BUILD_PROPERTIES "build.extra_flags=-DTIMER1_A_PIN=13 -DTIMSK1=TIMSK") +set(ARDUINO_BUILD_PROPERTIES "build.extra_flags=-flto -mrelax -mcall-prologues") set(ARDUINO_BOARD_OPTIONS "clock=7_3728MHz_external") +set(ARDUINO_LINKER_FLAGS "-Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff") set(ARDUINO_FQBN "MegaCore:avr:128") add_compile_options(-DATMEGA) diff --git a/cmake/toolchain/support/arduino-support.cmake b/cmake/toolchain/support/arduino-support.cmake index 080202c..4f4b0ca 100644 --- a/cmake/toolchain/support/arduino-support.cmake +++ b/cmake/toolchain/support/arduino-support.cmake @@ -64,6 +64,11 @@ function(set_arduino_build_settings) string(REPLACE ";" " " "${LIST_VARIABLE}" "${${LIST_VARIABLE}}") endforeach() + # Add additional linker flags if provided + if (ARDUINO_LINKER_FLAGS) + string(APPEND CMAKE_EXE_LINKER_FLAGS_INIT " ${ARDUINO_LINKER_FLAGS}") + endif() + read_json(INCLUDES "${WRAPPER_OUTPUT}" includes CXX) include_directories(${INCLUDES}) if (NOT TARGET fprime_arduino_libraries) diff --git a/cmake/toolchain/support/arduino-wrapper.cmake b/cmake/toolchain/support/arduino-wrapper.cmake index 167091e..aa12fc4 100644 --- a/cmake/toolchain/support/arduino-wrapper.cmake +++ b/cmake/toolchain/support/arduino-wrapper.cmake @@ -77,7 +77,7 @@ endfunction(run_arduino_wrapper) ### # Function `read_json`: # -# A wrapper to help read JOSN data as native-cmake types. +# A wrapper to help read JSON data as native-cmake types. # # Args: # VARIABLE_NAME: variable to set From 36f82f5bd7b9f2cd8869d9246529ecd88147d7ae Mon Sep 17 00:00:00 2001 From: Nathan Cheek Date: Fri, 23 Aug 2024 23:57:55 -0700 Subject: [PATCH 4/5] Update TimerOne library ATmega128 support --- ATmega/vendor/libraries/TimerOne/README.md | 33 ++++++++++++++ ATmega/vendor/libraries/TimerOne/TimerOne.h | 44 +++++++++---------- .../TimerOne/config/known_16bit_timers.h | 13 ++++-- .../FanSpeed/{FanSpeed.pde => FanSpeed.ino} | 0 .../{Interrupt.pde => Interrupt.ino} | 0 .../libraries/TimerOne/library.properties | 4 +- 6 files changed, 67 insertions(+), 27 deletions(-) create mode 100644 ATmega/vendor/libraries/TimerOne/README.md rename ATmega/vendor/libraries/TimerOne/examples/FanSpeed/{FanSpeed.pde => FanSpeed.ino} (100%) rename ATmega/vendor/libraries/TimerOne/examples/Interrupt/{Interrupt.pde => Interrupt.ino} (100%) diff --git a/ATmega/vendor/libraries/TimerOne/README.md b/ATmega/vendor/libraries/TimerOne/README.md new file mode 100644 index 0000000..0066032 --- /dev/null +++ b/ATmega/vendor/libraries/TimerOne/README.md @@ -0,0 +1,33 @@ +#TimerOne Library + +Paul Stoffregen's modified TimerOne. This version provides 2 main benefits: + +1: Optimized inline functions - much faster for the most common usage +2: Support for more boards (including ATTiny85 except for the PWM functionality) + +http://www.pjrc.com/teensy/td_libs_TimerOne.html + +https://github.com/PaulStoffregen/TimerOne + +Original code + +http://playground.arduino.cc/Code/Timer1 + +Open Source License + +TimerOne is free software. You can redistribute it and/or modify it under +the terms of Creative Commons Attribution 3.0 United States License. +To view a copy of this license, visit + +http://creativecommons.org/licenses/by/3.0/us/ + +Paul Stoffregen forked this version from an early copy of TimerOne/TimerThree +which was licensed "Creative Commons Attribution 3.0" and has maintained +the original "CC BY 3.0 US" license terms. + +Other, separately developed updates to TimerOne have been released by other +authors under the GNU GPLv2 license. Multiple copies of this library, bearing +the same name but distributed under different license terms, is unfortunately +confusing. This copy, with nearly all the code redesigned as inline functions, +is provided under the "CC BY 3.0 US" license terms. + diff --git a/ATmega/vendor/libraries/TimerOne/TimerOne.h b/ATmega/vendor/libraries/TimerOne/TimerOne.h index 2c192fe..43ea737 100644 --- a/ATmega/vendor/libraries/TimerOne/TimerOne.h +++ b/ATmega/vendor/libraries/TimerOne/TimerOne.h @@ -6,11 +6,12 @@ * Modified April 2012 by Paul Stoffregen - portable to other AVR chips, use inline functions * Modified again, June 2014 by Paul Stoffregen - support Teensy 3.x & even more AVR chips * Modified July 2017 by Stoyko Dimitrov - added support for ATTiny85 except for the PWM functionality - * + * Modified August 2024 by Nathan Cheek - added support for ATmega128 + * * * This is free software. You can redistribute it and/or modify it under - * the terms of Creative Commons Attribution 3.0 United States License. - * To view a copy of this license, visit http://creativecommons.org/licenses/by/3.0/us/ + * the terms of Creative Commons Attribution 3.0 United States License. + * To view a copy of this license, visit http://creativecommons.org/licenses/by/3.0/us/ * or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA. * */ @@ -52,7 +53,7 @@ class TimerOne TIMSK |= _BV(OCIE1A); //enable interrupt when OCR1A matches the timer value setPeriod(microseconds); } - void setPeriod(unsigned long microseconds) __attribute__((always_inline)) { + void setPeriod(unsigned long microseconds) __attribute__((always_inline)) { const unsigned long cycles = microseconds * ratio; if (cycles < TIMER1_RESOLUTION) { clockSelectBits = _BV(CS10); @@ -121,13 +122,13 @@ class TimerOne OCR1C = pwmPeriod; TCCR1 = _BV(CTC1) | clockSelectBits; } - + //**************************** // Run Control - //**************************** + //**************************** void start() __attribute__((always_inline)) { TCCR1 = 0; - TCNT1 = 0; + TCNT1 = 0; resume(); } void stop() __attribute__((always_inline)) { @@ -139,13 +140,13 @@ class TimerOne void resume() __attribute__((always_inline)) { TCCR1 = _BV(CTC1) | clockSelectBits; } - + //**************************** // PWM outputs //**************************** //Not implemented yet for ATTiny85 //TO DO - + //**************************** // Interrupt Function //**************************** @@ -168,21 +169,21 @@ class TimerOne static unsigned short pwmPeriod; static unsigned char clockSelectBits; static const byte ratio = (F_CPU)/ ( 1000000 ); - + #elif defined(__AVR__) #if defined (__AVR_ATmega8__) || defined (__AVR_ATmega128__) //in some io definitions for older microcontrollers TIMSK is used instead of TIMSK1 #define TIMSK1 TIMSK #endif - + public: //**************************** // Configuration //**************************** void initialize(unsigned long microseconds=1000000) __attribute__((always_inline)) { TCCR1B = _BV(WGM13); // set mode as phase and frequency correct pwm, stop the timer - TCCR1A = 0; // clear control register A + TCCR1A = 0; // clear control register A setPeriod(microseconds); } void setPeriod(unsigned long microseconds) __attribute__((always_inline)) { @@ -275,15 +276,14 @@ class TimerOne //**************************** // Interrupt Function //**************************** - + void attachInterrupt(void (*isr)()) __attribute__((always_inline)) { isrCallback = isr; - #if defined(__AVR_ATmega128__) - TIMSK1 |= _BV(TOIE1); - TIMSK1 &= ~(_BV(TICIE1) | _BV(OCIE1A) | _BV(OCIE1B)); + TIMSK1 |= _BV(TOIE1); + TIMSK1 &= ~(_BV(TICIE1) | _BV(OCIE1A) | _BV(OCIE1B)); #else - TIMSK1 = _BV(TOIE1); + TIMSK1 = _BV(TOIE1); #endif } void attachInterrupt(void (*isr)(), unsigned long microseconds) __attribute__((always_inline)) { @@ -291,10 +291,10 @@ class TimerOne attachInterrupt(isr); } void detachInterrupt() __attribute__((always_inline)) { - #if defined(__AVR_ATmega128__) - TIMSK1 &= ~(_BV(TOIE1) | _BV(TICIE1) | _BV(OCIE1A) | _BV(OCIE1B)); + #if defined(__AVR_ATmega128__) + TIMSK1 &= ~(_BV(TOIE1) | _BV(TICIE1) | _BV(OCIE1A) | _BV(OCIE1B)); #else - TIMSK1 = 0; + TIMSK1 = 0; #endif } static void (*isrCallback)(); @@ -339,10 +339,10 @@ class TimerOne // This is like a binary serch tree and no more than 3 conditions are evaluated. // I haven't checked if this becomes significantly longer ASM than the simple ladder. // It looks very similar to the ladder tho: same # of if's and else's - + /* // This code does not work properly in all cases :( - // https://github.com/PaulStoffregen/TimerOne/issues/17 + // https://github.com/PaulStoffregen/TimerOne/issues/17 if (cycles < TIMER1_RESOLUTION * 16) { if (cycles < TIMER1_RESOLUTION * 4) { if (cycles < TIMER1_RESOLUTION) { diff --git a/ATmega/vendor/libraries/TimerOne/config/known_16bit_timers.h b/ATmega/vendor/libraries/TimerOne/config/known_16bit_timers.h index 3530c3b..7aed224 100644 --- a/ATmega/vendor/libraries/TimerOne/config/known_16bit_timers.h +++ b/ATmega/vendor/libraries/TimerOne/config/known_16bit_timers.h @@ -48,7 +48,7 @@ #define TIMER3_A_PIN 32 #define TIMER3_B_PIN 25 #define TIMER3_ICP_PIN 32 - + // Teensy 3.5 / Teensy 3.6 // #elif defined(__MK64FX512__) || defined(__MK66FX1M0__) @@ -58,7 +58,7 @@ #define TIMER3_A_PIN 29 #define TIMER3_B_PIN 30 #define TIMER3_ICP_PIN 29 - + // Teensy-LC // #elif defined(__MKL26Z64__) @@ -121,7 +121,7 @@ #define TIMER1_B_PIN 10 #define TIMER1_ICP_PIN 8 #define TIMER1_CLK_PIN 5 -#elif defined(__AVR_ATmega328PB__) +#elif defined(__AVR_ATmega328PB__) #define TIMER1_A_PIN 9 #define TIMER1_B_PIN 10 #define TIMER1_ICP_PIN 8 @@ -142,6 +142,13 @@ #define TIMER1_B_PIN 11 //#define TIMER1_ICP_PIN 8 //#define TIMER1_CLK_PIN 5 + +#elif defined (__AVR_ATmega128__) + #define TIMER1_A_PIN 13 // PB5 + #define TIMER1_B_PIN 14 // PB6 + #define TIMER1_C_PIN 15 // PB7 + #define TIMER1_ICP_PIN 22 // PD4 + #define TIMER1_CLK_PIN 24 // PD6 // Sanguino // diff --git a/ATmega/vendor/libraries/TimerOne/examples/FanSpeed/FanSpeed.pde b/ATmega/vendor/libraries/TimerOne/examples/FanSpeed/FanSpeed.ino similarity index 100% rename from ATmega/vendor/libraries/TimerOne/examples/FanSpeed/FanSpeed.pde rename to ATmega/vendor/libraries/TimerOne/examples/FanSpeed/FanSpeed.ino diff --git a/ATmega/vendor/libraries/TimerOne/examples/Interrupt/Interrupt.pde b/ATmega/vendor/libraries/TimerOne/examples/Interrupt/Interrupt.ino similarity index 100% rename from ATmega/vendor/libraries/TimerOne/examples/Interrupt/Interrupt.pde rename to ATmega/vendor/libraries/TimerOne/examples/Interrupt/Interrupt.ino diff --git a/ATmega/vendor/libraries/TimerOne/library.properties b/ATmega/vendor/libraries/TimerOne/library.properties index 2664671..4822b6b 100644 --- a/ATmega/vendor/libraries/TimerOne/library.properties +++ b/ATmega/vendor/libraries/TimerOne/library.properties @@ -1,6 +1,6 @@ name=TimerOne -version=1.1 -author=Stoyko Dimitrov, Jesse Tane, Jérôme Despatis, Michael Polli, Dan Clemens, Paul Stoffregen +version=1.1.1 +author=Stoyko Dimitrov, Jesse Tane, Jérôme Despatis, Michael Polli, Dan Clemens, Nathan Cheek, Paul Stoffregen maintainer=Paul Stoffregen sentence=Use hardware Timer1 for finer PWM control and/or running an periodic interrupt function paragraph= From e03dcb5e976f7cf1b74fb99d1d9086637f489d33 Mon Sep 17 00:00:00 2001 From: Nathan Cheek Date: Sat, 24 Aug 2024 00:03:07 -0700 Subject: [PATCH 5/5] Use patched TimerOne library --- Arduino/Drv/HardwareRateDriver/CMakeLists.txt | 2 +- Arduino/Drv/HardwareRateDriver/HardwareRateDriverAvr.cpp | 2 +- cmake/toolchain/ATmega128.cmake | 3 --- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Arduino/Drv/HardwareRateDriver/CMakeLists.txt b/Arduino/Drv/HardwareRateDriver/CMakeLists.txt index 2ecc115..fcfc579 100644 --- a/Arduino/Drv/HardwareRateDriver/CMakeLists.txt +++ b/Arduino/Drv/HardwareRateDriver/CMakeLists.txt @@ -20,7 +20,7 @@ elseif (IS_TEENSY) target_use_arduino_libraries("IntervalTimer") list(APPEND SOURCE_FILES "${CMAKE_CURRENT_LIST_DIR}/HardwareRateDriverTeensy.cpp") elseif (IS_ATMEGA) - target_use_arduino_libraries("TimerOne") + list(APPEND SOURCE_FILES "${CMAKE_CURRENT_LIST_DIR}/../../../ATmega/vendor/libraries/TimerOne/TimerOne.cpp") list(APPEND SOURCE_FILES "${CMAKE_CURRENT_LIST_DIR}/HardwareRateDriverAvr.cpp") else() list(APPEND SOURCE_FILES "${CMAKE_CURRENT_LIST_DIR}/HardwareRateDriverBasic.cpp") diff --git a/Arduino/Drv/HardwareRateDriver/HardwareRateDriverAvr.cpp b/Arduino/Drv/HardwareRateDriver/HardwareRateDriverAvr.cpp index 06762a7..78b4cf5 100644 --- a/Arduino/Drv/HardwareRateDriver/HardwareRateDriverAvr.cpp +++ b/Arduino/Drv/HardwareRateDriver/HardwareRateDriverAvr.cpp @@ -1,7 +1,7 @@ #include #include #include -#include +#include namespace Arduino { diff --git a/cmake/toolchain/ATmega128.cmake b/cmake/toolchain/ATmega128.cmake index ea9dd3e..57507a5 100644 --- a/cmake/toolchain/ATmega128.cmake +++ b/cmake/toolchain/ATmega128.cmake @@ -13,7 +13,6 @@ set(CMAKE_SYSTEM_PROCESSOR "avr") set(CMAKE_CROSSCOMPILING 1) set(FPRIME_PLATFORM "ArduinoFw") set(FPRIME_USE_BAREMETAL_SCHEDULER ON) -# set(ARDUINO_LIBRARIES "SPI.h" "Wire.h" "TimerOne.h") set(ARDUINO_BUILD_PROPERTIES "build.extra_flags=-flto -mrelax -mcall-prologues") set(ARDUINO_BOARD_OPTIONS "clock=7_3728MHz_external") set(ARDUINO_LINKER_FLAGS "-Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff") @@ -24,5 +23,3 @@ add_compile_options(-DATMEGA) include("${CMAKE_CURRENT_LIST_DIR}/support/arduino-support.cmake") # Use the ranlib wrapper which adds the appropriate --plugin option for the compiler SET(CMAKE_RANLIB "${CMAKE_CXX_COMPILER_RANLIB}") - -# include_directories("${CMAKE_CURRENT_LIST_DIR}/../../ATmega/vendor/libraries/TimerOne")