diff --git a/Source/FilteringFunctions/arm_biquad_cascade_df2T_f64.c b/Source/FilteringFunctions/arm_biquad_cascade_df2T_f64.c index 521f63b3..ae06b634 100644 --- a/Source/FilteringFunctions/arm_biquad_cascade_df2T_f64.c +++ b/Source/FilteringFunctions/arm_biquad_cascade_df2T_f64.c @@ -105,7 +105,7 @@ To do this manually without calling the init function, assign the follow subfields of the instance structure: numStages, pCoeffs, pState. Also set all of the values in pState to zero. @par - Use of the initialization function is optional. + Use of the initialization function is optional except for the vectorized versions (Helium and Neon). However, if the initialization function is used, then the instance structure cannot be placed into a const data section. To place an instance structure into a const data section, the instance structure must be manually initialized. Set the values in the state buffer to zeros before static initialization. @@ -117,6 +117,12 @@ where numStages is the number of Biquad stages in the filter; pState is the address of the state buffer. pCoeffs is the address of the coefficient buffer; + @par Neon version + For Neon version, the function arm_biquad_cascade_df2T_compute_coefs_x must be + used in addition to arm_biquad_cascade_df2T_init_x. + + See the documentation of arm_biquad_cascade_df2T_init_x for more details. + */ /** diff --git a/Testing/FrameworkSource/Timing.cpp b/Testing/FrameworkSource/Timing.cpp index 58bda7ea..eb5423ae 100644 --- a/Testing/FrameworkSource/Timing.cpp +++ b/Testing/FrameworkSource/Timing.cpp @@ -63,8 +63,18 @@ static uint32_t startCycles=0; #if defined(CORTEXA) || defined(CORTEXR) #if !defined(__GNUC_PYTHON__) #include "cmsis_cp15.h" +#else +#if defined(__aarch64__) +#include "timing_aarch64.h" +#define AARCH64_TIMING +#endif #endif + +#if defined(CORTEXA) && defined(AARCH64_TIMING) +unsigned long long startCycles; +#else unsigned int startCycles; +#endif #define DO_RESET 1 #define ENABLE_DIVIDER 0 @@ -84,9 +94,9 @@ void initCycleMeasurement() #endif #if defined(CORTEXA) || defined(CORTEXR) +#if !defined(AARCH64_TIMING) // in general enable all counters (including cycle counter) - #if !defined(__GNUC_PYTHON__) int32_t value = 1; @@ -99,10 +109,8 @@ void initCycleMeasurement() if (ENABLE_DIVIDER) value |= 8; // enable "by 64" divider for CCNT. - #endif //value |= 16; -#if !defined(__GNUC_PYTHON__) // program the performance-counter control-register: __set_CP(15, 0, value, 9, 12, 0); @@ -117,6 +125,8 @@ void initCycleMeasurement() value = value | (0x8000 << 12); __set_CP(15, 0, value, 14, 15, 7); #endif +#else + enable_timing(); #endif #endif #endif @@ -143,11 +153,15 @@ void cycleMeasurementStart() #endif -#if (defined(CORTEXA) || defined(CORTEXR)) && !defined(__GNUC_PYTHON__) +#if (defined(CORTEXA) || defined(CORTEXR)) + #if !defined(AARCH64_TIMING) unsigned int value; // Read CCNT Register __get_CP(15, 0, value, 9, 13, 0); startCycles = value; + #else + startCycles = readCCNT(); + #endif #endif #endif #endif @@ -193,14 +207,18 @@ return(0); #endif #endif -#if (defined(CORTEXA) || defined(CORTEXR)) && !defined(__GNUC_PYTHON__) +#if (defined(CORTEXA) || defined(CORTEXR)) + #if !defined(AARCH64_TIMING) unsigned int value; // Read CCNT Register __get_CP(15, 0, value, 9, 13, 0); return(value - startCycles); + #else + unsigned long long value; + value = readCCNT(); + return((Testing::cycles_t)(value - startCycles)); + #endif #endif #endif - #if defined(__GNUC_PYTHON__) - return(0); - #endif + }