|
| 1 | +# Licensed to the Apache Software Foundation (ASF) under one |
| 2 | +# or more contributor license agreements. See the NOTICE file |
| 3 | +# distributed with this work for additional information |
| 4 | +# regarding copyright ownership. The ASF licenses this file |
| 5 | +# to you under the Apache License, Version 2.0 (the |
| 6 | +# "License"); you may not use this file except in compliance |
| 7 | +# with the License. You may obtain a copy of the License at |
| 8 | +# |
| 9 | +# http://www.apache.org/licenses/LICENSE-2.0 |
| 10 | +# |
| 11 | +# Unless required by applicable law or agreed to in writing, |
| 12 | +# software distributed under the License is distributed on an |
| 13 | +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| 14 | +# KIND, either express or implied. See the License for the |
| 15 | +# specific language governing permissions and limitations |
| 16 | +# under the License. |
| 17 | + |
| 18 | +# Makefile to build demo |
| 19 | + |
| 20 | +# Setup build environment |
| 21 | +BUILD_DIR := build |
| 22 | + |
| 23 | +ARM_CPU = ARMCM55 |
| 24 | +ETHOSU_PATH = /opt/arm/ethosu |
| 25 | +CMSIS_PATH ?= ${ETHOSU_PATH}/cmsis |
| 26 | +ETHOSU_PLATFORM_PATH ?= ${ETHOSU_PATH}/core_platform |
| 27 | +STANDALONE_CRT_PATH := $(abspath $(BUILD_DIR))/runtime |
| 28 | +CORSTONE_300_PATH = ${ETHOSU_PLATFORM_PATH}/targets/corstone-300 |
| 29 | +PKG_COMPILE_OPTS = -g -Wall -O2 -Wno-incompatible-pointer-types -Wno-format -mcpu=cortex-m55 -mthumb -mfloat-abi=hard -std=gnu99 |
| 30 | +CMAKE ?= cmake |
| 31 | +CC = arm-none-eabi-gcc |
| 32 | +AR = arm-none-eabi-ar |
| 33 | +RANLIB = arm-none-eabi-ranlib |
| 34 | +PKG_CFLAGS = ${PKG_COMPILE_OPTS} \ |
| 35 | + -I${STANDALONE_CRT_PATH}/include \ |
| 36 | + -I${STANDALONE_CRT_PATH}/src/runtime/crt/include \ |
| 37 | + -I${PWD}/include \ |
| 38 | + -I${CORSTONE_300_PATH} \ |
| 39 | + -I${CMSIS_PATH}/Device/ARM/${ARM_CPU}/Include/ \ |
| 40 | + -I${CMSIS_PATH}/CMSIS/Core/Include \ |
| 41 | + -I${CMSIS_PATH}/CMSIS/NN/Include \ |
| 42 | + -I${CMSIS_PATH}/CMSIS/DSP/Include \ |
| 43 | + -I$(abspath $(BUILD_DIR))/codegen/host/include |
| 44 | +CMSIS_NN_CMAKE_FLAGS = -DCMAKE_TOOLCHAIN_FILE=$(abspath $(BUILD_DIR))/../arm-none-eabi-gcc.cmake \ |
| 45 | + -DTARGET_CPU=cortex-m55 \ |
| 46 | + -DBUILD_CMSIS_NN_FUNCTIONS=YES |
| 47 | +PKG_LDFLAGS = -lm -specs=nosys.specs -static -T corstone300.ld |
| 48 | + |
| 49 | +$(ifeq VERBOSE,1) |
| 50 | +QUIET ?= |
| 51 | +$(else) |
| 52 | +QUIET ?= @ |
| 53 | +$(endif) |
| 54 | + |
| 55 | +DEMO_MAIN = src/demo_bare_metal.c |
| 56 | +CODEGEN_SRCS = $(wildcard $(abspath $(BUILD_DIR))/codegen/host/src/*.c) |
| 57 | +CODEGEN_OBJS = $(subst .c,.o,$(CODEGEN_SRCS)) |
| 58 | +CMSIS_STARTUP_SRCS = $(wildcard ${CMSIS_PATH}/Device/ARM/${ARM_CPU}/Source/*.c) |
| 59 | +UART_SRCS = $(wildcard ${CORSTONE_300_PATH}/*.c) |
| 60 | + |
| 61 | +demo: $(BUILD_DIR)/demo |
| 62 | + |
| 63 | +$(BUILD_DIR)/stack_allocator.o: $(STANDALONE_CRT_PATH)/src/runtime/crt/memory/stack_allocator.c |
| 64 | + $(QUIET)mkdir -p $(@D) |
| 65 | + $(QUIET)$(CC) -c $(PKG_CFLAGS) -o $@ $^ |
| 66 | + |
| 67 | +$(BUILD_DIR)/crt_backend_api.o: $(STANDALONE_CRT_PATH)/src/runtime/crt/common/crt_backend_api.c |
| 68 | + $(QUIET)mkdir -p $(@D) |
| 69 | + $(QUIET)$(CC) -c $(PKG_CFLAGS) -o $@ $^ |
| 70 | + |
| 71 | +# Build generated code |
| 72 | +$(BUILD_DIR)/libcodegen.a: $(CODEGEN_SRCS) |
| 73 | + $(QUIET)cd $(abspath $(BUILD_DIR)/codegen/host/src) && $(CC) -c $(PKG_CFLAGS) $(CODEGEN_SRCS) |
| 74 | + $(QUIET)$(AR) -cr $(abspath $(BUILD_DIR)/libcodegen.a) $(CODEGEN_OBJS) |
| 75 | + $(QUIET)$(RANLIB) $(abspath $(BUILD_DIR)/libcodegen.a) |
| 76 | + |
| 77 | +# Build CMSIS startup code |
| 78 | +${BUILD_DIR}/libcmsis_startup.a: $(CMSIS_STARTUP_SRCS) |
| 79 | + $(QUIET)mkdir -p $(abspath $(BUILD_DIR)/libcmsis_startup) |
| 80 | + $(QUIET)cd $(abspath $(BUILD_DIR)/libcmsis_startup) && $(CC) -c $(PKG_CFLAGS) -D${ARM_CPU} $^ |
| 81 | + $(QUIET)$(AR) -cr $(abspath $(BUILD_DIR)/libcmsis_startup.a) $(abspath $(BUILD_DIR))/libcmsis_startup/*.o |
| 82 | + $(QUIET)$(RANLIB) $(abspath $(BUILD_DIR)/libcmsis_startup.a) |
| 83 | + |
| 84 | +# Build CMSIS-NN |
| 85 | +${BUILD_DIR}/cmsis_nn/Source/SoftmaxFunctions/libCMSISNNSoftmax.a: |
| 86 | + $(QUIET)mkdir -p $(@D) |
| 87 | + $(QUIET)cd $(CMSIS_PATH)/CMSIS/NN && $(CMAKE) -B $(abspath $(BUILD_DIR)/cmsis_nn) $(CMSIS_NN_CMAKE_FLAGS) |
| 88 | + $(QUIET)cd $(abspath $(BUILD_DIR)/cmsis_nn) && $(MAKE) all |
| 89 | + |
| 90 | +# Build demo application |
| 91 | +$(BUILD_DIR)/demo: $(DEMO_MAIN) $(UART_SRCS) $(BUILD_DIR)/stack_allocator.o $(BUILD_DIR)/crt_backend_api.o \ |
| 92 | + ${BUILD_DIR}/libcodegen.a ${BUILD_DIR}/libcmsis_startup.a \ |
| 93 | + ${BUILD_DIR}/cmsis_nn/Source/SoftmaxFunctions/libCMSISNNSoftmax.a \ |
| 94 | + ${BUILD_DIR}/cmsis_nn/Source/FullyConnectedFunctions/libCMSISNNFullyConnected.a \ |
| 95 | + ${BUILD_DIR}/cmsis_nn/Source/SVDFunctions/libCMSISNNSVDF.a \ |
| 96 | + ${BUILD_DIR}/cmsis_nn/Source/ReshapeFunctions/libCMSISNNReshape.a \ |
| 97 | + ${BUILD_DIR}/cmsis_nn/Source/ActivationFunctions/libCMSISNNActivation.a \ |
| 98 | + ${BUILD_DIR}/cmsis_nn/Source/NNSupportFunctions/libCMSISNNSupport.a \ |
| 99 | + ${BUILD_DIR}/cmsis_nn/Source/ConcatenationFunctions/libCMSISNNConcatenation.a \ |
| 100 | + ${BUILD_DIR}/cmsis_nn/Source/BasicMathFunctions/libCMSISNNBasicMaths.a \ |
| 101 | + ${BUILD_DIR}/cmsis_nn/Source/ConvolutionFunctions/libCMSISNNConvolutions.a \ |
| 102 | + ${BUILD_DIR}/cmsis_nn/Source/PoolingFunctions/libCMSISNNPooling.a |
| 103 | + $(QUIET)mkdir -p $(@D) |
| 104 | + $(QUIET)$(CC) $(PKG_CFLAGS) $(FREERTOS_FLAGS) -o $@ -Wl,--whole-archive $^ -Wl,--no-whole-archive $(PKG_LDFLAGS) |
| 105 | + |
| 106 | +clean: |
| 107 | + $(QUIET)rm -rf $(BUILD_DIR)/codegen |
| 108 | + |
| 109 | +cleanall: |
| 110 | + $(QUIET)rm -rf $(BUILD_DIR) |
| 111 | + |
| 112 | +.SUFFIXES: |
| 113 | + |
| 114 | +.DEFAULT: demo |
0 commit comments