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`"
|
||||
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`"
|
||||
|
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.
|
||||
MICROLITE_LIB_NAME := libtensorflow-microlite.a
|
||||
|
||||
MICRO_LITE_EXAMPLE_TESTS := $(wildcard tensorflow/lite/micro/examples/*/Makefile.inc)
|
||||
|
||||
MICROLITE_TEST_SRCS := \
|
||||
$(wildcard tensorflow/lite/micro/*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}
|
||||
|
||||
# Load the examples.
|
||||
include $(wildcard tensorflow/lite/micro/examples/*/Makefile.inc)
|
||||
include $(MICRO_LITE_EXAMPLE_TESTS)
|
||||
|
||||
# Create rules for downloading third-party dependencies.
|
||||
THIRD_PARTY_TARGETS :=
|
||||
@ -308,6 +310,9 @@ $(eval $(call microlite_test,kernel_$(notdir $(basename $(TEST_TARGET))),$(TEST_
|
||||
|
||||
test: $(MICROLITE_TEST_TARGETS)
|
||||
|
||||
# Just build the test targets
|
||||
build: $(MICROLITE_BUILD_TARGETS)
|
||||
|
||||
generate_projects: $(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~~~'
|
||||
ifneq (,$(findstring _test,$(1)))
|
||||
MICROLITE_TEST_TARGETS += test_$(1)
|
||||
MICROLITE_BUILD_TARGETS += $$($(1)_BINARY)
|
||||
endif
|
||||
$(eval $(call generate_microlite_projects,$(1),$(call specialize,$(2)),$(3)))
|
||||
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