CMSIS-DSP: Test framework tuning

Tuning to test with gcc and Helium code.
pull/19/head
Christophe Favergeon 5 years ago
parent 4288cf4fec
commit 502fb88f3d

@ -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 @@ SECTIONS
*(.rodata*)
KEEP(*(.eh_frame*))
} > ITCM
} > FLASH
/*
* SG veneers:
@ -79,30 +147,32 @@ SECTIONS
.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 @@ SECTIONS
/* 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
*/
__etext = ALIGN (4);
.data :
.data : AT (__etext)
{
__data_start__ = .;
*(vtable)
@ -142,7 +213,6 @@ SECTIONS
KEEP(*(.init_array))
PROVIDE_HIDDEN (__init_array_end = .);
. = ALIGN(4);
/* finit data */
PROVIDE_HIDDEN (__fini_array_start = .);
@ -155,9 +225,7 @@ SECTIONS
/* All data end */
__data_end__ = .;
} > ITCM AT > DTCM
__etext = ADDR(.data);
} > RAM
/*
* Secondary data section, optional
@ -190,7 +258,7 @@ SECTIONS
*(COMMON)
. = ALIGN(4);
__bss_end__ = .;
} > DTCM2
} > RAM AT > RAM
/*
* Secondary bss section, optional
@ -219,21 +287,19 @@ SECTIONS
. = . + __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")
}

@ -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 @@ extern const pFunc __VECTOR_TABLE[240];
#define SERIAL_DATA *((volatile unsigned *) SERIAL_BASE_ADDRESS)
extern void _start(void) __NO_RETURN;
/*----------------------------------------------------------------------------
Reset Handler called on controller reset
@ -140,7 +136,9 @@ __NO_RETURN void Reset_Handler(void)
SystemInit(); /* CMSIS System Initialization */
__PROGRAM_START();
__PROGRAM_START();
//_start();
}
@ -150,6 +148,9 @@ __NO_RETURN void Reset_Handler(void)
*----------------------------------------------------------------------------*/
void HardFault_Handler(void)
{
SERIAL_DATA = 'H';
SERIAL_DATA = '\n';
while(1);
}
@ -158,6 +159,8 @@ void HardFault_Handler(void)
*----------------------------------------------------------------------------*/
void Default_Handler(void)
{
SERIAL_DATA = 'D';
SERIAL_DATA = '\n';
while(1);
}

@ -15,7 +15,7 @@ char __HeapBase, __HeapLimit; // make sure to define these symbols in linker co
#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 @@ char * sbrk(int incr) {
}
//! Synonym for sbrk.
char * _sbrk(int incr) { return sbrk(incr); };
*/
void __malloc_lock() { };
void __malloc_unlock() { };

@ -42,7 +42,7 @@ for compilation.
/* 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 @@ for compilation.
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.
*/

@ -7,7 +7,7 @@ function(fft PROJECT)
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 @@ endif()
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 @@ endif()
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 @@ endif()
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 @@ endif()
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 @@ endif()
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 @@ endif()
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 @@ endif()
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 @@ endif()
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)

@ -2,7 +2,7 @@
#include <stdio.h>
#include "Error.h"
#define SNR_THRESHOLD 30
#define SNR_THRESHOLD 27
/*
@ -25,7 +25,7 @@ a double precision computation.
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 @@ a double precision computation.
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 @@ a double precision computation.
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 @@ a double precision computation.
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 @@ a double precision computation.
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 @@ a double precision computation.
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

Loading…
Cancel
Save