From 9c6f9f8afcb003fd72944918d6b6e200d68c0918 Mon Sep 17 00:00:00 2001 From: Kshitij Sisodia Date: Fri, 20 May 2022 14:30:02 +0100 Subject: MLECO-3225: Using official support for Arm Cortex-M85 CPU. * CMake version requirement bumped up to 3.21.0 * CMake 3.22.4 installed in the local Python virtualenv * CPU flags updated in toolchain files. * Using __ARM_FEATURE_DSP instead of potentially defining ARM_MATH_DSP wrongly. * CMake project version bumped up to 22.05.0 Changes also made for MLECO-3107 (pack generation): * TensorFlow Lite Micro CMSIS-pack version updated to 1.22.02. * Change to using __ARM_FEATURE_DSP will also help the generated pack. Partial changes for MLECO-3095: * CMSIS updated to version post 5.9.0 * TensorFlow Lite Micro updated to latest available * Ethos-U driver and core-platform repositories updated to 20.05_rc2 tags. Change-Id: I012c9e65897aed8ce589cff9bfe3a19efc3edeb9 Signed-off-by: Kshitij Sisodia --- scripts/cmake/cmsis-dsp.cmake | 12 ++------ scripts/cmake/cmsis-pack-gen/CMakeLists.txt | 2 +- scripts/cmake/cmsis-pack-gen/use-case-api.yml | 12 ++++---- .../cmake/platforms/mps3/build_configuration.cmake | 13 +------- scripts/cmake/tensorflow.cmake | 2 +- scripts/cmake/toolchains/bare-metal-armclang.cmake | 36 ++++++++++++---------- scripts/cmake/toolchains/bare-metal-gcc.cmake | 33 ++++++++++---------- scripts/py/requirements.txt | 1 + 8 files changed, 48 insertions(+), 63 deletions(-) (limited to 'scripts') diff --git a/scripts/cmake/cmsis-dsp.cmake b/scripts/cmake/cmsis-dsp.cmake index 73f6100..f22d5ef 100644 --- a/scripts/cmake/cmsis-dsp.cmake +++ b/scripts/cmake/cmsis-dsp.cmake @@ -68,16 +68,8 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") endif() endif () -# 5. Add any custom/conditional flags for compilation or linkage -if ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "cortex-m55" OR "${CMAKE_SYSTEM_ARCH}" STREQUAL "armv8.1-m.main") - target_compile_definitions(${CMSIS_DSP_TARGET} PUBLIC - ARM_MATH_MVEI - ARM_MATH_DSP - ARM_MATH_LOOPUNROLL) -elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL cortex-m33) - # Placeholder, if building with Cortex-M33 -endif() - +# 5. General compile definitions +target_compile_definitions(${CMSIS_DSP_TARGET} PUBLIC ARM_MATH_LOOPUNROLL) # 6. Provide the library path for the top level CMake to use: set(CMSIS_DSP_LIB "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/lib${CMSIS_DSP_TARGET}.a") diff --git a/scripts/cmake/cmsis-pack-gen/CMakeLists.txt b/scripts/cmake/cmsis-pack-gen/CMakeLists.txt index 19787b6..db5cfff 100644 --- a/scripts/cmake/cmsis-pack-gen/CMakeLists.txt +++ b/scripts/cmake/cmsis-pack-gen/CMakeLists.txt @@ -22,7 +22,7 @@ # here along with their dependencies. # ######################################################### -cmake_minimum_required(VERSION 3.15.6) +cmake_minimum_required(VERSION 3.21.0) project(ml-embedded-eval-kit-api DESCRIPTION "Platform agnostic API for all examples.") diff --git a/scripts/cmake/cmsis-pack-gen/use-case-api.yml b/scripts/cmake/cmsis-pack-gen/use-case-api.yml index 8796dff..fb0cbd9 100644 --- a/scripts/cmake/cmsis-pack-gen/use-case-api.yml +++ b/scripts/cmake/cmsis-pack-gen/use-case-api.yml @@ -23,7 +23,7 @@ # # Ideal usage: from the root of the repository # -# ml-embedded-eval-kit $ packgen -s ./source/ \ # Source dir +# ml-embedded-eval-kit $ packgen -s ./ \ # Source dir (run this from repo root) # -v ./scripts/cmake/cmsis-pack-gen/use-case-api.yml \ # This file's path # -o /ml-embedded-eval-kit-pack \ # Where to generate the ouput # -i /tensorflow.tensorflow-lite-micro.pdsc \ # Tensorflow packs' PDSC file @@ -41,18 +41,18 @@ packs: - name: "ml-embedded-eval-kit-uc-api" description: "Sample use case APIs derived from ml-embedded-eval-kit" vendor: "ARM" - license: "" + license: "LICENSE_APACHE_2.0.txt" url: "https://review.mlplatform.org/admin/repos/ml/ethos-u/ml-embedded-evaluation-kit/" requirements: packages: - - attributes: {vendor: "tensorflow", name: "tensorflow-lite-micro", version: "0.4.0"} - - attributes: {vendor: "ARM", name: "CMSIS", version: "5.9.0"} + - attributes: {vendor: "tensorflow", name: "tensorflow-lite-micro", version: "1.22.02"} + - attributes: {vendor: "ARM", name: "CMSIS", version: "5.8.0"} releases: - version: "22.05.0" - date: "2022-05-04" - description: "Experimental package" + date: "2022-05-23" + description: "Beta release package" # @TODO: Add API header names and descriptions here (see placeholder below). # apis: diff --git a/scripts/cmake/platforms/mps3/build_configuration.cmake b/scripts/cmake/platforms/mps3/build_configuration.cmake index 6e21d9b..749b1e1 100644 --- a/scripts/cmake/platforms/mps3/build_configuration.cmake +++ b/scripts/cmake/platforms/mps3/build_configuration.cmake @@ -22,18 +22,7 @@ function(set_platform_global_defaults) if (TARGET_SUBSYSTEM STREQUAL sse-300) set(CMAKE_SYSTEM_PROCESSOR cortex-m55 CACHE STRING "Cortex-M CPU to use") elseif(TARGET_SUBSYSTEM STREQUAL sse-310) - # For CMake versions older than 3.21, the compiler and linker flags for - # ArmClang are added by CMake automatically which makes it mandatory to - # define the system processor. For CMake versions 3.21 or later (that - # implement policy CMP0123) we use armv8.1-m as the arch until the - # toolchain officially supports Cortex-M85. For older version of CMake - # we revert to using Cortex-M55 as the processor (as this will work - # for M85 too). - if(POLICY CMP0123) - set(CMAKE_SYSTEM_ARCH armv8.1-m.main CACHE STRING "System arch to use") - else() - set(CMAKE_SYSTEM_PROCESSOR cortex-m55) - endif() + set(CMAKE_SYSTEM_PROCESSOR cortex-m85 CACHE STRING "Cortex-M CPU to use") endif() endif() diff --git a/scripts/cmake/tensorflow.cmake b/scripts/cmake/tensorflow.cmake index 8a790bc..ac11542 100644 --- a/scripts/cmake/tensorflow.cmake +++ b/scripts/cmake/tensorflow.cmake @@ -51,7 +51,7 @@ if (TARGET_PLATFORM STREQUAL native) else() set(TENSORFLOW_LITE_MICRO_TARGET "cortex_m_generic") - if ("${CMAKE_SYSTEM_ARCH}" STREQUAL "armv8.1-m.main") + if ("${CMAKE_SYSTEM_ARCH}" STREQUAL "armv8.1-m.main" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "cortex-m85") # TensorFlow's generic makefile doesn't currently have a flow for Cortex-M85. # We build for Arm Cortex-M55 instead. # @TODO: check with latest TensorFlow package. diff --git a/scripts/cmake/toolchains/bare-metal-armclang.cmake b/scripts/cmake/toolchains/bare-metal-armclang.cmake index 97da76f..3db3320 100644 --- a/scripts/cmake/toolchains/bare-metal-armclang.cmake +++ b/scripts/cmake/toolchains/bare-metal-armclang.cmake @@ -25,40 +25,46 @@ set(CMAKE_ASM_COMPILER_AR armar) set(CMAKE_CROSSCOMPILING true) set(CMAKE_SYSTEM_NAME Generic) -set(MIN_ARM_CLANG_VERSION 6.16) - # Skip compiler test execution set(CMAKE_C_COMPILER_WORKS 1) set(CMAKE_CXX_COMPILER_WORKS 1) if (NOT DEFINED CMAKE_SYSTEM_PROCESSOR AND NOT DEFINED CMAKE_SYSTEM_ARCH) - set(CMAKE_SYSTEM_PROCESSOR cortex-m55) + set(CMAKE_SYSTEM_PROCESSOR cortex-m55 CACHE STRING "Cortex-M CPU to use") endif() if (CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m55) # Flags for cortex-m55 + set(MIN_ARM_CLANG_VERSION 6.16) set(CPU_ID M55) set(CPU_COMPILE_DEF CPU_CORTEX_${CPU_ID}) set(ARM_CPU "ARMC${CPU_ID}") - set(FLOAT_ABI hard) - set(ARM_MATH_DSP 1) - set(ARM_MATH_LOOPUNROLL 1) set(CPU_HEADER_FILE "${ARM_CPU}.h") set(CPU_COMPILE_OPTION "-mcpu=${CMAKE_SYSTEM_PROCESSOR}") + set(FLOAT_ABI_COMPILE_OPTION "-mfloat-abi=hard") + set(CPU_LINK_OPT "--cpu=Cortex-${CPU_ID}") +elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m85) + # Flags for cortex-m85 + set(MIN_ARM_CLANG_VERSION 6.18) + set(CPU_ID M85) + set(CPU_COMPILE_DEF CPU_CORTEX_${CPU_ID}) + set(ARM_CPU "ARMC${CPU_ID}") + set(CPU_HEADER_FILE "${ARM_CPU}.h") + set(CPU_COMPILE_OPTION "-mcpu=${CMAKE_SYSTEM_PROCESSOR}") + set(FLOAT_ABI_COMPILE_OPTION "-mfloat-abi=hard") set(CPU_LINK_OPT "--cpu=Cortex-${CPU_ID}") -elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m85 OR CMAKE_SYSTEM_ARCH STREQUAL armv8.1-m.main) - # Flags for Cortex-M85 +elseif (CMAKE_SYSTEM_ARCH STREQUAL armv8.1-m.main) + # Flags for generic armv8.1-m profile + set(MIN_ARM_CLANG_VERSION 6.16) set(CPU_ID ARMv81MML_DSP_DP_MVE_FP) set(ARM_CPU "ARMv81MML") set(CPU_COMPILE_DEF ${CPU_ID}) - set(FLOAT_ABI hard) - set(ARM_MATH_DSP 1) - set(ARM_MATH_LOOPUNROLL 1) # @TODO: Revise once we have the CPU file in CMSIS and CPU flags # are supported by toolchains. set(CPU_HEADER_FILE "${CPU_ID}.h") set(CPU_COMPILE_OPTION "-march=armv8.1-m.main+mve.fp+fp.dp") + set(FLOAT_ABI_COMPILE_OPTION "-mfloat-abi=hard") set(CPU_LINK_OPT "--cpu=8.1-M.Main.mve.fp") elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m33) # Flags for cortex-m33 to go here @@ -81,18 +87,16 @@ add_compile_options( # Arch compile options: add_compile_options( -mthumb - -mfloat-abi=${FLOAT_ABI} --target=arm-arm-non-eabi -mlittle-endian -MD - ${CPU_COMPILE_OPTION}) + ${CPU_COMPILE_OPTION} + ${FLOAT_ABI_COMPILE_OPTION}) # Compile definitions: add_compile_definitions( CPU_HEADER_FILE=\"${CPU_HEADER_FILE}\" - $<$:${CPU_COMPILE_DEF}> - $<$:ARM_MATH_DSP> - $<$:ARM_MATH_LOOPUNROLL>) + $<$:${CPU_COMPILE_DEF}>) # Link options: add_link_options(${CPU_LINK_OPT}) diff --git a/scripts/cmake/toolchains/bare-metal-gcc.cmake b/scripts/cmake/toolchains/bare-metal-gcc.cmake index a6d6c0e..9c1cd4f 100644 --- a/scripts/cmake/toolchains/bare-metal-gcc.cmake +++ b/scripts/cmake/toolchains/bare-metal-gcc.cmake @@ -30,7 +30,7 @@ set(CMAKE_C_COMPILER_WORKS 1) set(CMAKE_CXX_COMPILER_WORKS 1) if (NOT DEFINED CMAKE_SYSTEM_PROCESSOR AND NOT DEFINED CMAKE_SYSTEM_ARCH) - set(CMAKE_SYSTEM_PROCESSOR cortex-m55) + set(CMAKE_SYSTEM_PROCESSOR cortex-m55 CACHE STRING "Cortex-M CPU to use") endif() if (CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m55) @@ -38,25 +38,26 @@ if (CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m55) set(CPU_ID M55) set(CPU_COMPILE_DEF CPU_CORTEX_${CPU_ID}) set(ARM_CPU "ARMC${CPU_ID}") - set(FLOAT_ABI hard) - set(ARM_MATH_DSP 1) - set(ARM_MATH_LOOPUNROLL 1) set(CPU_HEADER_FILE "${ARM_CPU}.h") set(CPU_COMPILE_OPTION "-mcpu=${CMAKE_SYSTEM_PROCESSOR}") + set(FLOAT_ABI_COMPILE_OPTION "-mfloat-abi=hard") set(CPU_LINK_OPT "--cpu=Cortex-${CPU_ID}") -elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m85 OR CMAKE_SYSTEM_ARCH STREQUAL armv8.1-m.main) - # Flags for Cortex-M85 +elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m85) + # Flags for cortex-m85 + # @TODO: Current versions of GNU compiler do not support Cortex-M85, we compile for Cortex-M55 instead. + message(WARNING "Arm GNU Toolchain does not support Arm Cortex-M85 yet, switching to Cortex-M55.") + set(CMAKE_SYSTEM_PROCESSOR cortex-m55 CACHE STRING "Cortex-M CPU to use" FORCE) + # No need to duplicate the definitions here. + # Flags from Cortex-M55 will be added as this toolchain file will be read by CMake again. +elseif (CMAKE_SYSTEM_ARCH STREQUAL armv8.1-m.main) + # Flags for generic target armv8.1-m.main (will work for cortex-m55 and cortex-m85 set(CPU_ID ARMv81MML_DSP_DP_MVE_FP) set(ARM_CPU "ARMv81MML") set(CPU_COMPILE_DEF ${CPU_ID}) set(FLOAT_ABI hard) - set(ARM_MATH_DSP 1) - set(ARM_MATH_LOOPUNROLL 1) - - # @TODO: Revise once we have the CPU file in CMSIS and CPU flags - # are supported by toolchains. set(CPU_HEADER_FILE "${CPU_ID}.h") set(CPU_COMPILE_OPTION "-march=armv8.1-m.main+mve.fp+fp.dp") + set(FLOAT_ABI_COMPILE_OPTION "-mfloat-abi=hard") set(CPU_LINK_OPT "--cpu=8.1-M.Main.mve.fp") elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m33) # Flags for cortex-m33 to go here @@ -81,23 +82,21 @@ add_compile_options( # Arch compile options: add_compile_options( -mthumb - -mfloat-abi=${FLOAT_ABI} -mlittle-endian -MD + ${FLOAT_ABI_COMPILE_OPTION} ${CPU_COMPILE_OPTION}) # Compile definitions: add_compile_definitions( - CPU_HEADER_FILE=\"${CPU_HEADER_FILE}\" - $<$:${CPU_COMPILE_DEF}> - $<$:ARM_MATH_DSP> - $<$:ARM_MATH_LOOPUNROLL>) + $<$:CPU_HEADER_FILE=\"${CPU_HEADER_FILE}\"> + $<$:${CPU_COMPILE_DEF}>) # Link options: add_link_options( -mthumb ${CPU_COMPILE_OPTION} - -mfloat-abi=${FLOAT_ABI} + ${FLOAT_ABI_COMPILE_OPTION} -mlittle-endian --stats "SHELL:-Xlinker --gc-sections" diff --git a/scripts/py/requirements.txt b/scripts/py/requirements.txt index aeff2e0..7b4045c 100644 --- a/scripts/py/requirements.txt +++ b/scripts/py/requirements.txt @@ -10,3 +10,4 @@ resampy==0.2.2 scipy==1.8.0 six==1.16.0 SoundFile==0.10.3.post1 +cmake==3.22.4 -- cgit v1.2.1