CMSIS-DSP: Test framework tuning
Tuning to test with gcc and Helium code.
diff --git a/CMSIS/DSP/Platforms/FVP/ARMv81MML/LinkScripts/GCC/lnk.ld b/CMSIS/DSP/Platforms/FVP/ARMv81MML/LinkScripts/GCC/lnk.ld
index 08ce5ca..9aee29b 100755
--- a/CMSIS/DSP/Platforms/FVP/ARMv81MML/LinkScripts/GCC/lnk.ld
+++ b/CMSIS/DSP/Platforms/FVP/ARMv81MML/LinkScripts/GCC/lnk.ld
@@ -1,11 +1,11 @@
/******************************************************************************
* @file gcc_arm.ld
* @brief GNU Linker Script for Cortex-M based device
- * @version V2.0.0
- * @date 21. May 2019
+ * @version V1.1.0
+ * @date 04. August 2020
******************************************************************************/
/*
- * Copyright (c) 2009-2019 Arm Limited. All rights reserved.
+ * Copyright (c) 2009-2020 Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -21,18 +21,86 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-#include "mem_ARMv81MML.h"
-__STACK_SIZE = 0x2000;
-__HEAP_SIZE = 0x50000;
+/*
+ *-------- <<< Use Configuration Wizard in Context Menu >>> -------------------
+ */
+
+/* memory regions are:
+ secure ROM: 0x10000000
+ non-secure ROM: 0x00000000
+
+ secure RAM: 0x30000000
+ non-secure RAM: 0x20000000
+ */
+
+/*---------------------- Flash Configuration ----------------------------------
+ <h> Flash Configuration
+ <o0> Flash Base Address <0x0-0xFFFFFFFF:8>
+ <o1> Flash Size (in Bytes) <0x0-0xFFFFFFFF:8>
+ </h>
+ -----------------------------------------------------------------------------*/
+__ROM_BASE = 0x00000000;
+__ROM_SIZE = 0x00110000;
+
+/*--------------------- Embedded RAM Configuration ----------------------------
+ <h> RAM Configuration
+ <o0> RAM Base Address <0x0-0xFFFFFFFF:8>
+ <o1> RAM Size (in Bytes) <0x0-0xFFFFFFFF:8>
+ </h>
+ -----------------------------------------------------------------------------*/
+__RAM_BASE = 0x20000000;
+__RAM_SIZE = 0x00100000;
+
+/*--------------------- Stack / Heap Configuration ----------------------------
+ <h> Stack / Heap Configuration
+ <o0> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
+ <o1> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
+ </h>
+ -----------------------------------------------------------------------------*/
+__STACK_SIZE = 0x00002000;
+__HEAP_SIZE = 0x00050000;
+
+/*
+ *-------------------- <<< end of configuration section >>> -------------------
+ */
MEMORY
{
- ITCM (rx) : ORIGIN = 0x00000000, LENGTH = 512K
- DTCM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
- DTCM2 (xrw) : ORIGIN = 0x20020000, LENGTH = 384K
+ FLASH (rx) : ORIGIN = __ROM_BASE, LENGTH = __ROM_SIZE
+ RAM (rwx) : ORIGIN = __RAM_BASE, LENGTH = __RAM_SIZE
}
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ * Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ * __exidx_start
+ * __exidx_end
+ * __copy_table_start__
+ * __copy_table_end__
+ * __zero_table_start__
+ * __zero_table_end__
+ * __etext
+ * __data_start__
+ * __preinit_array_start
+ * __preinit_array_end
+ * __init_array_start
+ * __init_array_end
+ * __fini_array_start
+ * __fini_array_end
+ * __data_end__
+ * __bss_start__
+ * __bss_end__
+ * __end__
+ * end
+ * __HeapLimit
+ * __StackLimit
+ * __StackTop
+ * __stack
+ */
ENTRY(Reset_Handler)
SECTIONS
@@ -62,7 +130,7 @@
*(.rodata*)
KEEP(*(.eh_frame*))
- } > ITCM
+ } > FLASH
/*
* SG veneers:
@@ -79,30 +147,32 @@
.ARM.extab :
{
*(.ARM.extab* .gnu.linkonce.armextab.*)
- } > ITCM
+ } > FLASH
__exidx_start = .;
.ARM.exidx :
{
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
- } > ITCM
+ } > FLASH
__exidx_end = .;
.copy.table :
{
. = ALIGN(4);
__copy_table_start__ = .;
+
LONG (__etext)
LONG (__data_start__)
- LONG (__data_end__ - __data_start__)
+ LONG ((__data_end__ - __data_start__) / 4)
+
/* Add each additional data section here */
/*
LONG (__etext2)
LONG (__data2_start__)
- LONG (__data2_end__ - __data2_start__)
+ LONG ((__data2_end__ - __data2_start__) / 4)
*/
__copy_table_end__ = .;
- } > ITCM
+ } > FLASH
.zero.table :
{
@@ -111,18 +181,19 @@
/* Add each additional bss section here */
/*
LONG (__bss2_start__)
- LONG (__bss2_end__ - __bss2_start__)
+ LONG ((__bss2_end__ - __bss2_start__) / 4)
*/
__zero_table_end__ = .;
- } > DTCM
+ } > FLASH
/**
* Location counter can end up 2byte aligned with narrow Thumb code but
* __etext is assumed by startup code to be the LMA of a section in RAM
- * which must be 4byte aligned
+ * which must be 4byte aligned
*/
-
- .data :
+ __etext = ALIGN (4);
+
+ .data : AT (__etext)
{
__data_start__ = .;
*(vtable)
@@ -142,7 +213,6 @@
KEEP(*(.init_array))
PROVIDE_HIDDEN (__init_array_end = .);
-
. = ALIGN(4);
/* finit data */
PROVIDE_HIDDEN (__fini_array_start = .);
@@ -155,9 +225,7 @@
/* All data end */
__data_end__ = .;
- } > ITCM AT > DTCM
-
- __etext = ADDR(.data);
+ } > RAM
/*
* Secondary data section, optional
@@ -190,7 +258,7 @@
*(COMMON)
. = ALIGN(4);
__bss_end__ = .;
- } > DTCM2
+ } > RAM AT > RAM
/*
* Secondary bss section, optional
@@ -219,21 +287,19 @@
. = . + __HEAP_SIZE;
. = ALIGN(8);
__HeapLimit = .;
- } > DTCM2
+ } > RAM
+ PROVIDE(__HeapBase = __end__);
- .stack (ORIGIN(DTCM2) + LENGTH(DTCM2) - __STACK_SIZE) (COPY) :
+ .stack (ORIGIN(RAM) + LENGTH(RAM) - __STACK_SIZE) (COPY) :
{
. = ALIGN(8);
__StackLimit = .;
. = . + __STACK_SIZE;
. = ALIGN(8);
__StackTop = .;
- } > DTCM2
+ } > RAM
PROVIDE(__stack = __StackTop);
- /* Check if data + heap + stack exceeds DTCM2 limit */
- ASSERT(__StackLimit >= __HeapLimit, "region DTCM2 overflowed with stack")
+ /* Check if data + heap + stack exceeds RAM limit */
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
}
-
-
-
diff --git a/CMSIS/DSP/Platforms/FVP/ARMv81MML/Startup/GCC/startup_ARMv81MML.c b/CMSIS/DSP/Platforms/FVP/ARMv81MML/Startup/GCC/startup_ARMv81MML.c
index 06cbb5e..4e5bf5b 100755
--- a/CMSIS/DSP/Platforms/FVP/ARMv81MML/Startup/GCC/startup_ARMv81MML.c
+++ b/CMSIS/DSP/Platforms/FVP/ARMv81MML/Startup/GCC/startup_ARMv81MML.c
@@ -22,7 +22,6 @@
* limitations under the License.
*/
-
#if defined (ARMv81MML_DSP_DP_MVE_FP)
#include "ARMv81MML_DSP_DP_MVE_FP.h"
#else
@@ -125,10 +124,7 @@
#define SERIAL_DATA *((volatile unsigned *) SERIAL_BASE_ADDRESS)
-
-
-
-
+ extern void _start(void) __NO_RETURN;
/*----------------------------------------------------------------------------
Reset Handler called on controller reset
@@ -140,7 +136,9 @@
SystemInit(); /* CMSIS System Initialization */
- __PROGRAM_START();
+ __PROGRAM_START();
+
+ //_start();
}
@@ -150,6 +148,9 @@
*----------------------------------------------------------------------------*/
void HardFault_Handler(void)
{
+ SERIAL_DATA = 'H';
+ SERIAL_DATA = '\n';
+
while(1);
}
@@ -158,6 +159,8 @@
*----------------------------------------------------------------------------*/
void Default_Handler(void)
{
+ SERIAL_DATA = 'D';
+ SERIAL_DATA = '\n';
while(1);
}
diff --git a/CMSIS/DSP/Platforms/FVP/ARMv81MML/Startup/GCC/support.c b/CMSIS/DSP/Platforms/FVP/ARMv81MML/Startup/GCC/support.c
index 740f6b0..e284cd9 100755
--- a/CMSIS/DSP/Platforms/FVP/ARMv81MML/Startup/GCC/support.c
+++ b/CMSIS/DSP/Platforms/FVP/ARMv81MML/Startup/GCC/support.c
@@ -15,7 +15,7 @@
#endif
static int totalBytesProvidedBySBRK = 0;
-
+/*
//! sbrk/_sbrk version supporting reentrant newlib (depends upon above symbols defined by linker control file).
char * sbrk(int incr) {
static char *currentHeapEnd = &__HeapBase;
@@ -31,6 +31,6 @@
}
//! Synonym for sbrk.
char * _sbrk(int incr) { return sbrk(incr); };
-
+*/
void __malloc_lock() { };
void __malloc_unlock() { };
\ No newline at end of file
diff --git a/CMSIS/DSP/Source/CommonTables/arm_const_structs_f16.c b/CMSIS/DSP/Source/CommonTables/arm_const_structs_f16.c
index fa4a420..97db8af 100755
--- a/CMSIS/DSP/Source/CommonTables/arm_const_structs_f16.c
+++ b/CMSIS/DSP/Source/CommonTables/arm_const_structs_f16.c
@@ -42,7 +42,7 @@
/* Floating-point structs */
-#if !defined(ARM_MATH_MVEF) || defined(ARM_MATH_AUTOVECTORIZE)
+#if !defined(ARM_MATH_MVE_FLOAT16) || defined(ARM_MATH_AUTOVECTORIZE)
/*
@@ -50,7 +50,7 @@
Those structures cannot be used to initialize the MVE version of the FFT F32 instances.
So they are not compiled when MVE is defined.
-For the MVE version, the new arm_cfft_init_f32 must be used.
+For the MVE version, the new arm_cfft_init_f16 must be used.
*/
diff --git a/CMSIS/DSP/Source/fft.cmake b/CMSIS/DSP/Source/fft.cmake
index c1f9d8c..5719030 100644
--- a/CMSIS/DSP/Source/fft.cmake
+++ b/CMSIS/DSP/Source/fft.cmake
@@ -7,7 +7,7 @@
if (CONFIGTABLE AND CFFT_F32_16)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_TWIDDLECOEF_F32_16)
-if (HELIUM OR MVEF)
+if (HELIUM OR MVEF AND (NOT GCC))
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FXT_16)
else()
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FLT_16)
@@ -16,7 +16,7 @@
if (CONFIGTABLE AND CFFT_F32_32)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_TWIDDLECOEF_F32_32)
-if (HELIUM OR MVEF)
+if (HELIUM OR MVEF AND (NOT GCC))
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FXT_32)
else()
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FLT_32)
@@ -25,7 +25,7 @@
if (CONFIGTABLE AND CFFT_F32_64)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_TWIDDLECOEF_F32_64)
-if (HELIUM OR MVEF)
+if (HELIUM OR MVEF AND (NOT GCC))
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FXT_64)
else()
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FLT_64)
@@ -34,7 +34,7 @@
if (CONFIGTABLE AND CFFT_F32_128)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_TWIDDLECOEF_F32_128)
-if (HELIUM OR MVEF)
+if (HELIUM OR MVEF AND (NOT GCC))
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FXT_128)
else()
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FLT_128)
@@ -43,7 +43,7 @@
if (CONFIGTABLE AND CFFT_F32_256)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_TWIDDLECOEF_F32_256)
-if (HELIUM OR MVEF)
+if (HELIUM OR MVEF AND (NOT GCC))
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FXT_256)
else()
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FLT_256)
@@ -52,7 +52,7 @@
if (CONFIGTABLE AND CFFT_F32_512)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_TWIDDLECOEF_F32_512)
-if (HELIUM OR MVEF)
+if (HELIUM OR MVEF AND (NOT GCC))
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FXT_512)
else()
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FLT_512)
@@ -61,7 +61,7 @@
if (CONFIGTABLE AND CFFT_F32_1024)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_TWIDDLECOEF_F32_1024)
-if (HELIUM OR MVEF)
+if (HELIUM OR MVEF AND (NOT GCC))
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FXT_1024)
else()
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FLT_1024)
@@ -70,7 +70,7 @@
if (CONFIGTABLE AND CFFT_F32_2048)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_TWIDDLECOEF_F32_2048)
-if (HELIUM OR MVEF)
+if (HELIUM OR MVEF AND (NOT GCC))
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FXT_2048)
else()
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FLT_2048)
@@ -79,7 +79,7 @@
if (CONFIGTABLE AND CFFT_F32_4096)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_TWIDDLECOEF_F32_4096)
-if (HELIUM OR MVEF)
+if (HELIUM OR MVEF AND (NOT GCC))
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FXT_4096)
else()
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FLT_4096)
diff --git a/CMSIS/DSP/Testing/Source/Tests/BIQUADF16.cpp b/CMSIS/DSP/Testing/Source/Tests/BIQUADF16.cpp
index 3c72cfd..54ba98a 100755
--- a/CMSIS/DSP/Testing/Source/Tests/BIQUADF16.cpp
+++ b/CMSIS/DSP/Testing/Source/Tests/BIQUADF16.cpp
@@ -2,7 +2,7 @@
#include <stdio.h>
#include "Error.h"
-#define SNR_THRESHOLD 30
+#define SNR_THRESHOLD 27
/*
@@ -25,7 +25,7 @@
const float16_t *inputp = inputs.ptr();
float16_t *outp = output.ptr();
- #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
+ #if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE)
arm_biquad_mod_coef_f16 *coefsmodp = (arm_biquad_mod_coef_f16*)vecCoefs.ptr();
#endif
@@ -50,7 +50,7 @@
The filter is initialized with the coefs, blockSize and numTaps.
*/
-#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
+#if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE)
arm_biquad_cascade_df1_mve_init_f16(&this->Sdf1,3,coefsp,coefsmodp,statep);
#else
arm_biquad_cascade_df1_init_f16(&this->Sdf1,3,coefsp,statep);
@@ -162,7 +162,7 @@
const float16_t *inputp = inputs.ptr();
float16_t *outp = output.ptr();
- #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
+ #if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE)
arm_biquad_mod_coef_f16 *coefsmodp = (arm_biquad_mod_coef_f16*)vecCoefs.ptr();
#endif
@@ -194,7 +194,7 @@
The filter is initialized with the coefs, blockSize and numTaps.
*/
-#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
+#if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE)
arm_biquad_cascade_df1_mve_init_f16(&this->Sdf1,numStages,coefsp,coefsmodp,statep);
#else
arm_biquad_cascade_df1_init_f16(&this->Sdf1,numStages,coefsp,statep);
@@ -381,7 +381,7 @@
inputs.reload(BIQUADF16::BIQUADINPUTS_F16_ID,mgr);
coefs.reload(BIQUADF16::BIQUADCOEFS_F16_ID,mgr);
ref.reload(BIQUADF16::BIQUADREFS_F16_ID,mgr);
- #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
+ #if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE)
/* Max num stages is 47 in Python script */
vecCoefs.create(96*47,BIQUADF16::OUT_F16_ID,mgr);
#endif
@@ -401,7 +401,7 @@
coefs.reload(BIQUADF16::ALLBIQUADCOEFS_F16_ID,mgr);
ref.reload(BIQUADF16::ALLBIQUADREFS_F16_ID,mgr);
configs.reload(BIQUADF16::ALLBIQUADCONFIGS_S16_ID,mgr);
- #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
+ #if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE)
/* Max num stages is 47 in Python script */
vecCoefs.create(96*47,BIQUADF16::OUT_F16_ID,mgr);
#endif