diff --git a/DSP_Lib_TestSuite/CMakeLists.txt b/DSP_Lib_TestSuite/CMakeLists.txt new file mode 100644 index 00000000..56614459 --- /dev/null +++ b/DSP_Lib_TestSuite/CMakeLists.txt @@ -0,0 +1,86 @@ +cmake_minimum_required (VERSION 3.6) +cmake_policy(SET CMP0077 NEW) +# The tests are assuming that MATRIX_CHECK is enabled when building +# CMSIS-DSP. +set(MATRIXCHECK ON) +set(FASTMATHCOMPUTATIONS OFF) +option(DUMPPATTERN "Dump test patterns when test is failing" ON) +project(DSP_Lib_TestSuite) + +# Needed to find the config modules +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/..) + + +set(ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../..) + + +file(GLOB MAIN "Common/src/*.c") +file(GLOB BASICMATH_TESTS "Common/src/basic_math_tests/*.c") +file(GLOB COMPLEXMATH_TESTS "Common/src/complex_math_tests/*.c") +file(GLOB CONTROLLER_TESTS "Common/src/controller_tests/*.c") +file(GLOB FASTMATH_TESTS "Common/src/fast_math_tests/*.c") +file(GLOB FILTERING_TESTS "Common/src/filtering_tests/*.c") +file(GLOB INTRINSINCS_TESTS "Common/src/intrinsics_tests/*.c") +file(GLOB MATRIX_TESTS "Common/src/matrix_tests/*.c") +file(GLOB STATISTICS_TESTS "Common/src/statistics_tests/*.c") +file(GLOB SUPPORT_TESTS "Common/src/support_tests/*.c") +file(GLOB TRANSFORM_TESTS "Common/src/transform_tests/*.c") +file(GLOB JTEST_MAIN "Common/JTest/src/*.c") + +set(TESTSRC ${MAIN} + ${BASICMATH_TESTS} + ${COMPLEXMATH_TESTS} + ${CONTROLLER_TESTS} + ${FASTMATH_TESTS} + ${FILTERING_TESTS} + ${INTRINSINCS_TESTS} + ${MATRIX_TESTS} + ${STATISTICS_TESTS} + ${SUPPORT_TESTS} + ${TRANSFORM_TESTS} + ${JTEST_MAIN} + ) + +set(JINCS + Common/JTest/inc + Common/JTest/inc/arr_desc + Common/inc/basic_math_tests + Common/inc/complex_math_tests + Common/inc/controller_tests + Common/inc/fast_math_tests + Common/inc/filtering_tests + Common/inc/intrinsics_tests + Common/inc/matrix_tests + Common/inc/statistics_tests + Common/inc/support_tests + Common/inc/transform_tests + ) + +add_subdirectory(../Source bin_dsp) +add_subdirectory(RefLibs bin_ref) + + +add_executable(DSP_Lib_TestSuite) + +if (DUMPPATTERN) + target_compile_definitions(DSP_Lib_TestSuite PRIVATE DUMPPATTERN) +endif() + +# Change behavior of configBoot for scatter file +set(TESTFRAMEWORK ON) + +include(configBoot) + +file(COPY ${ROOT}/CMSIS/DSP/Examples/ARM/boot/RTE_Components.h DESTINATION tempLink) + +target_link_libraries(DSP_Lib_TestSuite PRIVATE CMSISDSP) +target_link_libraries(DSP_Lib_TestSuite PRIVATE DspRefLibs) + +target_sources(DSP_Lib_TestSuite PRIVATE ${TESTSRC}) + +### Includes +target_include_directories(DSP_Lib_TestSuite PRIVATE "Common/inc") +target_include_directories(DSP_Lib_TestSuite PRIVATE "Common/inc/templates") +target_include_directories(DSP_Lib_TestSuite PRIVATE ${JINCS}) + + diff --git a/DSP_Lib_TestSuite/Common/JTest/inc/jtest_fw.h b/DSP_Lib_TestSuite/Common/JTest/inc/jtest_fw.h index 644266b5..e48c0c5a 100644 --- a/DSP_Lib_TestSuite/Common/JTest/inc/jtest_fw.h +++ b/DSP_Lib_TestSuite/Common/JTest/inc/jtest_fw.h @@ -141,13 +141,13 @@ typedef struct JTEST_FW_struct * Fill the buffer named buf_name with value and dump it to the Keil debugger * using action. */ -#ifdef ARMv7A +#if defined(ARMv7A) || defined(FILEIO) #define JTEST_ACT_DUMP(action, buf_name, value) \ do \ { \ JTEST_CLEAR_BUFFER(buf_name); \ - printf("%s",value); \ + printf("%s",value); \ strcpy(JTEST_FW.buf_name, (value)); \ JTEST_TRIGGER_ACTION(action); \ } while (0) @@ -206,7 +206,7 @@ typedef struct JTEST_FW_struct /** * Dump a formatted string to the Keil Debugger. */ -#ifdef ARMv7A +#if defined(ARMv7A) || defined(FILEIO) #define JTEST_DUMP_STRF(format_str, ... ) \ do \ diff --git a/DSP_Lib_TestSuite/Common/inc/templates/test_templates.h b/DSP_Lib_TestSuite/Common/inc/templates/test_templates.h index 69c3488a..844e7c9e 100644 --- a/DSP_Lib_TestSuite/Common/inc/templates/test_templates.h +++ b/DSP_Lib_TestSuite/Common/inc/templates/test_templates.h @@ -62,25 +62,45 @@ /** * Assert that buffers A and B are byte-equivalent for a number of bytes. */ +#if defined(DUMPPATTERN) #define TEST_ASSERT_BUFFERS_EQUAL(buf_a, buf_b, bytes) \ do \ { \ if (memcmp(buf_a, buf_b, bytes) != 0) \ { \ + JTEST_DUMP_STRF("%s","DUMP PATTERNS\n"); \ + for(unsigned long i=0;i < bytes; i++) \ + { \ + /*JTEST_DUMP_STRF("%0x %0x\n", *a,*b);*/\ + } \ return JTEST_TEST_FAILED; \ } \ } while (0) +#else + +#define TEST_ASSERT_BUFFERS_EQUAL(buf_a, buf_b, bytes)\ + do \ + { \ + if (memcmp(buf_a, buf_b, bytes) != 0) \ + { \ + return JTEST_TEST_FAILED; \ + } \ + } while (0) + + +#endif + /** * Assert that the two entities are equal. */ -#define TEST_ASSERT_EQUAL(a, b) \ - do \ - { \ - if ((a) != (b)) \ - { \ - return JTEST_TEST_FAILED; \ - } \ +#define TEST_ASSERT_EQUAL(a, b) \ + do \ + { \ + if ((a) != (b)) \ + { \ + return JTEST_TEST_FAILED;\ + } \ } while (0) /** @@ -111,31 +131,74 @@ * Assert that the SNR between a reference and test sample is above a given * threshold. */ -#define TEST_ASSERT_SNR(ref_ptr, tst_ptr, block_size, threshold) \ +#if defined(DUMPPATTERN) + +#define TEST_ASSERT_SNR(ref_ptr, tst_ptr, block_size, threshold) \ + do \ + { \ + float32_t snr = arm_snr_f32(ref_ptr, tst_ptr, block_size);\ + if ( snr <= threshold) \ + { \ + JTEST_DUMP_STRF("%s","DUMP PATTERNS\n"); \ + for(unsigned long i=0;i < block_size; i++) \ + { \ + /*JTEST_DUMP_STRF("%f %f\n", ref_ptr[i],tst_ptr[i]);*/\ + } \ + JTEST_DUMP_STRF("SNR: %f\n", snr); \ + return JTEST_TEST_FAILED; \ + } \ + } while (0) + +#else + +#define TEST_ASSERT_SNR(ref_ptr, tst_ptr, block_size, threshold) \ + do \ + { \ + float32_t snr = arm_snr_f32(ref_ptr, tst_ptr, block_size);\ + if ( snr <= threshold) \ + { \ + JTEST_DUMP_STRF("SNR: %f\n", snr); \ + return JTEST_TEST_FAILED; \ + } \ + } while (0) + +#endif +/** + * Assert that the SNR between a reference and test sample is above a given + * threshold. Special case for float64_t + */ +#if defined(DUMPPATTERN) + +#define TEST_ASSERT_DBL_SNR(ref_ptr, tst_ptr, block_size, threshold)\ do \ { \ - float32_t snr = arm_snr_f32(ref_ptr, tst_ptr, block_size); \ - if ( snr <= threshold) \ + float64_t snr = arm_snr_f64(ref_ptr, tst_ptr, block_size); \ + if ( snr <= threshold) \ { \ + JTEST_DUMP_STRF("%s","DUMP PATTERNS\n"); \ + for(unsigned long i=0;i < block_size; i++) \ + { \ + /* JTEST_DUMP_STRF("%f %f\n", ref_ptr[i],tst_ptr[i]);*/ \ + } \ JTEST_DUMP_STRF("SNR: %f\n", snr); \ return JTEST_TEST_FAILED; \ } \ - } while (0) \ + } while (0) -/** - * Assert that the SNR between a reference and test sample is above a given - * threshold. Special case for float64_t - */ -#define TEST_ASSERT_DBL_SNR(ref_ptr, tst_ptr, block_size, threshold) \ +#else + +#define TEST_ASSERT_DBL_SNR(ref_ptr, tst_ptr, block_size, threshold)\ do \ { \ float64_t snr = arm_snr_f64(ref_ptr, tst_ptr, block_size); \ - if ( snr <= threshold) \ + if ( snr <= threshold) \ { \ JTEST_DUMP_STRF("SNR: %f\n", snr); \ return JTEST_TEST_FAILED; \ } \ - } while (0) \ + } while (0) + +#endif /** * Compare test and reference elements by converting to float and diff --git a/DSP_Lib_TestSuite/Common/src/all_tests.c b/DSP_Lib_TestSuite/Common/src/all_tests.c index a38e94f2..3c2f1b24 100644 --- a/DSP_Lib_TestSuite/Common/src/all_tests.c +++ b/DSP_Lib_TestSuite/Common/src/all_tests.c @@ -21,6 +21,9 @@ JTEST_DEFINE_GROUP(all_tests) JTEST_GROUP_CALL(complex_math_tests); JTEST_GROUP_CALL(controller_tests); JTEST_GROUP_CALL(fast_math_tests); + /* Biquad df2T_f32 will fail with Neon. The test must be updated. + Neon implementation is requiring a different initialization. + */ JTEST_GROUP_CALL(filtering_tests); JTEST_GROUP_CALL(matrix_tests); JTEST_GROUP_CALL(statistics_tests); diff --git a/DSP_Lib_TestSuite/Common/src/main.c b/DSP_Lib_TestSuite/Common/src/main.c index 2e7d5ad9..a41de7dd 100644 --- a/DSP_Lib_TestSuite/Common/src/main.c +++ b/DSP_Lib_TestSuite/Common/src/main.c @@ -16,12 +16,16 @@ void debug_init(void) int main(void) { +#if !defined(FILEIO) debug_init(); +#endif JTEST_INIT(); /* Initialize test framework. */ JTEST_GROUP_CALL(all_tests); /* Run all tests. */ JTEST_ACT_EXIT_FW(); /* Exit test framework. */ +#if !defined(FILEIO) while (1); /* Never return. */ +#endif } diff --git a/DSP_Lib_TestSuite/RefLibs/CMakeLists.txt b/DSP_Lib_TestSuite/RefLibs/CMakeLists.txt new file mode 100644 index 00000000..2fbb1910 --- /dev/null +++ b/DSP_Lib_TestSuite/RefLibs/CMakeLists.txt @@ -0,0 +1,78 @@ +cmake_minimum_required (VERSION 3.6) + +project(DspRefLibs) + +# Needed to find the config modules +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../..) + + + + +set(REFSRC src/BasicMathFunctions/abs.c + src/BasicMathFunctions/add.c + src/BasicMathFunctions/dot_prod.c + src/BasicMathFunctions/mult.c + src/BasicMathFunctions/negate.c + src/BasicMathFunctions/offset.c + src/BasicMathFunctions/scale.c + src/BasicMathFunctions/shift.c + src/BasicMathFunctions/sub.c + src/ComplexMathFunctions/cmplx_conj.c + src/ComplexMathFunctions/cmplx_dot_prod.c + src/ComplexMathFunctions/cmplx_mag.c + src/ComplexMathFunctions/cmplx_mag_squared.c + src/ComplexMathFunctions/cmplx_mult_cmplx.c + src/ComplexMathFunctions/cmplx_mult_real.c + src/ControllerFunctions/pid.c + src/ControllerFunctions/sin_cos.c + src/FastMathFunctions/cos.c + src/FastMathFunctions/sin.c + src/FastMathFunctions/sqrt.c + src/FilteringFunctions/biquad.c + src/FilteringFunctions/conv.c + src/FilteringFunctions/correlate.c + src/FilteringFunctions/fir.c + src/FilteringFunctions/fir_decimate.c + src/FilteringFunctions/fir_interpolate.c + src/FilteringFunctions/fir_lattice.c + src/FilteringFunctions/fir_sparse.c + src/FilteringFunctions/iir_lattice.c + src/FilteringFunctions/lms.c + src/HelperFunctions/mat_helper.c + src/HelperFunctions/ref_helper.c + src/Intrinsics/intrinsics.c + src/MatrixFunctions/mat_add.c + src/MatrixFunctions/mat_cmplx_mult.c + src/MatrixFunctions/mat_inverse.c + src/MatrixFunctions/mat_mult.c + src/MatrixFunctions/mat_scale.c + src/MatrixFunctions/mat_sub.c + src/MatrixFunctions/mat_trans.c + src/StatisticsFunctions/max.c + src/StatisticsFunctions/mean.c + src/StatisticsFunctions/min.c + src/StatisticsFunctions/power.c + src/StatisticsFunctions/rms.c + src/StatisticsFunctions/std.c + src/StatisticsFunctions/var.c + src/SupportFunctions/copy.c + src/SupportFunctions/fill.c + src/SupportFunctions/fixed_to_fixed.c + src/SupportFunctions/fixed_to_float.c + src/SupportFunctions/float_to_fixed.c + src/TransformFunctions/bitreversal.c + src/TransformFunctions/cfft.c + src/TransformFunctions/dct4.c + src/TransformFunctions/rfft.c + ) + +add_library(DspRefLibs STATIC ${REFSRC}) + +include(config) +configdsp(DspRefLibs ../../Source) + +### Includes +target_include_directories(DspRefLibs PUBLIC "inc") +target_include_directories(DspRefLibs PUBLIC "../../Include") + + diff --git a/DSP_Lib_TestSuite/RefLibs/inc/ref.h b/DSP_Lib_TestSuite/RefLibs/inc/ref.h index 3a6e6df7..69d83d13 100644 --- a/DSP_Lib_TestSuite/RefLibs/inc/ref.h +++ b/DSP_Lib_TestSuite/RefLibs/inc/ref.h @@ -59,10 +59,15 @@ extern "C" } dataType; +#ifndef FLT_MAX #define FLT_MAX 3.40282347e+38F +#endif + #define DBL_MAX 1.79769313486231571e+308 +#ifndef FLT_MIN #define FLT_MIN 1.175494351e-38F +#endif #define DBL_MIN 2.22507385850720138e-308 #define SCHAR_MIN (-128) diff --git a/DSP_Lib_TestSuite/RefLibs/src/TransformFunctions/bitreversal.c b/DSP_Lib_TestSuite/RefLibs/src/TransformFunctions/bitreversal.c index 1f2be89f..1b564fc4 100644 --- a/DSP_Lib_TestSuite/RefLibs/src/TransformFunctions/bitreversal.c +++ b/DSP_Lib_TestSuite/RefLibs/src/TransformFunctions/bitreversal.c @@ -8,7 +8,7 @@ ;* @param[in] *pBitRevTab points to bit reversal table. ;* @return none. ;*/ -void arm_bitreversal_32(uint32_t *pSrc, uint32_t bitRevLen, uint32_t *pBitRevTab) +void ref_arm_bitreversal_32(uint32_t *pSrc, uint32_t bitRevLen, uint32_t *pBitRevTab) { uint32_t a,b,i,tmp; diff --git a/Examples/ARM/arm_variance_example/CMakeLists.txt b/Examples/ARM/arm_variance_example/CMakeLists.txt index e2bd12b9..a2084d78 100755 --- a/Examples/ARM/arm_variance_example/CMakeLists.txt +++ b/Examples/ARM/arm_variance_example/CMakeLists.txt @@ -27,6 +27,8 @@ add_subdirectory(../../../Source bin_dsp) add_executable(arm_variance_example) +set(ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../../../..) + include(configBoot) target_sources(arm_variance_example PRIVATE arm_variance_example_f32.c) diff --git a/Include/arm_math.h b/Include/arm_math.h index 75a8789a..eb37f822 100644 --- a/Include/arm_math.h +++ b/Include/arm_math.h @@ -320,6 +320,7 @@ #include "string.h" #include "math.h" +#include "float.h" /* evaluate ARM DSP feature */ #if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) @@ -817,8 +818,6 @@ compiler file in Core or Core_A would not make sense. #if defined(ARM_MATH_NEON) -#define FLT_MIN 1E-37 - static inline float32x4_t __arm_vec_sqrt_f32_neon(float32x4_t x) { float32x4_t x1 = vmaxq_f32(x, vdupq_n_f32(FLT_MIN)); diff --git a/Source/ControllerFunctions/CMakeLists.txt b/Source/ControllerFunctions/CMakeLists.txt index 2efd7928..705f5b86 100644 --- a/Source/ControllerFunctions/CMakeLists.txt +++ b/Source/ControllerFunctions/CMakeLists.txt @@ -2,8 +2,7 @@ cmake_minimum_required (VERSION 3.6) project(CMSISDSPController) - -add_library(CMSISDSPController STATIC ${SRC}) +add_library(CMSISDSPController STATIC) configdsp(CMSISDSPController ..) diff --git a/Source/FilteringFunctions/CMakeLists.txt b/Source/FilteringFunctions/CMakeLists.txt index 101e3609..59471ad4 100644 --- a/Source/FilteringFunctions/CMakeLists.txt +++ b/Source/FilteringFunctions/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_minimum_required (VERSION 3.6) project(CMSISDSPFiltering) -add_library(CMSISDSPFiltering STATIC ${SRC}) +add_library(CMSISDSPFiltering STATIC) include(interpol) interpol(CMSISDSPFiltering) diff --git a/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f32.c b/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f32.c index 0c6f6df7..23cf2d29 100644 --- a/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f32.c +++ b/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f32.c @@ -46,14 +46,39 @@ @return none @par Coefficient and State Ordering - The coefficients are stored in the array pCoeffs in the following order: + The coefficients are stored in the array pCoeffs in the following order + in the not Neon version.
       {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...}
   
+ @par where b1x and a1x are the coefficients for the first stage, b2x and a2x are the coefficients for the second stage, and so on. The pCoeffs array contains a total of 5*numStages values. + + For Neon version, this array is bigger. If numstages = 4x + y, then the array has size: + 32*x + 5*y + and it must be initialized using the function + arm_biquad_cascade_df2T_compute_coefs_f32 which is taking the + standard array coefficient as parameters. + + But, an array of 8*numstages is a good approximation. + + Then, the initialization can be done with: +
+                   arm_biquad_cascade_df2T_init_f32(&SNeon, nbCascade, neonCoefs, stateNeon);
+                   arm_biquad_cascade_df2T_compute_coefs_f32(&SNeon,nbCascade,coefs);
+  
+ + @par In this example, neonCoefs is a bigger array of size 8 * numStages. + coefs is the standard array: + +
+      {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...}
+  
+ + @par The pState is a pointer to state array. Each Biquad stage has 2 state variables d1, and d2. @@ -63,6 +88,16 @@ */ #if defined(ARM_MATH_NEON) +/* + +Must be called after initializing the biquad instance. +pCoeffs has size 5 * nbCascade +Whereas the pCoeffs for the init has size (4*4 + 4*4)* nbCascade + +So this pCoeffs is the one which would be used for the not Neon version. +The pCoeffs passed in init is bigger than the one for the not Neon version. + +*/ void arm_biquad_cascade_df2T_compute_coefs_f32( arm_biquad_cascade_df2T_instance_f32 * S, uint8_t numStages, diff --git a/Source/TransformFunctions/CMakeLists.txt b/Source/TransformFunctions/CMakeLists.txt index 217c2c2d..4e5b4f27 100644 --- a/Source/TransformFunctions/CMakeLists.txt +++ b/Source/TransformFunctions/CMakeLists.txt @@ -38,6 +38,10 @@ target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix4_q31.c) target_sources(CMSISDSPTransform PRIVATE arm_cfft_q31.c) endif() +if (NOT CONFIGTABLE OR ALLFFT) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix2_init_q15.c) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix2_init_q31.c) +endif() if (NOT CONFIGTABLE OR ALLFFT OR DCT4_F32_128 OR DCT4_F32_512 OR DCT4_F32_2048 OR DCT4_F32_8192) target_sources(CMSISDSPTransform PRIVATE arm_dct4_f32.c) diff --git a/config.cmake b/config.cmake index ed24432d..b6c84bed 100755 --- a/config.cmake +++ b/config.cmake @@ -1,7 +1,8 @@ include(CMakePrintHelpers) +cmake_policy(SET CMP0077 NEW) SET(CORTEXM ON) -option(FASTMATH "Fast Math enabled" ON) +option(FASTMATHCOMPUTATIONS "Fast Math enabled" ON) option(NEON "Neon acceleration" OFF) option(NEONEXPERIMENTAL "Neon experimental acceleration" OFF) option(LOOPUNROLL "Loop unrolling" ON) @@ -22,7 +23,7 @@ function(configdsp PROJECTNAME DSP) target_compile_definitions(${PROJECTNAME} PUBLIC ARM_DSP_CONFIG_TABLES) endif() - if (FASTMATH) + if (FASTMATHCOMPUTATIONS) target_compile_options(${PROJECTNAME} PUBLIC "-ffast-math") endif() diff --git a/configBoot.cmake b/configBoot.cmake index 52e7717c..68a364c3 100755 --- a/configBoot.cmake +++ b/configBoot.cmake @@ -16,7 +16,7 @@ get_filename_component(PROJECT_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) cmake_print_variables(PROJECT_NAME) -set(ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../../../..) +#set(ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../../../..) if (ARMAC6) @@ -90,6 +90,7 @@ if (ARMAC6) # if (ARM_CPU STREQUAL "cortex-a5") cortexa(ARMCA5) + target_compile_definitions(${PROJECT_NAME} PRIVATE ARMv7A) endif() ################### @@ -98,6 +99,7 @@ if (ARMAC6) # if (ARM_CPU STREQUAL "cortex-a7") cortexa(ARMCA7) + target_compile_definitions(${PROJECT_NAME} PRIVATE ARMv7A) endif() ################### @@ -106,6 +108,7 @@ if (ARMAC6) # if (ARM_CPU STREQUAL "cortex-a9") cortexa(ARMCA9) + target_compile_definitions(${PROJECT_NAME} PRIVATE ARMv7A) endif() endif() diff --git a/configUtils.cmake b/configUtils.cmake index ba3ac630..43b1c5f0 100755 --- a/configUtils.cmake +++ b/configUtils.cmake @@ -4,7 +4,13 @@ function(cortexm CORE) target_include_directories(${PROJECT_NAME} PRIVATE ${ROOT}/Device/ARM/${CORE}/Include) target_include_directories(${PROJECT_NAME} PRIVATE ${ROOT}/CMSIS/Core/Include) - set(SCATTERFILE "${ROOT}/Device/ARM/${CORE}/Source/ARM/${CORE}_ac6.sct") + if (TESTFRAMEWORK) + # Need bigger sections for test framework + # So we use the test framework scatter file + set(SCATTERFILE "${ROOT}/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/ARMCLANG/armcc6_arm.sct") + else() + set(SCATTERFILE "${ROOT}/Device/ARM/${CORE}/Source/ARM/${CORE}_ac6.sct") + endif() target_link_options(${PROJECT_NAME} PRIVATE "--info=sizes;--entry=Reset_Handler;--scatter=${SCATTERFILE}") @@ -20,9 +26,18 @@ function(cortexa CORE) target_include_directories(${PROJECT_NAME} PRIVATE ${ROOT}/CMSIS/Core_A/Include) target_sources(${PROJECT_NAME} PRIVATE ${ROOT}/Device/ARM/${CORE}/Source/AC6/startup_${CORE}.c) - set(SCATTERFILE ${CMAKE_CURRENT_BINARY_DIR}/tempLink/${CORE}.sct) - target_include_directories(${PROJECT_NAME} PRIVATE ../boot) + if (TESTFRAMEWORK) + # Test scatter file is missing some sections required by startup file for + # cortex-a + #set(SCATTERFILE "${ROOT}/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/ARMCLANG/armcc6_arm.sct") + target_include_directories(${PROJECT_NAME} PRIVATE ../Examples/ARM/boot) + else() + target_include_directories(${PROJECT_NAME} PRIVATE ../boot) + endif() + + set(SCATTERFILE ${CMAKE_CURRENT_BINARY_DIR}/tempLink/${CORE}.sct) + # Copy the mem file to the build directory # so that it can be find when preprocessing the scatter file