From 8d5342f4fb5c5bdc67e4901b46b0eb4152d814a2 Mon Sep 17 00:00:00 2001 From: jakeg00dwin Date: Fri, 14 Jun 2024 16:21:07 -0700 Subject: [PATCH] Copied over the AVR branch from the original template. --- CMakeLists.txt | 9 +- avr-gcc-toolchain.cmake | 49 ++++++ .../CMakeDirectoryInformation.cmake | 16 ++ build/mocks/CMakeFiles/progress.marks | 1 + build/mocks/CTestTestfile.cmake | 6 + build/mocks/Makefile | 154 ++++++++++++++++++ build/mocks/cmake_install.cmake | 44 +++++ otto.sh | 42 ++++- src/CMakeLists.txt | 39 ++++- src/main.c | 55 ++++++- 10 files changed, 399 insertions(+), 16 deletions(-) create mode 100644 avr-gcc-toolchain.cmake create mode 100644 build/mocks/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 build/mocks/CMakeFiles/progress.marks create mode 100644 build/mocks/CTestTestfile.cmake create mode 100644 build/mocks/Makefile create mode 100644 build/mocks/cmake_install.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index d1b9750..4a4625d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.20) # Use the fancy version substitution -project(cmake-cpputest-template +project(main VERSION 1.0 DESCRIPTION "template for cmake + cpputest" LANGUAGES C CXX @@ -22,17 +22,16 @@ endif() set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # Request C 17 standard features -set(CMAKE_C_STANDARD 17) +set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED True) -set(CMAKE_C_FLAGS "-Wall -Werror -Wpedantic") +# set(CMAKE_C_FLAGS "-Wall -Werror -Wpedantic") # SETUP THE CXX flags for .cpp -set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True) set(CMAKE_CXX_FLAGS "-Wall -Werror -Wpedantic") - # ####################################### # TESTING STUFF # ####################################### diff --git a/avr-gcc-toolchain.cmake b/avr-gcc-toolchain.cmake new file mode 100644 index 0000000..6f5e353 --- /dev/null +++ b/avr-gcc-toolchain.cmake @@ -0,0 +1,49 @@ +# ############################### +# AVR-GCC toolchain file +# ############################### + +# Specify the cross-compiler +set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_VERSION 1) +set(CMAKE_SYSTEM_PROCESSOR avr) + +# Specify the compiler and linker +set(AVR_MCU atmega328p) # The old Classic +#set(AVR_MCU attiny85) # The older ATtiny series, avr25 +#set(AVR_MCU attiny404) # this is the avrxmega3 series +#set(AVR_MCU avr64dd28) # Newer DX series, avrxmega2 + +# The default frequency of an 328p devboard using the external crystal. +set(F_CPU 16000000UL) +#set(F_CPU 8000000) +add_compile_definitions(F_CPU=${F_CPU}) +# add_compile_definitions(MCU=atmega328p) +add_compile_definitions(__AVR_ATmega328P__) + +# Set up the programmer for it +#set(PROGRAMMER usbasp-clone) +set(PROGRAMMER arduino) + +# Set the Port for the programmer +set(PORT /dev/ttyUSB0) + + +# Define the toolchain executables +set(CMAKE_C_COMPILER avr-gcc) +set(CMAKE_CXX_COMPILER avr-g++) +set(CMAKE_ASM_COMPILER avr-gcc) +set(CMAKE_LINKER avr-ld) +set(CMAKE_OBJCOPY avr-objcopy) +set(CMAKE_SIZE avr-size) + + +# Define compile options +set(CMAKE_C_FLAGS " -Os -mmcu=${AVR_MCU} -DF_CPU=${F_CPU}") +set(CMAKE_CXX_FLAGS "-mmcu=${AVR_MCU} -DF_CPU=${F_CPU}") +set(CMAKE_EXE_LINKER_FLAGS_INIT "-mmcu=${AVR_MCU}") + + +# Define the archiver and other tools +set(CMAKE_AR avr-ar) +set(CMAKE_RANLIB avr-ranlib) + diff --git a/build/mocks/CMakeFiles/CMakeDirectoryInformation.cmake b/build/mocks/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..5f8adb4 --- /dev/null +++ b/build/mocks/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.22 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/ronin/Documents/projects/templates/cpputest_template_worktrees/avr") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/ronin/Documents/projects/templates/cpputest_template_worktrees/avr/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/build/mocks/CMakeFiles/progress.marks b/build/mocks/CMakeFiles/progress.marks new file mode 100644 index 0000000..573541a --- /dev/null +++ b/build/mocks/CMakeFiles/progress.marks @@ -0,0 +1 @@ +0 diff --git a/build/mocks/CTestTestfile.cmake b/build/mocks/CTestTestfile.cmake new file mode 100644 index 0000000..fe64b2e --- /dev/null +++ b/build/mocks/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/ronin/Documents/projects/templates/cpputest_template_worktrees/avr/mocks +# Build directory: /home/ronin/Documents/projects/templates/cpputest_template_worktrees/avr/build/mocks +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/build/mocks/Makefile b/build/mocks/Makefile new file mode 100644 index 0000000..d79450e --- /dev/null +++ b/build/mocks/Makefile @@ -0,0 +1,154 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.22 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Produce verbose output by default. +VERBOSE = 1 + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/ronin/Documents/projects/templates/cpputest_template_worktrees/avr + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/ronin/Documents/projects/templates/cpputest_template_worktrees/avr/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..." + /usr/bin/cmake-gui -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/ronin/Documents/projects/templates/cpputest_template_worktrees/avr/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/ronin/Documents/projects/templates/cpputest_template_worktrees/avr/build/CMakeFiles /home/ronin/Documents/projects/templates/cpputest_template_worktrees/avr/build/mocks//CMakeFiles/progress.marks + cd /home/ronin/Documents/projects/templates/cpputest_template_worktrees/avr/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 mocks/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/ronin/Documents/projects/templates/cpputest_template_worktrees/avr/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/ronin/Documents/projects/templates/cpputest_template_worktrees/avr/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 mocks/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/ronin/Documents/projects/templates/cpputest_template_worktrees/avr/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 mocks/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/ronin/Documents/projects/templates/cpputest_template_worktrees/avr/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 mocks/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/ronin/Documents/projects/templates/cpputest_template_worktrees/avr/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... rebuild_cache" + @echo "... test" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/ronin/Documents/projects/templates/cpputest_template_worktrees/avr/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/build/mocks/cmake_install.cmake b/build/mocks/cmake_install.cmake new file mode 100644 index 0000000..81d36b0 --- /dev/null +++ b/build/mocks/cmake_install.cmake @@ -0,0 +1,44 @@ +# Install script for directory: /home/ronin/Documents/projects/templates/cpputest_template_worktrees/avr/mocks + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set default install directory permissions. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + diff --git a/otto.sh b/otto.sh index 8765c50..549aba7 100755 --- a/otto.sh +++ b/otto.sh @@ -3,7 +3,7 @@ # Date: 2024 # Filename: otto.sh -CROSS_TC_WIN="$(pwd)/i686-w64-mingw32_toolchain.cmake" +AVR_TC="$(pwd)/avr-gcc-toolchain.cmake" CMAKE_VERBOSE="ON" CROSS_COMPILE=1 TEMPLATE_FILES=".template_files" @@ -166,11 +166,37 @@ build_release() { build_main () { clear_cmake_cache - cmake -DCMAKE_VERBOSE_MAKEFILE=${CMAKE_VERBOSE} ../ make main } +build_hex () { + clear_cmake_cache + + CMAKE_ARGS="-DCMAKE_VERBOSE_MAKEFILE=${CMAKE_VERBOSE}" + CMAKE_ARGS="${CMAKE_ARGS} -DCMAKE_TOOLCHAIN_FILE=${AVR_TC}" + + cmake ${CMAKE_ARGS} ../ + make all + make hex +} + +build_hex_optimized () { + clear_cmake_cache + + CMAKE_ARGS="-DCMAKE_VERBOSE_MAKEFILE=${CMAKE_VERBOSE}" + CMAKE_ARGS="${CMAKE_ARGS} -DCMAKE_TOOLCHAIN_FILE=${AVR_TC}" + + cmake ${CMAKE_ARGS} ../ + make all + make hex-release +} + +flash_avr () { + build_hex_optimized + make upload +} + run_c_tests () { clear_cmake_cache cmake -DUNIT_TESTING=ON -DCMAKE_VERBOSE_MAKEFILE=${CMAKE_VERBOSE} ../ @@ -180,9 +206,9 @@ run_c_tests () { print_menu () { echo "BUILD MENU:" echo "1. Run Tests" - echo "2. Build Project" - echo "3. Build for release" - echo "4. cross compile for XXXXXX" + echo "2. Build Project(hex)" + echo "3. Build for release(hex)" + echo "4. Flash to AVR" echo "5. Add new module to project" echo "6. Delete module from project" echo "7. Exit" @@ -206,17 +232,17 @@ main() { 2) echo "You selected Option 2" valid_choice=true - build_main + build_hex ;; 3) echo "You selected Option 3" valid_choice=true - build_release + build_hex_optimized ;; 4) echo "You selected Option 4" valid_choice=true - cross_compile + flash_avr ;; 5) echo "You selected Option 5" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f9696af..6f24694 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,3 +1,40 @@ -add_executable(main +add_executable(${PROJECT_NAME} main.c ) + +# Ensure the build rules are defined +set_target_properties(${PROJECT_NAME} PROPERTIES SUFFIX ".elf") + +if(NOT TARGET size) +# Set the size utility to display the size of the final binary +add_custom_target(size ALL + COMMAND ${CMAKE_SIZE} --format=avr --mcu=${AVR_MCU} ${CMAKE_PROJECT_NAME}.elf + DEPENDS ${CMAKE_PROJECT_NAME}.elf +) +endif() + + +if(NOT TARGET hex) +# Define how to convert ELF to HEX +add_custom_target(hex ALL + COMMAND ${CMAKE_OBJCOPY} -O ihex -R .eeprom ${CMAKE_PROJECT_NAME}.elf ${CMAKE_PROJECT_NAME}.hex + DEPENDS ${CMAKE_PROJECT_NAME}.elf +) +endif() + +if(NOT TARGET bin) +# Define how to convert ELF to BIN +add_custom_target(bin ALL + COMMAND ${CMAKE_OBJCOPY} -O binary -R .eeprom ${CMAKE_PROJECT_NAME}.elf ${CMAKE_PROJECT_NAME}.bin + DEPENDS ${CMAKE_PROJECT_NAME}.elf +) +endif() + + +if(NOT TARGET upload) +# Upload command (adjust according to your programmer) +add_custom_target(upload ALL + COMMAND avrdude -c ${PROGRAMMER} -P ${PORT} -p ${AVR_MCU} -U flash:w:${CMAKE_PROJECT_NAME}.hex + DEPENDS hex +) +endif() diff --git a/src/main.c b/src/main.c index 23fbcc0..6f256ad 100644 --- a/src/main.c +++ b/src/main.c @@ -1,8 +1,59 @@ #include "stdio.h" +#include +#include + + +//############################# +//Globals +//############################# + +#define LED_PORT (1<<5) +#define LED_PIN PB5 +#define BLINK_DELAY_MS 5000 + +//############################# +//Prototypes +//############################# + +void led_blink(void); + + + +//############################# +//MAIN +//############################# + int main(int argc, char **argv) -{ - printf("Hello!\n"); +{ + led_blink(); + + while(1) { + led_blink(); + _delay_ms(500); + } + return 0; } + + +//############################# +//FUNCTIONS +//############################# + +/* + * Input: None + * Output: None + * Description: Toggles the pin for the LED indicator. + */ +void led_blink(void) { + //Set the DDR for output. + DDRB |= LED_PORT; + + PORTB ^= (1<