Skip to content
Merged
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
64 changes: 64 additions & 0 deletions cmake/riscv64-gcc-rv32imc.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# /***************************************************************************
# * Copyright (C) 2026 Eclipse ThreadX contributors
# *
# * This program and the accompanying materials are made available under the
# * terms of the MIT License which is available at
# * https://opensource.org/licenses/MIT.
# *
# * AI Disclosure: This file was largely AI-generated by Copilot (Sonnet 4.6).
# * The AI-generated portions may be considered public domain (CC0-1.0)
# * and not subject to the project's licence. The human contributor has
# * reviewed and verified that the code is correct.
# *
# * SPDX-License-Identifier: MIT and CC0-1.0
# ***************************************************************************/

# CMake toolchain file for CORE-V MCU (CV32E40P, RV32IMC)
#
# Uses the riscv64-unknown-elf-gcc multi-lib toolchain (Ubuntu package
# gcc-riscv64-unknown-elf) to cross-compile for a 32-bit RISC-V target.
#
# Target ISA : rv32imc_zicsr (integer, multiply, compressed, Zicsr)
# ABI : ilp32 (32-bit int/long/ptr, no hardware FP)
# Code model : medlow (addresses in [0, 2 GiB))

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR riscv)

set(THREADX_ARCH "risc-v32")
set(THREADX_TOOLCHAIN "gnu")

set(ARCH_FLAGS "-march=rv32imc_zicsr -mabi=ilp32 -mcmodel=medlow")
set(CFLAGS "${ARCH_FLAGS}")
set(ASFLAGS "${ARCH_FLAGS}")
set(LDFLAGS "${ARCH_FLAGS}")

# Toolchain binaries (riscv64-unknown-elf can target rv32 via multilib)
set(CMAKE_C_COMPILER riscv64-unknown-elf-gcc)
set(CMAKE_CXX_COMPILER riscv64-unknown-elf-g++)
set(AS riscv64-unknown-elf-as)
set(AR riscv64-unknown-elf-ar)
set(OBJCOPY riscv64-unknown-elf-objcopy)
set(OBJDUMP riscv64-unknown-elf-objdump)
set(SIZE riscv64-unknown-elf-size)

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

# Use static library for compiler feature probing (no linker script yet)
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

set(CMAKE_C_FLAGS "${CFLAGS}" CACHE INTERNAL "c compiler flags")
set(CMAKE_CXX_FLAGS "${CFLAGS}" CACHE INTERNAL "cxx compiler flags")
set(CMAKE_ASM_FLAGS "${ASFLAGS} -D__ASSEMBLER__" CACHE INTERNAL "asm compiler flags")
set(CMAKE_EXE_LINKER_FLAGS "${LDFLAGS}" CACHE INTERNAL "exe link flags")

set(CMAKE_C_FLAGS_DEBUG "-Og -g -ggdb3" CACHE INTERNAL "c debug flags")
set(CMAKE_CXX_FLAGS_DEBUG "-Og -g -ggdb3" CACHE INTERNAL "cxx debug flags")
set(CMAKE_ASM_FLAGS_DEBUG "-g -ggdb3" CACHE INTERNAL "asm debug flags")

set(CMAKE_C_FLAGS_RELEASE "-Os" CACHE INTERNAL "c release flags")
set(CMAKE_CXX_FLAGS_RELEASE "-Os" CACHE INTERNAL "cxx release flags")
set(CMAKE_ASM_FLAGS_RELEASE "" CACHE INTERNAL "asm release flags")
65 changes: 65 additions & 0 deletions ports/risc-v32/gnu/example_build/core_v_mcu/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
cmake_minimum_required(VERSION 3.15 FATAL_ERROR)

project(demo_threadx_core_v_mcu LANGUAGES C ASM)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)

set(CORE_V_MCU_DIR ${CMAKE_CURRENT_LIST_DIR})
set(THREADX_ROOT ${CMAKE_CURRENT_LIST_DIR}/../../../../..)
set(TX_USER_FILE ${CORE_V_MCU_DIR}/include/tx_user.h)

set(THREADX_ARCH "risc-v32")
set(THREADX_TOOLCHAIN "gnu")
add_subdirectory(${THREADX_ROOT} threadx)
target_include_directories(threadx PRIVATE ${CORE_V_MCU_DIR}/include)

set(SRCS
${CORE_V_MCU_DIR}/crt0.S
${CORE_V_MCU_DIR}/vectors.S
${CORE_V_MCU_DIR}/tx_initialize_low_level.S
${CORE_V_MCU_DIR}/bsp/irq.c
${CORE_V_MCU_DIR}/bsp/timer_irq.c
${CORE_V_MCU_DIR}/bsp/fll.c
${CORE_V_MCU_DIR}/bsp/gpio.c
${CORE_V_MCU_DIR}/bsp/uart_driver.c
${CORE_V_MCU_DIR}/bsp/i2c_master.c
${CORE_V_MCU_DIR}/bsp/temp_sensor.c
${CORE_V_MCU_DIR}/bsp/system_core_v_mcu.c
${CORE_V_MCU_DIR}/bsp/string.c
${CORE_V_MCU_DIR}/demo_threadx.c
)

add_executable(demo_threadx ${SRCS})
set_target_properties(demo_threadx PROPERTIES OUTPUT_NAME "demo_threadx.elf")

target_include_directories(demo_threadx PRIVATE
${CORE_V_MCU_DIR}/include
${THREADX_ROOT}/common/inc
${THREADX_ROOT}/ports/risc-v32/gnu/inc
)

target_link_libraries(demo_threadx PRIVATE threadx gcc)

target_link_options(demo_threadx PRIVATE
-T${CORE_V_MCU_DIR}/link.ld
-nostartfiles
-nodefaultlibs
-Wl,--gc-sections
-Wl,-Map=${CMAKE_CURRENT_BINARY_DIR}/demo_threadx.map
)

target_compile_options(demo_threadx PRIVATE
-Os
-g
-Wall
-Wextra
-ffreestanding
-ffunction-sections
-fdata-sections
-DTX_INCLUDE_USER_DEFINE_FILE
)

add_custom_command(TARGET demo_threadx POST_BUILD
COMMAND ${OBJCOPY} -O binary $<TARGET_FILE:demo_threadx> ${CMAKE_CURRENT_BINARY_DIR}/demo_threadx.bin
COMMENT "Generating demo_threadx.bin"
)
Loading