Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,5 +33,8 @@ jobs:
- name: Configure firmware/rmcs_board
run: cmake --preset debug -S firmware/rmcs_board

- name: Configure firmware/c_board
run: cmake --preset debug -S firmware/c_board

- name: Run clang-tidy check
run: .scripts/clang-tidy-check
8 changes: 8 additions & 0 deletions .scripts/lint-targets.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,11 @@ rmcs_board:
- core/include
- firmware/rmcs_board/src
- firmware/rmcs_board/include

c_board:
cmake: firmware/c_board/CMakeLists.txt
folders:
- core/src
- core/include
- firmware/c_board/src
- firmware/c_board/include
3 changes: 3 additions & 0 deletions firmware/c_board/.clang-tidy
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
InheritParentConfig: true
CheckOptions:
misc-include-cleaner.IgnoreHeaders: "bits/.+h;cmsis_.+h"
13 changes: 13 additions & 0 deletions firmware/c_board/.clangd
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
CompileFlags:
Add:
- "--target=arm-none-eabi"
- "-isystem/opt/arm-none-eabi/arm-none-eabi/include/c++/15.2.1"
- "-isystem/opt/arm-none-eabi/arm-none-eabi/include/c++/15.2.1/arm-none-eabi"
- "-isystem/opt/arm-none-eabi/arm-none-eabi/include/c++/15.2.1/backward"
- "-isystem/opt/arm-none-eabi/lib/gcc/arm-none-eabi/15.2.1/include-fixed"
- "-isystem/opt/arm-none-eabi/arm-none-eabi/include"
Diagnostics:
Includes:
IgnoreHeader:
- "bits/.+h" # https://github.com/llvm/llvm-project/issues/68213
- "cmsis_.+h"
129 changes: 129 additions & 0 deletions firmware/c_board/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
cmake_minimum_required(VERSION 3.28)
set(CMAKE_CXX_SCAN_FOR_MODULES OFF)

# Language standards
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Debug")
endif()

set(CMAKE_PROJECT_NAME librmcs-firmware)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

project(${CMAKE_PROJECT_NAME})
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
enable_language(C CXX ASM)

set(LIBRMCS_PROJECT_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../..")
cmake_path(ABSOLUTE_PATH LIBRMCS_PROJECT_ROOT NORMALIZE)

if(NOT DEFINED LIBRMCS_PROJECT_VERSION OR LIBRMCS_PROJECT_VERSION STREQUAL "")
execute_process(
COMMAND ".scripts/generate_version"
WORKING_DIRECTORY "${LIBRMCS_PROJECT_ROOT}"
OUTPUT_VARIABLE LIBRMCS_PROJECT_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE
COMMAND_ERROR_IS_FATAL ANY
)
endif()
message(STATUS "Librmcs project version: ${LIBRMCS_PROJECT_VERSION}")

add_executable(${CMAKE_PROJECT_NAME})

# Add libstdc++ for C++ code. This is consumed by stm32cubemx/CMakeLists.txt
# via TOOLCHAIN_LINK_LIBRARIES.
list(APPEND TOOLCHAIN_LINK_LIBRARIES "stdc++")

# Bring in CubeMX generated HAL build definitions.
add_subdirectory(bsp/HAL/cmake/stm32cubemx)

# Mark CubeMX/HAL headers as SYSTEM so they show up as `-isystem` in
# compile_commands.json (clang-tidy should not warn on third-party code).
if(TARGET stm32cubemx)
get_target_property(HAL_INCLUDE_DIRS stm32cubemx INTERFACE_INCLUDE_DIRECTORIES)
if(HAL_INCLUDE_DIRS AND NOT HAL_INCLUDE_DIRS STREQUAL "HAL_INCLUDE_DIRS-NOTFOUND")
set_property(TARGET stm32cubemx PROPERTY INTERFACE_INCLUDE_DIRECTORIES "")
target_include_directories(stm32cubemx SYSTEM INTERFACE ${HAL_INCLUDE_DIRS})
endif()
endif()

# --- Compile options ---
target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE
-fvisibility=hidden
$<$<COMPILE_LANGUAGE:CXX>:-Wall -Wextra -Wpedantic>
$<$<COMPILE_LANGUAGE:CXX>:-fno-unwind-tables>
$<$<COMPILE_LANGUAGE:CXX>:-fno-asynchronous-unwind-tables>
$<$<COMPILE_LANGUAGE:CXX>:-fno-use-cxa-atexit>
)

# --- HOST_DEBUGGER support ---
option(HOST_DEBUGGER "Debugger runs outside Dev Container (Docker)" OFF)
set(SOURCE_PATH_MAP "" CACHE PATH "(In container) Map container source path to a host-visible path for debugger")

if(HOST_DEBUGGER AND SOURCE_PATH_MAP STREQUAL "")
if(DEFINED ENV{HOST_WORKSPACE_FOLDER} AND NOT "$ENV{HOST_WORKSPACE_FOLDER}" STREQUAL "")
set(SOURCE_PATH_MAP "$ENV{HOST_WORKSPACE_FOLDER}")
else()
message(FATAL_ERROR "HOST_WORKSPACE_FOLDER is not set")
endif()
endif()
if(NOT SOURCE_PATH_MAP STREQUAL "")
set(SOURCE_PATH_MAP "${SOURCE_PATH_MAP}/")
cmake_path(NORMAL_PATH SOURCE_PATH_MAP)

target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE
"-fdebug-prefix-map=${LIBRMCS_PROJECT_ROOT}=${SOURCE_PATH_MAP}"
"-ffile-prefix-map=${LIBRMCS_PROJECT_ROOT}=${SOURCE_PATH_MAP}"
)
endif()

# Debug build: append -Og (overrides toolchain's -O0, GCC takes last)
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE -Og)
endif()

# --- User application sources ---
file(GLOB_RECURSE APP_SOURCES CONFIGURE_DEPENDS src/*.cpp src/*.c)
file(GLOB_RECURSE CORE_SOURCES CONFIGURE_DEPENDS
"${LIBRMCS_PROJECT_ROOT}/core/src/*.cpp"
"${LIBRMCS_PROJECT_ROOT}/core/src/*.c"
)
file(GLOB SEGGER_C_SOURCES bsp/SEGGER/RTT/*.c)
file(GLOB SEGGER_ASM_SOURCES bsp/SEGGER/RTT/*.S)

target_sources(${CMAKE_PROJECT_NAME} PRIVATE
${APP_SOURCES}
${CORE_SOURCES}
${SEGGER_C_SOURCES}
${SEGGER_ASM_SOURCES}
)

# --- Include paths ---
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
${LIBRMCS_PROJECT_ROOT}
)

# SEGGER RTT is third-party code; treat its headers as system headers.
target_include_directories(${CMAKE_PROJECT_NAME} SYSTEM PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/bsp/SEGGER/RTT
${CMAKE_CURRENT_SOURCE_DIR}/bsp/SEGGER/Config
)

# --- Defines ---
target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE
LIBRMCS_PROJECT_VERSION_STRING="${LIBRMCS_PROJECT_VERSION}"
$<$<CONFIG:Release>:NDEBUG>
)

# Remove wrong libob.a dependency (CubeMX toolchain quirk)
list(REMOVE_ITEM CMAKE_C_IMPLICIT_LINK_LIBRARIES ob)

target_link_libraries(${CMAKE_PROJECT_NAME}
stm32cubemx
)
35 changes: 35 additions & 0 deletions firmware/c_board/CMakePresets.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"version": 4,
"configurePresets": [
{
"name": "base",
"hidden": true,
"generator": "Ninja",
"binaryDir": "${sourceDir}/build",
"toolchainFile": "${sourceDir}/bsp/HAL/cmake/gcc-arm-none-eabi.cmake"
},
{
"name": "debug",
"inherits": "base",
"cacheVariables": {
"HOST_DEBUGGER": "OFF",
"CMAKE_BUILD_TYPE": "Debug"
}
},
{
"name": "debug-outside",
"inherits": "base",
"cacheVariables": {
"HOST_DEBUGGER": "ON",
"CMAKE_BUILD_TYPE": "Debug"
}
},
{
"name": "release",
"inherits": "base",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release"
}
}
]
}
52 changes: 52 additions & 0 deletions firmware/c_board/bsp/HAL/.mxproject

Large diffs are not rendered by default.

68 changes: 68 additions & 0 deletions firmware/c_board/bsp/HAL/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
cmake_minimum_required(VERSION 3.22)

#
# This file is generated only once,
# and is not re-generated if converter is called multiple times.
#
# User is free to modify the file as much as necessary
#

# Setup compiler settings
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS ON)


# Define the build type
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Debug")
endif()

# Set the project name
set(CMAKE_PROJECT_NAME rmcs_slave)

# Enable compile command to ease indexing with e.g. clangd
set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)

# Core project settings
project(${CMAKE_PROJECT_NAME})
message("Build type: " ${CMAKE_BUILD_TYPE})

# Enable CMake support for ASM and C languages
enable_language(C ASM)

# Create an executable object type
add_executable(${CMAKE_PROJECT_NAME})

# Add STM32CubeMX generated sources
add_subdirectory(cmake/stm32cubemx)

# Link directories setup
target_link_directories(${CMAKE_PROJECT_NAME} PRIVATE
# Add user defined library search paths
)

# Add sources to executable
target_sources(${CMAKE_PROJECT_NAME} PRIVATE
# Add user sources here
)

# Add include paths
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
# Add user defined include paths
)

# Add project symbols (macros)
target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE
# Add user defined symbols
)

# Remove wrong libob.a library dependency when using cpp files
list(REMOVE_ITEM CMAKE_C_IMPLICIT_LINK_LIBRARIES ob)

# Add linked libraries
target_link_libraries(${CMAKE_PROJECT_NAME}
stm32cubemx

# Add user defined libraries
)
38 changes: 38 additions & 0 deletions firmware/c_board/bsp/HAL/CMakePresets.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"version": 3,
"configurePresets": [
{
"name": "default",
"hidden": true,
"generator": "Ninja",
"binaryDir": "${sourceDir}/build/${presetName}",
"toolchainFile": "${sourceDir}/cmake/gcc-arm-none-eabi.cmake",
"cacheVariables": {
}
},
{
"name": "Debug",
"inherits": "default",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug"
}
},
{
"name": "Release",
"inherits": "default",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release"
}
}
],
"buildPresets": [
{
"name": "Debug",
"configurePreset": "Debug"
},
{
"name": "Release",
"configurePreset": "Release"
}
]
}
55 changes: 55 additions & 0 deletions firmware/c_board/bsp/HAL/Core/Inc/can.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file can.h
* @brief This file contains all the function prototypes for
* the can.c file
******************************************************************************
* @attention
*
* Copyright (c) 2024 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CAN_H__
#define __CAN_H__

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* USER CODE BEGIN Includes */
#include "stm32f4xx_hal_can.h" // IWYU pragma: export
/* USER CODE END Includes */

extern CAN_HandleTypeDef hcan1;

extern CAN_HandleTypeDef hcan2;

/* USER CODE BEGIN Private defines */

/* USER CODE END Private defines */

void MX_CAN1_Init(void);
void MX_CAN2_Init(void);

/* USER CODE BEGIN Prototypes */

/* USER CODE END Prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __CAN_H__ */

Loading