TFLu: Add stm32f4 and build target
Add new TARGET=stm32f4 that is working with Renode. Add new <build> target that will just build the test binaries. Add new CI script for this as well. The purpose of this is CMSIS-NN regression.
This commit is contained in:
parent
4d0eaa651e
commit
8faed4f3d5
25
tensorflow/lite/micro/stm32f4/debug_log.cc
Normal file
25
tensorflow/lite/micro/stm32f4/debug_log.cc
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
/* Copyright 2020 The TensorFlow Authors. All Rights Reserved.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==============================================================================*/
|
||||||
|
|
||||||
|
#include "tensorflow/lite/micro/debug_log.h"
|
||||||
|
|
||||||
|
extern "C" void DebugLog(const char* s) {
|
||||||
|
asm("mov r0, #0x04\n" // SYS_WRITE0
|
||||||
|
"mov r1, %[str]\n"
|
||||||
|
"bkpt #0xAB\n"
|
||||||
|
:
|
||||||
|
: [ str ] "r"(s)
|
||||||
|
: "r0", "r1");
|
||||||
|
}
|
@ -49,4 +49,7 @@ tensorflow/lite/micro/tools/ci_build/test_sparkfun.sh
|
|||||||
echo "Running x86 tests at `date`"
|
echo "Running x86 tests at `date`"
|
||||||
tensorflow/lite/micro/tools/ci_build/test_x86.sh
|
tensorflow/lite/micro/tools/ci_build/test_x86.sh
|
||||||
|
|
||||||
|
echo "Running stm32f4 tests at `date`"
|
||||||
|
tensorflow/lite/micro/tools/ci_build/test_stm32f4.sh
|
||||||
|
|
||||||
echo "Finished all micro tests at `date`"
|
echo "Finished all micro tests at `date`"
|
||||||
|
40
tensorflow/lite/micro/tools/ci_build/test_stm32f4.sh
Executable file
40
tensorflow/lite/micro/tools/ci_build/test_stm32f4.sh
Executable file
@ -0,0 +1,40 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Copyright 2020 The TensorFlow Authors. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
# ==============================================================================
|
||||||
|
#
|
||||||
|
# Tests the microcontroller code for stm32f4
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
TARGET=stm32f4
|
||||||
|
TAGS=cmsis-nn
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
ROOT_DIR=${SCRIPT_DIR}/../../../../..
|
||||||
|
cd ${ROOT_DIR}
|
||||||
|
pwd
|
||||||
|
|
||||||
|
source tensorflow/lite/micro/tools/ci_build/helper_functions.sh
|
||||||
|
|
||||||
|
readable_run make -f tensorflow/lite/micro/tools/make/Makefile clean
|
||||||
|
|
||||||
|
# TODO(b/143715361): downloading first to allow for parallel builds.
|
||||||
|
readable_run make -f tensorflow/lite/micro/tools/make/Makefile TAGS=${TAGS} TARGET=${TARGET} third_party_downloads
|
||||||
|
|
||||||
|
# Build test binaries first
|
||||||
|
readable_run make -j8 -f tensorflow/lite/micro/tools/make/Makefile TAGS=${TAGS} TARGET=${TARGET} build
|
||||||
|
|
||||||
|
# Parallell builds doesn't work very well with this
|
||||||
|
readable_run make -f tensorflow/lite/micro/tools/make/Makefile TAGS=${TAGS} TARGET=${TARGET} test
|
||||||
|
|
@ -81,6 +81,8 @@ CC_PREFIX :=
|
|||||||
# runtime that can be linked in to other programs.
|
# runtime that can be linked in to other programs.
|
||||||
MICROLITE_LIB_NAME := libtensorflow-microlite.a
|
MICROLITE_LIB_NAME := libtensorflow-microlite.a
|
||||||
|
|
||||||
|
MICRO_LITE_EXAMPLE_TESTS := $(wildcard tensorflow/lite/micro/examples/*/Makefile.inc)
|
||||||
|
|
||||||
MICROLITE_TEST_SRCS := \
|
MICROLITE_TEST_SRCS := \
|
||||||
$(wildcard tensorflow/lite/micro/*test.cc) \
|
$(wildcard tensorflow/lite/micro/*test.cc) \
|
||||||
$(wildcard tensorflow/lite/micro/kernels/*test.cc) \
|
$(wildcard tensorflow/lite/micro/kernels/*test.cc) \
|
||||||
@ -240,7 +242,7 @@ CC := $(CC_PREFIX)${TARGET_TOOLCHAIN_PREFIX}${CC_TOOL}
|
|||||||
AR := $(CC_PREFIX)${TARGET_TOOLCHAIN_PREFIX}${AR_TOOL}
|
AR := $(CC_PREFIX)${TARGET_TOOLCHAIN_PREFIX}${AR_TOOL}
|
||||||
|
|
||||||
# Load the examples.
|
# Load the examples.
|
||||||
include $(wildcard tensorflow/lite/micro/examples/*/Makefile.inc)
|
include $(MICRO_LITE_EXAMPLE_TESTS)
|
||||||
|
|
||||||
# Create rules for downloading third-party dependencies.
|
# Create rules for downloading third-party dependencies.
|
||||||
THIRD_PARTY_TARGETS :=
|
THIRD_PARTY_TARGETS :=
|
||||||
@ -308,6 +310,9 @@ $(eval $(call microlite_test,kernel_$(notdir $(basename $(TEST_TARGET))),$(TEST_
|
|||||||
|
|
||||||
test: $(MICROLITE_TEST_TARGETS)
|
test: $(MICROLITE_TEST_TARGETS)
|
||||||
|
|
||||||
|
# Just build the test targets
|
||||||
|
build: $(MICROLITE_BUILD_TARGETS)
|
||||||
|
|
||||||
generate_projects: $(ALL_PROJECT_TARGETS)
|
generate_projects: $(ALL_PROJECT_TARGETS)
|
||||||
|
|
||||||
generate_non_kernel_projects: $(filter-out generate_kernel%,$(ALL_PROJECT_TARGETS))
|
generate_non_kernel_projects: $(filter-out generate_kernel%,$(ALL_PROJECT_TARGETS))
|
||||||
|
@ -371,6 +371,7 @@ test_$(1): $$($(1)_BINARY)
|
|||||||
$$(TEST_SCRIPT) $$($(1)_BINARY) '~~~ALL TESTS PASSED~~~'
|
$$(TEST_SCRIPT) $$($(1)_BINARY) '~~~ALL TESTS PASSED~~~'
|
||||||
ifneq (,$(findstring _test,$(1)))
|
ifneq (,$(findstring _test,$(1)))
|
||||||
MICROLITE_TEST_TARGETS += test_$(1)
|
MICROLITE_TEST_TARGETS += test_$(1)
|
||||||
|
MICROLITE_BUILD_TARGETS += $$($(1)_BINARY)
|
||||||
endif
|
endif
|
||||||
$(eval $(call generate_microlite_projects,$(1),$(call specialize,$(2)),$(3)))
|
$(eval $(call generate_microlite_projects,$(1),$(call specialize,$(2)),$(3)))
|
||||||
endef
|
endef
|
||||||
|
102
tensorflow/lite/micro/tools/make/targets/stm32f4/stm32f4.lds
Normal file
102
tensorflow/lite/micro/tools/make/targets/stm32f4/stm32f4.lds
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
/* Copyright 2020 Google Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
Copyright 2020 The TensorFlow Authors. All Rights Reserved.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==============================================================================*/
|
||||||
|
|
||||||
|
/* Copied and modified from: tensorflow/lite/micro/tools/make/targets/bluepill/bluepill.lds
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 0x00000000 - 0x07ffffff - aliased to flash or sys memory depending on BOOT jumpers.
|
||||||
|
* 0x08000000 - 0x0801ffff - Flash.
|
||||||
|
* 0x1ffff000 - 0x1ffff7ff - Boot firmware in system memory.
|
||||||
|
* 0x1ffff800 - 0x1fffffff - Option bytes.
|
||||||
|
* 0x20000000 - 0x20004fff - SRAM.
|
||||||
|
* 0x40000000 - 0x40023400 - Peripherals
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define main entry point */
|
||||||
|
ENTRY(_main)
|
||||||
|
|
||||||
|
/* 20K of RAM and 128K of FLASH */
|
||||||
|
MEMORY {
|
||||||
|
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K
|
||||||
|
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 256K
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Compute where the stack ends rather than hard coding it */
|
||||||
|
_ld_stack_end_addr = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
_ld_min_stack_size = 0x200;
|
||||||
|
|
||||||
|
SECTIONS {
|
||||||
|
|
||||||
|
/* interrupt vector goes to top of flash */
|
||||||
|
|
||||||
|
.interrupt_vector : {
|
||||||
|
. = ALIGN(4);
|
||||||
|
KEEP(*(.interrupt_vector))
|
||||||
|
. = ALIGN(4);
|
||||||
|
} >FLASH
|
||||||
|
|
||||||
|
/* read only .text and .rodata go to flash */
|
||||||
|
|
||||||
|
.text : {
|
||||||
|
. = ALIGN(4);
|
||||||
|
KEEP(*(.text.interrupt_handler))
|
||||||
|
*(.text*)
|
||||||
|
} >FLASH
|
||||||
|
|
||||||
|
.rodata : {
|
||||||
|
. = ALIGN(4);
|
||||||
|
*(.rodata*)
|
||||||
|
. = ALIGN(4);
|
||||||
|
} >FLASH
|
||||||
|
|
||||||
|
/* read mwrite data needs to be stored in flash but copied to ram */
|
||||||
|
.data : {
|
||||||
|
. = ALIGN(4);
|
||||||
|
_ld_data_load_dest_start = .; /* export where to load from */
|
||||||
|
*(.data*)
|
||||||
|
. = ALIGN(4);
|
||||||
|
_ld_data_load_dest_stop = .; /* export where to load from */
|
||||||
|
} >RAM AT> FLASH
|
||||||
|
_ld_data_load_source = LOADADDR(.data);
|
||||||
|
|
||||||
|
/* unitialized data section needs zero initialization */
|
||||||
|
.bss :
|
||||||
|
{
|
||||||
|
. = ALIGN(4);
|
||||||
|
_ld_bss_data_start = .;
|
||||||
|
*(.bss*)
|
||||||
|
. = ALIGN(4);
|
||||||
|
_ld_bss_data_stop = .;
|
||||||
|
} >RAM
|
||||||
|
|
||||||
|
._user_heap_stack :
|
||||||
|
{
|
||||||
|
. = ALIGN(8);
|
||||||
|
. += _ld_min_stack_size;
|
||||||
|
PROVIDE(end = .);
|
||||||
|
. = ALIGN(8);
|
||||||
|
} >RAM
|
||||||
|
|
||||||
|
/DISCARD/ :
|
||||||
|
{
|
||||||
|
libc.a (*)
|
||||||
|
libm.a (*)
|
||||||
|
libgcc.a (*)
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* SECTIONS */
|
@ -0,0 +1,86 @@
|
|||||||
|
# Settings for stm32f4 based platforms
|
||||||
|
ifeq ($(TARGET), stm32f4)
|
||||||
|
export PATH := $(MAKEFILE_DIR)/downloads/gcc_embedded/bin/:$(PATH)
|
||||||
|
TARGET_ARCH := cortex-m4
|
||||||
|
TARGET_TOOLCHAIN_PREFIX := arm-none-eabi-
|
||||||
|
|
||||||
|
$(eval $(call add_third_party_download,$(GCC_EMBEDDED_URL),$(GCC_EMBEDDED_MD5),gcc_embedded,))
|
||||||
|
$(eval $(call add_third_party_download,$(CMSIS_URL),$(CMSIS_MD5),cmsis,))
|
||||||
|
$(eval $(call add_third_party_download,$(STM32_BARE_LIB_URL),$(STM32_BARE_LIB_MD5),stm32_bare_lib,))
|
||||||
|
|
||||||
|
PLATFORM_FLAGS = \
|
||||||
|
-DGEMMLOWP_ALLOW_SLOW_SCALAR_FALLBACK \
|
||||||
|
-DTF_LITE_STATIC_MEMORY \
|
||||||
|
-DTF_LITE_MCU_DEBUG_LOG \
|
||||||
|
-fno-rtti \
|
||||||
|
-fmessage-length=0 \
|
||||||
|
-fno-exceptions \
|
||||||
|
-fno-unwind-tables \
|
||||||
|
-fno-builtin \
|
||||||
|
-ffunction-sections \
|
||||||
|
-fdata-sections \
|
||||||
|
-funsigned-char \
|
||||||
|
-MMD \
|
||||||
|
-mcpu=cortex-m4 \
|
||||||
|
-mthumb \
|
||||||
|
-std=gnu++11 \
|
||||||
|
-Wvla \
|
||||||
|
-Wall \
|
||||||
|
-Wextra \
|
||||||
|
-Wno-unused-parameter \
|
||||||
|
-Wno-missing-field-initializers \
|
||||||
|
-Wno-write-strings \
|
||||||
|
-Wno-sign-compare \
|
||||||
|
-fno-delete-null-pointer-checks \
|
||||||
|
-fomit-frame-pointer \
|
||||||
|
-fpermissive \
|
||||||
|
-g \
|
||||||
|
-Os
|
||||||
|
CXXFLAGS += $(PLATFORM_FLAGS)
|
||||||
|
CCFLAGS += $(PLATFORM_FLAGS)
|
||||||
|
LDFLAGS += \
|
||||||
|
--specs=nosys.specs \
|
||||||
|
-T $(MAKEFILE_DIR)/targets/stm32f4/stm32f4.lds \
|
||||||
|
-Wl,-Map=$(MAKEFILE_DIR)/gen/$(TARGET).map,--cref \
|
||||||
|
-Wl,--gc-sections
|
||||||
|
BUILD_TYPE := micro
|
||||||
|
MICROLITE_LIBS := \
|
||||||
|
-lm
|
||||||
|
INCLUDES += \
|
||||||
|
-isystem$(MAKEFILE_DIR)/downloads/cmsis/CMSIS/Core/Include/ \
|
||||||
|
-I$(MAKEFILE_DIR)/downloads/stm32_bare_lib/include
|
||||||
|
MICROLITE_CC_SRCS += \
|
||||||
|
$(wildcard $(MAKEFILE_DIR)/downloads/stm32_bare_lib/source/*.c) \
|
||||||
|
$(wildcard $(MAKEFILE_DIR)/downloads/stm32_bare_lib/source/*.cc)
|
||||||
|
EXCLUDED_SRCS := \
|
||||||
|
$(MAKEFILE_DIR)/downloads/stm32_bare_lib/source/debug_log.c
|
||||||
|
MICROLITE_CC_SRCS := $(filter-out $(EXCLUDED_SRCS), $(MICROLITE_CC_SRCS))
|
||||||
|
# Stm32f4 is reusing the bluepill renode scripts for now
|
||||||
|
TEST_SCRIPT := tensorflow/lite/micro/testing/test_bluepill_binary.sh
|
||||||
|
# TODO, non working tests.. the micro_speech example and conv_test.cc/depthwise_conv_test.cc partly works
|
||||||
|
EXCLUDED_TESTS := \
|
||||||
|
tensorflow/lite/micro/micro_interpreter_test.cc \
|
||||||
|
tensorflow/lite/micro/micro_allocator_test.cc \
|
||||||
|
tensorflow/lite/micro/memory_helpers_test.cc \
|
||||||
|
tensorflow/lite/micro/kernels/depthwise_conv_test.cc \
|
||||||
|
tensorflow/lite/micro/kernels/conv_test.cc \
|
||||||
|
tensorflow/lite/micro/simple_tensor_allocator_test.cc
|
||||||
|
MICROLITE_TEST_SRCS := $(filter-out $(EXCLUDED_TESTS), $(MICROLITE_TEST_SRCS))
|
||||||
|
EXCLUDED_EXAMPLE_TESTS := \
|
||||||
|
tensorflow/lite/micro/examples/magic_wand/Makefile.inc \
|
||||||
|
tensorflow/lite/micro/examples/person_detection/Makefile.inc \
|
||||||
|
tensorflow/lite/micro/examples/person_detection_experimental/Makefile.inc \
|
||||||
|
tensorflow/lite/micro/examples/mobilenet_v2/Makefile.inc \
|
||||||
|
tensorflow/lite/micro/examples/micro_speech/Makefile.inc \
|
||||||
|
tensorflow/lite/micro/examples/ds_cnn_l/Makefile.inc
|
||||||
|
MICRO_LITE_EXAMPLE_TESTS := $(filter-out $(EXCLUDED_EXAMPLE_TESTS), $(MICRO_LITE_EXAMPLE_TESTS))
|
||||||
|
|
||||||
|
# These are microcontroller-specific rules for converting the ELF output
|
||||||
|
# of the linker into a binary image that can be loaded directly.
|
||||||
|
OBJCOPY := $(TARGET_TOOLCHAIN_PREFIX)objcopy
|
||||||
|
|
||||||
|
$(BINDIR)/%.bin: $(BINDIR)/%
|
||||||
|
@mkdir -p $(dir $@)
|
||||||
|
$(OBJCOPY) $< $@ -O binary
|
||||||
|
|
||||||
|
endif
|
Loading…
Reference in New Issue
Block a user