first generate
This commit is contained in:
		@ -0,0 +1,220 @@
 | 
			
		||||
#ifndef _ARR_DESC_H_
 | 
			
		||||
#define _ARR_DESC_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <string.h>             /* memset() */
 | 
			
		||||
#include "../util/util.h"       /* CONCAT() */
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Type Definitions */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Array-descriptor struct.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct ARR_DESC_struct
 | 
			
		||||
{
 | 
			
		||||
    void *  data_ptr;                /* Pointer to the array contents. */
 | 
			
		||||
    int32_t element_count;           /* Number of current elements. */
 | 
			
		||||
    int32_t element_size;            /* Size of current elements in bytes. */
 | 
			
		||||
    int32_t underlying_size;         /* Size of underlying array in bytes. */
 | 
			
		||||
} ARR_DESC_t;
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros and Defines */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Prefix of the array variable's name when creating an array and an array
 | 
			
		||||
 *  descriptor at the same time.
 | 
			
		||||
 */
 | 
			
		||||
#define ARR_DESC_ARR_PREFIX ARR_DESC_ARR_
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Evaluate to the array variable's name when creating an array and an array
 | 
			
		||||
 *  descriptor at the same time.
 | 
			
		||||
 */
 | 
			
		||||
#define ARR_DESC_ARR_NAME(name)                 \
 | 
			
		||||
    CONCAT(ARR_DESC_ARR_PREFIX, name)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Define an #ARR_DESC_t by itself.
 | 
			
		||||
 *
 | 
			
		||||
 *  @note The user must supply an array to store the data used by the
 | 
			
		||||
 *  #ARR_DESC_t.
 | 
			
		||||
 */
 | 
			
		||||
#define ARR_DESC_INTERNAL_DEFINE(name, data_ptr,                \
 | 
			
		||||
                                 element_count, element_size)   \
 | 
			
		||||
    ARR_DESC_t name = {                                         \
 | 
			
		||||
        data_ptr,                                               \
 | 
			
		||||
        element_count,                                          \
 | 
			
		||||
        element_size,                                           \
 | 
			
		||||
        element_count * element_size                            \
 | 
			
		||||
    }                                                           \
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Define both an array and an #ARR_DESC_t that describes it.
 | 
			
		||||
 *
 | 
			
		||||
 *  @note Use the #CURLY() macro for the content field; it provides the curly
 | 
			
		||||
 *  braces necessary for an array initialization.
 | 
			
		||||
 */
 | 
			
		||||
#define ARR_DESC_DEFINE(type, name, element_count, content)             \
 | 
			
		||||
    type ARR_DESC_ARR_NAME(name)[element_count] = content;              \
 | 
			
		||||
    ARR_DESC_INTERNAL_DEFINE(name,                                      \
 | 
			
		||||
                             &ARR_DESC_ARR_NAME(name),                  \
 | 
			
		||||
                             element_count,                             \
 | 
			
		||||
                             sizeof(type)) /* Note the lacking semicolon */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Create a #ARR_DESC_t which refers to a subset of the data in another.
 | 
			
		||||
 *
 | 
			
		||||
 *  The new #ARR_DESC_t shares the same underlying array as the aliased
 | 
			
		||||
 *  #ARR_DESC_t, but only describes a subset of the originals values.
 | 
			
		||||
 */
 | 
			
		||||
#define ARR_DESC_DEFINE_SUBSET(name, original, element_cnt)         \
 | 
			
		||||
    ARR_DESC_INTERNAL_DEFINE(name,                                  \
 | 
			
		||||
                             &ARR_DESC_ARR_NAME(original),          \
 | 
			
		||||
                             element_cnt,                           \
 | 
			
		||||
                             sizeof(ARR_DESC_ARR_NAME(original)[0]) \
 | 
			
		||||
        ) /* Note the lacking semicolon */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Creat an #ARR_DESC_t which points to the data in an existing array.
 | 
			
		||||
 *
 | 
			
		||||
 *  @param start_idx Offset in array_ptr of first element.
 | 
			
		||||
 *  @param element_cnt Number of elements to include in the #ARR_DESC_t.
 | 
			
		||||
 *
 | 
			
		||||
 *  @example
 | 
			
		||||
 *
 | 
			
		||||
 *  float my_floats[4] = {0.0f, 1.0f, 2.0f, 3.0f};
 | 
			
		||||
 *
 | 
			
		||||
 *  ARR_DESC_DEFINE_USING_ARR(my_arr_desc, my_floats, 1, 3);
 | 
			
		||||
 *
 | 
			
		||||
 *  printf("Element 0: %f\n", ARR_DESC_ELT(float, 0, &my_arr_desc));
 | 
			
		||||
 *  printf("Element 1: %f\n", ARR_DESC_ELT(float, 1, &my_arr_desc));
 | 
			
		||||
 *
 | 
			
		||||
 *  Outputs:
 | 
			
		||||
 *
 | 
			
		||||
 *  Element 0: 1.000000
 | 
			
		||||
 *  Element 1: 2.000000
 | 
			
		||||
 *
 | 
			
		||||
 *  @warning There are no checks in place to catch invalid start indices; This
 | 
			
		||||
 *  is left to the user.
 | 
			
		||||
 */
 | 
			
		||||
#define ARR_DESC_DEFINE_USING_ARR(type, name, array_ptr, start_idx, element_cnt) \
 | 
			
		||||
    ARR_DESC_INTERNAL_DEFINE(                                           \
 | 
			
		||||
        name,                                                           \
 | 
			
		||||
        (type *) (array_ptr + start_idx),                               \
 | 
			
		||||
        element_cnt,                                                    \
 | 
			
		||||
        sizeof(type)                                                    \
 | 
			
		||||
        ) /* Note the lacking semicolon*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Declare an #ARR_DESC_t object.
 | 
			
		||||
 */
 | 
			
		||||
#define ARR_DESC_DECLARE(name)                              \
 | 
			
		||||
    extern ARR_DESC_t name /* Note the lacking semicolon */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Evaluate to the number of bytes stored in the #ARR_DESC_t.
 | 
			
		||||
 */
 | 
			
		||||
#define ARR_DESC_BYTES(arr_desc_ptr)                                \
 | 
			
		||||
    ((arr_desc_ptr)->element_count * (arr_desc_ptr)->element_size)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Set the contents of #ARR_DESC_t to value.
 | 
			
		||||
 */
 | 
			
		||||
#define ARR_DESC_MEMSET(arr_desc_ptr, value, bytes)     \
 | 
			
		||||
    do                                                  \
 | 
			
		||||
    {                                                   \
 | 
			
		||||
        memset((arr_desc_ptr)->data_ptr,                \
 | 
			
		||||
               value,                                   \
 | 
			
		||||
               BOUND(0,                                 \
 | 
			
		||||
                     (arr_desc_ptr)->underlying_size,   \
 | 
			
		||||
                     bytes)                             \
 | 
			
		||||
            );                                          \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Perform a memcpy of 'bytes' bytes from the source #ARR_DESC_t to the
 | 
			
		||||
 *  destination #ARR_DESC_t.
 | 
			
		||||
 */
 | 
			
		||||
#define ARR_DESC_MEMCPY(arr_desc_dest_ptr, arr_desc_src_ptr, bytes) \
 | 
			
		||||
    do                                                              \
 | 
			
		||||
    {                                                               \
 | 
			
		||||
        memcpy((arr_desc_dest_ptr)->data_ptr,                       \
 | 
			
		||||
               (arr_desc_src_ptr)->data_ptr,                        \
 | 
			
		||||
               BOUND(0,                                             \
 | 
			
		||||
                     (arr_desc_dest_ptr)->underlying_size,          \
 | 
			
		||||
                     bytes));                                       \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Evaluate to true if the source #ARR_DESC_t contents will fit into the
 | 
			
		||||
 *  destination #ARR_DESC_t and false otherwise.
 | 
			
		||||
 */
 | 
			
		||||
#define ARR_DESC_COPYABLE(arr_desc_dest_ptr, arr_desc_src_ptr)  \
 | 
			
		||||
      (ARR_DESC_BYTES(arr_desc_src_ptr) <=                      \
 | 
			
		||||
       (arr_desc_dest_ptr)->underlying_size)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Copy all the data from the source #ARR_DESC_t to the destination
 | 
			
		||||
 *  #ARR_DESC_t.
 | 
			
		||||
 *
 | 
			
		||||
 *  @note If the destination #ARR_DESC_t is too small to fit the source data the
 | 
			
		||||
 *  copy is aborted and nothing happens.
 | 
			
		||||
 */
 | 
			
		||||
#define ARR_DESC_COPY(arr_desc_dest_ptr, arr_desc_src_ptr)      \
 | 
			
		||||
    do                                                          \
 | 
			
		||||
    {                                                           \
 | 
			
		||||
        if (ARR_DESC_COPYABLE(arr_desc_dest_ptr,                 \
 | 
			
		||||
                             arr_desc_src_ptr))                 \
 | 
			
		||||
        {                                                       \
 | 
			
		||||
            ARR_DESC_MEMCPY(arr_desc_dest_ptr,                  \
 | 
			
		||||
                            arr_desc_src_ptr,                   \
 | 
			
		||||
                            ARR_DESC_BYTES(arr_desc_src_ptr));  \
 | 
			
		||||
            /* Update the properties*/                          \
 | 
			
		||||
            (arr_desc_dest_ptr)->element_count =                \
 | 
			
		||||
                (arr_desc_src_ptr)->element_count;              \
 | 
			
		||||
            (arr_desc_dest_ptr)->element_size =                 \
 | 
			
		||||
                (arr_desc_src_ptr)->element_size;               \
 | 
			
		||||
        }                                                       \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Compare the data in two #ARR_DESC_t structs for the specified number of
 | 
			
		||||
 *  bytes.
 | 
			
		||||
 */
 | 
			
		||||
#define ARR_DESC_MEMCMP(arr_desc_ptr_a, arr_desc_ptr_b, bytes)  \
 | 
			
		||||
        memcmp((arr_desc_ptr_a)->data_ptr,                      \
 | 
			
		||||
            (arr_desc_ptr_b)->data_ptr,                         \
 | 
			
		||||
               bytes) /* Note the lacking semicolon */          \
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Zero out the contents of the #ARR_DESC_t.
 | 
			
		||||
 */
 | 
			
		||||
#define ARR_DESC_ZERO(arr_desc_ptr)             \
 | 
			
		||||
        ARR_DESC_MEMSET(arr_desc_ptr,           \
 | 
			
		||||
                        0,                      \
 | 
			
		||||
                        (arr_desc_ptr)->underlying_size)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Evaluate to the data address in #ARR_DESC_t at offset.
 | 
			
		||||
 */
 | 
			
		||||
#define ARR_DESC_DATA_ADDR(type, arr_desc_ptr, offset)  \
 | 
			
		||||
        ((void*)(((type *)                              \
 | 
			
		||||
                  ((arr_desc_ptr)->data_ptr))           \
 | 
			
		||||
                 + offset))
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Evaluate to the element in #ARR_DESC_t with type at idx.
 | 
			
		||||
 */
 | 
			
		||||
#define ARR_DESC_ELT(type, idx, arr_desc_ptr)           \
 | 
			
		||||
        (*((type *) ARR_DESC_DATA_ADDR(type,            \
 | 
			
		||||
                                       arr_desc_ptr,    \
 | 
			
		||||
                                       idx)))
 | 
			
		||||
 | 
			
		||||
#endif /* _ARR_DESC_H_ */
 | 
			
		||||
							
								
								
									
										17
									
								
								Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
			
		||||
#ifndef _JTEST_H_
 | 
			
		||||
#define _JTEST_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "jtest_fw.h"
 | 
			
		||||
#include "jtest_test.h"
 | 
			
		||||
#include "jtest_test_define.h"
 | 
			
		||||
#include "jtest_test_call.h"
 | 
			
		||||
#include "jtest_group.h"
 | 
			
		||||
#include "jtest_group_define.h"
 | 
			
		||||
#include "jtest_group_call.h"
 | 
			
		||||
#include "jtest_cycle.h"
 | 
			
		||||
 | 
			
		||||
#endif /* _JTEST_H_ */
 | 
			
		||||
@ -0,0 +1,65 @@
 | 
			
		||||
#ifndef _JTEST_CYCLE_H_
 | 
			
		||||
#define _JTEST_CYCLE_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "jtest_fw.h"           /* JTEST_DUMP_STRF() */
 | 
			
		||||
#include "jtest_systick.h"
 | 
			
		||||
#include "jtest_util.h"         /* STR() */
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Declare Module Variables */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
extern const char * JTEST_CYCLE_STRF;
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros and Defines */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Wrap the function call, fn_call, to count execution cycles and display the
 | 
			
		||||
 *  results.
 | 
			
		||||
 */
 | 
			
		||||
/* skipp function name + param
 | 
			
		||||
#define JTEST_COUNT_CYCLES(fn_call)                     \
 | 
			
		||||
    do                                                  \
 | 
			
		||||
    {                                                   \
 | 
			
		||||
        uint32_t __jtest_cycle_end_count;               \
 | 
			
		||||
                                                        \
 | 
			
		||||
        JTEST_SYSTICK_RESET(SysTick);                   \
 | 
			
		||||
        JTEST_SYSTICK_START(SysTick);                   \
 | 
			
		||||
                                                        \
 | 
			
		||||
        fn_call;                                        \
 | 
			
		||||
                                                        \
 | 
			
		||||
        __jtest_cycle_end_count =                       \
 | 
			
		||||
            JTEST_SYSTICK_VALUE(SysTick);               \
 | 
			
		||||
                                                        \
 | 
			
		||||
		JTEST_SYSTICK_RESET(SysTick);                   \
 | 
			
		||||
        JTEST_DUMP_STRF(JTEST_CYCLE_STRF,               \
 | 
			
		||||
                        STR(fn_call),                   \
 | 
			
		||||
                        (JTEST_SYSTICK_INITIAL_VALUE -  \
 | 
			
		||||
                         __jtest_cycle_end_count));     \
 | 
			
		||||
    } while (0)
 | 
			
		||||
*/
 | 
			
		||||
#define JTEST_COUNT_CYCLES(fn_call)                     \
 | 
			
		||||
    do                                                  \
 | 
			
		||||
    {                                                   \
 | 
			
		||||
        uint32_t __jtest_cycle_end_count;               \
 | 
			
		||||
                                                        \
 | 
			
		||||
        JTEST_SYSTICK_RESET(SysTick);                   \
 | 
			
		||||
        JTEST_SYSTICK_START(SysTick);                   \
 | 
			
		||||
                                                        \
 | 
			
		||||
        fn_call;                                        \
 | 
			
		||||
                                                        \
 | 
			
		||||
        __jtest_cycle_end_count =                       \
 | 
			
		||||
            JTEST_SYSTICK_VALUE(SysTick);               \
 | 
			
		||||
                                                        \
 | 
			
		||||
		JTEST_SYSTICK_RESET(SysTick);                   \
 | 
			
		||||
        JTEST_DUMP_STRF(JTEST_CYCLE_STRF,               \
 | 
			
		||||
                        (JTEST_SYSTICK_INITIAL_VALUE -  \
 | 
			
		||||
                         __jtest_cycle_end_count));     \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
#endif /* _JTEST_CYCLE_H_ */
 | 
			
		||||
@ -0,0 +1,37 @@
 | 
			
		||||
#ifndef _JTEST_DEFINE_H_
 | 
			
		||||
#define _JTEST_DEFINE_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros and Defines */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Makes a symbol for use as a struct name. Names made this way have two parts;
 | 
			
		||||
 *  the first parts is a prefix common to all structs of that class. The second
 | 
			
		||||
 *  is a specifier which differs for each instance of that struct type.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_STRUCT_NAME(prefix, specifier)    \
 | 
			
		||||
    CONCAT(prefix, specifier)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Define a struct with type with a name generated by #JTEST_STRUCT_NAME().
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_DEFINE_STRUCT(type, struct_name)    \
 | 
			
		||||
    type struct_name
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Declare a struct with type with a name generated by #JTEST_STRUCT_NAME().
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_DECLARE_STRUCT(struct_definition) \
 | 
			
		||||
    extern struct_definition
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Define and initialize a struct (created with JTEST_DEFINE_STRUCT()) and
 | 
			
		||||
 *  initialize it with init_values.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_INIT_STRUCT(struct_definition, init_values)       \
 | 
			
		||||
    struct_definition = {                                       \
 | 
			
		||||
        init_values                                             \
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif /* _JTEST_DEFINE_H_ */
 | 
			
		||||
							
								
								
									
										253
									
								
								Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_fw.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										253
									
								
								Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_fw.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,253 @@
 | 
			
		||||
#ifndef _JTEST_FW_H_
 | 
			
		||||
#define _JTEST_FW_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>             /* int32_t */
 | 
			
		||||
#include <string.h>             /* strcpy() */
 | 
			
		||||
#include <stdio.h>              /* sprintf() */
 | 
			
		||||
#include "jtest_pf.h"           /* Extend JTEST_FW_t with Pass/Fail data */
 | 
			
		||||
#include "jtest_group.h"
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Type Definitions */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  A struct used to interface with the Keil Debugger.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct JTEST_FW_struct
 | 
			
		||||
{
 | 
			
		||||
    /* Action Triggers: The Keil debugger monitors these values for changes.  In
 | 
			
		||||
     * response to a change, the debugger executes code on the host. */
 | 
			
		||||
    volatile int32_t test_start;
 | 
			
		||||
    volatile int32_t test_end;
 | 
			
		||||
    volatile int32_t group_start;
 | 
			
		||||
    volatile int32_t group_end;
 | 
			
		||||
    volatile int32_t dump_str;
 | 
			
		||||
    volatile int32_t dump_data;
 | 
			
		||||
    volatile int32_t exit_fw;
 | 
			
		||||
 | 
			
		||||
    JTEST_GROUP_t * current_group_ptr;
 | 
			
		||||
 | 
			
		||||
    /* Buffers: The C-code cannot send strings and data directly to the
 | 
			
		||||
     * debugging framework. Instead, the debugger can be told to read 128 byte
 | 
			
		||||
     * (by default) chunks of memory.  Data received in this manner requires
 | 
			
		||||
     * post-processing to be legible.*/
 | 
			
		||||
    char * str_buffer;
 | 
			
		||||
    char * data_buffer;
 | 
			
		||||
 | 
			
		||||
    /* Pass/Fail Data */
 | 
			
		||||
    JTEST_PF_MEMBERS;
 | 
			
		||||
 | 
			
		||||
} JTEST_FW_t;
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros and Defines */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Default name for the JTEST_FW struct.
 | 
			
		||||
 *
 | 
			
		||||
 *  Define your own if you want the variable containing the #JTEST_FW_t to have
 | 
			
		||||
 *  a different name.
 | 
			
		||||
 */
 | 
			
		||||
#ifndef JTEST_FW
 | 
			
		||||
#define JTEST_FW JTEST_FW
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Default name for the JTEST_FW_STR_BUFFER.
 | 
			
		||||
 *
 | 
			
		||||
 *  Define your own if you want the variable containing the char buffer to have
 | 
			
		||||
 *  a different name.
 | 
			
		||||
 */
 | 
			
		||||
#ifndef JTEST_FW_STR_BUFFER
 | 
			
		||||
#define JTEST_FW_STR_BUFFER JTEST_FW_STR_BUFFER
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Size of the #JTEST_FW_t, output string-buffer.
 | 
			
		||||
 *
 | 
			
		||||
 *  If you change this value, make sure the "dump_str_fn" and "dump_data_fn"
 | 
			
		||||
 *  functions in jtest_fns.ini uses the same size. If you aren't sure, read the
 | 
			
		||||
 *  documentation Keil Debugger Command 'DISPLAY'.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_BUF_SIZE 256
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  The maximum number of bytes output at once using #JTEST_DUMP_STRF().
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_STR_MAX_OUTPUT_SIZE 128
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  The maximum number of block transimissions needed to send a string from a
 | 
			
		||||
 *  buffer with JTEST_BUF_SIZE.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_STR_MAX_OUTPUT_SEGMENTS           \
 | 
			
		||||
    (JTEST_BUF_SIZE / JTEST_STR_MAX_OUTPUT_SIZE)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Initialize the JTEST framework.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_INIT()                                                    \
 | 
			
		||||
    do                                                                  \
 | 
			
		||||
    {                                                                   \
 | 
			
		||||
        JTEST_FW.str_buffer = JTEST_FW_STR_BUFFER;                      \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/* Debugger Action-triggering Macros */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Dispatch macro to trigger various actions in the Keil Debugger.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_TRIGGER_ACTION(action_name)       \
 | 
			
		||||
    do                                          \
 | 
			
		||||
    {                                           \
 | 
			
		||||
        action_name();                          \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Trigger the "Test Start" action in the Keil Debugger.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_ACT_TEST_START()                  \
 | 
			
		||||
    JTEST_TRIGGER_ACTION(test_start)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Trigger the "Test End" action in the Keil Debugger.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_ACT_TEST_END()                    \
 | 
			
		||||
    JTEST_TRIGGER_ACTION(test_end)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Trigger the "Group Start" action in the Keil Debugger.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_ACT_GROUP_START()                 \
 | 
			
		||||
    JTEST_TRIGGER_ACTION(group_start)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Trigger the "Group End" action in the Keil Debugger.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_ACT_GROUP_END()                   \
 | 
			
		||||
    JTEST_TRIGGER_ACTION(group_end)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Fill the buffer named buf_name with value and dump it to the Keil debugger
 | 
			
		||||
 *  using action.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_ACT_DUMP(action, buf_name, value) \
 | 
			
		||||
    do                                          \
 | 
			
		||||
    {                                           \
 | 
			
		||||
        JTEST_CLEAR_BUFFER(buf_name);           \
 | 
			
		||||
        strcpy(JTEST_FW.buf_name, (value));     \
 | 
			
		||||
        JTEST_TRIGGER_ACTION(action);           \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Trigger the "Exit Framework" action in the Keil Debugger.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_ACT_EXIT_FW()                     \
 | 
			
		||||
    do                                          \
 | 
			
		||||
    {                                           \
 | 
			
		||||
        JTEST_TRIGGER_ACTION(exit_fw);          \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Buffer Manipulation Macros */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Clear the JTEST_FW buffer with name buf_name.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_CLEAR_BUFFER(buf_name)                    \
 | 
			
		||||
    do                                                  \
 | 
			
		||||
    {                                                   \
 | 
			
		||||
        memset(JTEST_FW.buf_name, 0, JTEST_BUF_SIZE);   \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Clear the memory needed for the JTEST_FW's string buffer.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_CLEAR_STR_BUFFER()                \
 | 
			
		||||
        JTEST_CLEAR_BUFFER(str_buffer)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Clear the memory needed for the JTEST_FW's data buffer.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_CLEAR_DATA_BUFFER()               \
 | 
			
		||||
        JTEST_CLEAR_BUFFER(data_buffer)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Dump the given string to the Keil Debugger.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_DUMP_STR(string)                          \
 | 
			
		||||
        JTEST_ACT_DUMP(dump_str, str_buffer, string)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Dump a formatted string to the Keil Debugger.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_DUMP_STRF(format_str, ... )                               \
 | 
			
		||||
    do                                                                  \
 | 
			
		||||
    {                                                                   \
 | 
			
		||||
        JTEST_CLEAR_STR_BUFFER();                                       \
 | 
			
		||||
        sprintf(JTEST_FW.str_buffer,format_str, __VA_ARGS__);           \
 | 
			
		||||
        jtest_dump_str_segments();                                      \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/* Pass/Fail Macros */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Increment the number of passed tests in #JTEST_FW.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_FW_INC_PASSED(amount)             \
 | 
			
		||||
        JTEST_PF_INC_PASSED(&JTEST_FW, amount)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Increment the number of passed tests in #JTEST_FW.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_FW_INC_FAILED(amount)             \
 | 
			
		||||
        JTEST_PF_INC_FAILED(&JTEST_FW, amount)
 | 
			
		||||
 | 
			
		||||
/* Manipulating the Current Group */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Evaluate to the current_group_ptr in #JTEST_FW.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_CURRENT_GROUP_PTR()               \
 | 
			
		||||
    (JTEST_FW.current_group_ptr)
 | 
			
		||||
 | 
			
		||||
#define JTEST_SET_CURRENT_GROUP(group_ptr)      \
 | 
			
		||||
    do                                          \
 | 
			
		||||
    {                                           \
 | 
			
		||||
        JTEST_CURRENT_GROUP_PTR() = group_ptr;  \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Declare Global Variables */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
extern char JTEST_FW_STR_BUFFER[JTEST_BUF_SIZE];
 | 
			
		||||
extern volatile JTEST_FW_t JTEST_FW;
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Function Prototypes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
void jtest_dump_str_segments(void);
 | 
			
		||||
 | 
			
		||||
void test_start  (void);
 | 
			
		||||
void test_end    (void);
 | 
			
		||||
void group_start (void);
 | 
			
		||||
void group_end   (void);
 | 
			
		||||
void dump_str    (void);
 | 
			
		||||
void dump_data   (void);
 | 
			
		||||
void exit_fw     (void);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /* _JTEST_FW_H_ */
 | 
			
		||||
@ -0,0 +1,66 @@
 | 
			
		||||
#ifndef _JTEST_GROUP_H_
 | 
			
		||||
#define _JTEST_GROUP_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "jtest_pf.h"
 | 
			
		||||
#include "jtest_util.h"
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Type Definitions */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  A struct which represents a group of #JTEST_TEST_t structs. This struct is
 | 
			
		||||
 *  used to run the group of tests, and report on their outcomes.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct JTEST_GROUP_struct
 | 
			
		||||
{
 | 
			
		||||
    void (* group_fn_ptr) (void); /**< Pointer to the test group */
 | 
			
		||||
    char * name_str;              /**< Name of the group */
 | 
			
		||||
    
 | 
			
		||||
    /* Extend the #JTEST_GROUP_t with Pass/Fail information.*/
 | 
			
		||||
    JTEST_PF_MEMBERS;
 | 
			
		||||
} JTEST_GROUP_t;
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros and Defines */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Set the name of JTEST_GROUP_t.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_GROUP_SET_NAME(group_ptr, name)     \
 | 
			
		||||
    JTEST_SET_STRUCT_ATTRIBUTE(group_ptr, name_str, name)
 | 
			
		||||
 | 
			
		||||
#define JTEST_GROUP_SET_FN(group_ptr, fn_ptr)     \
 | 
			
		||||
    JTEST_SET_STRUCT_ATTRIBUTE(group_ptr, group_fn_ptr, fn_ptr)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Increment the number of tests passed in the JTEST_GROUP_t pointed to by
 | 
			
		||||
 *  group_ptr.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_GROUP_INC_PASSED(group_ptr, amount) \
 | 
			
		||||
    JTEST_PF_INC_PASSED(group_ptr, amount)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Increment the number of tests failed in the JTEST_GROUP_t pointed to by
 | 
			
		||||
 *  group_ptr.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_GROUP_INC_FAILED(group_ptr, amount) \
 | 
			
		||||
    JTEST_PF_INC_FAILED(group_ptr, amount)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Reset the pass/fail information of the #JTEST_GROUP_t pointed to by
 | 
			
		||||
 *  group_ptr.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_GROUP_RESET_PF(group_ptr)         \
 | 
			
		||||
    do                                          \
 | 
			
		||||
    {                                           \
 | 
			
		||||
        JTEST_PF_RESET_PASSED(group_ptr);       \
 | 
			
		||||
        JTEST_PF_RESET_FAILED(group_ptr);       \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
#endif /* _JTEST_GROUP_H_ */
 | 
			
		||||
@ -0,0 +1,126 @@
 | 
			
		||||
#ifndef _JTEST_GROUP_CALL_H_
 | 
			
		||||
#define _JTEST_GROUP_CALL_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "jtest_fw.h"
 | 
			
		||||
#include <inttypes.h>
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros and Defines */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Execute the test in the #JTEST_GROUP_t struct associated witht he identifier
 | 
			
		||||
 *  group_fn.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_GROUP_RUN(group_fn)                                   \
 | 
			
		||||
    do                                                              \
 | 
			
		||||
    {                                                               \
 | 
			
		||||
        JTEST_DUMP_STR("Group Name:\n");                            \
 | 
			
		||||
        JTEST_DUMP_STR(JTEST_GROUP_STRUCT_NAME(group_fn).name_str); \
 | 
			
		||||
        JTEST_GROUP_STRUCT_NAME(group_fn).group_fn_ptr();           \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Update the enclosing #JTEST_GROUP_t's pass/fail information using the
 | 
			
		||||
 *  current #JTEST_GROUP_t's.
 | 
			
		||||
 *
 | 
			
		||||
 *  @param group_ptr Pointer to the current #JTEST_GROUP_t.
 | 
			
		||||
 *  @param parent_ptr Pointer to the enclosing #JTEST_GROUP_t.
 | 
			
		||||
 *
 | 
			
		||||
 *  @warning Only run this if the current #JTEST_GROUP_t is being called within
 | 
			
		||||
 *  the context of another #JTEST_GROUP_t.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_GROUP_UPDATE_PARENT_GROUP_PF(group_ptr, parent_group_ptr) \
 | 
			
		||||
    do                                                                  \
 | 
			
		||||
    {                                                                   \
 | 
			
		||||
        JTEST_GROUP_INC_PASSED(parent_group_ptr,                        \
 | 
			
		||||
                               (group_ptr)->passed);                    \
 | 
			
		||||
        JTEST_GROUP_INC_FAILED(parent_group_ptr,                        \
 | 
			
		||||
                               (group_ptr)->failed);                    \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Update the #JTEST_FW's pass/fail information using the current
 | 
			
		||||
 *  #JTEST_GROUP_t's.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_GROUP_UPDATE_FW_PF(group_ptr)                     \
 | 
			
		||||
    do                                                          \
 | 
			
		||||
    {                                                           \
 | 
			
		||||
        JTEST_FW_INC_PASSED((group_ptr)->passed);               \
 | 
			
		||||
        JTEST_FW_INC_FAILED((group_ptr)->failed);               \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Update the enclosing context with the current #JTEST_GROUP_t's pass/fail
 | 
			
		||||
 *  information. If this group isn't in an enclosing group, it updates the
 | 
			
		||||
 *  #JTEST_FW's pass/fail info by default.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_GROUP_UPDATE_PARENT_GROUP_OR_FW_PF(group_ptr,         \
 | 
			
		||||
                                                 parent_group_ptr)  \
 | 
			
		||||
    do                                                              \
 | 
			
		||||
    {                                                               \
 | 
			
		||||
        /* Update the pass fail counts in the parent group */       \
 | 
			
		||||
        if (parent_group_ptr /* Null implies Top*/)                 \
 | 
			
		||||
        {                                                           \
 | 
			
		||||
            JTEST_GROUP_UPDATE_PARENT_GROUP_PF(                     \
 | 
			
		||||
                group_ptr,                                          \
 | 
			
		||||
                parent_group_ptr);                                  \
 | 
			
		||||
        } else {                                                    \
 | 
			
		||||
            JTEST_GROUP_UPDATE_FW_PF(                               \
 | 
			
		||||
                group_ptr);                                         \
 | 
			
		||||
        }                                                           \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Dump the results of running the #JTEST_GROUP_t to the Keil Debugger.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_GROUP_DUMP_RESULTS(group_ptr)                             \
 | 
			
		||||
        do                                                              \
 | 
			
		||||
        {                                                               \
 | 
			
		||||
            JTEST_DUMP_STRF(                                            \
 | 
			
		||||
                "Tests Run: %" PRIu32 "\n"                              \
 | 
			
		||||
                "----------\n"                                          \
 | 
			
		||||
                "   Passed: %" PRIu32 "\n"                              \
 | 
			
		||||
                "   Failed: %" PRIu32 "\n",                             \
 | 
			
		||||
                (group_ptr)->passed + (group_ptr)->failed,              \
 | 
			
		||||
                (group_ptr)->passed,                                    \
 | 
			
		||||
                (group_ptr)->failed);                                   \
 | 
			
		||||
        } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Call the #JTEST_GROUP_t associated with the identifier group_fn.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_GROUP_CALL(group_fn)                                      \
 | 
			
		||||
        do                                                              \
 | 
			
		||||
        {   /* Save the current group from JTEST_FW_t before swapping */ \
 | 
			
		||||
            /* it to this group (in order to restore it later )*/       \
 | 
			
		||||
            JTEST_GROUP_t * __jtest_temp_group_ptr =                    \
 | 
			
		||||
                JTEST_CURRENT_GROUP_PTR();                              \
 | 
			
		||||
            JTEST_SET_CURRENT_GROUP(&JTEST_GROUP_STRUCT_NAME(group_fn)); \
 | 
			
		||||
                                                                        \
 | 
			
		||||
            /* Reset this group's pass/fail count. Each group */        \
 | 
			
		||||
            /* should only remember counts for its last execution. */   \
 | 
			
		||||
            JTEST_GROUP_RESET_PF(JTEST_CURRENT_GROUP_PTR());            \
 | 
			
		||||
                                                                        \
 | 
			
		||||
            /* Run the current group */                                 \
 | 
			
		||||
            JTEST_ACT_GROUP_START();                                    \
 | 
			
		||||
            JTEST_GROUP_RUN(group_fn);                                  \
 | 
			
		||||
            JTEST_ACT_GROUP_END();                                      \
 | 
			
		||||
                                                                        \
 | 
			
		||||
            /* Update the pass fail counts in the parent group (or FW) */ \
 | 
			
		||||
            JTEST_GROUP_UPDATE_PARENT_GROUP_OR_FW_PF(                   \
 | 
			
		||||
                JTEST_CURRENT_GROUP_PTR(),                              \
 | 
			
		||||
                __jtest_temp_group_ptr);                                \
 | 
			
		||||
                                                                        \
 | 
			
		||||
            JTEST_GROUP_DUMP_RESULTS(JTEST_CURRENT_GROUP_PTR());        \
 | 
			
		||||
                                                                        \
 | 
			
		||||
            /* Restore the previously current group */                  \
 | 
			
		||||
            JTEST_SET_CURRENT_GROUP(__jtest_temp_group_ptr);            \
 | 
			
		||||
        } while (0)
 | 
			
		||||
 | 
			
		||||
#endif /* _JTEST_GROUP_CALL_H_ */
 | 
			
		||||
@ -0,0 +1,87 @@
 | 
			
		||||
#ifndef _JTEST_GROUP_DEFINE_H_
 | 
			
		||||
#define _JTEST_GROUP_DEFINE_H_
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "jtest_util.h"
 | 
			
		||||
#include "jtest_define.h"
 | 
			
		||||
#include "jtest_group.h"
 | 
			
		||||
 | 
			
		||||
/* For defining macros with optional arguments */
 | 
			
		||||
#include "opt_arg/opt_arg.h"
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros and Defines */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Prefix for all #JTEST_GROUP_t structs.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_GROUP_STRUCT_NAME_PREFIX G_JTEST_GROUP_STRUCT_
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Define test template used by #JTEST_GROUP_t tests.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_GROUP_FN_TEMPLATE(group_fn)    \
 | 
			
		||||
    void group_fn(void)
 | 
			
		||||
 | 
			
		||||
#define JTEST_GROUP_FN_PROTOTYPE JTEST_GROUP_FN_TEMPLATE /**< Alias for
 | 
			
		||||
                                                            #JTEST_GROUP_FN_TEMPLATE. */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Evaluate to the name of the #JTEST_GROUP_t struct associated with group_fn.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_GROUP_STRUCT_NAME(group_fn)    \
 | 
			
		||||
    JTEST_STRUCT_NAME(JTEST_GROUP_STRUCT_NAME_PREFIX, group_fn)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Define a #JTEST_GROUP_t struct based on the given group_fn.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_GROUP_DEFINE_STRUCT(group_fn)  \
 | 
			
		||||
    JTEST_DEFINE_STRUCT(JTEST_GROUP_t,       \
 | 
			
		||||
                        JTEST_GROUP_STRUCT_NAME(group_fn))
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Declare a #JTEST_GROUP_t struct based on the given group_fn.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_GROUP_DECLARE_STRUCT(group_fn) \
 | 
			
		||||
    JTEST_DECLARE_STRUCT(JTEST_GROUP_DEFINE_STRUCT(group_fn))
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Contents needed to initialize a JTEST_GROUP_t struct.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_GROUP_STRUCT_INIT(group_fn)    \
 | 
			
		||||
    group_fn,                                \
 | 
			
		||||
        STR_NL(group_fn),                       \
 | 
			
		||||
        JTEST_PF_MEMBER_INIT
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Initialize the contents of a #JTEST_GROUP_t struct.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_GROUP_INIT(group_fn)           \
 | 
			
		||||
    JTEST_GROUP_DEFINE_STRUCT(group_fn) = {  \
 | 
			
		||||
        JTEST_GROUP_STRUCT_INIT(group_fn)    \
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
/* Test Definition Macro */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Define a #JTEST_GROUP_t object and a test function.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_DEFINE_GROUP(group_fn)         \
 | 
			
		||||
    JTEST_GROUP_FN_PROTOTYPE(group_fn);      \
 | 
			
		||||
    JTEST_GROUP_INIT(group_fn);              \
 | 
			
		||||
    JTEST_GROUP_FN_PROTOTYPE(group_fn) /* Notice the lacking semicolon */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Declare a #JTEST_GROUP_t object and a test function prototype.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_DECLARE_GROUP(group_fn)        \
 | 
			
		||||
    JTEST_GROUP_FN_PROTOTYPE(group_fn);      \
 | 
			
		||||
    JTEST_GROUP_DECLARE_STRUCT(group_fn) /* Note the lacking semicolon */
 | 
			
		||||
 | 
			
		||||
#endif /* _JTEST_GROUP_DEFINE_H_ */
 | 
			
		||||
@ -0,0 +1,85 @@
 | 
			
		||||
#ifndef _JTEST_PF_H_
 | 
			
		||||
#define _JTEST_PF_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Purpose */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* jtest_pf.h Contains macros useful for capturing pass/fail data. */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros and Defines */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Members that can be added to other structs to extend them pass/fail data and
 | 
			
		||||
 * corresponding functionality.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_PF_MEMBERS                            \
 | 
			
		||||
    uint32_t passed;                                \
 | 
			
		||||
    uint32_t failed /* Note the lacking semicolon*/ \
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Used for initializing JTEST_PF_MEMBERS in a struct declaration.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_PF_MEMBER_INIT                    \
 | 
			
		||||
    0,                                          \
 | 
			
		||||
    0
 | 
			
		||||
 | 
			
		||||
/* Member-Incrementing Macros */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Dispatch macro for incrementing #JTEST_PF_MEMBERS.
 | 
			
		||||
 *
 | 
			
		||||
 *  @param xxx Values: 'passed', 'failed'
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_PF_INC_XXX(xxx, struct_pf_ptr, amount)    \
 | 
			
		||||
    do                                                  \
 | 
			
		||||
    {                                                   \
 | 
			
		||||
        ((struct_pf_ptr)->xxx) += (amount);             \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Specialization of the #JTEST_PF_INC_XXX macro to increment the passed
 | 
			
		||||
 *  member.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_PF_INC_PASSED(struct_pf_ptr, amount)  \
 | 
			
		||||
    JTEST_PF_INC_XXX(passed, struct_pf_ptr, amount)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Specialization of the #JTEST_PF_INC_XXX macro to increment the failed
 | 
			
		||||
 *  member.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_PF_INC_FAILED(struct_pf_ptr, amount)  \
 | 
			
		||||
    JTEST_PF_INC_XXX(failed, struct_pf_ptr, amount)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Member-Resetting Macros */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Dispatch macro for setting #JTEST_PF_MEMBERS to zero.
 | 
			
		||||
 *
 | 
			
		||||
 *  @param xxx Values: 'passed', 'failed'
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_PF_RESET_XXX(xxx, struct_pf_ptr)  \
 | 
			
		||||
    do                                          \
 | 
			
		||||
    {                                           \
 | 
			
		||||
        ((struct_pf_ptr)->xxx) = UINT32_C(0);   \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Specialization of #JTEST_PF_RESET_XXX for the 'passed' member.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_PF_RESET_PASSED(struct_pf_ptr)    \
 | 
			
		||||
    JTEST_PF_RESET_XXX(passed, struct_pf_ptr)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Specialization of #JTEST_PF_RESET_XXX for the 'failed' member.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_PF_RESET_FAILED(struct_pf_ptr)    \
 | 
			
		||||
    JTEST_PF_RESET_XXX(failed, struct_pf_ptr)
 | 
			
		||||
 | 
			
		||||
#endif /* _JTEST_PF_H_ */
 | 
			
		||||
@ -0,0 +1,93 @@
 | 
			
		||||
#ifndef _JTEST_SYSTICK_H_
 | 
			
		||||
#define _JTEST_SYSTICK_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* Get access to the SysTick structure. */
 | 
			
		||||
#if   defined ARMCM0
 | 
			
		||||
  #include "ARMCM0.h"
 | 
			
		||||
#elif defined ARMCM0P
 | 
			
		||||
  #include "ARMCM0plus.h"
 | 
			
		||||
#elif defined ARMCM3
 | 
			
		||||
  #include "ARMCM3.h"
 | 
			
		||||
#elif defined ARMCM4
 | 
			
		||||
  #include "ARMCM4.h"
 | 
			
		||||
#elif defined ARMCM4_FP
 | 
			
		||||
  #include "ARMCM4_FP.h"
 | 
			
		||||
#elif defined ARMCM7
 | 
			
		||||
  #include "ARMCM7.h" 
 | 
			
		||||
#elif defined ARMCM7_SP
 | 
			
		||||
  #include "ARMCM7_SP.h"
 | 
			
		||||
#elif defined ARMCM7_DP
 | 
			
		||||
  #include "ARMCM7_DP.h"
 | 
			
		||||
#elif defined ARMSC000
 | 
			
		||||
  #include "ARMSC000.h"
 | 
			
		||||
#elif defined ARMSC300
 | 
			
		||||
  #include "ARMSC300.h"
 | 
			
		||||
#elif defined ARMv8MBL
 | 
			
		||||
  #include "ARMv8MBL.h"
 | 
			
		||||
#elif defined ARMv8MML
 | 
			
		||||
  #include "ARMv8MML.h"
 | 
			
		||||
#elif defined ARMv8MML_DSP
 | 
			
		||||
  #include "ARMv8MML_DSP.h"
 | 
			
		||||
#elif defined ARMv8MML_SP
 | 
			
		||||
  #include "ARMv8MML_SP.h"
 | 
			
		||||
#elif defined ARMv8MML_DSP_SP
 | 
			
		||||
  #include "ARMv8MML_DSP_SP.h"
 | 
			
		||||
#elif defined ARMv8MML_DP
 | 
			
		||||
  #include "ARMv8MML_DP.h"
 | 
			
		||||
#elif defined ARMv8MML_DSP_DP
 | 
			
		||||
  #include "ARMv8MML_DSP_DP.h"
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
  #warning "no appropriate header file found!"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros and Defines */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Initial value for the SysTick module.
 | 
			
		||||
 *
 | 
			
		||||
 *  @note This is also the maximum value, important as SysTick is a decrementing
 | 
			
		||||
 *  counter.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_SYSTICK_INITIAL_VALUE 0xFFFFFF
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Reset the SysTick, decrementing timer to it's maximum value and disable it.
 | 
			
		||||
 *
 | 
			
		||||
 *  This macro should leave the SysTick timer in a state that's ready for cycle
 | 
			
		||||
 *  counting.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_SYSTICK_RESET(systick_ptr)                    \
 | 
			
		||||
    do                                                      \
 | 
			
		||||
    {                                                       \
 | 
			
		||||
        (systick_ptr)->LOAD = JTEST_SYSTICK_INITIAL_VALUE;  \
 | 
			
		||||
        (systick_ptr)->VAL = 1;                             \
 | 
			
		||||
                                                            \
 | 
			
		||||
        /* Disable the SysTick module. */                   \
 | 
			
		||||
        (systick_ptr)->CTRL = UINT32_C(0x000000);           \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Start the SysTick timer, sourced by the processor clock.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_SYSTICK_START(systick_ptr)                    \
 | 
			
		||||
    do                                                      \
 | 
			
		||||
    {                                                       \
 | 
			
		||||
        (systick_ptr)->CTRL =                               \
 | 
			
		||||
            SysTick_CTRL_ENABLE_Msk |                       \
 | 
			
		||||
            SysTick_CTRL_CLKSOURCE_Msk; /* Internal clk*/   \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Evaluate to the current value of the SysTick timer.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_SYSTICK_VALUE(systick_ptr)        \
 | 
			
		||||
    ((systick_ptr)->VAL)
 | 
			
		||||
           
 | 
			
		||||
#endif /* _JTEST_SYSTICK_H_ */
 | 
			
		||||
@ -0,0 +1,100 @@
 | 
			
		||||
#ifndef _JTEST_TEST_H_
 | 
			
		||||
#define _JTEST_TEST_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include "jtest_util.h"
 | 
			
		||||
#include "jtest_test_ret.h"
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Type Definitions */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  A struct which represents a Test in the JTEST framework.  This struct is
 | 
			
		||||
 *  used to enable, run, and describe the test it represents.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct JTEST_TEST_struct
 | 
			
		||||
{
 | 
			
		||||
    JTEST_TEST_RET_t ( * test_fn_ptr)(void); /**< Pointer to the test function. */
 | 
			
		||||
    char   * test_fn_str;                    /**< Name of the test function */
 | 
			
		||||
    char   * fut_str;           /**< Name of the function under test. */
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     *  Flags that govern how the #JTEST_TEST_t behaves.
 | 
			
		||||
     */
 | 
			
		||||
    union {
 | 
			
		||||
        struct {
 | 
			
		||||
            unsigned enabled : 1;
 | 
			
		||||
            unsigned unused  : 7;
 | 
			
		||||
        } bits;
 | 
			
		||||
        uint8_t byte;           /* Access all flags at once. */
 | 
			
		||||
    } flags;
 | 
			
		||||
    
 | 
			
		||||
} JTEST_TEST_t;
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros and Defines */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Assign a test function to the #JTEST_TEST_t struct.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_TEST_SET_FN(jtest_test_ptr, fn_ptr)                   \
 | 
			
		||||
    JTEST_SET_STRUCT_ATTRIBUTE(jtest_test_ptr, test_fn_ptr, fn_ptr)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Specify a function under test (FUT) for the #JTEST_TEST_t struct.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_TEST_SET_FUT(jtest_test_ptr, str)                 \
 | 
			
		||||
    JTEST_SET_STRUCT_ATTRIBUTE(jtest_test_ptr, fut_str, str)
 | 
			
		||||
 | 
			
		||||
/* Macros concerning JTEST_TEST_t flags */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#define JTEST_TEST_FLAG_SET 1 /**< Value of a set #JTEST_TEST_t flag. */
 | 
			
		||||
#define JTEST_TEST_FLAG_CLR 0 /**< Value of a cleared #JTEST_TEST_t flag. */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Evaluate to the flag in #JTEST_TEST_t having flag_name.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_TEST_FLAG(jtest_test_ptr, flag_name)  \
 | 
			
		||||
    ((jtest_test_ptr)->flags.bits.flag_name)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Dispatch macro for setting and clearing #JTEST_TEST_t flags.
 | 
			
		||||
 *
 | 
			
		||||
 *  @param jtest_test_ptr Pointer to a #JTEST_TEST_t struct.
 | 
			
		||||
 *  @param flag_name      Name of the flag to set in #JTEST_TEST_t.flags.bits
 | 
			
		||||
 *  @param xxx            Vaid values: "SET" or "CLR"
 | 
			
		||||
 *
 | 
			
		||||
 *  @note This function depends on JTEST_TEST_FLAG_SET and JTEST_TEST_FLAG_CLR.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_TEST_XXX_FLAG(jtest_test_ptr, flag_name, xxx)                  \
 | 
			
		||||
    do                                                                       \
 | 
			
		||||
    {                                                                        \
 | 
			
		||||
        JTEST_TEST_FLAG(jtest_test_ptr, flag_name) = JTEST_TEST_FLAG_##xxx ; \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Specification of #JTEST_TEST_XXX_FLAG to set #JTEST_TEST_t flags.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_TEST_SET_FLAG(jtest_test_ptr, flag_name)                       \
 | 
			
		||||
    JTEST_TEST_XXX_FLAG(jtest_test_ptr, flag_name, SET)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Specification of #JTEST_TEST_XXX_FLAG to clear #JTEST_TEST_t flags.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_TEST_CLR_FLAG(jtest_test_ptr, flag_name)                       \
 | 
			
		||||
    JTEST_TEST_XXX_FLAG(jtest_test_ptr, flag_name, CLR)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Evaluate to true if the #JTEST_TEST_t is enabled.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_TEST_IS_ENABLED(jtest_test_ptr)                           \
 | 
			
		||||
    (JTEST_TEST_FLAG(jtest_test_ptr, enabled) == JTEST_TEST_FLAG_SET)
 | 
			
		||||
 | 
			
		||||
#endif /* _JTEST_TEST_H_ */
 | 
			
		||||
@ -0,0 +1,121 @@
 | 
			
		||||
#ifndef _JTEST_TEST_CALL_H_
 | 
			
		||||
#define _JTEST_TEST_CALL_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
#include "jtest_test.h"
 | 
			
		||||
#include "jtest_test_define.h"
 | 
			
		||||
#include "jtest_fw.h"
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros and Defines */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Exectute the test in the #JTEST_TEST_t struct associated with the identifier
 | 
			
		||||
 *  test_fn and store the result in retval.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_TEST_RUN(retval, test_fn)                                 \
 | 
			
		||||
    do                                                                  \
 | 
			
		||||
    {                                                                   \
 | 
			
		||||
        JTEST_DUMP_STR("Test Name:\n");                                 \
 | 
			
		||||
        JTEST_DUMP_STR(JTEST_TEST_STRUCT_NAME(test_fn).test_fn_str);    \
 | 
			
		||||
        JTEST_DUMP_STR("Function Under Test:\n");                       \
 | 
			
		||||
        JTEST_DUMP_STR(JTEST_TEST_STRUCT_NAME(test_fn).fut_str);        \
 | 
			
		||||
        retval = JTEST_TEST_STRUCT_NAME(test_fn).test_fn_ptr();         \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Update the enclosing #JTEST_GROUP_t's pass/fail information based on
 | 
			
		||||
 *  test_retval.
 | 
			
		||||
 *
 | 
			
		||||
 *  @param test_retval A #JTEST_TEST_RET_enum for the current test.
 | 
			
		||||
 *
 | 
			
		||||
 *  @warning Only use if #JTEST_TEST_t is called in the context of a
 | 
			
		||||
 *  #JTEST_GROUP_t.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_TEST_UPDATE_PARENT_GROUP_PF(test_retval)              \
 | 
			
		||||
    do                                                              \
 | 
			
		||||
    {                                                               \
 | 
			
		||||
        /* Update enclosing JTEST_GROUP_t with pass/fail info */    \
 | 
			
		||||
        if (test_retval == JTEST_TEST_PASSED)                       \
 | 
			
		||||
        {                                                           \
 | 
			
		||||
            JTEST_GROUP_INC_PASSED(JTEST_CURRENT_GROUP_PTR(), 1);   \
 | 
			
		||||
        } else {                                                    \
 | 
			
		||||
            JTEST_GROUP_INC_FAILED(JTEST_CURRENT_GROUP_PTR(), 1);   \
 | 
			
		||||
        }                                                           \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Update the #JTEST_FW with pass/fail information based on test_retval.
 | 
			
		||||
 *
 | 
			
		||||
 *  @param test_retval A #JTEST_TEST_RET_enum for the current test.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_TEST_UPDATE_FW_PF(test_retval)                        \
 | 
			
		||||
    do                                                              \
 | 
			
		||||
    {                                                               \
 | 
			
		||||
        /* Update the JTEST_FW with pass/fail info */                \
 | 
			
		||||
        if (test_retval == JTEST_TEST_PASSED)                       \
 | 
			
		||||
        {                                                           \
 | 
			
		||||
            JTEST_FW_INC_PASSED( 1);                                \
 | 
			
		||||
        } else {                                                    \
 | 
			
		||||
            JTEST_FW_INC_FAILED(1);                                 \
 | 
			
		||||
        }                                                           \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Update the enclosing JTEST_GROUP_t's pass/fail information, or the
 | 
			
		||||
 *  #JTEST_FW's if this test has no enclosing #JTEST_GROUP_t.
 | 
			
		||||
 *
 | 
			
		||||
 *  @param test_retval A #JTEST_TEST_RET_enum for the current test.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_TEST_UPDATE_PARENT_GROUP_OR_FW_PF(test_retval)            \
 | 
			
		||||
    do                                                                  \
 | 
			
		||||
    {                                                                   \
 | 
			
		||||
        /* Update pass-fail information */                              \
 | 
			
		||||
        if (JTEST_CURRENT_GROUP_PTR() /* Non-null */)                    \
 | 
			
		||||
        {                                                               \
 | 
			
		||||
            JTEST_TEST_UPDATE_PARENT_GROUP_PF(test_retval);             \
 | 
			
		||||
        } else {                                                        \
 | 
			
		||||
            JTEST_TEST_UPDATE_FW_PF(test_retval);                       \
 | 
			
		||||
        }                                                               \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Dump the results of the test to the Keil Debugger.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_TEST_DUMP_RESULTS(test_retval)        \
 | 
			
		||||
        do                                          \
 | 
			
		||||
        {                                           \
 | 
			
		||||
            if (test_retval == JTEST_TEST_PASSED)   \
 | 
			
		||||
            {                                       \
 | 
			
		||||
                JTEST_DUMP_STR("Test Passed\n");      \
 | 
			
		||||
            } else {                                \
 | 
			
		||||
                JTEST_DUMP_STR("Test Failed\n");      \
 | 
			
		||||
            }                                       \
 | 
			
		||||
        } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Call the #JTEST_TEST_t assocaited with the identifier test_fn.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_TEST_CALL(test_fn)                                        \
 | 
			
		||||
    do                                                                  \
 | 
			
		||||
    {                                                                   \
 | 
			
		||||
        if (JTEST_TEST_IS_ENABLED(&JTEST_TEST_STRUCT_NAME(test_fn)))    \
 | 
			
		||||
        {                                                               \
 | 
			
		||||
            /* Default to failure */                                    \
 | 
			
		||||
            JTEST_TEST_RET_t __jtest_test_ret = JTEST_TEST_FAILED;      \
 | 
			
		||||
                                                                        \
 | 
			
		||||
            JTEST_ACT_TEST_START();                                     \
 | 
			
		||||
            JTEST_TEST_RUN(__jtest_test_ret, test_fn);                  \
 | 
			
		||||
                                                                        \
 | 
			
		||||
            /* Update pass-fail information */                          \
 | 
			
		||||
            JTEST_TEST_UPDATE_PARENT_GROUP_OR_FW_PF(__jtest_test_ret);  \
 | 
			
		||||
                                                                        \
 | 
			
		||||
            JTEST_TEST_DUMP_RESULTS(__jtest_test_ret);                  \
 | 
			
		||||
            JTEST_ACT_TEST_END();                                       \
 | 
			
		||||
        }                                                               \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
#endif /* _JTEST_TEST_CALL_H_ */
 | 
			
		||||
@ -0,0 +1,133 @@
 | 
			
		||||
#ifndef _JTEST_TEST_DEFINE_H_
 | 
			
		||||
#define _JTEST_TEST_DEFINE_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "jtest_util.h"
 | 
			
		||||
#include "jtest_define.h"
 | 
			
		||||
#include "jtest_test.h"
 | 
			
		||||
 | 
			
		||||
/* For defining macros with optional arguments */
 | 
			
		||||
#include "opt_arg/opt_arg.h"
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros and Defines */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Prefix for all #JTEST_TEST_t structs.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_TEST_STRUCT_NAME_PREFIX G_JTEST_TEST_STRUCT_
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Define test template used by #JTEST_TEST_t tests.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_TEST_FN_TEMPLATE(test_fn)                         \
 | 
			
		||||
    JTEST_TEST_RET_t test_fn(void)
 | 
			
		||||
 | 
			
		||||
#define JTEST_TEST_FN_PROTOTYPE JTEST_TEST_FN_TEMPLATE /**< Alias for
 | 
			
		||||
                                                        * #JTEST_TEST_FN_TEMPLATE. */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Evaluate to the name of the #JTEST_TEST_t struct associated with test_fn.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_TEST_STRUCT_NAME(test_fn)                         \
 | 
			
		||||
    JTEST_STRUCT_NAME(JTEST_TEST_STRUCT_NAME_PREFIX, test_fn)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Define a #JTEST_TEST_t struct based on the given test_fn.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_TEST_DEFINE_STRUCT(test_fn)                   \
 | 
			
		||||
    JTEST_DEFINE_STRUCT(JTEST_TEST_t,                       \
 | 
			
		||||
                        JTEST_TEST_STRUCT_NAME(test_fn))
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Declare a #JTEST_TEST_t struct based on the given test_fn.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_TEST_DECLARE_STRUCT(test_fn)      \
 | 
			
		||||
    JTEST_DECLARE_STRUCT(JTEST_TEST_DEFINE_STRUCT(test_fn))
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Contents needed to initialize a JTEST_TEST_t struct.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_TEST_STRUCT_INIT(test_fn, fut, enable)    \
 | 
			
		||||
    test_fn,                                            \
 | 
			
		||||
        STR_NL(test_fn),                                   \
 | 
			
		||||
        STR_NL(fut),                                       \
 | 
			
		||||
    {                                                   \
 | 
			
		||||
        {                                               \
 | 
			
		||||
            enable,                                     \
 | 
			
		||||
                0                                       \
 | 
			
		||||
        }                                               \
 | 
			
		||||
    }                                                   \
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Initialize the contents of a #JTEST_TEST_t struct.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_TEST_INIT(test_fn, fut, enable)              \
 | 
			
		||||
    JTEST_TEST_DEFINE_STRUCT(test_fn) = {                  \
 | 
			
		||||
        JTEST_TEST_STRUCT_INIT(test_fn, fut, enable)       \
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
/* Test Definition Macro */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Define a #JTEST_TEST_t object and a test function.
 | 
			
		||||
 */
 | 
			
		||||
#define _JTEST_DEFINE_TEST(test_fn, fut, enable)           \
 | 
			
		||||
    JTEST_TEST_FN_PROTOTYPE(test_fn);                      \
 | 
			
		||||
    JTEST_TEST_INIT(test_fn, fut, enable);                 \
 | 
			
		||||
    JTEST_TEST_FN_PROTOTYPE(test_fn) /* Notice the lacking semicolon */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Declare a #JTEST_TEST_t object and a test function prototype.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_DECLARE_TEST(test_fn)                                     \
 | 
			
		||||
    JTEST_TEST_FN_PROTOTYPE(test_fn);                                   \
 | 
			
		||||
    JTEST_TEST_DECLARE_STRUCT(test_fn) /* Note the lacking semicolon */
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros with optional arguments */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* Top-level Interface */
 | 
			
		||||
#define JTEST_DEFINE_TEST(...)                             \
 | 
			
		||||
    JTEST_DEFINE_TEST_(PP_NARG(__VA_ARGS__), ##__VA_ARGS__)
 | 
			
		||||
 | 
			
		||||
/* Dispatch Macro*/
 | 
			
		||||
#define JTEST_DEFINE_TEST_(N, ...)                         \
 | 
			
		||||
    SPLICE(JTEST_DEFINE_TEST_, N)(__VA_ARGS__)
 | 
			
		||||
 | 
			
		||||
/* Default Arguments */
 | 
			
		||||
#define JTEST_DEFINE_TEST_DEFAULT_FUT /* Blank */
 | 
			
		||||
#define JTEST_DEFINE_TEST_DEFAULT_ENABLE                   \
 | 
			
		||||
    JTEST_TRUE                                 /* Tests enabled by
 | 
			
		||||
                                                * default. */ 
 | 
			
		||||
 | 
			
		||||
/* Dispatch Cases*/
 | 
			
		||||
#define JTEST_DEFINE_TEST_1(_1)                            \
 | 
			
		||||
    _JTEST_DEFINE_TEST(                                    \
 | 
			
		||||
        _1,                                                \
 | 
			
		||||
        JTEST_DEFINE_TEST_DEFAULT_FUT,                     \
 | 
			
		||||
        JTEST_DEFINE_TEST_DEFAULT_ENABLE                   \
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
#define JTEST_DEFINE_TEST_2(_1, _2)                        \
 | 
			
		||||
    _JTEST_DEFINE_TEST(                                    \
 | 
			
		||||
        _1,                                                \
 | 
			
		||||
        _2,                                                \
 | 
			
		||||
        JTEST_DEFINE_TEST_DEFAULT_ENABLE                   \
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
#define JTEST_DEFINE_TEST_3(_1, _2, _3)                    \
 | 
			
		||||
    _JTEST_DEFINE_TEST(                                    \
 | 
			
		||||
        _1,                                                \
 | 
			
		||||
        _2,                                                \
 | 
			
		||||
        _3                                                 \
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
#endif /* _JTEST_TEST_DEFINE_H_ */
 | 
			
		||||
@ -0,0 +1,17 @@
 | 
			
		||||
#ifndef _JTEST_TEST_RET_H_
 | 
			
		||||
#define _JTEST_TEST_RET_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Type Definitions */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Values a #JTEST_TEST_t can return.
 | 
			
		||||
 */
 | 
			
		||||
typedef enum JTEST_TEST_RET_enum
 | 
			
		||||
{
 | 
			
		||||
    JTEST_TEST_PASSED,
 | 
			
		||||
    JTEST_TEST_FAILED
 | 
			
		||||
} JTEST_TEST_RET_t;
 | 
			
		||||
 | 
			
		||||
#endif /* _JTEST_TEST_RET_H_ */
 | 
			
		||||
@ -0,0 +1,27 @@
 | 
			
		||||
#ifndef _JTEST_UTIL_H_
 | 
			
		||||
#define _JTEST_UTIL_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "util/util.h"
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros and Defines */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* Define boolean values for the framework. */
 | 
			
		||||
#define JTEST_TRUE  1           /**< Value used for TRUE in JTEST. */
 | 
			
		||||
#define JTEST_FALSE 0           /**< Value used for FALSE in JTEST. */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Set the value of the attribute in the struct to by struct_ptr to value.
 | 
			
		||||
 */
 | 
			
		||||
#define JTEST_SET_STRUCT_ATTRIBUTE(struct_ptr, attribute, value)    \
 | 
			
		||||
    do                                                              \
 | 
			
		||||
    {                                                               \
 | 
			
		||||
        (struct_ptr)->attribute = (value);                          \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
#endif /* _JTEST_UTIL_H_ */
 | 
			
		||||
@ -0,0 +1,15 @@
 | 
			
		||||
#ifndef _OPT_ARG_H_
 | 
			
		||||
#define _OPT_ARG_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "pp_narg.h"
 | 
			
		||||
#include "splice.h"
 | 
			
		||||
 | 
			
		||||
/* If you are Joseph Jaoudi, you have a snippet which expands into an
 | 
			
		||||
   example. If you are not Joseph, but possess his code, study the examples. If
 | 
			
		||||
   you have no examples, turn back contact Joseph. */
 | 
			
		||||
 | 
			
		||||
#endif /* _OPT_ARG_H_ */
 | 
			
		||||
@ -0,0 +1,25 @@
 | 
			
		||||
#ifndef _PP_NARG_H_
 | 
			
		||||
#define _PP_NARG_H_
 | 
			
		||||
 | 
			
		||||
#define PP_NARG(...)                                      \
 | 
			
		||||
    PP_NARG_(__VA_ARGS__,PP_RSEQ_N())
 | 
			
		||||
#define PP_NARG_(...)                                     \
 | 
			
		||||
    PP_ARG_N(__VA_ARGS__)
 | 
			
		||||
#define PP_ARG_N(                                         \
 | 
			
		||||
                 _1, _2, _3, _4, _5, _6, _7, _8, _9,_10,  \
 | 
			
		||||
                 _11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \
 | 
			
		||||
                 _21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \
 | 
			
		||||
                 _31,_32,_33,_34,_35,_36,_37,_38,_39,_40, \
 | 
			
		||||
                 _41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \
 | 
			
		||||
                 _51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \
 | 
			
		||||
                 _61,_62,_63,N,...) N
 | 
			
		||||
#define PP_RSEQ_N()                                       \
 | 
			
		||||
    63,62,61,60,                                          \
 | 
			
		||||
        59,58,57,56,55,54,53,52,51,50,                    \
 | 
			
		||||
        49,48,47,46,45,44,43,42,41,40,                    \
 | 
			
		||||
        39,38,37,36,35,34,33,32,31,30,                    \
 | 
			
		||||
        29,28,27,26,25,24,23,22,21,20,                    \
 | 
			
		||||
        19,18,17,16,15,14,13,12,11,10,                    \
 | 
			
		||||
        9,8,7,6,5,4,3,2,1,0
 | 
			
		||||
 | 
			
		||||
#endif /* _PP_NARG_H_ */
 | 
			
		||||
@ -0,0 +1,8 @@
 | 
			
		||||
#ifndef _SPLICE_H_
 | 
			
		||||
#define _SPLICE_H_
 | 
			
		||||
 | 
			
		||||
#define SPLICE(a,b) SPLICE_1(a,b)
 | 
			
		||||
#define SPLICE_1(a,b) SPLICE_2(a,b)
 | 
			
		||||
#define SPLICE_2(a,b) a##b
 | 
			
		||||
 | 
			
		||||
#endif /* _SPLICE_H_ */
 | 
			
		||||
@ -0,0 +1,52 @@
 | 
			
		||||
#ifndef _UTIL_H_
 | 
			
		||||
#define _UTIL_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros and Defines */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Convert a symbol to a string and add a 'NewLine'.
 | 
			
		||||
 */
 | 
			
		||||
#define STR_NL(x)  STR1_NL(x)
 | 
			
		||||
#define STR1_NL(x) (STR2_NL(x)"\n")
 | 
			
		||||
#define STR2_NL(x) #x
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Convert a symbol to a string.
 | 
			
		||||
 */
 | 
			
		||||
#define STR(x)  STR1(x)
 | 
			
		||||
#define STR1(x) STR2(x)
 | 
			
		||||
#define STR2(x) #x
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Concatenate two symbols.
 | 
			
		||||
 */
 | 
			
		||||
#define CONCAT(a, b)  CONCAT1(a, b)
 | 
			
		||||
#define CONCAT1(a, b) CONCAT2(a, b)
 | 
			
		||||
#define CONCAT2(a, b) a##b
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Place curly braces around a varaible number of macro arguments.
 | 
			
		||||
 */
 | 
			
		||||
#define CURLY(...) {__VA_ARGS__}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Place parenthesis around a variable number of macro arguments.
 | 
			
		||||
 */
 | 
			
		||||
#define PAREN(...) (__VA_ARGS__)
 | 
			
		||||
 | 
			
		||||
/* Standard min/max macros. */
 | 
			
		||||
#define MIN(x,y) (((x) < (y)) ? (x) : (y) )
 | 
			
		||||
#define MAX(x,y) (((x) > (y)) ? (x) : (y) )
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Bound value using low and high limits.
 | 
			
		||||
 *
 | 
			
		||||
 *  Evaluate to a number in the range, endpoint inclusive.
 | 
			
		||||
 */
 | 
			
		||||
#define BOUND(low, high, value)                 \
 | 
			
		||||
    MAX(MIN(high, value), low)
 | 
			
		||||
 | 
			
		||||
#endif /* _UTIL_H_ */
 | 
			
		||||
@ -0,0 +1,9 @@
 | 
			
		||||
#include "../inc/jtest_cycle.h"
 | 
			
		||||
#include <inttypes.h>
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Define Module Variables */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* const char * JTEST_CYCLE_STRF = "Running: %s\nCycles: %" PRIu32 "\n"; */
 | 
			
		||||
const char * JTEST_CYCLE_STRF = "Cycles: %" PRIu32 "\n"; /* function name + parameter string skipped */
 | 
			
		||||
@ -0,0 +1,36 @@
 | 
			
		||||
#include "jtest_fw.h"
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Dump the JTEST_FW.str_buffer the Keil framework in pieces.
 | 
			
		||||
 *
 | 
			
		||||
 *  The JTEST_FW.str_buffer contains more characters than the Keil framework can
 | 
			
		||||
 *  dump at once. This function dumps them in blocks.
 | 
			
		||||
 */
 | 
			
		||||
void jtest_dump_str_segments(void)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t seg_idx      = 0;
 | 
			
		||||
    uint32_t memmove_idx = 0;
 | 
			
		||||
    uint32_t seg_cnt  =
 | 
			
		||||
        (strlen(JTEST_FW.str_buffer) / JTEST_STR_MAX_OUTPUT_SIZE) + 1;
 | 
			
		||||
 | 
			
		||||
    for( seg_idx = 0; seg_idx < seg_cnt; ++seg_idx)
 | 
			
		||||
    {
 | 
			
		||||
        JTEST_TRIGGER_ACTION(dump_str);
 | 
			
		||||
 | 
			
		||||
        if (seg_idx < JTEST_STR_MAX_OUTPUT_SEGMENTS)
 | 
			
		||||
        {
 | 
			
		||||
            memmove_idx = 0;
 | 
			
		||||
            while (memmove_idx < (seg_cnt - seg_idx -1) )
 | 
			
		||||
            {
 | 
			
		||||
                memmove(
 | 
			
		||||
                    JTEST_FW.str_buffer+
 | 
			
		||||
                    (memmove_idx* JTEST_STR_MAX_OUTPUT_SIZE),
 | 
			
		||||
                    JTEST_FW.str_buffer+
 | 
			
		||||
                    ((memmove_idx+1)*JTEST_STR_MAX_OUTPUT_SIZE),
 | 
			
		||||
                    JTEST_BUF_SIZE);
 | 
			
		||||
                ++memmove_idx;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,9 @@
 | 
			
		||||
#include "../inc/jtest.h"
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Define Global Variables */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
char JTEST_FW_STR_BUFFER[JTEST_BUF_SIZE] = {0};
 | 
			
		||||
 | 
			
		||||
volatile JTEST_FW_t JTEST_FW = {0};
 | 
			
		||||
@ -0,0 +1,37 @@
 | 
			
		||||
 | 
			
		||||
#include "jtest_fw.h"
 | 
			
		||||
 | 
			
		||||
void test_start    (void) {
 | 
			
		||||
//  ;
 | 
			
		||||
  JTEST_FW.test_start++;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void test_end      (void) {
 | 
			
		||||
//  ;
 | 
			
		||||
  JTEST_FW.test_end++;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void group_start   (void) {
 | 
			
		||||
//  ;
 | 
			
		||||
  JTEST_FW.group_start++;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void group_end     (void) {
 | 
			
		||||
//  ;
 | 
			
		||||
  JTEST_FW.group_end++;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dump_str      (void) {
 | 
			
		||||
//  ;
 | 
			
		||||
  JTEST_FW.dump_str++;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dump_data     (void) {
 | 
			
		||||
//  ;
 | 
			
		||||
  JTEST_FW.dump_data++;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void exit_fw       (void) {
 | 
			
		||||
//  ;
 | 
			
		||||
  JTEST_FW.exit_fw++;
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,9 @@
 | 
			
		||||
#ifndef _ALL_TESTS_H_
 | 
			
		||||
#define _ALL_TESTS_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Declare Test Groups */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
JTEST_DECLARE_GROUP(all_tests);
 | 
			
		||||
 | 
			
		||||
#endif /* _ALL_TESTS_H_ */
 | 
			
		||||
@ -0,0 +1,267 @@
 | 
			
		||||
#ifndef _BASIC_MATH_TEMPLATES_H_
 | 
			
		||||
#define _BASIC_MATH_TEMPLATES_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
#include "test_templates.h"
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Group Specific Templates */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Compare the outputs used by basic math tests for the function under test and
 | 
			
		||||
 *  the reference function.
 | 
			
		||||
 */
 | 
			
		||||
#define BASIC_MATH_COMPARE_INTERFACE(block_size, output_type)   \
 | 
			
		||||
    TEST_ASSERT_BUFFERS_EQUAL(                                  \
 | 
			
		||||
        basic_math_output_ref.data_ptr,                         \
 | 
			
		||||
        basic_math_output_fut.data_ptr,                         \
 | 
			
		||||
        block_size * sizeof(output_type))
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Comparison SNR thresholds for the data types used in basic_math_tests.
 | 
			
		||||
 */
 | 
			
		||||
#define BASIC_MATH_SNR_THRESHOLD_float32_t 120
 | 
			
		||||
#define BASIC_MATH_SNR_THRESHOLD_q31_t 100
 | 
			
		||||
#define BASIC_MATH_SNR_THRESHOLD_q15_t 75
 | 
			
		||||
#define BASIC_MATH_SNR_THRESHOLD_q7_t 25
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Compare reference and fut outputs using SNR.
 | 
			
		||||
 *
 | 
			
		||||
 *  @note The outputs are converted to float32_t before comparison.
 | 
			
		||||
 */
 | 
			
		||||
#define BASIC_MATH_SNR_COMPARE_INTERFACE(block_size, output_type)   \
 | 
			
		||||
    do                                                              \
 | 
			
		||||
    {                                                               \
 | 
			
		||||
        TEST_CONVERT_AND_ASSERT_SNR(                                \
 | 
			
		||||
            basic_math_output_f32_ref,                              \
 | 
			
		||||
            basic_math_output_ref.data_ptr,                         \
 | 
			
		||||
            basic_math_output_f32_fut,                              \
 | 
			
		||||
            basic_math_output_fut.data_ptr,                         \
 | 
			
		||||
            block_size,                                             \
 | 
			
		||||
            output_type,                                            \
 | 
			
		||||
            BASIC_MATH_SNR_THRESHOLD_##output_type                  \
 | 
			
		||||
            );                                                      \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Compare reference and fut outputs using SNR.
 | 
			
		||||
 *
 | 
			
		||||
 *  @note The outputs are converted to float32_t before comparison.
 | 
			
		||||
 */
 | 
			
		||||
#define BASIC_MATH_SNR_ELT1_COMPARE_INTERFACE(block_size, output_type)  \
 | 
			
		||||
    do                                                                  \
 | 
			
		||||
    {                                                                   \
 | 
			
		||||
        TEST_CONVERT_AND_ASSERT_SNR(                                    \
 | 
			
		||||
            basic_math_output_f32_ref,                                  \
 | 
			
		||||
            basic_math_output_ref.data_ptr,                             \
 | 
			
		||||
            basic_math_output_f32_fut,                                  \
 | 
			
		||||
            basic_math_output_fut.data_ptr,                             \
 | 
			
		||||
            1,                                                          \
 | 
			
		||||
            output_type,                                                \
 | 
			
		||||
            BASIC_MATH_SNR_THRESHOLD_##output_type                      \
 | 
			
		||||
            );                                                          \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Input Interfaces */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/*
 | 
			
		||||
 *  General:
 | 
			
		||||
 *  Input interfaces provide inputs to functions inside test templates.  They
 | 
			
		||||
 *  ONLY provide the inputs.  The output variables should be hard coded.
 | 
			
		||||
 *
 | 
			
		||||
 *  The input interfaces must have the following format:
 | 
			
		||||
 *
 | 
			
		||||
 *  ARM_xxx_INPUT_INTERFACE() or
 | 
			
		||||
 *  REF_xxx_INPUT_INTERFACE()
 | 
			
		||||
 *
 | 
			
		||||
 *  The xxx must be lowercase, and is intended to be the indentifying substring
 | 
			
		||||
 *  in the function's name.  Acceptable values are 'sub' or 'add' from the
 | 
			
		||||
 *  functions arm_add_q31.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define ARM_abs_INPUT_INTERFACE(input, block_size)              \
 | 
			
		||||
    PAREN(input, basic_math_output_fut.data_ptr, block_size)
 | 
			
		||||
 | 
			
		||||
#define REF_abs_INPUT_INTERFACE(input, block_size)              \
 | 
			
		||||
    PAREN(input, basic_math_output_ref.data_ptr, block_size)
 | 
			
		||||
 | 
			
		||||
#define ARM_add_INPUT_INTERFACE(input_a, input_b, block_size)           \
 | 
			
		||||
    PAREN(input_a, input_b, basic_math_output_fut.data_ptr, block_size) \
 | 
			
		||||
 | 
			
		||||
#define REF_add_INPUT_INTERFACE(input_a, input_b, block_size)           \
 | 
			
		||||
    PAREN(input_a, input_b, basic_math_output_ref.data_ptr, block_size) \
 | 
			
		||||
 | 
			
		||||
#define ARM_dot_prod_INPUT_INTERFACE(input_a, input_b, block_size)      \
 | 
			
		||||
    PAREN(input_a, input_b, block_size, basic_math_output_fut.data_ptr) \
 | 
			
		||||
 | 
			
		||||
#define REF_dot_prod_INPUT_INTERFACE(input_a, input_b, block_size)      \
 | 
			
		||||
    PAREN(input_a, input_b, block_size, basic_math_output_ref.data_ptr) \
 | 
			
		||||
 | 
			
		||||
#define ARM_mult_INPUT_INTERFACE(input_a, input_b, block_size)          \
 | 
			
		||||
    PAREN(input_a, input_b, basic_math_output_fut.data_ptr, block_size) \
 | 
			
		||||
 | 
			
		||||
#define REF_mult_INPUT_INTERFACE(input_a, input_b, block_size)          \
 | 
			
		||||
    PAREN(input_a, input_b, basic_math_output_ref.data_ptr, block_size) \
 | 
			
		||||
 | 
			
		||||
#define ARM_negate_INPUT_INTERFACE(input, block_size)           \
 | 
			
		||||
    PAREN(input, basic_math_output_fut.data_ptr, block_size)
 | 
			
		||||
 | 
			
		||||
#define REF_negate_INPUT_INTERFACE(input, block_size)           \
 | 
			
		||||
    PAREN(input, basic_math_output_ref.data_ptr, block_size)
 | 
			
		||||
 | 
			
		||||
#define ARM_offset_INPUT_INTERFACE(input, elt, block_size)          \
 | 
			
		||||
    PAREN(input, elt, basic_math_output_fut.data_ptr, block_size)   \
 | 
			
		||||
 | 
			
		||||
#define REF_offset_INPUT_INTERFACE(input, elt, block_size)          \
 | 
			
		||||
    PAREN(input, elt, basic_math_output_ref.data_ptr, block_size)   \
 | 
			
		||||
 | 
			
		||||
#define ARM_shift_INPUT_INTERFACE(input, elt, block_size)           \
 | 
			
		||||
    PAREN(input, elt, basic_math_output_fut.data_ptr, block_size)   \
 | 
			
		||||
 | 
			
		||||
#define REF_shift_INPUT_INTERFACE(input, elt, block_size)           \
 | 
			
		||||
    PAREN(input, elt, basic_math_output_ref.data_ptr, block_size)   \
 | 
			
		||||
 | 
			
		||||
#define ARM_scale_float_INPUT_INTERFACE(input, elt, block_size)     \
 | 
			
		||||
    PAREN(input, elt, basic_math_output_fut.data_ptr, block_size)   \
 | 
			
		||||
 | 
			
		||||
#define REF_scale_float_INPUT_INTERFACE(input, elt, block_size)     \
 | 
			
		||||
    PAREN(input, elt, basic_math_output_ref.data_ptr, block_size)   \
 | 
			
		||||
 | 
			
		||||
/* These two are for the fixed point functions */
 | 
			
		||||
#define ARM_scale_INPUT_INTERFACE(input, elt1, elt2, block_size)        \
 | 
			
		||||
    PAREN(input, elt1, elt2, basic_math_output_fut.data_ptr, block_size) \
 | 
			
		||||
 | 
			
		||||
#define REF_scale_INPUT_INTERFACE(input, elt1, elt2, block_size)        \
 | 
			
		||||
    PAREN(input, elt1, elt2, basic_math_output_ref.data_ptr, block_size) \
 | 
			
		||||
 | 
			
		||||
#define ARM_sub_INPUT_INTERFACE(input_a, input_b, block_size)           \
 | 
			
		||||
    PAREN(input_a, input_b, basic_math_output_fut.data_ptr, block_size) \
 | 
			
		||||
 | 
			
		||||
#define REF_sub_INPUT_INTERFACE(input_a, input_b, block_size)           \
 | 
			
		||||
    PAREN(input_a, input_b, basic_math_output_ref.data_ptr, block_size) \
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Test Templates */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Specialization of #TEST_TEMPLATE_BUF1_BLK() for basic math tests.
 | 
			
		||||
 *
 | 
			
		||||
 *  @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and
 | 
			
		||||
 *  REF_xxx_INPUT_INTERFACEs.
 | 
			
		||||
 */
 | 
			
		||||
#define BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF1_BLK(fn_name,       \
 | 
			
		||||
                                                 suffix,        \
 | 
			
		||||
                                                 input_type,    \
 | 
			
		||||
                                                 output_type)   \
 | 
			
		||||
    JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test,          \
 | 
			
		||||
                      arm_##fn_name##_##suffix)                 \
 | 
			
		||||
    {                                                           \
 | 
			
		||||
        TEST_TEMPLATE_BUF1_BLK(                                 \
 | 
			
		||||
            basic_math_f_all,                                   \
 | 
			
		||||
            basic_math_block_sizes,                             \
 | 
			
		||||
            input_type,                                         \
 | 
			
		||||
            output_type,                                        \
 | 
			
		||||
            arm_##fn_name##_##suffix,                           \
 | 
			
		||||
            ARM_##fn_name##_INPUT_INTERFACE,                    \
 | 
			
		||||
            ref_##fn_name##_##suffix,                           \
 | 
			
		||||
            REF_##fn_name##_INPUT_INTERFACE,                    \
 | 
			
		||||
            BASIC_MATH_COMPARE_INTERFACE);                      \
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Specialization of #TEST_TEMPLATE_BUF2_BLK() for basic math tests.
 | 
			
		||||
 *
 | 
			
		||||
 *  @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and
 | 
			
		||||
 *  REF_xxx_INPUT_INTERFACEs.
 | 
			
		||||
 */
 | 
			
		||||
#define BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF2_BLK(fn_name,               \
 | 
			
		||||
                                                 suffix,                \
 | 
			
		||||
                                                 input_type,            \
 | 
			
		||||
                                                 output_type,           \
 | 
			
		||||
                                                 comparison_interface)  \
 | 
			
		||||
    JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test,                  \
 | 
			
		||||
                      arm_##fn_name##_##suffix)                         \
 | 
			
		||||
    {                                                                   \
 | 
			
		||||
        TEST_TEMPLATE_BUF2_BLK(                                         \
 | 
			
		||||
            basic_math_f_all,                                           \
 | 
			
		||||
            basic_math_f_all,                                           \
 | 
			
		||||
            basic_math_block_sizes,                                     \
 | 
			
		||||
            input_type,                                                 \
 | 
			
		||||
            output_type,                                                \
 | 
			
		||||
            arm_##fn_name##_##suffix,                                   \
 | 
			
		||||
            ARM_##fn_name##_INPUT_INTERFACE,                            \
 | 
			
		||||
            ref_##fn_name##_##suffix,                                   \
 | 
			
		||||
            REF_##fn_name##_INPUT_INTERFACE,                            \
 | 
			
		||||
            comparison_interface);                                      \
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Specialization of #TEST_TEMPLATE_BUF1_ELT1_BLK() for basic math tests.
 | 
			
		||||
 *
 | 
			
		||||
 *  @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and
 | 
			
		||||
 *  REF_xxx_INPUT_INTERFACEs.
 | 
			
		||||
 */
 | 
			
		||||
#define BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF1_ELT1_BLK(fn_name,      \
 | 
			
		||||
                                                      suffix,       \
 | 
			
		||||
                                                      input_type,   \
 | 
			
		||||
                                                      elt_type,     \
 | 
			
		||||
                                                      output_type)  \
 | 
			
		||||
    JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test,              \
 | 
			
		||||
                      arm_##fn_name##_##suffix)                     \
 | 
			
		||||
    {                                                               \
 | 
			
		||||
        TEST_TEMPLATE_BUF1_ELT1_BLK(                                \
 | 
			
		||||
            basic_math_f_all,                                       \
 | 
			
		||||
            basic_math_elts,                                        \
 | 
			
		||||
            basic_math_block_sizes,                                 \
 | 
			
		||||
            input_type,                                             \
 | 
			
		||||
            elt_type,                                               \
 | 
			
		||||
            output_type,                                            \
 | 
			
		||||
            arm_##fn_name##_##suffix,                               \
 | 
			
		||||
            ARM_##fn_name##_INPUT_INTERFACE,                        \
 | 
			
		||||
            ref_##fn_name##_##suffix,                               \
 | 
			
		||||
            REF_##fn_name##_INPUT_INTERFACE,                        \
 | 
			
		||||
            BASIC_MATH_COMPARE_INTERFACE);                          \
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Specialization of #TEST_TEMPLATE_BUF1_ELT2_BLK() for basic math tests.
 | 
			
		||||
 *
 | 
			
		||||
 *  @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and
 | 
			
		||||
 *  REF_xxx_INPUT_INTERFACEs.
 | 
			
		||||
 */
 | 
			
		||||
#define BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF1_ELT2_BLK(fn_name,      \
 | 
			
		||||
                                                      suffix,       \
 | 
			
		||||
                                                      input_type,   \
 | 
			
		||||
                                                      elt1_type,    \
 | 
			
		||||
                                                      elt2_type,    \
 | 
			
		||||
                                                      output_type)  \
 | 
			
		||||
    JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test,              \
 | 
			
		||||
                      arm_##fn_name##_##suffix)                     \
 | 
			
		||||
    {                                                               \
 | 
			
		||||
        TEST_TEMPLATE_BUF1_ELT2_BLK(                                \
 | 
			
		||||
            basic_math_f_all,                                       \
 | 
			
		||||
            basic_math_elts,                                        \
 | 
			
		||||
            basic_math_elts2,                                       \
 | 
			
		||||
            basic_math_block_sizes,                                 \
 | 
			
		||||
            input_type,                                             \
 | 
			
		||||
            elt1_type,                                              \
 | 
			
		||||
            elt2_type,                                              \
 | 
			
		||||
            output_type,                                            \
 | 
			
		||||
            arm_##fn_name##_##suffix,                               \
 | 
			
		||||
            ARM_##fn_name##_INPUT_INTERFACE,                        \
 | 
			
		||||
            ref_##fn_name##_##suffix,                               \
 | 
			
		||||
            REF_##fn_name##_INPUT_INTERFACE,                        \
 | 
			
		||||
            BASIC_MATH_COMPARE_INTERFACE);                          \
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif /* _BASIC_MATH_TEMPLATES_H_ */
 | 
			
		||||
@ -0,0 +1,46 @@
 | 
			
		||||
#ifndef ARM_BASIC_MATH_TEST_DATA_H
 | 
			
		||||
#define ARM_BASIC_MATH_TEST_DATA_H
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "arr_desc.h"
 | 
			
		||||
#include "arm_math.h"
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros and Defines */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
#define BASIC_MATH_MAX_INPUT_ELEMENTS 32
 | 
			
		||||
#define BASIC_MATH_BIGGEST_INPUT_TYPE float32_t
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Declare Variables */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* Input/Output Buffers */
 | 
			
		||||
ARR_DESC_DECLARE(basic_math_output_fut);
 | 
			
		||||
ARR_DESC_DECLARE(basic_math_output_ref);
 | 
			
		||||
 | 
			
		||||
extern BASIC_MATH_BIGGEST_INPUT_TYPE
 | 
			
		||||
basic_math_output_f32_ref[BASIC_MATH_MAX_INPUT_ELEMENTS];
 | 
			
		||||
 | 
			
		||||
extern BASIC_MATH_BIGGEST_INPUT_TYPE
 | 
			
		||||
basic_math_output_f32_fut[BASIC_MATH_MAX_INPUT_ELEMENTS];
 | 
			
		||||
 | 
			
		||||
/* Block Sizes*/
 | 
			
		||||
ARR_DESC_DECLARE(basic_math_block_sizes);
 | 
			
		||||
 | 
			
		||||
/* Numbers */
 | 
			
		||||
ARR_DESC_DECLARE(basic_math_elts);
 | 
			
		||||
ARR_DESC_DECLARE(basic_math_elts2);
 | 
			
		||||
ARR_DESC_DECLARE(basic_math_eltsf);
 | 
			
		||||
 | 
			
		||||
/* Float Inputs */
 | 
			
		||||
ARR_DESC_DECLARE(basic_math_zeros);
 | 
			
		||||
ARR_DESC_DECLARE(basic_math_f_2);
 | 
			
		||||
ARR_DESC_DECLARE(basic_math_f_15);
 | 
			
		||||
ARR_DESC_DECLARE(basic_math_f_32);
 | 
			
		||||
ARR_DESC_DECLARE(basic_math_f_all);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@ -0,0 +1,9 @@
 | 
			
		||||
#ifndef _BASIC_MATH_TEST_GROUP_H_
 | 
			
		||||
#define _BASIC_MATH_TEST_GROUP_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Declare Test Groups */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
JTEST_DECLARE_GROUP(basic_math_tests);
 | 
			
		||||
 | 
			
		||||
#endif /* _BASIC_MATH_TEST_GROUP_H_ */
 | 
			
		||||
@ -0,0 +1,17 @@
 | 
			
		||||
#ifndef _BASIC_MATH_TESTS_H_
 | 
			
		||||
#define _BASIC_MATH_TESTS_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Test/Group Declarations */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
JTEST_DECLARE_GROUP(abs_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(add_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(dot_prod_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(mult_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(negate_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(offset_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(scale_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(shift_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(sub_tests);
 | 
			
		||||
 | 
			
		||||
#endif /* _BASIC_MATH_TESTS_H_ */
 | 
			
		||||
@ -0,0 +1,222 @@
 | 
			
		||||
#ifndef _COMPLEX_MATH_TEMPLATES_H_
 | 
			
		||||
#define _COMPLEX_MATH_TEMPLATES_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
#include "test_templates.h"
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Group Specific Templates */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Compare the real outputs from the function under test and the reference
 | 
			
		||||
 *  function.
 | 
			
		||||
 */
 | 
			
		||||
#define COMPLEX_MATH_COMPARE_RE_INTERFACE(block_size, output_type)  \
 | 
			
		||||
    TEST_ASSERT_BUFFERS_EQUAL(                                      \
 | 
			
		||||
        complex_math_output_ref_a.data_ptr,                         \
 | 
			
		||||
        complex_math_output_fut_a.data_ptr,                         \
 | 
			
		||||
        block_size * sizeof(output_type))
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Compare the real and imaginary outputs from the function under test and the
 | 
			
		||||
 *  reference function.
 | 
			
		||||
 */
 | 
			
		||||
#define COMPLEX_MATH_COMPARE_CMPLX_INTERFACE(block_size, output_type)   \
 | 
			
		||||
    do                                                                  \
 | 
			
		||||
    {                                                                   \
 | 
			
		||||
        COMPLEX_MATH_COMPARE_RE_INTERFACE(block_size * 2, output_type); \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Comparison SNR thresholds for the data types used in complex_math_tests.
 | 
			
		||||
 */
 | 
			
		||||
#define COMPLEX_MATH_SNR_THRESHOLD_float32_t 120
 | 
			
		||||
#define COMPLEX_MATH_SNR_THRESHOLD_q31_t 100
 | 
			
		||||
#define COMPLEX_MATH_SNR_THRESHOLD_q15_t 75
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Compare reference and fut outputs using SNR.
 | 
			
		||||
 *
 | 
			
		||||
 *  The output_suffix specifies which output buffers to use for the
 | 
			
		||||
 *  comparison. An output_suffix of 'a' expands to the following buffers:
 | 
			
		||||
 *
 | 
			
		||||
 *  - complex_math_output_f32_ref_a
 | 
			
		||||
 *  - complex_math_output_f32_fut_a
 | 
			
		||||
 *  - complex_math_output_ref_a
 | 
			
		||||
 *  - complex_math_output_fut_a
 | 
			
		||||
 *
 | 
			
		||||
 *  @note The outputs are converted to float32_t before comparison.
 | 
			
		||||
 */
 | 
			
		||||
#define COMPLEX_MATH_SNR_COMPARE_OUT_INTERFACE(block_size,      \
 | 
			
		||||
                                               output_type,     \
 | 
			
		||||
                                               output_suffix)   \
 | 
			
		||||
    do                                                          \
 | 
			
		||||
    {                                                           \
 | 
			
		||||
        TEST_CONVERT_AND_ASSERT_SNR(                            \
 | 
			
		||||
            complex_math_output_f32_ref_##output_suffix,        \
 | 
			
		||||
            complex_math_output_ref_##output_suffix.data_ptr,   \
 | 
			
		||||
            complex_math_output_f32_fut_##output_suffix,        \
 | 
			
		||||
            complex_math_output_fut_##output_suffix.data_ptr,   \
 | 
			
		||||
            block_size,                                         \
 | 
			
		||||
            output_type,                                        \
 | 
			
		||||
            COMPLEX_MATH_SNR_THRESHOLD_##output_type            \
 | 
			
		||||
            );                                                  \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Specification of #COMPLEX_MATH_SNR_COMPARE_INTERFACE() for real outputs.
 | 
			
		||||
 */
 | 
			
		||||
#define COMPLEX_MATH_SNR_COMPARE_RE_INTERFACE(block_size,       \
 | 
			
		||||
                                                   output_type) \
 | 
			
		||||
    COMPLEX_MATH_SNR_COMPARE_OUT_INTERFACE(block_size,          \
 | 
			
		||||
                                           output_type,         \
 | 
			
		||||
                                           a)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Specification of #COMPLEX_MATH_SNR_COMPARE_INTERFACE() for complex outputs.
 | 
			
		||||
 */
 | 
			
		||||
#define COMPLEX_MATH_SNR_COMPARE_CMPLX_INTERFACE(block_size,    \
 | 
			
		||||
                                                 output_type)   \
 | 
			
		||||
        COMPLEX_MATH_SNR_COMPARE_OUT_INTERFACE(block_size * 2,  \
 | 
			
		||||
                                               output_type,     \
 | 
			
		||||
                                               a)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Compare reference and fut split outputs using SNR.
 | 
			
		||||
 *
 | 
			
		||||
 *  'Split' refers to two separate output buffers; one for real and one for
 | 
			
		||||
 *  complex.
 | 
			
		||||
 */
 | 
			
		||||
#define COMPLEX_MATH_SNR_COMPARE_SPLIT_INTERFACE(block_size,    \
 | 
			
		||||
                                                 output_type)   \
 | 
			
		||||
        do                                                      \
 | 
			
		||||
        {                                                       \
 | 
			
		||||
            COMPLEX_MATH_SNR_COMPARE_OUT_INTERFACE(block_size,  \
 | 
			
		||||
                                                   output_type, \
 | 
			
		||||
                                                   a);          \
 | 
			
		||||
            COMPLEX_MATH_SNR_COMPARE_OUT_INTERFACE(block_size,  \
 | 
			
		||||
                                                   output_type, \
 | 
			
		||||
                                                   b);          \
 | 
			
		||||
        } while (0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Input Interfaces */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/*
 | 
			
		||||
 *  General:
 | 
			
		||||
 *  Input interfaces provide inputs to functions inside test templates.  They
 | 
			
		||||
 *  ONLY provide the inputs.  The output variables should be hard coded.
 | 
			
		||||
 *
 | 
			
		||||
 *  The input interfaces must have the following format:
 | 
			
		||||
 *
 | 
			
		||||
 *  ARM_xxx_INPUT_INTERFACE() or
 | 
			
		||||
 *  REF_xxx_INPUT_INTERFACE()
 | 
			
		||||
 *
 | 
			
		||||
 *  The xxx must be lowercase, and is intended to be the indentifying substring
 | 
			
		||||
 *  in the function's name.  Acceptable values are 'sub' or 'add' from the
 | 
			
		||||
 *  functions arm_add_q31.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define ARM_cmplx_conj_INPUT_INTERFACE(input, block_size)           \
 | 
			
		||||
    PAREN(input, complex_math_output_fut_a.data_ptr, block_size)
 | 
			
		||||
 | 
			
		||||
#define REF_cmplx_conj_INPUT_INTERFACE(input, block_size)           \
 | 
			
		||||
    PAREN(input, complex_math_output_ref_a.data_ptr, block_size)
 | 
			
		||||
 | 
			
		||||
#define ARM_cmplx_dot_prod_INPUT_INTERFACE(input_a, input_b, block_size) \
 | 
			
		||||
    PAREN(input_a, input_b, block_size,                                 \
 | 
			
		||||
          complex_math_output_fut_a.data_ptr,                          \
 | 
			
		||||
          complex_math_output_fut_b.data_ptr)
 | 
			
		||||
 | 
			
		||||
#define REF_cmplx_dot_prod_INPUT_INTERFACE(input_a, input_b, block_size) \
 | 
			
		||||
    PAREN(input_a, input_b, block_size,                                 \
 | 
			
		||||
          complex_math_output_ref_a.data_ptr,                          \
 | 
			
		||||
          complex_math_output_ref_b.data_ptr)
 | 
			
		||||
 | 
			
		||||
#define ARM_cmplx_mag_INPUT_INTERFACE(input, block_size)            \
 | 
			
		||||
    PAREN(input, complex_math_output_fut_a.data_ptr, block_size)
 | 
			
		||||
 | 
			
		||||
#define REF_cmplx_mag_INPUT_INTERFACE(input, block_size)            \
 | 
			
		||||
    PAREN(input, complex_math_output_ref_a.data_ptr, block_size)
 | 
			
		||||
 | 
			
		||||
#define ARM_cmplx_mag_squared_INPUT_INTERFACE(input, block_size)    \
 | 
			
		||||
    PAREN(input, complex_math_output_fut_a.data_ptr, block_size)
 | 
			
		||||
 | 
			
		||||
#define REF_cmplx_mag_squared_INPUT_INTERFACE(input, block_size)    \
 | 
			
		||||
    PAREN(input, complex_math_output_ref_a.data_ptr, block_size)
 | 
			
		||||
 | 
			
		||||
#define ARM_cmplx_mult_cmplx_INPUT_INTERFACE(input_a, input_b, block_size) \
 | 
			
		||||
    PAREN(input_a, input_b, complex_math_output_fut_a.data_ptr, block_size)
 | 
			
		||||
 | 
			
		||||
#define REF_cmplx_mult_cmplx_INPUT_INTERFACE(input_a, input_b, block_size) \
 | 
			
		||||
    PAREN(input_a, input_b, complex_math_output_ref_a.data_ptr, block_size)
 | 
			
		||||
 | 
			
		||||
#define ARM_cmplx_mult_real_INPUT_INTERFACE(input_a, input_b, block_size) \
 | 
			
		||||
    PAREN(input_a, input_b, complex_math_output_fut_a.data_ptr, block_size)
 | 
			
		||||
 | 
			
		||||
#define REF_cmplx_mult_real_INPUT_INTERFACE(input_a, input_b, block_size) \
 | 
			
		||||
    PAREN(input_a, input_b, complex_math_output_ref_a.data_ptr, block_size)
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Test Templates */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Specialization of #TEST_TEMPLATE_BUF1_BLK() for complex math tests.
 | 
			
		||||
 *
 | 
			
		||||
 *  @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and
 | 
			
		||||
 *  REF_xxx_INPUT_INTERFACEs.
 | 
			
		||||
 */
 | 
			
		||||
#define COMPLEX_MATH_DEFINE_TEST_TEMPLATE_BUF1_BLK(fn_name,         \
 | 
			
		||||
                                                   suffix,          \
 | 
			
		||||
                                                   input_type,      \
 | 
			
		||||
                                                   output_type,     \
 | 
			
		||||
                                                   comparison_interface) \
 | 
			
		||||
    JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test,              \
 | 
			
		||||
                      arm_##fn_name##_##suffix)                     \
 | 
			
		||||
    {                                                               \
 | 
			
		||||
        TEST_TEMPLATE_BUF1_BLK(                                     \
 | 
			
		||||
            complex_math_f_all,                                     \
 | 
			
		||||
            complex_math_block_sizes,                               \
 | 
			
		||||
            input_type,                                             \
 | 
			
		||||
            output_type,                                            \
 | 
			
		||||
            arm_##fn_name##_##suffix,                               \
 | 
			
		||||
            ARM_##fn_name##_INPUT_INTERFACE,                        \
 | 
			
		||||
            ref_##fn_name##_##suffix,                               \
 | 
			
		||||
            REF_##fn_name##_INPUT_INTERFACE,                        \
 | 
			
		||||
            comparison_interface);                                  \
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Specialization of #TEST_TEMPLATE_BUF2_BLK1() for complex math tests.
 | 
			
		||||
 *
 | 
			
		||||
 *  @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and
 | 
			
		||||
 *  REF_xxx_INPUT_INTERFACEs.
 | 
			
		||||
 */
 | 
			
		||||
#define COMPLEX_MATH_DEFINE_TEST_TEMPLATE_BUF2_BLK(fn_name,         \
 | 
			
		||||
                                                   suffix,          \
 | 
			
		||||
                                                   input_type,      \
 | 
			
		||||
                                                   output_type,     \
 | 
			
		||||
                                                   comparison_interface) \
 | 
			
		||||
    JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test,              \
 | 
			
		||||
                      arm_##fn_name##_##suffix)                     \
 | 
			
		||||
    {                                                               \
 | 
			
		||||
        TEST_TEMPLATE_BUF2_BLK(                                     \
 | 
			
		||||
            complex_math_f_all,                                     \
 | 
			
		||||
            complex_math_f_all,                                     \
 | 
			
		||||
            complex_math_block_sizes,                               \
 | 
			
		||||
            input_type,                                             \
 | 
			
		||||
            output_type,                                            \
 | 
			
		||||
            arm_##fn_name##_##suffix,                               \
 | 
			
		||||
            ARM_##fn_name##_INPUT_INTERFACE,                        \
 | 
			
		||||
            ref_##fn_name##_##suffix,                               \
 | 
			
		||||
            REF_##fn_name##_INPUT_INTERFACE,                        \
 | 
			
		||||
            comparison_interface);                                  \
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif /* _COMPLEX_MATH_TEMPLATES_H_ */
 | 
			
		||||
@ -0,0 +1,50 @@
 | 
			
		||||
#ifndef _COMPLEX_MATH_TEST_DATA_H_
 | 
			
		||||
#define _COMPLEX_MATH_TEST_DATA_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "arr_desc.h"
 | 
			
		||||
#include "arm_math.h"
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros and Defines */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
#define COMPLEX_MATH_MAX_INPUT_ELEMENTS 32
 | 
			
		||||
#define COMPLEX_MATH_BIGGEST_INPUT_TYPE float32_t
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Decalare Variables */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* Input/Output Buffers */
 | 
			
		||||
ARR_DESC_DECLARE(complex_math_output_fut_a);
 | 
			
		||||
ARR_DESC_DECLARE(complex_math_output_fut_b);
 | 
			
		||||
ARR_DESC_DECLARE(complex_math_output_ref_a);
 | 
			
		||||
ARR_DESC_DECLARE(complex_math_output_ref_b);
 | 
			
		||||
 | 
			
		||||
extern COMPLEX_MATH_BIGGEST_INPUT_TYPE
 | 
			
		||||
complex_math_output_f32_ref_a[COMPLEX_MATH_MAX_INPUT_ELEMENTS * 2];
 | 
			
		||||
 | 
			
		||||
extern COMPLEX_MATH_BIGGEST_INPUT_TYPE
 | 
			
		||||
complex_math_output_f32_ref_b[COMPLEX_MATH_MAX_INPUT_ELEMENTS * 2];
 | 
			
		||||
 | 
			
		||||
extern COMPLEX_MATH_BIGGEST_INPUT_TYPE
 | 
			
		||||
complex_math_output_f32_fut_a[COMPLEX_MATH_MAX_INPUT_ELEMENTS * 2];
 | 
			
		||||
 | 
			
		||||
extern COMPLEX_MATH_BIGGEST_INPUT_TYPE
 | 
			
		||||
complex_math_output_f32_fut_b[COMPLEX_MATH_MAX_INPUT_ELEMENTS * 2];
 | 
			
		||||
 | 
			
		||||
/* Block Sizes*/
 | 
			
		||||
ARR_DESC_DECLARE(complex_math_block_sizes);
 | 
			
		||||
 | 
			
		||||
/* Float Inputs */
 | 
			
		||||
ARR_DESC_DECLARE(complex_math_zeros);
 | 
			
		||||
ARR_DESC_DECLARE(complex_math_f_2);
 | 
			
		||||
ARR_DESC_DECLARE(complex_math_f_15);
 | 
			
		||||
ARR_DESC_DECLARE(complex_math_f_32);
 | 
			
		||||
ARR_DESC_DECLARE(complex_math_f_all);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /* _COMPLEX_MATH_TEST_DATA_H_ */
 | 
			
		||||
@ -0,0 +1,9 @@
 | 
			
		||||
#ifndef _COMPLEX_MATH_TEST_GROUP_H_
 | 
			
		||||
#define _COMPLEX_MATH_TEST_GROUP_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Declare Test Groups */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
JTEST_DECLARE_GROUP(complex_math_tests);
 | 
			
		||||
 | 
			
		||||
#endif /* _COMPLEX_MATH_TEST_GROUP_H_ */
 | 
			
		||||
@ -0,0 +1,14 @@
 | 
			
		||||
#ifndef _COMPLEX_MATH_TESTS_H_
 | 
			
		||||
#define _COMPLEX_MATH_TESTS_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Test/Group Declarations */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
JTEST_DECLARE_GROUP(cmplx_conj_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(cmplx_dot_prod_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(cmplx_mag_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(cmplx_mag_squared_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(cmplx_mult_cmplx_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(cmplx_mult_real_tests);
 | 
			
		||||
 | 
			
		||||
#endif /* _COMPLEX_MATH_TESTS_H_ */
 | 
			
		||||
@ -0,0 +1,46 @@
 | 
			
		||||
#ifndef _CONTROLLER_TEMPLATES_H_
 | 
			
		||||
#define _CONTROLLER_TEMPLATES_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "test_templates.h"
 | 
			
		||||
#include <string.h>             /* memcpy() */
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Group Specific Templates */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Comparison SNR thresholds for the data types used in transform_tests.
 | 
			
		||||
 */
 | 
			
		||||
#define CONTROLLER_SNR_THRESHOLD_float32_t 110
 | 
			
		||||
#define CONTROLLER_SNR_THRESHOLD_q31_t     100
 | 
			
		||||
#define CONTROLLER_SNR_THRESHOLD_q15_t     45
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Compare the outputs from the function under test and the reference
 | 
			
		||||
 *  function using SNR.
 | 
			
		||||
 */
 | 
			
		||||
#define CONTROLLER_SNR_COMPARE_INTERFACE(block_size,    \
 | 
			
		||||
                                         output_type)   \
 | 
			
		||||
    do                                                  \
 | 
			
		||||
    {                                                   \
 | 
			
		||||
        TEST_CONVERT_AND_ASSERT_SNR(                    \
 | 
			
		||||
            controller_output_f32_ref,                  \
 | 
			
		||||
            (output_type *) controller_output_ref,      \
 | 
			
		||||
            controller_output_f32_fut,                  \
 | 
			
		||||
            (output_type *) controller_output_fut,      \
 | 
			
		||||
            block_size,                                 \
 | 
			
		||||
            output_type,                                \
 | 
			
		||||
            CONTROLLER_SNR_THRESHOLD_##output_type      \
 | 
			
		||||
            );                                          \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* TEST Templates */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#endif /* _CONTROLLER_TEMPLATES_H_ */
 | 
			
		||||
@ -0,0 +1,33 @@
 | 
			
		||||
#ifndef _CONTROLLER_TEST_DATA_H_
 | 
			
		||||
#define _CONTROLLER_TEST_DATA_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "arm_math.h"
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros and Defines */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#define CONTROLLER_MAX_LEN 1024
 | 
			
		||||
#define CONTROLLER_MAX_COEFFS_LEN (12 * 3)
 | 
			
		||||
#define TRANFORM_BIGGEST_INPUT_TYPE float32_t
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Variable Declarations */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
extern float32_t controller_output_fut[CONTROLLER_MAX_LEN];
 | 
			
		||||
extern float32_t controller_output_ref[CONTROLLER_MAX_LEN];
 | 
			
		||||
extern float32_t controller_output_f32_fut[CONTROLLER_MAX_LEN];
 | 
			
		||||
extern float32_t controller_output_f32_ref[CONTROLLER_MAX_LEN];
 | 
			
		||||
extern const float32_t controller_f32_inputs[CONTROLLER_MAX_LEN];
 | 
			
		||||
extern const q31_t controller_q31_inputs[CONTROLLER_MAX_LEN];
 | 
			
		||||
extern const q15_t * controller_q15_inputs;
 | 
			
		||||
extern const float32_t controller_f32_coeffs[CONTROLLER_MAX_COEFFS_LEN];
 | 
			
		||||
extern const q31_t controller_q31_coeffs[CONTROLLER_MAX_COEFFS_LEN];
 | 
			
		||||
extern const q15_t controller_q15_coeffs[CONTROLLER_MAX_COEFFS_LEN];
 | 
			
		||||
 | 
			
		||||
#endif /* _CONTROLLER_TEST_DATA_H_ */
 | 
			
		||||
@ -0,0 +1,9 @@
 | 
			
		||||
#ifndef _CONTROLLER_TEST_GROUP_H_
 | 
			
		||||
#define _CONTROLLER_TEST_GROUP_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Declare Test Group */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
JTEST_DECLARE_GROUP(controller_tests);
 | 
			
		||||
 | 
			
		||||
#endif /* _CONTROLLER_TEST_GROUP_H_ */
 | 
			
		||||
@ -0,0 +1,11 @@
 | 
			
		||||
#ifndef _CONTROLLER_TESTS_H_
 | 
			
		||||
#define _CONTROLLER_TESTS_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Test/Group Declarations */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
JTEST_DECLARE_GROUP(pid_reset_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(sin_cos_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(pid_tests);
 | 
			
		||||
 | 
			
		||||
#endif /* _CONTROLLER_TESTS_H_ */
 | 
			
		||||
@ -0,0 +1,102 @@
 | 
			
		||||
#ifndef _FAST_MATH_TEMPLATES_H_
 | 
			
		||||
#define _FAST_MATH_TEMPLATES_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "test_templates.h"
 | 
			
		||||
#include <string.h>             /* memcpy() */
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Group Specific Templates */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Comparison SNR thresholds for the data types used in transform_tests.
 | 
			
		||||
 */
 | 
			
		||||
#define FAST_MATH_SNR_THRESHOLD_float32_t 95
 | 
			
		||||
#define FAST_MATH_SNR_THRESHOLD_q31_t     95
 | 
			
		||||
#define FAST_MATH_SNR_THRESHOLD_q15_t     45
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Compare the outputs from the function under test and the reference
 | 
			
		||||
 *  function using SNR.
 | 
			
		||||
 */
 | 
			
		||||
#define FAST_MATH_SNR_COMPARE_INTERFACE(block_size,     \
 | 
			
		||||
                                        output_type)    \
 | 
			
		||||
    do                                                  \
 | 
			
		||||
    {                                                   \
 | 
			
		||||
        TEST_CONVERT_AND_ASSERT_SNR(                    \
 | 
			
		||||
            fast_math_output_f32_ref,                   \
 | 
			
		||||
            (output_type *) fast_math_output_ref,       \
 | 
			
		||||
            fast_math_output_f32_fut,                   \
 | 
			
		||||
            (output_type *) fast_math_output_fut,       \
 | 
			
		||||
            block_size,                                 \
 | 
			
		||||
            output_type,                                \
 | 
			
		||||
            FAST_MATH_SNR_THRESHOLD_##output_type       \
 | 
			
		||||
            );                                          \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* TEST Templates */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#define SQRT_TEST_TEMPLATE_ELT1(suffix)                             \
 | 
			
		||||
                                                                    \
 | 
			
		||||
    JTEST_DEFINE_TEST(arm_sqrt_##suffix##_test, arm_sqrt_##suffix)  \
 | 
			
		||||
    {                                                               \
 | 
			
		||||
        uint32_t i;                                                 \
 | 
			
		||||
                                                                    \
 | 
			
		||||
        JTEST_COUNT_CYCLES(                                         \
 | 
			
		||||
            for(i=0;i<FAST_MATH_MAX_LEN;i++)                        \
 | 
			
		||||
            {                                                       \
 | 
			
		||||
                arm_sqrt_##suffix(                                  \
 | 
			
		||||
                    (suffix##_t)fast_math_##suffix##_inputs[i]      \
 | 
			
		||||
                    ,(suffix##_t*)fast_math_output_fut + i);        \
 | 
			
		||||
            });                                                     \
 | 
			
		||||
                                                                    \
 | 
			
		||||
        for(i=0;i<FAST_MATH_MAX_LEN;i++)                            \
 | 
			
		||||
        {                                                           \
 | 
			
		||||
            ref_sqrt_##suffix(                                      \
 | 
			
		||||
                (suffix##_t)fast_math_##suffix##_inputs[i]          \
 | 
			
		||||
                ,(suffix##_t*)fast_math_output_ref + i);            \
 | 
			
		||||
        }                                                           \
 | 
			
		||||
                                                                    \
 | 
			
		||||
        FAST_MATH_SNR_COMPARE_INTERFACE(                            \
 | 
			
		||||
            FAST_MATH_MAX_LEN,                                      \
 | 
			
		||||
            suffix##_t);                                            \
 | 
			
		||||
                                                                    \
 | 
			
		||||
        return JTEST_TEST_PASSED;                                   \
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define SIN_COS_TEST_TEMPLATE_ELT1(suffix, type, func)                  \
 | 
			
		||||
                                                                        \
 | 
			
		||||
        JTEST_DEFINE_TEST(arm_##func##_##suffix##_test, arm_##func##_##suffix) \
 | 
			
		||||
        {                                                               \
 | 
			
		||||
            uint32_t i;                                                 \
 | 
			
		||||
                                                                        \
 | 
			
		||||
            JTEST_COUNT_CYCLES(                                         \
 | 
			
		||||
                for(i=0;i<FAST_MATH_MAX_LEN;i++)                        \
 | 
			
		||||
                {                                                       \
 | 
			
		||||
                    *((type*)fast_math_output_fut + i) = arm_##func##_##suffix( \
 | 
			
		||||
                        fast_math_##suffix##_inputs[i]);                \
 | 
			
		||||
                });                                                     \
 | 
			
		||||
                                                                        \
 | 
			
		||||
            JTEST_COUNT_CYCLES(                                         \
 | 
			
		||||
                for(i=0;i<FAST_MATH_MAX_LEN;i++)                        \
 | 
			
		||||
                {                                                       \
 | 
			
		||||
                    *((type*)fast_math_output_ref + i) = ref_##func##_##suffix( \
 | 
			
		||||
                        fast_math_##suffix##_inputs[i]);                \
 | 
			
		||||
                });                                                     \
 | 
			
		||||
                                                                        \
 | 
			
		||||
            FAST_MATH_SNR_COMPARE_INTERFACE(                            \
 | 
			
		||||
                FAST_MATH_MAX_LEN,                                      \
 | 
			
		||||
                type);                                                  \
 | 
			
		||||
                                                                        \
 | 
			
		||||
            return JTEST_TEST_PASSED;                                   \
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#endif /* _FAST_MATH_TEMPLATES_H_ */
 | 
			
		||||
@ -0,0 +1,29 @@
 | 
			
		||||
#ifndef _FAST_MATH_TEST_DATA_H_
 | 
			
		||||
#define _FAST_MATH_TEST_DATA_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "arm_math.h"
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros and Defines */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#define FAST_MATH_MAX_LEN 1024
 | 
			
		||||
#define TRANFORM_BIGGEST_INPUT_TYPE float32_t
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Variable Declarations */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
extern float32_t fast_math_output_fut[FAST_MATH_MAX_LEN];
 | 
			
		||||
extern float32_t fast_math_output_ref[FAST_MATH_MAX_LEN];
 | 
			
		||||
extern float32_t fast_math_output_f32_fut[FAST_MATH_MAX_LEN];
 | 
			
		||||
extern float32_t fast_math_output_f32_ref[FAST_MATH_MAX_LEN];
 | 
			
		||||
extern const float32_t fast_math_f32_inputs[FAST_MATH_MAX_LEN];
 | 
			
		||||
extern const q31_t fast_math_q31_inputs[FAST_MATH_MAX_LEN];
 | 
			
		||||
extern const q15_t * fast_math_q15_inputs;
 | 
			
		||||
 | 
			
		||||
#endif /* _FAST_MATH_TEST_DATA_H_ */
 | 
			
		||||
@ -0,0 +1,9 @@
 | 
			
		||||
#ifndef _FAST_MATH_TEST_GROUP_H_
 | 
			
		||||
#define _FAST_MATH_TEST_GROUP_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Declare Test Groups */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
JTEST_DECLARE_GROUP(fast_math_tests);
 | 
			
		||||
 | 
			
		||||
#endif /* _FAST_MATH_TEST_GROUP_H_ */
 | 
			
		||||
@ -0,0 +1,91 @@
 | 
			
		||||
#ifndef _FILTERING_TEMPLATES_H_
 | 
			
		||||
#define _FILTERING_TEMPLATES_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
#include "test_templates.h"
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Group Specific Templates */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Comparison SNR thresholds for the data types used in statistics_tests.
 | 
			
		||||
 */
 | 
			
		||||
#define FILTERING_SNR_THRESHOLD_float64_t 120
 | 
			
		||||
#define FILTERING_SNR_THRESHOLD_float32_t 99
 | 
			
		||||
#define FILTERING_SNR_THRESHOLD_q31_t 90
 | 
			
		||||
#define FILTERING_SNR_THRESHOLD_q15_t 60
 | 
			
		||||
#define FILTERING_SNR_THRESHOLD_q7_t 30
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Compare reference and fut outputs using SNR.
 | 
			
		||||
 *
 | 
			
		||||
 *  @note The outputs are converted to float32_t before comparison.
 | 
			
		||||
 */
 | 
			
		||||
#define FILTERING_SNR_COMPARE_INTERFACE(block_size,                     \
 | 
			
		||||
                                        output_type)                    \
 | 
			
		||||
    FILTERING_SNR_COMPARE_INTERFACE_OFFSET(0, block_size, output_type)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Compare reference and fut outputs starting at some offset using SNR.
 | 
			
		||||
 */
 | 
			
		||||
#define FILTERING_SNR_COMPARE_INTERFACE_OFFSET(offset,      \
 | 
			
		||||
                                               block_size,  \
 | 
			
		||||
                                               output_type) \
 | 
			
		||||
    do                                                      \
 | 
			
		||||
    {                                                       \
 | 
			
		||||
        TEST_CONVERT_AND_ASSERT_SNR(                        \
 | 
			
		||||
            filtering_output_f32_ref,                       \
 | 
			
		||||
            (output_type *) filtering_output_ref + offset,  \
 | 
			
		||||
            filtering_output_f32_fut,                       \
 | 
			
		||||
            (output_type *) filtering_output_fut + offset,  \
 | 
			
		||||
            block_size,                                     \
 | 
			
		||||
            output_type,                                    \
 | 
			
		||||
            FILTERING_SNR_THRESHOLD_##output_type           \
 | 
			
		||||
            );                                              \
 | 
			
		||||
    } while (0)                                              
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Compare reference and fut outputs starting at some offset using SNR.
 | 
			
		||||
 *  Special case for float64_t
 | 
			
		||||
 */
 | 
			
		||||
#define FILTERING_DBL_SNR_COMPARE_INTERFACE(block_size,  				\
 | 
			
		||||
                                            output_type) 				\
 | 
			
		||||
    do                                                      		\
 | 
			
		||||
    {                                                       		\
 | 
			
		||||
        TEST_ASSERT_DBL_SNR(                        						\
 | 
			
		||||
            (float64_t*)filtering_output_ref,               \
 | 
			
		||||
            (float64_t*)filtering_output_fut,               \
 | 
			
		||||
            block_size,                                     		\
 | 
			
		||||
            FILTERING_SNR_THRESHOLD_##output_type           		\
 | 
			
		||||
            );                                              		\
 | 
			
		||||
    } while (0)                                              
 | 
			
		||||
		
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Input Interfaces */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/*
 | 
			
		||||
 *  General:
 | 
			
		||||
 *  Input interfaces provide inputs to functions inside test templates.  They
 | 
			
		||||
 *  ONLY provide the inputs.  The output variables should be hard coded.
 | 
			
		||||
 *
 | 
			
		||||
 *  The input interfaces must have the following format:
 | 
			
		||||
 *
 | 
			
		||||
 *  ARM_xxx_INPUT_INTERFACE() or
 | 
			
		||||
 *  REF_xxx_INPUT_INTERFACE()
 | 
			
		||||
 *
 | 
			
		||||
 *  The xxx must be lowercase, and is intended to be the indentifying substring
 | 
			
		||||
 *  in the function's name.  Acceptable values are 'sub' or 'add' from the
 | 
			
		||||
 *  functions arm_add_q31.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Test Templates */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /* _FILTERING_TEMPLATES_H_ */
 | 
			
		||||
@ -0,0 +1,81 @@
 | 
			
		||||
#ifndef FILTERING_TEST_DATA_H
 | 
			
		||||
#define FILTERING_TEST_DATA_H
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "arr_desc.h"
 | 
			
		||||
#include "arm_math.h"
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros and Defines */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#define FILTERING_MAX_BLOCKSIZE  33
 | 
			
		||||
#define LMS_MAX_BLOCKSIZE        512
 | 
			
		||||
#define FILTERING_MAX_NUMTAPS		34
 | 
			
		||||
#define FILTERING_MAX_NUMSTAGES  14
 | 
			
		||||
#define FILTERING_MAX_POSTSHIFT  8
 | 
			
		||||
#define FILTERING_MAX_TAP_DELAY	0xFF
 | 
			
		||||
#define FILTERING_MAX_L				3
 | 
			
		||||
#define FILTERING_MAX_M				33
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Declare Variables */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* Input/Output Buffers */
 | 
			
		||||
extern float32_t filtering_output_fut[LMS_MAX_BLOCKSIZE*2];
 | 
			
		||||
extern float32_t filtering_output_ref[LMS_MAX_BLOCKSIZE*2];
 | 
			
		||||
extern float32_t filtering_output_f32_fut[LMS_MAX_BLOCKSIZE*2];
 | 
			
		||||
extern float32_t filtering_output_f32_ref[LMS_MAX_BLOCKSIZE*2];
 | 
			
		||||
extern float32_t filtering_input_lms[LMS_MAX_BLOCKSIZE*2];
 | 
			
		||||
extern float32_t filtering_pState[LMS_MAX_BLOCKSIZE + FILTERING_MAX_NUMTAPS];
 | 
			
		||||
extern float32_t filtering_scratch[FILTERING_MAX_BLOCKSIZE * 3];
 | 
			
		||||
extern float32_t filtering_scratch2[FILTERING_MAX_BLOCKSIZE * 3];
 | 
			
		||||
extern float32_t filtering_coeffs_lms[FILTERING_MAX_NUMTAPS];
 | 
			
		||||
 | 
			
		||||
extern const float64_t filtering_f64_inputs[FILTERING_MAX_BLOCKSIZE * FILTERING_MAX_M + FILTERING_MAX_NUMTAPS];
 | 
			
		||||
extern const float32_t filtering_f32_inputs[FILTERING_MAX_BLOCKSIZE * FILTERING_MAX_M + FILTERING_MAX_NUMTAPS];
 | 
			
		||||
extern const q31_t filtering_q31_inputs[FILTERING_MAX_BLOCKSIZE * FILTERING_MAX_M + FILTERING_MAX_NUMTAPS];
 | 
			
		||||
extern const q15_t * filtering_q15_inputs;
 | 
			
		||||
extern const q7_t * filtering_q7_inputs;
 | 
			
		||||
 | 
			
		||||
/* Block Sizes */
 | 
			
		||||
ARR_DESC_DECLARE(filtering_blocksizes);
 | 
			
		||||
ARR_DESC_DECLARE(lms_blocksizes);
 | 
			
		||||
ARR_DESC_DECLARE(filtering_numtaps);
 | 
			
		||||
ARR_DESC_DECLARE(filtering_numtaps2);
 | 
			
		||||
ARR_DESC_DECLARE(filtering_postshifts);
 | 
			
		||||
ARR_DESC_DECLARE(filtering_numstages);
 | 
			
		||||
ARR_DESC_DECLARE(filtering_Ls);
 | 
			
		||||
ARR_DESC_DECLARE(filtering_Ms);
 | 
			
		||||
 | 
			
		||||
/* Coefficient Lists */
 | 
			
		||||
extern const float64_t filtering_coeffs_f64[FILTERING_MAX_NUMSTAGES * 6 + 2];
 | 
			
		||||
extern const float64_t filtering_coeffs_b_f64[FILTERING_MAX_NUMSTAGES * 6 + 2];
 | 
			
		||||
extern const float32_t filtering_coeffs_f32[FILTERING_MAX_NUMSTAGES * 6 + 2];
 | 
			
		||||
extern const float32_t filtering_coeffs_b_f32[FILTERING_MAX_NUMSTAGES * 6 + 2];
 | 
			
		||||
extern const float32_t *filtering_coeffs_c_f32;
 | 
			
		||||
extern float32_t filtering_coeffs_lms_f32[FILTERING_MAX_NUMTAPS];
 | 
			
		||||
extern const q31_t filtering_coeffs_q31[FILTERING_MAX_NUMSTAGES * 6 + 2];
 | 
			
		||||
extern const q31_t *filtering_coeffs_b_q31;
 | 
			
		||||
extern const q31_t *filtering_coeffs_c_q31;
 | 
			
		||||
extern q31_t filtering_coeffs_lms_q31[FILTERING_MAX_NUMTAPS];
 | 
			
		||||
extern const q15_t filtering_coeffs_q15[FILTERING_MAX_NUMSTAGES * 6 + 4];
 | 
			
		||||
extern const q15_t *filtering_coeffs_b_q15;
 | 
			
		||||
extern const q15_t *filtering_coeffs_c_q15;
 | 
			
		||||
extern q15_t filtering_coeffs_lms_q15[FILTERING_MAX_NUMTAPS];
 | 
			
		||||
extern const q7_t filtering_coeffs_q7[FILTERING_MAX_NUMSTAGES * 6 + 8];
 | 
			
		||||
extern const q7_t *filtering_coeffs_b_q7;
 | 
			
		||||
extern const q7_t *filtering_coeffs_c_q7;
 | 
			
		||||
 | 
			
		||||
/* Tap Delay Lists */
 | 
			
		||||
extern const int32_t filtering_tap_delay[FILTERING_MAX_NUMTAPS];
 | 
			
		||||
 | 
			
		||||
/* Numbers */
 | 
			
		||||
 | 
			
		||||
/* Float Inputs */
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@ -0,0 +1,9 @@
 | 
			
		||||
#ifndef _FILTERING_TEST_GROUP_H_
 | 
			
		||||
#define _FILTERING_TEST_GROUP_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Declare Test Groups */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
JTEST_DECLARE_GROUP(filtering_tests);
 | 
			
		||||
 | 
			
		||||
#endif /* _FILTERING_TEST_GROUP_H_ */
 | 
			
		||||
@ -0,0 +1,15 @@
 | 
			
		||||
#ifndef _FILTERING_TESTS_H_
 | 
			
		||||
#define _FILTERING_TESTS_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Test/Group Declarations */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
JTEST_DECLARE_GROUP(biquad_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(conv_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(correlate_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(fir_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(iir_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(lms_tests);
 | 
			
		||||
 | 
			
		||||
#endif /* _FILTERING_TESTS_H_ */
 | 
			
		||||
@ -0,0 +1,166 @@
 | 
			
		||||
#ifndef _INTRINSICS_TEMPLATES_H_
 | 
			
		||||
#define _INTRINSICS_TEMPLATES_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "test_templates.h"
 | 
			
		||||
#include <string.h>             /* memcpy() */
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Group Specific Templates */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* Comparison SNR thresholds for the data types used in transform_tests.
 | 
			
		||||
*/
 | 
			
		||||
#define INTRINSICS_SNR_THRESHOLD_q63_t     120
 | 
			
		||||
#define INTRINSICS_SNR_THRESHOLD_q31_t     95
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
*  Compare the outputs from the function under test and the reference
 | 
			
		||||
*  function using SNR.
 | 
			
		||||
*/
 | 
			
		||||
#define INTRINSICS_SNR_COMPARE_INTERFACE(block_size,  \
 | 
			
		||||
   output_type)                                       \
 | 
			
		||||
   do                                                 \
 | 
			
		||||
   {                                                  \
 | 
			
		||||
      TEST_CONVERT_AND_ASSERT_SNR(                    \
 | 
			
		||||
         intrinsics_output_f32_ref,                   \
 | 
			
		||||
         (output_type##_t *) intrinsics_output_ref,   \
 | 
			
		||||
         intrinsics_output_f32_fut,                   \
 | 
			
		||||
         (output_type##_t *) intrinsics_output_fut,   \
 | 
			
		||||
         block_size,                                  \
 | 
			
		||||
         output_type,                                 \
 | 
			
		||||
         INTRINSICS_SNR_THRESHOLD_##output_type##_t   \
 | 
			
		||||
      );                                              \
 | 
			
		||||
   } while (0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* TEST Templates */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#define INTRINSICS_TEST_TEMPLATE_ELT1(functionName, dataType)              \
 | 
			
		||||
                                                                           \
 | 
			
		||||
   JTEST_DEFINE_TEST(functionName##_test, functionName)                    \
 | 
			
		||||
   {                                                                       \
 | 
			
		||||
      uint32_t i;                                                          \
 | 
			
		||||
                                                                           \
 | 
			
		||||
      JTEST_COUNT_CYCLES(                                                  \
 | 
			
		||||
         for(i=0;i<INTRINSICS_MAX_LEN;i++)                                 \
 | 
			
		||||
         {                                                                 \
 | 
			
		||||
            *((dataType##_t*)intrinsics_output_fut + i) =                  \
 | 
			
		||||
               functionName(                                               \
 | 
			
		||||
                  (dataType##_t)intrinsics_##dataType##_inputs[i]);        \
 | 
			
		||||
         });                                                               \
 | 
			
		||||
                                                                           \
 | 
			
		||||
      for(i=0;i<INTRINSICS_MAX_LEN;i++)                                    \
 | 
			
		||||
      {                                                                    \
 | 
			
		||||
         *((dataType##_t*)intrinsics_output_ref + i) =                     \
 | 
			
		||||
            ref##functionName(                                             \
 | 
			
		||||
               (dataType##_t)intrinsics_##dataType##_inputs[i]);           \
 | 
			
		||||
      }                                                                    \
 | 
			
		||||
                                                                           \
 | 
			
		||||
      INTRINSICS_SNR_COMPARE_INTERFACE(                                    \
 | 
			
		||||
         INTRINSICS_MAX_LEN,                                               \
 | 
			
		||||
         dataType);                                                        \
 | 
			
		||||
                                                                           \
 | 
			
		||||
      return JTEST_TEST_PASSED;                                            \
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
#define INTRINSICS_TEST_TEMPLATE_ELT2(functionName, dataType)              \
 | 
			
		||||
                                                                           \
 | 
			
		||||
   JTEST_DEFINE_TEST(functionName##_test, functionName)                    \
 | 
			
		||||
   {                                                                       \
 | 
			
		||||
      uint32_t i;                                                          \
 | 
			
		||||
                                                                           \
 | 
			
		||||
      JTEST_COUNT_CYCLES(                                                  \
 | 
			
		||||
         for(i=0;i<INTRINSICS_MAX_LEN;i++)                                 \
 | 
			
		||||
         {                                                                 \
 | 
			
		||||
            *((dataType##_t*)intrinsics_output_fut + i) =                  \
 | 
			
		||||
               functionName(                                               \
 | 
			
		||||
                  (dataType##_t)intrinsics_##dataType##_inputs[i]          \
 | 
			
		||||
                  ,(dataType##_t)intrinsics_##dataType##_inputs[i]);       \
 | 
			
		||||
         });                                                               \
 | 
			
		||||
                                                                           \
 | 
			
		||||
      for(i=0;i<INTRINSICS_MAX_LEN;i++)                                    \
 | 
			
		||||
      {                                                                    \
 | 
			
		||||
         *((dataType##_t*)intrinsics_output_ref + i) =                     \
 | 
			
		||||
            ref##functionName(                                             \
 | 
			
		||||
               (dataType##_t)intrinsics_##dataType##_inputs[i]             \
 | 
			
		||||
               ,(dataType##_t)intrinsics_##dataType##_inputs[i]);          \
 | 
			
		||||
      }                                                                    \
 | 
			
		||||
                                                                           \
 | 
			
		||||
      INTRINSICS_SNR_COMPARE_INTERFACE(                                    \
 | 
			
		||||
         INTRINSICS_MAX_LEN,                                               \
 | 
			
		||||
         dataType);                                                        \
 | 
			
		||||
                                                                           \
 | 
			
		||||
      return JTEST_TEST_PASSED;                                            \
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
#define INTRINSICS_TEST_TEMPLATE_ELT3(functionName, dataType)              \
 | 
			
		||||
                                                                           \
 | 
			
		||||
   JTEST_DEFINE_TEST(functionName##_test, functionName)                    \
 | 
			
		||||
   {                                                                       \
 | 
			
		||||
      uint32_t i;                                                          \
 | 
			
		||||
                                                                           \
 | 
			
		||||
      JTEST_COUNT_CYCLES(                                                  \
 | 
			
		||||
         for(i=0;i<INTRINSICS_MAX_LEN;i++)                                 \
 | 
			
		||||
         {                                                                 \
 | 
			
		||||
            *((dataType##_t*)intrinsics_output_fut + i) =                  \
 | 
			
		||||
               functionName(                                               \
 | 
			
		||||
                  (dataType##_t)intrinsics_##dataType##_inputs[i]          \
 | 
			
		||||
                  ,(dataType##_t)intrinsics_##dataType##_inputs[i]         \
 | 
			
		||||
                  ,(dataType##_t)intrinsics_##dataType##_inputs[i]);       \
 | 
			
		||||
         });                                                               \
 | 
			
		||||
                                                                           \
 | 
			
		||||
      for(i=0;i<INTRINSICS_MAX_LEN;i++)                                    \
 | 
			
		||||
      {                                                                    \
 | 
			
		||||
         *((dataType##_t*)intrinsics_output_ref + i) =                     \
 | 
			
		||||
            ref##functionName(                                             \
 | 
			
		||||
               (dataType##_t)intrinsics_##dataType##_inputs[i]             \
 | 
			
		||||
               ,(dataType##_t)intrinsics_##dataType##_inputs[i]            \
 | 
			
		||||
               ,(dataType##_t)intrinsics_##dataType##_inputs[i]);          \
 | 
			
		||||
      }                                                                    \
 | 
			
		||||
                                                                           \
 | 
			
		||||
      INTRINSICS_SNR_COMPARE_INTERFACE(                                    \
 | 
			
		||||
         INTRINSICS_MAX_LEN,                                               \
 | 
			
		||||
         dataType);                                                        \
 | 
			
		||||
                                                                           \
 | 
			
		||||
      return JTEST_TEST_PASSED;                                            \
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
#define INTRINSICS_TEST_TEMPLATE_ELT4(functionName, dataType, dataType2)   \
 | 
			
		||||
   JTEST_DEFINE_TEST(functionName##_test, functionName)                    \
 | 
			
		||||
   {                                                                       \
 | 
			
		||||
      uint32_t i;                                                          \
 | 
			
		||||
                                                                           \
 | 
			
		||||
      JTEST_COUNT_CYCLES(                                                  \
 | 
			
		||||
         for(i=0;i<INTRINSICS_MAX_LEN;i++)                                 \
 | 
			
		||||
         {                                                                 \
 | 
			
		||||
            *((dataType2##_t*)intrinsics_output_fut + i) =                 \
 | 
			
		||||
               functionName(                                               \
 | 
			
		||||
                  (dataType##_t)intrinsics_##dataType##_inputs[i]          \
 | 
			
		||||
                  ,(dataType##_t)intrinsics_##dataType##_inputs[i]         \
 | 
			
		||||
                  ,(dataType2##_t)intrinsics_##dataType2##_inputs[i]);     \
 | 
			
		||||
         });                                                               \
 | 
			
		||||
                                                                           \
 | 
			
		||||
      for(i=0;i<INTRINSICS_MAX_LEN;i++)                                    \
 | 
			
		||||
      {                                                                    \
 | 
			
		||||
         *((dataType2##_t*)intrinsics_output_ref + i) =                    \
 | 
			
		||||
            ref##functionName(                                             \
 | 
			
		||||
               (dataType##_t)intrinsics_##dataType##_inputs[i]             \
 | 
			
		||||
               ,(dataType##_t)intrinsics_##dataType##_inputs[i]            \
 | 
			
		||||
               ,(dataType2##_t)intrinsics_##dataType2##_inputs[i]);        \
 | 
			
		||||
      }                                                                    \
 | 
			
		||||
                                                                           \
 | 
			
		||||
      INTRINSICS_SNR_COMPARE_INTERFACE(                                    \
 | 
			
		||||
         INTRINSICS_MAX_LEN,                                               \
 | 
			
		||||
         dataType2);                                                       \
 | 
			
		||||
                                                                           \
 | 
			
		||||
      return JTEST_TEST_PASSED;                                            \
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
#endif /* _INTRINSICS_TEMPLATES_H_ */
 | 
			
		||||
@ -0,0 +1,27 @@
 | 
			
		||||
#ifndef _INTRINSICS_TEST_DATA_H_
 | 
			
		||||
#define _INTRINSICS_TEST_DATA_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "arm_math.h"
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros and Defines */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#define INTRINSICS_MAX_LEN 1024
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Variable Declarations */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
extern q63_t intrinsics_output_fut[INTRINSICS_MAX_LEN];
 | 
			
		||||
extern q63_t intrinsics_output_ref[INTRINSICS_MAX_LEN];
 | 
			
		||||
extern float32_t intrinsics_output_f32_fut[INTRINSICS_MAX_LEN];
 | 
			
		||||
extern float32_t intrinsics_output_f32_ref[INTRINSICS_MAX_LEN];
 | 
			
		||||
extern const q63_t intrinsics_q63_inputs[INTRINSICS_MAX_LEN];
 | 
			
		||||
extern const q31_t *intrinsics_q31_inputs;
 | 
			
		||||
 | 
			
		||||
#endif /* _INTRINSICS_TEST_DATA_H_ */
 | 
			
		||||
@ -0,0 +1,9 @@
 | 
			
		||||
#ifndef _INTRINSICS_TEST_GROUP_H_
 | 
			
		||||
#define _INTRINSICS_TEST_GROUP_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Declare Test Groups */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
JTEST_DECLARE_GROUP(intrinsics_tests);
 | 
			
		||||
 | 
			
		||||
#endif /* _INTRINSICS_TEST_GROUP_H_ */
 | 
			
		||||
							
								
								
									
										52
									
								
								Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/math_helper.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/math_helper.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,52 @@
 | 
			
		||||
/* ----------------------------------------------------------------------
 | 
			
		||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
* $Date:        29. November 2010
 | 
			
		||||
* $Revision:    V1.0.3
 | 
			
		||||
*
 | 
			
		||||
* Project:      CMSIS DSP Library
 | 
			
		||||
*
 | 
			
		||||
* Title:        math_helper.h
 | 
			
		||||
*
 | 
			
		||||
*
 | 
			
		||||
* Description:	Prototypes of all helper functions required.
 | 
			
		||||
*
 | 
			
		||||
* Target Processor: Cortex-M4/Cortex-M3
 | 
			
		||||
*
 | 
			
		||||
* Version 1.0.3 2010/11/29
 | 
			
		||||
*    Re-organized the CMSIS folders and updated documentation.
 | 
			
		||||
*
 | 
			
		||||
* Version 1.0.2 2010/11/11
 | 
			
		||||
*    Documentation updated.
 | 
			
		||||
*
 | 
			
		||||
* Version 1.0.1 2010/10/05
 | 
			
		||||
*    Production release and review comments incorporated.
 | 
			
		||||
*
 | 
			
		||||
* Version 1.0.0 2010/09/20
 | 
			
		||||
*    Production release and review comments incorporated.
 | 
			
		||||
*
 | 
			
		||||
* Version 0.0.7  2010/06/10
 | 
			
		||||
*    Misra-C changes done
 | 
			
		||||
* -------------------------------------------------------------------- */
 | 
			
		||||
 | 
			
		||||
#ifndef MATH_HELPER_H
 | 
			
		||||
#define MATH_HELPER_H
 | 
			
		||||
 | 
			
		||||
#include "arm_math.h"
 | 
			
		||||
 | 
			
		||||
float arm_snr_f32(float *pRef, float *pTest,  uint32_t buffSize);
 | 
			
		||||
double arm_snr_f64(double *pRef, double *pTest,  uint32_t buffSize);
 | 
			
		||||
void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples);
 | 
			
		||||
void arm_provide_guard_bits_q15(q15_t *input_buf, uint32_t blockSize, uint32_t guard_bits);
 | 
			
		||||
void arm_provide_guard_bits_q31(q31_t *input_buf, uint32_t blockSize, uint32_t guard_bits);
 | 
			
		||||
void arm_float_to_q14(float *pIn, q15_t *pOut, uint32_t numSamples);
 | 
			
		||||
void arm_float_to_q29(float *pIn, q31_t *pOut, uint32_t numSamples);
 | 
			
		||||
void arm_float_to_q28(float *pIn, q31_t *pOut, uint32_t numSamples);
 | 
			
		||||
void arm_float_to_q30(float *pIn, q31_t *pOut, uint32_t numSamples);
 | 
			
		||||
void arm_clip_f32(float *pIn, uint32_t numSamples);
 | 
			
		||||
uint32_t arm_calc_guard_bits(uint32_t num_adds);
 | 
			
		||||
void arm_apply_guard_bits (float32_t * pIn, uint32_t numSamples, uint32_t guard_bits);
 | 
			
		||||
uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples);
 | 
			
		||||
uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t *pOut, uint32_t numSamples);
 | 
			
		||||
uint32_t arm_calc_2pow(uint32_t guard_bits);
 | 
			
		||||
#endif
 | 
			
		||||
@ -0,0 +1,370 @@
 | 
			
		||||
#ifndef _MATRIX_TEMPLATES_H_
 | 
			
		||||
#define _MATRIX_TEMPLATES_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
#include "test_templates.h"
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Group Specific Templates */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Compare the outputs from the function under test and the reference
 | 
			
		||||
 *  function.
 | 
			
		||||
 */
 | 
			
		||||
#define MATRIX_COMPARE_INTERFACE(output_type, output_content_type)  \
 | 
			
		||||
    TEST_ASSERT_BUFFERS_EQUAL(                                      \
 | 
			
		||||
        ((output_type *) &matrix_output_ref)->pData,                \
 | 
			
		||||
        ((output_type *) &matrix_output_fut)->pData,                \
 | 
			
		||||
        ((output_type *) &matrix_output_fut)->numRows *             \
 | 
			
		||||
        ((output_type *) &matrix_output_ref)->numCols *             \
 | 
			
		||||
        sizeof(output_content_type))
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Comparison SNR thresholds for the data types used in matrix_tests.
 | 
			
		||||
 */
 | 
			
		||||
#define MATRIX_SNR_THRESHOLD 120
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Compare the outputs from the function under test and the reference
 | 
			
		||||
 *  function using SNR.
 | 
			
		||||
 */
 | 
			
		||||
#define MATRIX_SNR_COMPARE_INTERFACE(output_type, output_content_type)  \
 | 
			
		||||
    do                                                                  \
 | 
			
		||||
    {                                                                   \
 | 
			
		||||
        TEST_CONVERT_AND_ASSERT_SNR(                                    \
 | 
			
		||||
            (float32_t *)matrix_output_f32_ref,                         \
 | 
			
		||||
            ((output_type *) &matrix_output_ref)->pData,                \
 | 
			
		||||
            (float32_t *)matrix_output_f32_fut,                         \
 | 
			
		||||
            ((output_type *) &matrix_output_ref)->pData,                \
 | 
			
		||||
            ((output_type *) &matrix_output_fut)->numRows *             \
 | 
			
		||||
            ((output_type *) &matrix_output_ref)->numCols,              \
 | 
			
		||||
            output_content_type,                                        \
 | 
			
		||||
            MATRIX_SNR_THRESHOLD                                        \
 | 
			
		||||
            );                                                          \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Compare the outputs from the function under test and the reference
 | 
			
		||||
 *  function using SNR. This is special for float64_t
 | 
			
		||||
 */
 | 
			
		||||
#define MATRIX_DBL_SNR_COMPARE_INTERFACE(output_type)                   \
 | 
			
		||||
    do                                                                  \
 | 
			
		||||
    {                                                                   \
 | 
			
		||||
        TEST_ASSERT_DBL_SNR(                                            \
 | 
			
		||||
            (float64_t *)matrix_output_f32_ref,                         \
 | 
			
		||||
            (float64_t *)matrix_output_f32_fut,                         \
 | 
			
		||||
            ((output_type *) &matrix_output_fut)->numRows *             \
 | 
			
		||||
            ((output_type *) &matrix_output_ref)->numCols,              \
 | 
			
		||||
            MATRIX_SNR_THRESHOLD                                        \
 | 
			
		||||
            );                                                          \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Input Interfaces */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/*
 | 
			
		||||
 *  General:
 | 
			
		||||
 *  Input interfaces provide inputs to functions inside test templates.  They
 | 
			
		||||
 *  ONLY provide the inputs.  The output variables should be hard coded.
 | 
			
		||||
 *
 | 
			
		||||
 *  The input interfaces must have the following format:
 | 
			
		||||
 *
 | 
			
		||||
 *  ARM_xxx_INPUT_INTERFACE() or
 | 
			
		||||
 *  REF_xxx_INPUT_INTERFACE()
 | 
			
		||||
 *
 | 
			
		||||
 *  The xxx must be lowercase, and is intended to be the indentifying substring
 | 
			
		||||
 *  in the function's name.  Acceptable values are 'sub' or 'add' from the
 | 
			
		||||
 *  functions arm_add_q31.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define ARM_mat_add_INPUT_INTERFACE(input_a_ptr, input_b_ptr)    \
 | 
			
		||||
    PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_fut)
 | 
			
		||||
 | 
			
		||||
#define REF_mat_add_INPUT_INTERFACE(input_a_ptr, input_b_ptr)    \
 | 
			
		||||
    PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_ref)
 | 
			
		||||
 | 
			
		||||
#define ARM_mat_cmplx_mult_INPUT_INTERFACE(input_a_ptr, input_b_ptr)    \
 | 
			
		||||
    PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_fut)
 | 
			
		||||
 | 
			
		||||
#define REF_mat_cmplx_mult_INPUT_INTERFACE(input_a_ptr, input_b_ptr)    \
 | 
			
		||||
    PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_ref)
 | 
			
		||||
 | 
			
		||||
#define ARM_mat_inverse_INPUT_INTERFACE(input_ptr)  \
 | 
			
		||||
    PAREN(input_ptr, (void *) &matrix_output_fut)
 | 
			
		||||
 | 
			
		||||
#define REF_mat_inverse_INPUT_INTERFACE(input_ptr)  \
 | 
			
		||||
    PAREN(input_ptr, (void *) &matrix_output_ref)
 | 
			
		||||
 | 
			
		||||
#define ARM_mat_mult_INPUT_INTERFACE(input_a_ptr, input_b_ptr)      \
 | 
			
		||||
    PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_fut)
 | 
			
		||||
 | 
			
		||||
#define REF_mat_mult_INPUT_INTERFACE(input_a_ptr, input_b_ptr)      \
 | 
			
		||||
    PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_ref)
 | 
			
		||||
 | 
			
		||||
#define ARM_mat_mult_fast_INPUT_INTERFACE(input_a_ptr, input_b_ptr) \
 | 
			
		||||
    PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_fut)
 | 
			
		||||
 | 
			
		||||
#define REF_mat_mult_fast_INPUT_INTERFACE(input_a_ptr, input_b_ptr) \
 | 
			
		||||
    PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_ref)
 | 
			
		||||
 | 
			
		||||
#define ARM_mat_sub_INPUT_INTERFACE(input_a_ptr, input_b_ptr)    \
 | 
			
		||||
    PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_fut)
 | 
			
		||||
 | 
			
		||||
#define REF_mat_sub_INPUT_INTERFACE(input_a_ptr, input_b_ptr)    \
 | 
			
		||||
    PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_ref)
 | 
			
		||||
 | 
			
		||||
#define ARM_mat_trans_INPUT_INTERFACE(input_ptr)    \
 | 
			
		||||
    PAREN(input_ptr, (void *) &matrix_output_fut)
 | 
			
		||||
 | 
			
		||||
#define REF_mat_trans_INPUT_INTERFACE(input_ptr)    \
 | 
			
		||||
    PAREN(input_ptr, (void *) &matrix_output_ref)
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Dimension Validation Interfaces */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#define MATRIX_TEST_VALID_ADDITIVE_DIMENSIONS(input_type,   \
 | 
			
		||||
                                              matrix_a_ptr, \
 | 
			
		||||
                                              matrix_b_ptr) \
 | 
			
		||||
    ((((input_type) (matrix_a_ptr))->numRows ==             \
 | 
			
		||||
      ((input_type) (matrix_b_ptr))->numRows) &&            \
 | 
			
		||||
     (((input_type) (matrix_a_ptr))->numCols ==             \
 | 
			
		||||
      ((input_type) (matrix_b_ptr))->numCols))
 | 
			
		||||
 | 
			
		||||
#define MATRIX_TEST_VALID_MULTIPLICATIVE_DIMENSIONS(input_type,     \
 | 
			
		||||
                                                    matrix_a_ptr,   \
 | 
			
		||||
                                                    matrix_b_ptr)   \
 | 
			
		||||
    (((input_type) (matrix_a_ptr))->numCols ==                      \
 | 
			
		||||
     ((input_type) (matrix_b_ptr))->numRows)
 | 
			
		||||
 | 
			
		||||
#define MATRIX_TEST_VALID_SQUARE_DIMENSIONS(input_type, \
 | 
			
		||||
                                            matrix_ptr) \
 | 
			
		||||
    (((input_type)(matrix_ptr))->numRows ==             \
 | 
			
		||||
     ((input_type)(matrix_ptr))->numCols)
 | 
			
		||||
 | 
			
		||||
#define MATRIX_TEST_VALID_DIMENSIONS_ALWAYS(input_type, \
 | 
			
		||||
                                            matrix_ptr) \
 | 
			
		||||
    (1 == 1)                                            \
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Output Configuration Interfaces */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* The matrix tests assume the output matrix is always the correct size.  These
 | 
			
		||||
 * interfaces size the properly size the output matrices according to the input
 | 
			
		||||
 * matrices and the operation at hand.*/
 | 
			
		||||
 | 
			
		||||
#define MATRIX_TEST_CONFIG_ADDITIVE_OUTPUT(input_type,      \
 | 
			
		||||
                                           matrix_a_ptr,    \
 | 
			
		||||
                                           matrix_b_ptr)    \
 | 
			
		||||
    do                                                      \
 | 
			
		||||
    {                                                       \
 | 
			
		||||
        ((input_type) &matrix_output_fut)->numRows =        \
 | 
			
		||||
            ((input_type)(matrix_a_ptr))->numRows;          \
 | 
			
		||||
        ((input_type) &matrix_output_fut)->numCols =        \
 | 
			
		||||
            ((input_type)(matrix_a_ptr))->numCols;          \
 | 
			
		||||
        ((input_type) &matrix_output_ref)->numRows =        \
 | 
			
		||||
            ((input_type)(matrix_a_ptr))->numRows;          \
 | 
			
		||||
        ((input_type) &matrix_output_ref)->numCols =        \
 | 
			
		||||
            ((input_type)(matrix_a_ptr))->numCols;          \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
#define MATRIX_TEST_CONFIG_MULTIPLICATIVE_OUTPUT(input_type,    \
 | 
			
		||||
                                                 matrix_a_ptr,  \
 | 
			
		||||
                                                 matrix_b_ptr)  \
 | 
			
		||||
    do                                                          \
 | 
			
		||||
    {                                                           \
 | 
			
		||||
        ((input_type) &matrix_output_fut)->numRows =            \
 | 
			
		||||
            ((input_type)(matrix_a_ptr))->numRows;              \
 | 
			
		||||
        ((input_type) &matrix_output_fut)->numCols =            \
 | 
			
		||||
            ((input_type)(matrix_b_ptr))->numCols;              \
 | 
			
		||||
        ((input_type) &matrix_output_ref)->numRows =            \
 | 
			
		||||
            ((input_type)(matrix_a_ptr))->numRows;              \
 | 
			
		||||
        ((input_type) &matrix_output_ref)->numCols =            \
 | 
			
		||||
            ((input_type)(matrix_b_ptr))->numCols;              \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
#define MATRIX_TEST_CONFIG_SAMESIZE_OUTPUT(input_type,  \
 | 
			
		||||
                                           matrix_ptr)  \
 | 
			
		||||
    do                                                  \
 | 
			
		||||
    {                                                   \
 | 
			
		||||
        ((input_type) &matrix_output_fut)->numRows =    \
 | 
			
		||||
            ((input_type)(matrix_ptr))->numRows;        \
 | 
			
		||||
        ((input_type) &matrix_output_fut)->numCols =    \
 | 
			
		||||
            ((input_type)(matrix_ptr))->numCols;        \
 | 
			
		||||
        ((input_type) &matrix_output_ref)->numRows =    \
 | 
			
		||||
            ((input_type)(matrix_ptr))->numRows;        \
 | 
			
		||||
        ((input_type) &matrix_output_ref)->numCols =    \
 | 
			
		||||
            ((input_type)(matrix_ptr))->numCols;        \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
#define MATRIX_TEST_CONFIG_TRANSPOSE_OUTPUT(input_type,     \
 | 
			
		||||
                                            matrix_ptr)     \
 | 
			
		||||
        do                                                  \
 | 
			
		||||
        {                                                   \
 | 
			
		||||
            ((input_type) &matrix_output_fut)->numRows =    \
 | 
			
		||||
                ((input_type)(matrix_ptr))->numCols;        \
 | 
			
		||||
            ((input_type) &matrix_output_fut)->numCols =    \
 | 
			
		||||
                ((input_type)(matrix_ptr))->numRows;        \
 | 
			
		||||
            ((input_type) &matrix_output_ref)->numRows =    \
 | 
			
		||||
                ((input_type)(matrix_ptr))->numCols;        \
 | 
			
		||||
            ((input_type) &matrix_output_ref)->numCols =    \
 | 
			
		||||
                ((input_type)(matrix_ptr))->numRows;        \
 | 
			
		||||
        } while (0)
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* TEST Templates */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#define MATRIX_TEST_TEMPLATE_ELT1(arr_desc_inputs,                      \
 | 
			
		||||
                                  input_type,                           \
 | 
			
		||||
                                  output_type, output_content_type,     \
 | 
			
		||||
                                  fut, fut_arg_interface,               \
 | 
			
		||||
                                  ref, ref_arg_interface,               \
 | 
			
		||||
                                  output_config_interface,              \
 | 
			
		||||
                                  dim_validation_interface,             \
 | 
			
		||||
                                  compare_interface)                    \
 | 
			
		||||
    do                                                                  \
 | 
			
		||||
    {                                                                   \
 | 
			
		||||
        TEMPLATE_DO_ARR_DESC(                                           \
 | 
			
		||||
            input_idx, input_type, input, arr_desc_inputs               \
 | 
			
		||||
            ,                                                           \
 | 
			
		||||
            JTEST_DUMP_STRF("Matrix Dimensions: %dx%d\n",               \
 | 
			
		||||
                         (int)input->numRows,                           \
 | 
			
		||||
                         (int)input->numCols);                          \
 | 
			
		||||
                                                                        \
 | 
			
		||||
            if (dim_validation_interface(input_type,                     \
 | 
			
		||||
                                        input)) {                       \
 | 
			
		||||
                output_config_interface(input_type,                     \
 | 
			
		||||
                                        input);                         \
 | 
			
		||||
                TEST_CALL_FUT_AND_REF(                                  \
 | 
			
		||||
                    fut, fut_arg_interface(input),                      \
 | 
			
		||||
                    ref, ref_arg_interface(input));                     \
 | 
			
		||||
                compare_interface(output_type,                          \
 | 
			
		||||
                                  output_content_type);                 \
 | 
			
		||||
            } else {                                                    \
 | 
			
		||||
                arm_status matrix_test_retval;                          \
 | 
			
		||||
                TEST_CALL_FUT(                                          \
 | 
			
		||||
                    matrix_test_retval = fut,                           \
 | 
			
		||||
                    fut_arg_interface(input));                          \
 | 
			
		||||
                                                                        \
 | 
			
		||||
                /* If dimensions are known bad, the fut should */       \
 | 
			
		||||
                /* detect it. */                                        \
 | 
			
		||||
                if ( matrix_test_retval != ARM_MATH_SIZE_MISMATCH) {     \
 | 
			
		||||
                    return JTEST_TEST_FAILED;                           \
 | 
			
		||||
                }                                                       \
 | 
			
		||||
            });                                                         \
 | 
			
		||||
        return JTEST_TEST_PASSED;                                       \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define MATRIX_TEST_TEMPLATE_ELT2(arr_desc_inputs_a,                    \
 | 
			
		||||
                                  arr_desc_inputs_b,                    \
 | 
			
		||||
                                  input_type,                           \
 | 
			
		||||
                                  output_type, output_content_type,     \
 | 
			
		||||
                                  fut, fut_arg_interface,               \
 | 
			
		||||
                                  ref, ref_arg_interface,               \
 | 
			
		||||
                                  output_config_interface,              \
 | 
			
		||||
                                  dim_validation_interface,             \
 | 
			
		||||
                                  compare_interface)                    \
 | 
			
		||||
    do                                                                  \
 | 
			
		||||
    {                                                                   \
 | 
			
		||||
        TEMPLATE_DO_ARR_DESC(                                           \
 | 
			
		||||
            input_a_idx, input_type, input_a, arr_desc_inputs_a         \
 | 
			
		||||
            ,                                                           \
 | 
			
		||||
            input_type input_b = ARR_DESC_ELT(                          \
 | 
			
		||||
                input_type, input_a_idx,                                \
 | 
			
		||||
                &(arr_desc_inputs_b));                                  \
 | 
			
		||||
                                                                        \
 | 
			
		||||
            JTEST_DUMP_STRF("Matrix Dimensions: A %dx%d  B %dx%d\n",    \
 | 
			
		||||
                     (int)input_a->numRows,                             \
 | 
			
		||||
                     (int)input_a->numCols,                             \
 | 
			
		||||
                     (int)input_b->numRows,                             \
 | 
			
		||||
                     (int)input_b->numCols);                            \
 | 
			
		||||
                                                                        \
 | 
			
		||||
            if (dim_validation_interface(input_type,                     \
 | 
			
		||||
                                        input_a,                        \
 | 
			
		||||
                                        input_b)) {                     \
 | 
			
		||||
                                                                        \
 | 
			
		||||
                output_config_interface(input_type,                     \
 | 
			
		||||
                                        input_a,                        \
 | 
			
		||||
                                        input_b);                       \
 | 
			
		||||
                                                                        \
 | 
			
		||||
                TEST_CALL_FUT_AND_REF(                                  \
 | 
			
		||||
                    fut, fut_arg_interface(input_a, input_b),           \
 | 
			
		||||
                    ref, ref_arg_interface(input_a, input_b));          \
 | 
			
		||||
                                                                        \
 | 
			
		||||
                compare_interface(output_type, output_content_type);    \
 | 
			
		||||
                                                                        \
 | 
			
		||||
            } else {                                                    \
 | 
			
		||||
                arm_status matrix_test_retval;                          \
 | 
			
		||||
                TEST_CALL_FUT(                                          \
 | 
			
		||||
                    matrix_test_retval = fut, fut_arg_interface(input_a, input_b)); \
 | 
			
		||||
                                                                        \
 | 
			
		||||
                /* If dimensions are known bad, the fut should */       \
 | 
			
		||||
                /* detect it. */                                        \
 | 
			
		||||
                if ( matrix_test_retval != ARM_MATH_SIZE_MISMATCH) {     \
 | 
			
		||||
                    return JTEST_TEST_FAILED;                           \
 | 
			
		||||
                }                                                       \
 | 
			
		||||
            });                                                         \
 | 
			
		||||
        return JTEST_TEST_PASSED;                                       \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Specialization of #MATRIX_TEST_TEMPLATE_ELT2() for matrix tests.
 | 
			
		||||
 *
 | 
			
		||||
 *  @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and
 | 
			
		||||
 *  REF_xxx_INPUT_INTERFACEs.
 | 
			
		||||
 */
 | 
			
		||||
#define MATRIX_DEFINE_TEST_TEMPLATE_ELT2(fn_name, suffix,           \
 | 
			
		||||
                                         output_config_interface,   \
 | 
			
		||||
                                         dim_validation_interface,  \
 | 
			
		||||
                                         comparison_interface)      \
 | 
			
		||||
        JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test,          \
 | 
			
		||||
                          arm_##fn_name##_##suffix)                 \
 | 
			
		||||
        {                                                           \
 | 
			
		||||
            MATRIX_TEST_TEMPLATE_ELT2(                              \
 | 
			
		||||
                matrix_##suffix##_a_inputs,                         \
 | 
			
		||||
                matrix_##suffix##_b_inputs,                         \
 | 
			
		||||
                arm_matrix_instance_##suffix * ,                    \
 | 
			
		||||
                arm_matrix_instance_##suffix,                       \
 | 
			
		||||
                TYPE_FROM_ABBREV(suffix),                           \
 | 
			
		||||
                arm_##fn_name##_##suffix,                           \
 | 
			
		||||
                ARM_##fn_name##_INPUT_INTERFACE,                    \
 | 
			
		||||
                ref_##fn_name##_##suffix,                           \
 | 
			
		||||
                REF_##fn_name##_INPUT_INTERFACE,                    \
 | 
			
		||||
                output_config_interface,                            \
 | 
			
		||||
                dim_validation_interface,                           \
 | 
			
		||||
                comparison_interface);                              \
 | 
			
		||||
        }                                                           \
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Specialization of #MATRIX_TEST_TEMPLATE_ELT1() for matrix tests.
 | 
			
		||||
 *
 | 
			
		||||
 *  @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and
 | 
			
		||||
 *  REF_xxx_INPUT_INTERFACEs.
 | 
			
		||||
 */
 | 
			
		||||
#define MATRIX_DEFINE_TEST_TEMPLATE_ELT1(fn_name, suffix,           \
 | 
			
		||||
                                         output_config_interface,   \
 | 
			
		||||
                                         dim_validation_interface)  \
 | 
			
		||||
        JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test,          \
 | 
			
		||||
                          arm_##fn_name##_##suffix)                 \
 | 
			
		||||
        {                                                           \
 | 
			
		||||
            MATRIX_TEST_TEMPLATE_ELT1(                              \
 | 
			
		||||
                matrix_##suffix##_a_inputs,                         \
 | 
			
		||||
                arm_matrix_instance_##suffix * ,                    \
 | 
			
		||||
                arm_matrix_instance_##suffix,                       \
 | 
			
		||||
                TYPE_FROM_ABBREV(suffix),                           \
 | 
			
		||||
                arm_##fn_name##_##suffix,                           \
 | 
			
		||||
                ARM_##fn_name##_INPUT_INTERFACE,                    \
 | 
			
		||||
                ref_##fn_name##_##suffix,                           \
 | 
			
		||||
                REF_##fn_name##_INPUT_INTERFACE,                    \
 | 
			
		||||
                output_config_interface,                            \
 | 
			
		||||
                dim_validation_interface,                           \
 | 
			
		||||
                MATRIX_COMPARE_INTERFACE);                          \
 | 
			
		||||
        }                                                           \
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /* _MATRIX_TEMPLATES_H_ */
 | 
			
		||||
@ -0,0 +1,54 @@
 | 
			
		||||
#ifndef _MATRIX_TEST_DATA_H_
 | 
			
		||||
#define _MATRIX_TEST_DATA_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "arr_desc.h"
 | 
			
		||||
#include "arm_math.h"           /* float32_t */
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros and Defines */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
#define MATRIX_TEST_MAX_ROWS 4
 | 
			
		||||
#define MATRIX_TEST_MAX_COLS 4
 | 
			
		||||
#define MATRIX_TEST_BIGGEST_INPUT_TYPE float64_t
 | 
			
		||||
#define MATRIX_TEST_MAX_ELTS (MATRIX_TEST_MAX_ROWS * MATRIX_TEST_MAX_COLS)
 | 
			
		||||
#define MATRIX_MAX_COEFFS_LEN 16
 | 
			
		||||
#define MATRIX_MAX_SHIFTS_LEN 5
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Declare the matrix inputs defined by MATRIX_DEFINE_INPUTS.
 | 
			
		||||
 */
 | 
			
		||||
#define MATRIX_DECLARE_INPUTS(suffix)               \
 | 
			
		||||
    ARR_DESC_DECLARE(matrix_##suffix##_a_inputs);   \
 | 
			
		||||
    ARR_DESC_DECLARE(matrix_##suffix##_b_inputs);   \
 | 
			
		||||
    ARR_DESC_DECLARE(matrix_##suffix##_invertible_inputs)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Declare Variables */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* Input/Output Buffers */
 | 
			
		||||
extern arm_matrix_instance_f32 matrix_output_fut;
 | 
			
		||||
extern arm_matrix_instance_f32 matrix_output_ref;
 | 
			
		||||
extern arm_matrix_instance_f64 matrix_output_fut64;
 | 
			
		||||
extern arm_matrix_instance_f64 matrix_output_ref64;
 | 
			
		||||
extern MATRIX_TEST_BIGGEST_INPUT_TYPE matrix_output_f32_fut[MATRIX_TEST_MAX_ELTS];
 | 
			
		||||
extern MATRIX_TEST_BIGGEST_INPUT_TYPE matrix_output_f32_ref[MATRIX_TEST_MAX_ELTS];
 | 
			
		||||
extern MATRIX_TEST_BIGGEST_INPUT_TYPE matrix_output_scratch[MATRIX_TEST_MAX_ELTS];
 | 
			
		||||
 | 
			
		||||
/* Matrix Inputs */
 | 
			
		||||
MATRIX_DECLARE_INPUTS(f64);
 | 
			
		||||
MATRIX_DECLARE_INPUTS(f32);
 | 
			
		||||
MATRIX_DECLARE_INPUTS(q31);
 | 
			
		||||
MATRIX_DECLARE_INPUTS(q15);
 | 
			
		||||
 | 
			
		||||
extern const float32_t matrix_f32_scale_values[MATRIX_MAX_COEFFS_LEN];
 | 
			
		||||
extern const q31_t matrix_q31_scale_values[MATRIX_MAX_COEFFS_LEN];
 | 
			
		||||
extern const q15_t matrix_q15_scale_values[MATRIX_MAX_COEFFS_LEN];
 | 
			
		||||
extern const int32_t matrix_shift_values[MATRIX_MAX_SHIFTS_LEN];
 | 
			
		||||
 | 
			
		||||
#endif /* _MATRIX_TEST_DATA_H_ */
 | 
			
		||||
@ -0,0 +1,9 @@
 | 
			
		||||
#ifndef _MATRIX_TEST_GROUP_H_
 | 
			
		||||
#define _MATRIX_TEST_GROUP_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Declare Test Groups */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
JTEST_DECLARE_GROUP(matrix_tests);
 | 
			
		||||
 | 
			
		||||
#endif /* _MATRIX_TEST_GROUP_H_ */
 | 
			
		||||
@ -0,0 +1,17 @@
 | 
			
		||||
#ifndef _MATRIX_TESTS_H_
 | 
			
		||||
#define _MATRIX_TESTS_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Test/Group Declarations */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
JTEST_DECLARE_GROUP(mat_add_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(mat_cmplx_mult_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(mat_init_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(mat_inverse_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(mat_mult_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(mat_mult_fast_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(mat_sub_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(mat_trans_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(mat_scale_tests);
 | 
			
		||||
 | 
			
		||||
#endif /* _MATRIX_TESTS_H_ */
 | 
			
		||||
@ -0,0 +1,157 @@
 | 
			
		||||
#ifndef _STATISTICS_TEMPLATES_H_
 | 
			
		||||
#define _STATISTICS_TEMPLATES_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "test_templates.h"
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Group Specific Templates */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Compare the outputs from the function under test and the reference function.
 | 
			
		||||
 */
 | 
			
		||||
#define STATISTICS_COMPARE_INTERFACE(block_size,    \
 | 
			
		||||
                                     output_type)   \
 | 
			
		||||
    do                                              \
 | 
			
		||||
    {                                               \
 | 
			
		||||
        TEST_ASSERT_BUFFERS_EQUAL(                  \
 | 
			
		||||
            statistics_output_ref.data_ptr,         \
 | 
			
		||||
            statistics_output_fut.data_ptr,         \
 | 
			
		||||
            1 * sizeof(output_type) /* All fns return one value*/   \
 | 
			
		||||
            );                                      \
 | 
			
		||||
        TEST_ASSERT_EQUAL(                          \
 | 
			
		||||
            statistics_idx_fut,                     \
 | 
			
		||||
            statistics_idx_ref);                    \
 | 
			
		||||
    } while (0)                                      \
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Comparison SNR thresholds for the data types used in statistics_tests.
 | 
			
		||||
 */
 | 
			
		||||
#define STATISTICS_SNR_THRESHOLD_float32_t 120
 | 
			
		||||
#define STATISTICS_SNR_THRESHOLD_q31_t 100
 | 
			
		||||
#define STATISTICS_SNR_THRESHOLD_q15_t 60
 | 
			
		||||
#define STATISTICS_SNR_THRESHOLD_q7_t 30
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Compare reference and fut outputs using SNR.
 | 
			
		||||
 *
 | 
			
		||||
 *  @note The outputs are converted to float32_t before comparison.
 | 
			
		||||
 */
 | 
			
		||||
#define STATISTICS_SNR_COMPARE_INTERFACE(block_size,    \
 | 
			
		||||
                                         output_type)   \
 | 
			
		||||
    do                                                  \
 | 
			
		||||
    {                                                   \
 | 
			
		||||
        TEST_CONVERT_AND_ASSERT_SNR(                    \
 | 
			
		||||
            statistics_output_f32_ref,                  \
 | 
			
		||||
            statistics_output_ref.data_ptr,             \
 | 
			
		||||
            statistics_output_f32_fut,                  \
 | 
			
		||||
            statistics_output_fut.data_ptr,             \
 | 
			
		||||
                1, /* All fns return one element*/      \
 | 
			
		||||
            output_type,                                \
 | 
			
		||||
            STATISTICS_SNR_THRESHOLD_##output_type      \
 | 
			
		||||
            );                                          \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Input Interfaces */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/*
 | 
			
		||||
 *  General:
 | 
			
		||||
 *  Input interfaces provide inputs to functions inside test templates.  They
 | 
			
		||||
 *  ONLY provide the inputs.  The output variables should be hard coded.
 | 
			
		||||
 *
 | 
			
		||||
 *  The input interfaces must have the following format:
 | 
			
		||||
 *
 | 
			
		||||
 *  ARM_xxx_INPUT_INTERFACE() or
 | 
			
		||||
 *  REF_xxx_INPUT_INTERFACE()
 | 
			
		||||
 *
 | 
			
		||||
 *  The xxx must be lowercase, and is intended to be the indentifying substring
 | 
			
		||||
 *  in the function's name.  Acceptable values are 'sub' or 'add' from the
 | 
			
		||||
 *  functions arm_add_q31.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define ARM_max_INPUT_INTERFACE(input, block_size)              \
 | 
			
		||||
    PAREN(input, block_size,                                    \
 | 
			
		||||
          statistics_output_fut.data_ptr, &statistics_idx_fut)
 | 
			
		||||
 | 
			
		||||
#define REF_max_INPUT_INTERFACE(input, block_size)              \
 | 
			
		||||
    PAREN(input, block_size,                                    \
 | 
			
		||||
          statistics_output_ref.data_ptr, &statistics_idx_ref)
 | 
			
		||||
 | 
			
		||||
#define ARM_mean_INPUT_INTERFACE(input, block_size)             \
 | 
			
		||||
    PAREN(input, block_size, statistics_output_fut.data_ptr)
 | 
			
		||||
 | 
			
		||||
#define REF_mean_INPUT_INTERFACE(input, block_size)             \
 | 
			
		||||
    PAREN(input, block_size, statistics_output_ref.data_ptr)
 | 
			
		||||
 | 
			
		||||
#define ARM_min_INPUT_INTERFACE(input, block_size)              \
 | 
			
		||||
    PAREN(input, block_size,                                    \
 | 
			
		||||
          statistics_output_fut.data_ptr, &statistics_idx_fut)
 | 
			
		||||
 | 
			
		||||
#define REF_min_INPUT_INTERFACE(input, block_size)              \
 | 
			
		||||
    PAREN(input, block_size,                                    \
 | 
			
		||||
          statistics_output_ref.data_ptr, &statistics_idx_ref)
 | 
			
		||||
 | 
			
		||||
#define ARM_power_INPUT_INTERFACE(input, block_size)            \
 | 
			
		||||
    PAREN(input, block_size, statistics_output_fut.data_ptr)
 | 
			
		||||
 | 
			
		||||
#define REF_power_INPUT_INTERFACE(input, block_size)            \
 | 
			
		||||
    PAREN(input, block_size, statistics_output_ref.data_ptr)
 | 
			
		||||
 | 
			
		||||
#define ARM_rms_INPUT_INTERFACE(input, block_size)              \
 | 
			
		||||
    PAREN(input, block_size, statistics_output_fut.data_ptr)
 | 
			
		||||
 | 
			
		||||
#define REF_rms_INPUT_INTERFACE(input, block_size)              \
 | 
			
		||||
    PAREN(input, block_size, statistics_output_ref.data_ptr)
 | 
			
		||||
 | 
			
		||||
#define ARM_std_INPUT_INTERFACE(input, block_size)              \
 | 
			
		||||
    PAREN(input, block_size, statistics_output_fut.data_ptr)
 | 
			
		||||
 | 
			
		||||
#define REF_std_INPUT_INTERFACE(input, block_size)              \
 | 
			
		||||
    PAREN(input, block_size, statistics_output_ref.data_ptr)
 | 
			
		||||
 | 
			
		||||
#define ARM_var_INPUT_INTERFACE(input, block_size)              \
 | 
			
		||||
    PAREN(input, block_size, statistics_output_fut.data_ptr)
 | 
			
		||||
 | 
			
		||||
#define REF_var_INPUT_INTERFACE(input, block_size)              \
 | 
			
		||||
    PAREN(input, block_size, statistics_output_ref.data_ptr)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Test Templates */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Specialization of #TEST_TEMPLATE_BUF1_BLK() for statistics tests.
 | 
			
		||||
 *
 | 
			
		||||
 *  @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and
 | 
			
		||||
 *  REF_xxx_INPUT_INTERFACEs.
 | 
			
		||||
 */
 | 
			
		||||
#define STATISTICS_DEFINE_TEST_TEMPLATE_BUF1_BLK(fn_name,       \
 | 
			
		||||
                                                 suffix,        \
 | 
			
		||||
                                                 input_type,    \
 | 
			
		||||
                                                 output_type,   \
 | 
			
		||||
                                                 comparison_interface)  \
 | 
			
		||||
    JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test,          \
 | 
			
		||||
                      arm_##fn_name##_##suffix)                 \
 | 
			
		||||
    {                                                           \
 | 
			
		||||
        TEST_TEMPLATE_BUF1_BLK(                                 \
 | 
			
		||||
            statistics_f_all,                                   \
 | 
			
		||||
            statistics_block_sizes,                             \
 | 
			
		||||
            input_type,                                         \
 | 
			
		||||
            output_type,                                        \
 | 
			
		||||
            arm_##fn_name##_##suffix,                           \
 | 
			
		||||
            ARM_##fn_name##_INPUT_INTERFACE,                    \
 | 
			
		||||
            ref_##fn_name##_##suffix,                           \
 | 
			
		||||
            REF_##fn_name##_INPUT_INTERFACE,                    \
 | 
			
		||||
            comparison_interface);                              \
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /* _STATISTICS_TEMPLATES_H_ */
 | 
			
		||||
@ -0,0 +1,44 @@
 | 
			
		||||
#ifndef _STATISTICS_TEST_DATA_H_
 | 
			
		||||
#define _STATISTICS_TEST_DATA_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "arr_desc.h"
 | 
			
		||||
#include "arm_math.h"
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros and Defines */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
#define STATISTICS_MAX_INPUT_ELEMENTS 32
 | 
			
		||||
#define STATISTICS_BIGGEST_INPUT_TYPE float32_t
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Declare Variables */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* Input/Output Buffers */
 | 
			
		||||
ARR_DESC_DECLARE(statistics_output_fut);
 | 
			
		||||
ARR_DESC_DECLARE(statistics_output_ref);
 | 
			
		||||
extern uint32_t statistics_idx_fut;
 | 
			
		||||
extern uint32_t statistics_idx_ref;
 | 
			
		||||
 | 
			
		||||
extern STATISTICS_BIGGEST_INPUT_TYPE
 | 
			
		||||
statistics_output_f32_ref[STATISTICS_MAX_INPUT_ELEMENTS];
 | 
			
		||||
 | 
			
		||||
extern STATISTICS_BIGGEST_INPUT_TYPE
 | 
			
		||||
statistics_output_f32_fut[STATISTICS_MAX_INPUT_ELEMENTS];
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Block Sizes */
 | 
			
		||||
ARR_DESC_DECLARE(statistics_block_sizes);
 | 
			
		||||
 | 
			
		||||
/* Float Inputs */
 | 
			
		||||
ARR_DESC_DECLARE(statistics_zeros);
 | 
			
		||||
ARR_DESC_DECLARE(statistics_f_2);
 | 
			
		||||
ARR_DESC_DECLARE(statistics_f_15);
 | 
			
		||||
ARR_DESC_DECLARE(statistics_f_32);
 | 
			
		||||
ARR_DESC_DECLARE(statistics_f_all);
 | 
			
		||||
 | 
			
		||||
#endif /* _STATISTICS_TEST_DATA_H_ */
 | 
			
		||||
@ -0,0 +1,9 @@
 | 
			
		||||
#ifndef _STATISTICS_TEST_GROUP_H_
 | 
			
		||||
#define _STATISTICS_TEST_GROUP_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Declare Test Groups */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
JTEST_DECLARE_GROUP(statistics_tests);
 | 
			
		||||
 | 
			
		||||
#endif /* _STATISTICS_TEST_GROUP_H_ */
 | 
			
		||||
@ -0,0 +1,15 @@
 | 
			
		||||
#ifndef _STATISTICS_TESTS_H_
 | 
			
		||||
#define _STATISTICS_TESTS_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Test/Group Declarations */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
JTEST_DECLARE_GROUP(max_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(mean_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(min_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(power_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(rms_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(std_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(var_tests);
 | 
			
		||||
 | 
			
		||||
#endif /* _STATISTICS_TESTS_H_ */
 | 
			
		||||
@ -0,0 +1,120 @@
 | 
			
		||||
#ifndef _SUPPORT_TEMPLATES_H_
 | 
			
		||||
#define _SUPPORT_TEMPLATES_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "test_templates.h"
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Group Specific Templates */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Compare the outputs from the function under test and the reference function.
 | 
			
		||||
 */
 | 
			
		||||
#define SUPPORT_COMPARE_INTERFACE(block_size,   \
 | 
			
		||||
                                  output_type)  \
 | 
			
		||||
    do                                          \
 | 
			
		||||
    {                                           \
 | 
			
		||||
        TEST_ASSERT_BUFFERS_EQUAL(              \
 | 
			
		||||
            support_output_ref.data_ptr,        \
 | 
			
		||||
            support_output_fut.data_ptr,        \
 | 
			
		||||
            block_size * sizeof(output_type));  \
 | 
			
		||||
    } while (0)                                  \
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Input Interfaces */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/*
 | 
			
		||||
 *  General:
 | 
			
		||||
 *  Input interfaces provide inputs to functions inside test templates.  They
 | 
			
		||||
 *  ONLY provide the inputs.  The output variables should be hard coded.
 | 
			
		||||
 *
 | 
			
		||||
 *  The input interfaces must have the following format:
 | 
			
		||||
 *
 | 
			
		||||
 *  ARM_xxx_INPUT_INTERFACE() or
 | 
			
		||||
 *  REF_xxx_INPUT_INTERFACE()
 | 
			
		||||
 *
 | 
			
		||||
 *  The xxx must be lowercase, and is intended to be the indentifying substring
 | 
			
		||||
 *  in the function's name.  Acceptable values are 'sub' or 'add' from the
 | 
			
		||||
 *  functions arm_add_q31.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define ARM_copy_INPUT_INTERFACE(input, block_size)         \
 | 
			
		||||
    PAREN(input, support_output_fut.data_ptr, block_size)
 | 
			
		||||
 | 
			
		||||
#define REF_copy_INPUT_INTERFACE(input, block_size)         \
 | 
			
		||||
    PAREN(input, support_output_ref.data_ptr, block_size)
 | 
			
		||||
 | 
			
		||||
#define ARM_fill_INPUT_INTERFACE(elt, block_size)       \
 | 
			
		||||
    PAREN(elt, support_output_fut.data_ptr, block_size)
 | 
			
		||||
 | 
			
		||||
#define REF_fill_INPUT_INTERFACE(elt, block_size)       \
 | 
			
		||||
    PAREN(elt, support_output_ref.data_ptr, block_size)
 | 
			
		||||
 | 
			
		||||
#define ARM_x_to_y_INPUT_INTERFACE(input, block_size)       \
 | 
			
		||||
    PAREN(input, support_output_fut.data_ptr, block_size)
 | 
			
		||||
 | 
			
		||||
#define REF_x_to_y_INPUT_INTERFACE(input, block_size)       \
 | 
			
		||||
    PAREN(input, support_output_ref.data_ptr, block_size)
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Test Templates */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Specialization of #TEST_TEMPLATE_BUF1_BLK() for support tests.
 | 
			
		||||
 *
 | 
			
		||||
 *  @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and
 | 
			
		||||
 *  REF_xxx_INPUT_INTERFACEs.
 | 
			
		||||
 */
 | 
			
		||||
#define SUPPORT_DEFINE_TEST_TEMPLATE_BUF1_BLK(fn_name,              \
 | 
			
		||||
                                              suffix,               \
 | 
			
		||||
                                              input_type,           \
 | 
			
		||||
                                              output_type,          \
 | 
			
		||||
                                              comparison_interface) \
 | 
			
		||||
    JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test,              \
 | 
			
		||||
                      arm_##fn_name##_##suffix)                     \
 | 
			
		||||
    {                                                               \
 | 
			
		||||
        TEST_TEMPLATE_BUF1_BLK(                                     \
 | 
			
		||||
            support_f_all,                                          \
 | 
			
		||||
            support_block_sizes,                                    \
 | 
			
		||||
            input_type,                                             \
 | 
			
		||||
            output_type,                                            \
 | 
			
		||||
            arm_##fn_name##_##suffix,                               \
 | 
			
		||||
            ARM_##fn_name##_INPUT_INTERFACE,                        \
 | 
			
		||||
            ref_##fn_name##_##suffix,                               \
 | 
			
		||||
            REF_##fn_name##_INPUT_INTERFACE,                        \
 | 
			
		||||
            comparison_interface);                                  \
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Specialization of #TEST_TEMPLATE_ELT1_BLK() for support tests.
 | 
			
		||||
 *
 | 
			
		||||
 *  @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and
 | 
			
		||||
 *  REF_xxx_INPUT_INTERFACEs.
 | 
			
		||||
 */
 | 
			
		||||
#define SUPPORT_DEFINE_TEST_TEMPLATE_ELT1_BLK(fn_name,              \
 | 
			
		||||
                                              suffix,               \
 | 
			
		||||
                                              elt_type,             \
 | 
			
		||||
                                              output_type,          \
 | 
			
		||||
                                              comparison_interface) \
 | 
			
		||||
    JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test,              \
 | 
			
		||||
                      arm_##fn_name##_##suffix)                     \
 | 
			
		||||
    {                                                               \
 | 
			
		||||
        TEST_TEMPLATE_ELT1_BLK(                                     \
 | 
			
		||||
            support_elts,                                           \
 | 
			
		||||
            support_block_sizes,                                    \
 | 
			
		||||
            elt_type,                                               \
 | 
			
		||||
            output_type,                                            \
 | 
			
		||||
            arm_##fn_name##_##suffix,                               \
 | 
			
		||||
            ARM_##fn_name##_INPUT_INTERFACE,                        \
 | 
			
		||||
            ref_##fn_name##_##suffix,                               \
 | 
			
		||||
            REF_##fn_name##_INPUT_INTERFACE,                        \
 | 
			
		||||
            comparison_interface);                                  \
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif /* _SUPPORT_TEMPLATES_H_ */
 | 
			
		||||
@ -0,0 +1,31 @@
 | 
			
		||||
#ifndef ARM_SUPPORT_TEST_DATA_H
 | 
			
		||||
#define ARM_SUPPORT_TEST_DATA_H
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "arr_desc.h"
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Declare Variables */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* Input/Output Buffers */
 | 
			
		||||
ARR_DESC_DECLARE(support_output_fut);
 | 
			
		||||
ARR_DESC_DECLARE(support_output_ref);
 | 
			
		||||
 | 
			
		||||
/* Block Sizes*/
 | 
			
		||||
ARR_DESC_DECLARE(support_block_sizes);
 | 
			
		||||
 | 
			
		||||
/* Numbers */
 | 
			
		||||
ARR_DESC_DECLARE(support_elts);
 | 
			
		||||
 | 
			
		||||
/* Float Inputs */
 | 
			
		||||
ARR_DESC_DECLARE(support_zeros);
 | 
			
		||||
ARR_DESC_DECLARE(support_f_2);
 | 
			
		||||
ARR_DESC_DECLARE(support_f_15);
 | 
			
		||||
ARR_DESC_DECLARE(support_f_32);
 | 
			
		||||
ARR_DESC_DECLARE(support_f_all);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@ -0,0 +1,9 @@
 | 
			
		||||
#ifndef _SUPPORT_TEST_GROUP_H_
 | 
			
		||||
#define _SUPPORT_TEST_GROUP_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Declare Test Groups */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
JTEST_DECLARE_GROUP(support_tests);
 | 
			
		||||
 | 
			
		||||
#endif /* _SUPPORT_TEST_GROUP_H_ */
 | 
			
		||||
@ -0,0 +1,11 @@
 | 
			
		||||
#ifndef _SUPPORT_TESTS_H_
 | 
			
		||||
#define _SUPPORT_TESTS_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Test/Group Declarations */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
JTEST_DECLARE_GROUP(copy_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(fill_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(x_to_y_tests);
 | 
			
		||||
 | 
			
		||||
#endif /* _SUPPORT_TESTS_H_ */
 | 
			
		||||
@ -0,0 +1,88 @@
 | 
			
		||||
#ifndef _TEMPLATE_H_
 | 
			
		||||
#define _TEMPLATE_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Looping and Iteration */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Template for the general structure of a loop.
 | 
			
		||||
 */
 | 
			
		||||
#define TEMPLATE_LOOP(setup, loop_def, body)    \
 | 
			
		||||
    do                                          \
 | 
			
		||||
    {                                           \
 | 
			
		||||
        setup;                                  \
 | 
			
		||||
        loop_def {                              \
 | 
			
		||||
            body;                               \
 | 
			
		||||
        }                                       \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Template for looping over an array-like sequence.
 | 
			
		||||
 */
 | 
			
		||||
#define TEMPLATE_DO_ARR_LIKE(iter_idx, type,                            \
 | 
			
		||||
                             arr, arr_length,                           \
 | 
			
		||||
                             iter_elem_setup,                           \
 | 
			
		||||
                             body)                                      \
 | 
			
		||||
    do                                                                  \
 | 
			
		||||
    {                                                                   \
 | 
			
		||||
        TEMPLATE_LOOP(                                                  \
 | 
			
		||||
            int iter_idx,                                               \
 | 
			
		||||
            for(iter_idx = 0; iter_idx < (arr_length); ++iter_idx),     \
 | 
			
		||||
            iter_elem_setup;                                            \
 | 
			
		||||
            body);                                                      \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Template for looping over the contents of an array.
 | 
			
		||||
 */
 | 
			
		||||
#define TEMPLATE_DO_ARR(iter_idx, type, iter_elem, arr, arr_length, body) \
 | 
			
		||||
    do                                                                  \
 | 
			
		||||
    {                                                                   \
 | 
			
		||||
        TEMPLATE_DO_ARR_LIKE(                                           \
 | 
			
		||||
            iter_idx, type, arr, arr_length,                            \
 | 
			
		||||
            type iter_elem = (arr)[iter_idx],                           \
 | 
			
		||||
            body);                                                      \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Template for looping over the contents of an #ARR_DESC.
 | 
			
		||||
 */
 | 
			
		||||
#define TEMPLATE_DO_ARR_DESC(iter_idx, type, iter_elem, arr_desc, body) \
 | 
			
		||||
    do                                                                  \
 | 
			
		||||
    {                                                                   \
 | 
			
		||||
        TEMPLATE_DO_ARR_LIKE(                                           \
 | 
			
		||||
            iter_idx, type, arr_desc, (arr_desc).element_count,         \
 | 
			
		||||
            type iter_elem = ARR_DESC_ELT(type, iter_idx, &(arr_desc)), \
 | 
			
		||||
            body);                                                      \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Test Definition */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Template for the general structure of a test.
 | 
			
		||||
 */
 | 
			
		||||
#define TEMPLATE_TEST(setup, body, teardown)    \
 | 
			
		||||
        do                                      \
 | 
			
		||||
        {                                       \
 | 
			
		||||
            setup;                              \
 | 
			
		||||
            body;                               \
 | 
			
		||||
            teardown;                           \
 | 
			
		||||
        } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Template for calling a function.
 | 
			
		||||
 *
 | 
			
		||||
 *  @note Surround function arguments with the #PAREN() macro.
 | 
			
		||||
 *
 | 
			
		||||
 *  @example
 | 
			
		||||
 *  void my_func(int arg1, int arg2);
 | 
			
		||||
 *
 | 
			
		||||
 *  TEMPLATE_CALL_FN(my_func, PAREN(3, 7));
 | 
			
		||||
 */
 | 
			
		||||
#define TEMPLATE_CALL_FN(fn, fn_args)           \
 | 
			
		||||
        fn fn_args
 | 
			
		||||
 | 
			
		||||
#endif /* _TEMPLATE_H_ */
 | 
			
		||||
@ -0,0 +1,458 @@
 | 
			
		||||
#ifndef _TEST_TEMPLATES_H_
 | 
			
		||||
#define _TEST_TEMPLATES_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
#include "template.h"
 | 
			
		||||
#include <string.h>             /* memcmp() */
 | 
			
		||||
#include <inttypes.h>           /* PRIu32 */
 | 
			
		||||
#include "math_helper.h"        /* arm_snr_f32() */
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Function Aliases for use in Templates. */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
#define ref_q31_t_to_float ref_q31_to_float
 | 
			
		||||
#define ref_q15_t_to_float ref_q15_to_float
 | 
			
		||||
#define ref_q7_t_to_float  ref_q7_to_float
 | 
			
		||||
#define ref_float_to_q31_t ref_float_to_q31
 | 
			
		||||
#define ref_float_to_q15_t ref_float_to_q15
 | 
			
		||||
#define ref_float_to_q7_t  ref_float_to_q7
 | 
			
		||||
#define ref_float32_t_to_float ref_copy_f32
 | 
			
		||||
#define ref_float_to_float32_t ref_copy_f32
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros and Defines */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Call the function-under-test.
 | 
			
		||||
 */
 | 
			
		||||
#define TEST_CALL_FUT(fut, fut_args)                    \
 | 
			
		||||
    JTEST_COUNT_CYCLES(TEMPLATE_CALL_FN(fut, fut_args))
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Call the reference-function.
 | 
			
		||||
 */
 | 
			
		||||
#define TEST_CALL_REF(ref, ref_args)            \
 | 
			
		||||
    TEMPLATE_CALL_FN(ref, ref_args)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Call the function-under-test and the reference-function.
 | 
			
		||||
 */
 | 
			
		||||
#define TEST_CALL_FUT_AND_REF(fut, fut_args, ref, ref_args) \
 | 
			
		||||
    do {                                                    \
 | 
			
		||||
        TEST_CALL_FUT(fut, fut_args);                       \
 | 
			
		||||
        TEST_CALL_REF(ref, ref_args);                       \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  This macro eats a variable number of arguments and evaluates to a null
 | 
			
		||||
 *  statement.
 | 
			
		||||
 */
 | 
			
		||||
#define TEST_NULL_STATEMENT(...) (void) "TEST_NULL_STATEMENT"
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  A function name, Usable in any template where a fut or ref name is accepted,
 | 
			
		||||
 *  that evaluates to a #TEST_NULL_STATEMENT().
 | 
			
		||||
 */
 | 
			
		||||
#define TEST_NULL_FN TEST_NULL_STATEMENT
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Assert that buffers A and B are byte-equivalent for a number of bytes.
 | 
			
		||||
 */
 | 
			
		||||
#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)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Assert that the two entities are equal.
 | 
			
		||||
 */
 | 
			
		||||
#define TEST_ASSERT_EQUAL(a, b)                         \
 | 
			
		||||
    do                                                  \
 | 
			
		||||
    {                                                   \
 | 
			
		||||
        if ((a) != (b))                                 \
 | 
			
		||||
        {                                               \
 | 
			
		||||
            return JTEST_TEST_FAILED;                   \
 | 
			
		||||
        }                                               \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Convert elements to from src_type to float.
 | 
			
		||||
 */
 | 
			
		||||
#define TEST_CONVERT_TO_FLOAT(src_ptr, dst_ptr, block_size, src_type)   \
 | 
			
		||||
    do                                                                  \
 | 
			
		||||
    {                                                                   \
 | 
			
		||||
        ref_##src_type##_to_float(                                      \
 | 
			
		||||
            src_ptr,                                                    \
 | 
			
		||||
            dst_ptr,                                                    \
 | 
			
		||||
            block_size);                                                \
 | 
			
		||||
        } while (0)                                                      \
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Convert elements to from float to dst_type .
 | 
			
		||||
 */
 | 
			
		||||
#define TEST_CONVERT_FLOAT_TO(src_ptr, dst_ptr, block_size, dst_type)   \
 | 
			
		||||
    do                                                                  \
 | 
			
		||||
    {                                                                   \
 | 
			
		||||
        ref_float_to_##dst_type(                                        \
 | 
			
		||||
            src_ptr,                                                    \
 | 
			
		||||
            dst_ptr,                                                    \
 | 
			
		||||
            block_size);                                                \
 | 
			
		||||
    } while (0)                                                          \
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  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)    \
 | 
			
		||||
    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)                                                      \
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  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)    \
 | 
			
		||||
    do                                                              \
 | 
			
		||||
    {                                                               \
 | 
			
		||||
        float64_t snr = arm_snr_f64(ref_ptr, tst_ptr, block_size);  \
 | 
			
		||||
        if ( snr <= threshold)                                       \
 | 
			
		||||
        {                                                           \
 | 
			
		||||
            JTEST_DUMP_STRF("SNR: %f\n", snr);                      \
 | 
			
		||||
            return JTEST_TEST_FAILED;                               \
 | 
			
		||||
        }                                                           \
 | 
			
		||||
    } while (0)                                                      \
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Compare test and reference elements by converting to float and
 | 
			
		||||
 *  calculating an SNR.
 | 
			
		||||
 *
 | 
			
		||||
 *  This macro is a merger of the #TEST_CONVERT_TO_FLOAT() and
 | 
			
		||||
 *  #TEST_ASSERT_SNR() macros.
 | 
			
		||||
 */
 | 
			
		||||
#define TEST_CONVERT_AND_ASSERT_SNR(ref_dst_ptr, ref_src_ptr,   \
 | 
			
		||||
                                    tst_dst_ptr, tst_src_ptr,   \
 | 
			
		||||
                                    block_size,                 \
 | 
			
		||||
                                    tst_src_type,               \
 | 
			
		||||
                                    threshold)                  \
 | 
			
		||||
        do                                                      \
 | 
			
		||||
        {                                                       \
 | 
			
		||||
            TEST_CONVERT_TO_FLOAT(ref_src_ptr,                  \
 | 
			
		||||
                                  ref_dst_ptr,                  \
 | 
			
		||||
                                  block_size,                   \
 | 
			
		||||
                                  tst_src_type);                \
 | 
			
		||||
            TEST_CONVERT_TO_FLOAT(tst_src_ptr,                  \
 | 
			
		||||
                                  tst_dst_ptr,                  \
 | 
			
		||||
                                  block_size,                   \
 | 
			
		||||
                                  tst_src_type);                \
 | 
			
		||||
            TEST_ASSERT_SNR(ref_dst_ptr,                        \
 | 
			
		||||
                            tst_dst_ptr,                        \
 | 
			
		||||
                            block_size,                         \
 | 
			
		||||
                            threshold);                         \
 | 
			
		||||
        } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Execute statements only if the combination of block size, function type
 | 
			
		||||
 *  specifier, and input ARR_DESC_t are valid.
 | 
			
		||||
 *
 | 
			
		||||
 *  @example An ARR_DESC_t that contains 64 bytes cant service a 32 element
 | 
			
		||||
 *  block size if they are extracted in float32_t increments.
 | 
			
		||||
 *
 | 
			
		||||
 *  8 * 32 = 256 > 64.
 | 
			
		||||
 */
 | 
			
		||||
#define TEST_DO_VALID_BLOCKSIZE(block_size, fn_type_spec,   \
 | 
			
		||||
                                input_arr_desc, body)       \
 | 
			
		||||
    do                                                      \
 | 
			
		||||
    {                                                       \
 | 
			
		||||
        if (block_size * sizeof(fn_type_spec) <=             \
 | 
			
		||||
           ARR_DESC_BYTES(input_arr_desc))                  \
 | 
			
		||||
        {                                                   \
 | 
			
		||||
            JTEST_DUMP_STRF("Block Size: %"PRIu32"\n", block_size); \
 | 
			
		||||
            body;                                           \
 | 
			
		||||
        }                                                   \
 | 
			
		||||
    } while (0)                                              \
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Template for tests that rely on one input buffer and a blocksize parameter.
 | 
			
		||||
 *
 | 
			
		||||
 *  The buffer is an #ARR_DESC_t.  It is iterated over and it's values are
 | 
			
		||||
 *  passed to the function under test and reference functions through their
 | 
			
		||||
 *  appropriate argument interfaces.  The argument interfaces this template to
 | 
			
		||||
 *  execute structurally similar functions.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#define TEST_TEMPLATE_BUF1_BLK(arr_desc_inputs,                         \
 | 
			
		||||
                              arr_desc_block_sizes,                     \
 | 
			
		||||
                              input_type, output_type,                  \
 | 
			
		||||
                              fut, fut_arg_interface,                   \
 | 
			
		||||
                              ref, ref_arg_interface,                   \
 | 
			
		||||
                              compare_interface)                        \
 | 
			
		||||
    do                                                                  \
 | 
			
		||||
    {                                                                   \
 | 
			
		||||
        TEMPLATE_DO_ARR_DESC(                                           \
 | 
			
		||||
            input_idx, ARR_DESC_t *, input_ptr, arr_desc_inputs         \
 | 
			
		||||
            ,                                                           \
 | 
			
		||||
            TEMPLATE_DO_ARR_DESC(                                       \
 | 
			
		||||
                block_size_idx, uint32_t, block_size, arr_desc_block_sizes \
 | 
			
		||||
                ,                                                       \
 | 
			
		||||
                void *   input_data_ptr = input_ptr->data_ptr;          \
 | 
			
		||||
                                                                        \
 | 
			
		||||
                TEST_DO_VALID_BLOCKSIZE(                                \
 | 
			
		||||
                    block_size, input_type, input_ptr                   \
 | 
			
		||||
                    ,                                                   \
 | 
			
		||||
                    TEST_CALL_FUT_AND_REF(                              \
 | 
			
		||||
                        fut, fut_arg_interface(                         \
 | 
			
		||||
                            input_data_ptr, block_size),                \
 | 
			
		||||
                        ref, ref_arg_interface(                         \
 | 
			
		||||
                            input_data_ptr, block_size));               \
 | 
			
		||||
                                                                        \
 | 
			
		||||
                    compare_interface(block_size, output_type))));      \
 | 
			
		||||
                                                                        \
 | 
			
		||||
        return JTEST_TEST_PASSED;                                       \
 | 
			
		||||
                                                                        \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Template for tests that rely on an input buffer and an element.
 | 
			
		||||
 *
 | 
			
		||||
 *  An element can is any thing which doesn't walk and talk like a
 | 
			
		||||
 *  sequence. Examples include numbers, and structures.
 | 
			
		||||
 */
 | 
			
		||||
#define TEST_TEMPLATE_BUF1_ELT1(arr_desc_inputs,                        \
 | 
			
		||||
                                arr_desc_elts,                          \
 | 
			
		||||
                                input_type, elt_type, output_type,      \
 | 
			
		||||
                                fut, fut_arg_interface,                 \
 | 
			
		||||
                                ref, ref_arg_interface,                 \
 | 
			
		||||
                                compare_interface)                      \
 | 
			
		||||
        do                                                              \
 | 
			
		||||
        {                                                               \
 | 
			
		||||
            TEMPLATE_DO_ARR_DESC(                                       \
 | 
			
		||||
                input_idx, ARR_DESC_t *, input_ptr, arr_desc_inputs     \
 | 
			
		||||
                ,                                                       \
 | 
			
		||||
                TEMPLATE_DO_ARR_DESC(                                   \
 | 
			
		||||
                    elt_idx, elt_type, elt, arr_desc_elts               \
 | 
			
		||||
                    ,                                                   \
 | 
			
		||||
                    void * input_data_ptr = input_ptr->data_ptr;        \
 | 
			
		||||
                    TEST_CALL_FUT_AND_REF(                              \
 | 
			
		||||
                        fut, fut_arg_interface(input_data_ptr, elt),    \
 | 
			
		||||
                        ref, ref_arg_interface(input_data_ptr, elt));   \
 | 
			
		||||
                                                                        \
 | 
			
		||||
                    compare_interface(output_type)));                   \
 | 
			
		||||
            return JTEST_TEST_PASSED;                                   \
 | 
			
		||||
        } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Template for tests that rely on an input buffer, an element, and a blocksize
 | 
			
		||||
 *  parameter.
 | 
			
		||||
 */
 | 
			
		||||
#define TEST_TEMPLATE_BUF1_ELT1_BLK(arr_desc_inputs,                \
 | 
			
		||||
                                    arr_desc_elts,                  \
 | 
			
		||||
                                    arr_desc_block_sizes,           \
 | 
			
		||||
                                    input_type, elt_type, output_type,  \
 | 
			
		||||
                                    fut, fut_arg_interface,         \
 | 
			
		||||
                                    ref, ref_arg_interface,         \
 | 
			
		||||
                                    compare_interface);             \
 | 
			
		||||
    do                                                              \
 | 
			
		||||
    {                                                               \
 | 
			
		||||
        TEMPLATE_DO_ARR_DESC(                                       \
 | 
			
		||||
            inut_idx, ARR_DESC_t *, input_ptr, arr_desc_inputs      \
 | 
			
		||||
            ,                                                       \
 | 
			
		||||
            TEMPLATE_DO_ARR_DESC(                                   \
 | 
			
		||||
                block_size_idx, uint32_t, block_size,               \
 | 
			
		||||
                arr_desc_block_sizes                                \
 | 
			
		||||
                ,                                                   \
 | 
			
		||||
                TEMPLATE_DO_ARR_DESC(                               \
 | 
			
		||||
                    elt_idx, elt_type, elt, arr_desc_elts           \
 | 
			
		||||
                    ,                                               \
 | 
			
		||||
                    void * input_data_ptr = input_ptr->data_ptr;    \
 | 
			
		||||
                    TEST_DO_VALID_BLOCKSIZE(                        \
 | 
			
		||||
                        block_size, input_type, input_ptr,          \
 | 
			
		||||
                                              \
 | 
			
		||||
                        TEST_CALL_FUT_AND_REF(                      \
 | 
			
		||||
                            fut, fut_arg_interface(                 \
 | 
			
		||||
                                input_data_ptr, elt, block_size),   \
 | 
			
		||||
                            ref, ref_arg_interface(                 \
 | 
			
		||||
                                input_data_ptr, elt, block_size));  \
 | 
			
		||||
                        compare_interface(block_size, output_type))))); \
 | 
			
		||||
        return JTEST_TEST_PASSED;                                   \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Template for tests that rely on an input buffer, two elements, and a blocksize
 | 
			
		||||
 *  parameter.
 | 
			
		||||
 */
 | 
			
		||||
#define TEST_TEMPLATE_BUF1_ELT2_BLK(arr_desc_inputs,                    \
 | 
			
		||||
                                    arr_desc_elt1s,                     \
 | 
			
		||||
                                    arr_desc_elt2s,                     \
 | 
			
		||||
                                    arr_desc_block_sizes,               \
 | 
			
		||||
                                    input_type, elt1_type,              \
 | 
			
		||||
                                    elt2_type, output_type,             \
 | 
			
		||||
                                    fut, fut_arg_interface,             \
 | 
			
		||||
                                    ref, ref_arg_interface,             \
 | 
			
		||||
                                    compare_interface)                  \
 | 
			
		||||
        do                                                              \
 | 
			
		||||
        {                                                               \
 | 
			
		||||
            TEMPLATE_DO_ARR_DESC(                                       \
 | 
			
		||||
                inut_idx, ARR_DESC_t *, input_ptr, arr_desc_inputs      \
 | 
			
		||||
                ,                                                       \
 | 
			
		||||
                TEMPLATE_DO_ARR_DESC(                                   \
 | 
			
		||||
                    block_size_idx, uint32_t, block_size,               \
 | 
			
		||||
                    arr_desc_block_sizes                                \
 | 
			
		||||
                    ,                                                   \
 | 
			
		||||
                    TEMPLATE_DO_ARR_DESC(                               \
 | 
			
		||||
                        elt1_idx, elt1_type, elt1, arr_desc_elt1s       \
 | 
			
		||||
                        ,                                               \
 | 
			
		||||
                        TEMPLATE_DO_ARR_DESC(                           \
 | 
			
		||||
                            elt2_idx, elt2_type, elt2, arr_desc_elt2s   \
 | 
			
		||||
                            ,                                           \
 | 
			
		||||
                            void * input_data_ptr = input_ptr->data_ptr; \
 | 
			
		||||
                            TEST_DO_VALID_BLOCKSIZE(                    \
 | 
			
		||||
                                block_size, input_type, input_ptr,      \
 | 
			
		||||
                                TEST_CALL_FUT_AND_REF(                  \
 | 
			
		||||
                                    fut, fut_arg_interface(             \
 | 
			
		||||
                                        input_data_ptr, elt1, elt2, block_size), \
 | 
			
		||||
                                    ref, ref_arg_interface(             \
 | 
			
		||||
                                        input_data_ptr, elt1, elt2, block_size)); \
 | 
			
		||||
                                compare_interface(block_size, output_type)))))); \
 | 
			
		||||
            return JTEST_TEST_PASSED;                                   \
 | 
			
		||||
        } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Template for tests that rely on two input buffers and a blocksize parameter.
 | 
			
		||||
 *
 | 
			
		||||
 *  The two #ARR_DESC_t, input buffers are iterated through in parallel. The
 | 
			
		||||
 *  length of the first #ARR_DESC_t determines the length of the iteration.
 | 
			
		||||
 */
 | 
			
		||||
#define TEST_TEMPLATE_BUF2_BLK(arr_desc_inputs_a,                       \
 | 
			
		||||
                              arr_desc_inputs_b,                        \
 | 
			
		||||
                              arr_desc_block_sizes,                     \
 | 
			
		||||
                              input_type, output_type,                  \
 | 
			
		||||
                              fut, fut_arg_interface,                   \
 | 
			
		||||
                              ref, ref_arg_interface,                   \
 | 
			
		||||
                              compare_interface)                        \
 | 
			
		||||
    do                                                                  \
 | 
			
		||||
    {                                                                   \
 | 
			
		||||
        /* Iterate over two input arrays in parallel.*/                 \
 | 
			
		||||
        TEMPLATE_DO_ARR_DESC(                                           \
 | 
			
		||||
            input_idx, ARR_DESC_t *, input_ptr, arr_desc_inputs_a       \
 | 
			
		||||
            ,                                                           \
 | 
			
		||||
            TEMPLATE_DO_ARR_DESC(                                       \
 | 
			
		||||
                block_size_idx, uint32_t, block_size, arr_desc_block_sizes, \
 | 
			
		||||
                void * input_a_ptr = input_ptr->data_ptr;               \
 | 
			
		||||
                void * input_b_ptr = ARR_DESC_ELT(                      \
 | 
			
		||||
                    ARR_DESC_t *, input_idx,                            \
 | 
			
		||||
                    &(arr_desc_inputs_b))->data_ptr;                    \
 | 
			
		||||
                                                                        \
 | 
			
		||||
                TEST_DO_VALID_BLOCKSIZE(                                \
 | 
			
		||||
                    block_size, input_type, input_ptr                   \
 | 
			
		||||
                    ,                                                   \
 | 
			
		||||
                    TEST_CALL_FUT_AND_REF(                              \
 | 
			
		||||
                        fut, fut_arg_interface(                         \
 | 
			
		||||
                            input_a_ptr, input_b_ptr, block_size),      \
 | 
			
		||||
                        ref, ref_arg_interface(                         \
 | 
			
		||||
                            input_a_ptr, input_b_ptr, block_size));     \
 | 
			
		||||
                                                                        \
 | 
			
		||||
                    compare_interface(block_size, output_type))));      \
 | 
			
		||||
        return JTEST_TEST_PASSED;                                       \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Test template that uses a single element.
 | 
			
		||||
 */
 | 
			
		||||
#define TEST_TEMPLATE_ELT1(arr_desc_elts,                       \
 | 
			
		||||
                           elt_type, output_type,               \
 | 
			
		||||
                           fut, fut_arg_interface,              \
 | 
			
		||||
                           ref, ref_arg_interface,              \
 | 
			
		||||
                           compare_interface)                   \
 | 
			
		||||
        do                                                      \
 | 
			
		||||
        {                                                       \
 | 
			
		||||
            TEMPLATE_DO_ARR_DESC(                               \
 | 
			
		||||
                elt_idx, elt_type, elt, arr_desc_elts           \
 | 
			
		||||
                ,                                               \
 | 
			
		||||
                TEST_CALL_FUT_AND_REF(                          \
 | 
			
		||||
                    fut, fut_arg_interface(                     \
 | 
			
		||||
                        elt),                                   \
 | 
			
		||||
                    ref, ref_arg_interface(                     \
 | 
			
		||||
                        elt));                                  \
 | 
			
		||||
                /* Comparison interfaces typically accept */    \
 | 
			
		||||
                /* a block_size. Pass a dummy value 1.*/        \
 | 
			
		||||
                compare_interface(1, output_type));             \
 | 
			
		||||
            return JTEST_TEST_PASSED;                           \
 | 
			
		||||
        } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Test template that iterates over two sets of elements in parallel.
 | 
			
		||||
 *
 | 
			
		||||
 *  The length of the first set determines the number of iteratsions.
 | 
			
		||||
 */
 | 
			
		||||
#define TEST_TEMPLATE_ELT2(arr_desc_elts_a,                     \
 | 
			
		||||
                           arr_desc_elts_b,                     \
 | 
			
		||||
                           elt_a_type, elt_b_type, output_type, \
 | 
			
		||||
                           fut, fut_arg_interface,              \
 | 
			
		||||
                           ref, ref_arg_interface,              \
 | 
			
		||||
                           compare_interface)                   \
 | 
			
		||||
        do                                                      \
 | 
			
		||||
        {                                                       \
 | 
			
		||||
            TEMPLATE_DO_ARR_DESC(                               \
 | 
			
		||||
                elt_a_idx, elt_a_type, elt_a, arr_desc_elts_a   \
 | 
			
		||||
                ,                                               \
 | 
			
		||||
                elt_b_type * elt_b = ARR_DESC_ELT(              \
 | 
			
		||||
                    elt_b_type,                                 \
 | 
			
		||||
                    elt_a_idx,                                  \
 | 
			
		||||
                    arr_desc_elts_b);                           \
 | 
			
		||||
                                                                \
 | 
			
		||||
                TEST_CALL_FUT_AND_REF(                          \
 | 
			
		||||
                    fut, fut_arg_interface(                     \
 | 
			
		||||
                        elt_a, elt_b),                          \
 | 
			
		||||
                    ref, ref_arg_interface(                     \
 | 
			
		||||
                        elt_a, elt_b));                         \
 | 
			
		||||
                /* Comparison interfaces typically accept */    \
 | 
			
		||||
                /* a block_size. Pass a dummy value 1.*/        \
 | 
			
		||||
                compare_interface(1, output_type));             \
 | 
			
		||||
            return JTEST_TEST_PASSED;                           \
 | 
			
		||||
        } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Test template that uses an element and a block size.
 | 
			
		||||
 */
 | 
			
		||||
#define TEST_TEMPLATE_ELT1_BLK(arr_desc_elts,                       \
 | 
			
		||||
                               arr_desc_block_sizes,                \
 | 
			
		||||
                               elt_type, output_type,               \
 | 
			
		||||
                               fut, fut_arg_interface,              \
 | 
			
		||||
                               ref, ref_arg_interface,              \
 | 
			
		||||
                               compare_interface)                   \
 | 
			
		||||
        do                                                          \
 | 
			
		||||
        {                                                           \
 | 
			
		||||
            TEMPLATE_DO_ARR_DESC(                                   \
 | 
			
		||||
                block_size_idx, uint32_t, block_size,               \
 | 
			
		||||
                arr_desc_block_sizes                                \
 | 
			
		||||
                ,                                                   \
 | 
			
		||||
                TEMPLATE_DO_ARR_DESC(                               \
 | 
			
		||||
                    elt_idx, elt_type, elt, arr_desc_elts           \
 | 
			
		||||
                    ,                                               \
 | 
			
		||||
                    JTEST_DUMP_STRF("Block Size: %d\n",             \
 | 
			
		||||
                         (int)block_size);                          \
 | 
			
		||||
                    TEST_CALL_FUT_AND_REF(                          \
 | 
			
		||||
                        fut, fut_arg_interface(                     \
 | 
			
		||||
                            elt, block_size),                       \
 | 
			
		||||
                        ref, ref_arg_interface(                     \
 | 
			
		||||
                            elt, block_size));                      \
 | 
			
		||||
                    compare_interface(block_size, output_type)));   \
 | 
			
		||||
            return JTEST_TEST_PASSED;                               \
 | 
			
		||||
        } while (0)
 | 
			
		||||
 | 
			
		||||
#endif /* _TEST_TEMPLATES_H_ */
 | 
			
		||||
@ -0,0 +1,181 @@
 | 
			
		||||
#ifndef _TRANSFORM_TEMPLATES_H_
 | 
			
		||||
#define _TRANSFORM_TEMPLATES_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "test_templates.h"
 | 
			
		||||
#include <string.h>             /* memcpy() */
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Group Specific Templates */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Comparison SNR thresholds for the data types used in transform_tests.
 | 
			
		||||
 */
 | 
			
		||||
#define TRANSFORM_SNR_THRESHOLD_float32_t 90
 | 
			
		||||
#define TRANSFORM_SNR_THRESHOLD_q31_t     90
 | 
			
		||||
#define TRANSFORM_SNR_THRESHOLD_q15_t     30
 | 
			
		||||
 | 
			
		||||
#define DCT4_TRANSFORM_SNR_THRESHOLD_float32_t 80
 | 
			
		||||
#define DCT4_TRANSFORM_SNR_THRESHOLD_q31_t     75
 | 
			
		||||
#define DCT4_TRANSFORM_SNR_THRESHOLD_q15_t     11
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Compare the outputs from the function under test and the reference
 | 
			
		||||
 *  function using SNR.
 | 
			
		||||
 */
 | 
			
		||||
#define TRANSFORM_SNR_COMPARE_INTERFACE(block_size,     \
 | 
			
		||||
                                        output_type)    \
 | 
			
		||||
    do                                                  \
 | 
			
		||||
    {                                                   \
 | 
			
		||||
        TEST_CONVERT_AND_ASSERT_SNR(                    \
 | 
			
		||||
            transform_fft_output_f32_ref,               \
 | 
			
		||||
            (output_type *) transform_fft_output_ref,   \
 | 
			
		||||
            transform_fft_output_f32_fut,               \
 | 
			
		||||
            (output_type *) transform_fft_output_fut,   \
 | 
			
		||||
            block_size,                                 \
 | 
			
		||||
            output_type,                                \
 | 
			
		||||
            TRANSFORM_SNR_THRESHOLD_##output_type       \
 | 
			
		||||
            );                                          \
 | 
			
		||||
    } while (0)
 | 
			
		||||
    
 | 
			
		||||
/**
 | 
			
		||||
 *  Compare the outputs from the function under test and the reference
 | 
			
		||||
 *  function using SNR.
 | 
			
		||||
 */
 | 
			
		||||
#define DCT_TRANSFORM_SNR_COMPARE_INTERFACE(block_size,  \
 | 
			
		||||
                                            output_type) \
 | 
			
		||||
    do                                                   \
 | 
			
		||||
    {                                                    \
 | 
			
		||||
        TEST_CONVERT_AND_ASSERT_SNR(                     \
 | 
			
		||||
            transform_fft_output_f32_ref,                \
 | 
			
		||||
            (output_type *) transform_fft_output_ref,    \
 | 
			
		||||
            transform_fft_output_f32_fut,                \
 | 
			
		||||
            (output_type *) transform_fft_output_fut,    \
 | 
			
		||||
            block_size,                                  \
 | 
			
		||||
            output_type,                                 \
 | 
			
		||||
            DCT4_TRANSFORM_SNR_THRESHOLD_##output_type   \
 | 
			
		||||
            );                                           \
 | 
			
		||||
    } while (0)                                           \
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Specialization on #TRANSFORM_SNR_COMPARE_INTERFACE() to fix the block_size
 | 
			
		||||
 *  for complex datasets.
 | 
			
		||||
 */
 | 
			
		||||
#define TRANSFORM_SNR_COMPARE_CMPLX_INTERFACE(block_size, output_type)  \
 | 
			
		||||
    /* Complex numbers have two components*/                            \
 | 
			
		||||
    TRANSFORM_SNR_COMPARE_INTERFACE(block_size * 2, output_type )
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This macro copys data from the input_ptr into input arrays.
 | 
			
		||||
 *
 | 
			
		||||
 * Some functions modify their input data; in order to provide the same data to
 | 
			
		||||
 * multiple tests, copies must be made so the changes from one function don't
 | 
			
		||||
 * impact the others.
 | 
			
		||||
 */
 | 
			
		||||
#define TRANSFORM_COPY_INPUTS(input_ptr,        \
 | 
			
		||||
                              bytes)            \
 | 
			
		||||
    do                                          \
 | 
			
		||||
    {                                           \
 | 
			
		||||
        memcpy(                                 \
 | 
			
		||||
            transform_fft_input_fut,            \
 | 
			
		||||
            input_ptr,                          \
 | 
			
		||||
            bytes);                             \
 | 
			
		||||
        memcpy(                                 \
 | 
			
		||||
            transform_fft_input_ref,            \
 | 
			
		||||
            input_ptr,                          \
 | 
			
		||||
            bytes);                             \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This macro copys data from the input_ptr into input arrays. It also creates
 | 
			
		||||
 * symmetric input data for rfft inverse.
 | 
			
		||||
 *
 | 
			
		||||
 * The 4.534234f just makes the middle entry of the array semi random.  It's
 | 
			
		||||
 * actual value doesn't seem to matter much.
 | 
			
		||||
 *
 | 
			
		||||
 * Some functions modify their input data; in order to provide the same data to
 | 
			
		||||
 * multiple tests, copies must be made so the changes from one function don't
 | 
			
		||||
 * impact the others.
 | 
			
		||||
 */
 | 
			
		||||
#define TRANSFORM_PREPARE_INVERSE_INPUTS(input_ptr,                              \
 | 
			
		||||
                              fftlen, input_type, bytes)                         \
 | 
			
		||||
    do                                                                           \
 | 
			
		||||
    {                                                                            \
 | 
			
		||||
        uint32_t i;                                                              \
 | 
			
		||||
                                                                                 \
 | 
			
		||||
        memcpy(                                                                  \
 | 
			
		||||
            transform_fft_input_fut,                                             \
 | 
			
		||||
            input_ptr,                                                           \
 | 
			
		||||
            bytes);                                                              \
 | 
			
		||||
                                                                                 \
 | 
			
		||||
        ((input_type*)transform_fft_input_fut)[1] = 0;                           \
 | 
			
		||||
        ((input_type*)transform_fft_input_fut)[fftlen + 0] = 0;                  \
 | 
			
		||||
        ((input_type*)transform_fft_input_fut)[fftlen + 1] = 0;                  \
 | 
			
		||||
        for(i=1;i<fftlen/2;i++)                                                  \
 | 
			
		||||
        {                                                                        \
 | 
			
		||||
           *((input_type*)transform_fft_input_fut + fftlen + 2*i + 0) =          \
 | 
			
		||||
               *((input_type*)transform_fft_input_fut + fftlen - 2*i + 0);       \
 | 
			
		||||
           *((input_type*)transform_fft_input_fut + fftlen + 2*i + 1) =          \
 | 
			
		||||
               -(*((input_type*)transform_fft_input_fut + fftlen - 2*i + 1));    \
 | 
			
		||||
                                                                                 \
 | 
			
		||||
        }                                                                        \
 | 
			
		||||
                                                                                 \
 | 
			
		||||
        memcpy(                                                                  \
 | 
			
		||||
            transform_fft_input_ref,                                             \
 | 
			
		||||
            transform_fft_input_fut,                                             \
 | 
			
		||||
            bytes * 2);                                                          \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This macro copys data from the input_ptr into the in-place input arrays.
 | 
			
		||||
 *
 | 
			
		||||
 * Some functions modify their input data; in order to provide the same data to
 | 
			
		||||
 * multiple tests, copies must be made so the changes from one function don't
 | 
			
		||||
 * impact the others.
 | 
			
		||||
 */
 | 
			
		||||
#define TRANSFORM_PREPARE_INPLACE_INPUTS_DOWNSHIFT(input_ptr,       \
 | 
			
		||||
                                         bytes,                     \
 | 
			
		||||
                                         type)                      \
 | 
			
		||||
    do                                                              \
 | 
			
		||||
    {                                                               \
 | 
			
		||||
        uint32_t i;                                                 \
 | 
			
		||||
        memcpy(                                                     \
 | 
			
		||||
            transform_fft_inplace_input_fut,                        \
 | 
			
		||||
            input_ptr,                                              \
 | 
			
		||||
            bytes);                                                 \
 | 
			
		||||
        memcpy(                                                     \
 | 
			
		||||
            transform_fft_inplace_input_ref,                        \
 | 
			
		||||
            input_ptr,                                              \
 | 
			
		||||
            bytes);                                                 \
 | 
			
		||||
        for(i=0;i<bytes/sizeof(type);i++) {                         \
 | 
			
		||||
            *((type*)transform_fft_inplace_input_fut + i) >>= 1;    \
 | 
			
		||||
            *((type*)transform_fft_inplace_input_ref + i) >>= 1;}   \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This macro copys data from the input_ptr into the in-place input arrays.
 | 
			
		||||
 *
 | 
			
		||||
 * Some functions modify their input data; in order to provide the same data to
 | 
			
		||||
 * multiple tests, copies must be made so the changes from one function don't
 | 
			
		||||
 * impact the others.
 | 
			
		||||
 */
 | 
			
		||||
#define TRANSFORM_PREPARE_INPLACE_INPUTS(input_ptr, \
 | 
			
		||||
                                         bytes)     \
 | 
			
		||||
    do                                              \
 | 
			
		||||
    {                                               \
 | 
			
		||||
        memcpy(                                     \
 | 
			
		||||
            transform_fft_inplace_input_fut,        \
 | 
			
		||||
            input_ptr,                              \
 | 
			
		||||
            bytes);                                 \
 | 
			
		||||
        memcpy(                                     \
 | 
			
		||||
            transform_fft_inplace_input_ref,        \
 | 
			
		||||
            input_ptr,                              \
 | 
			
		||||
            bytes);                                 \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /* _TRANSFORM_TEMPLATES_H_ */
 | 
			
		||||
@ -0,0 +1,48 @@
 | 
			
		||||
#ifndef _TRANSFORM_TEST_DATA_H_
 | 
			
		||||
#define _TRANSFORM_TEST_DATA_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Includes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "arr_desc.h"
 | 
			
		||||
#include "arm_math.h"
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros and Defines */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#define TRANSFORM_MAX_FFT_LEN 4096
 | 
			
		||||
#define TRANFORM_BIGGEST_INPUT_TYPE float32_t
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Variable Declarations */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* Lengths are multiplied by 2 to accomodate complex numbers*/
 | 
			
		||||
extern float32_t transform_fft_output_fut[TRANSFORM_MAX_FFT_LEN * 2];
 | 
			
		||||
extern float32_t transform_fft_output_ref[TRANSFORM_MAX_FFT_LEN * 2];
 | 
			
		||||
extern float32_t transform_fft_input_fut[TRANSFORM_MAX_FFT_LEN * 2];
 | 
			
		||||
extern float32_t transform_fft_input_ref[TRANSFORM_MAX_FFT_LEN * 2];
 | 
			
		||||
extern float32_t transform_fft_output_f32_fut[TRANSFORM_MAX_FFT_LEN * 2];
 | 
			
		||||
extern float32_t transform_fft_output_f32_ref[TRANSFORM_MAX_FFT_LEN * 2];
 | 
			
		||||
extern float32_t * transform_fft_inplace_input_fut;
 | 
			
		||||
extern float32_t * transform_fft_inplace_input_ref;
 | 
			
		||||
extern float32_t transform_fft_f32_inputs[TRANSFORM_MAX_FFT_LEN * 2];
 | 
			
		||||
extern q31_t transform_fft_q31_inputs[TRANSFORM_MAX_FFT_LEN * 2];
 | 
			
		||||
extern q15_t * transform_fft_q15_inputs;
 | 
			
		||||
extern q15_t dct4_transform_fft_q15_inputs[TRANSFORM_MAX_FFT_LEN * 2];
 | 
			
		||||
 | 
			
		||||
/* FFT Lengths */
 | 
			
		||||
ARR_DESC_DECLARE(transform_radix2_fftlens);
 | 
			
		||||
ARR_DESC_DECLARE(transform_radix4_fftlens);
 | 
			
		||||
ARR_DESC_DECLARE(transform_rfft_fftlens);
 | 
			
		||||
ARR_DESC_DECLARE(transform_rfft_fast_fftlens);
 | 
			
		||||
ARR_DESC_DECLARE(transform_dct_fftlens);
 | 
			
		||||
 | 
			
		||||
/* CFFT Structs */
 | 
			
		||||
ARR_DESC_DECLARE(transform_cfft_f32_structs);
 | 
			
		||||
ARR_DESC_DECLARE(transform_cfft_q31_structs);
 | 
			
		||||
ARR_DESC_DECLARE(transform_cfft_q15_structs);
 | 
			
		||||
 | 
			
		||||
#endif /* _TRANSFORM_TEST_DATA_H_ */
 | 
			
		||||
@ -0,0 +1,9 @@
 | 
			
		||||
#ifndef _TRANSFORM_TEST_GROUP_H_
 | 
			
		||||
#define _TRANSFORM_TEST_GROUP_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Declare Test Groups */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
JTEST_DECLARE_GROUP(transform_tests);
 | 
			
		||||
 | 
			
		||||
#endif /* _TRANSFORM_TEST_GROUP_H_ */
 | 
			
		||||
@ -0,0 +1,13 @@
 | 
			
		||||
#ifndef _TRANSFORM_TESTS_H_
 | 
			
		||||
#define _TRANSFORM_TESTS_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Test/Group Declarations */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
JTEST_DECLARE_GROUP(cfft_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(cfft_family_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(dct4_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(rfft_tests);
 | 
			
		||||
JTEST_DECLARE_GROUP(rfft_fast_tests);
 | 
			
		||||
 | 
			
		||||
#endif /* _TRANSFORM_TESTS_H_ */
 | 
			
		||||
							
								
								
									
										37
									
								
								Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/type_abbrev.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/type_abbrev.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,37 @@
 | 
			
		||||
#ifndef _TYPE_ABBREV_H_
 | 
			
		||||
#define _TYPE_ABBREV_H_
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Macros and Defines */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Expand the abbreviation for a type into the type itself.
 | 
			
		||||
 */
 | 
			
		||||
#define TYPE_FROM_ABBREV(abbrev)                \
 | 
			
		||||
    TYPE_ABBREV_##abbrev                        \
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Expand the type to an abbreviation for that type.
 | 
			
		||||
 *
 | 
			
		||||
 *  Inverse of #TYPE_FROM_ABBREV().
 | 
			
		||||
 *
 | 
			
		||||
 *  @note Should be able to get a type back by writing.
 | 
			
		||||
 *  TYPE_FROM_ABBREV(ABBREV_FROM_TYPE(type))
 | 
			
		||||
 */
 | 
			
		||||
#define ABBREV_FROM_TYPE(type)                  \
 | 
			
		||||
    TYPE_SUFFIX_##type
 | 
			
		||||
 | 
			
		||||
#define TYPE_ABBREV_f64 float64_t
 | 
			
		||||
#define TYPE_ABBREV_f32 float32_t
 | 
			
		||||
#define TYPE_ABBREV_q31 q31_t
 | 
			
		||||
#define TYPE_ABBREV_q15 q15_t
 | 
			
		||||
#define TYPE_ABBREV_q7  q7_t
 | 
			
		||||
 | 
			
		||||
#define TYPE_SUFFIX_float64_t f64
 | 
			
		||||
#define TYPE_SUFFIX_float32_t f32
 | 
			
		||||
#define TYPE_SUFFIX_q31_t q31
 | 
			
		||||
#define TYPE_SUFFIX_q15_t q15
 | 
			
		||||
#define TYPE_SUFFIX_q7_t q7
 | 
			
		||||
 | 
			
		||||
#endif /* _TYPE_ABBREV_H_ */
 | 
			
		||||
@ -0,0 +1,52 @@
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
 * Name:    Retarget.c
 | 
			
		||||
 * Purpose: 'Retarget' layer for target-dependent low level functions
 | 
			
		||||
 * Note(s):
 | 
			
		||||
 *----------------------------------------------------------------------------
 | 
			
		||||
 * This file is part of the uVision/ARM development tools.
 | 
			
		||||
 * This software may only be used under the terms of a valid, current,
 | 
			
		||||
 * end user licence from KEIL for a compatible version of KEIL software
 | 
			
		||||
 * development tools. Nothing else gives you the right to use this software.
 | 
			
		||||
 *
 | 
			
		||||
 * This software is supplied "AS IS" without warranties of any kind.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2011 Keil - An ARM Company. All rights reserved.
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <rt_misc.h>
 | 
			
		||||
#include "Serial.h"
 | 
			
		||||
 | 
			
		||||
#pragma import(__use_no_semihosting_swi)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct __FILE { int handle; /* Add whatever you need here */ };
 | 
			
		||||
FILE __stdout;
 | 
			
		||||
FILE __stdin;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int fputc(int c, FILE *f) {
 | 
			
		||||
  return (SER_PutChar(c));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int fgetc(FILE *f) {
 | 
			
		||||
  return (SER_GetChar());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int ferror(FILE *f) {
 | 
			
		||||
  /* Your implementation of ferror */
 | 
			
		||||
  return EOF;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void _ttywrch(int c) {
 | 
			
		||||
  SER_PutChar(c);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void _sys_exit(int return_code) {
 | 
			
		||||
label:  goto label;  /* endless loop */
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,195 @@
 | 
			
		||||
;/* File: startup_armv6-m.s
 | 
			
		||||
; * Purpose: startup file for armv7-m architecture devices.
 | 
			
		||||
; *          Should be used with ARMCC
 | 
			
		||||
; * Version: V2.00
 | 
			
		||||
; * Date: 16 November 2015
 | 
			
		||||
; *
 | 
			
		||||
; */
 | 
			
		||||
;/* Copyright (c) 2011 - 2014 ARM LIMITED
 | 
			
		||||
;
 | 
			
		||||
;   All rights reserved.
 | 
			
		||||
;   Redistribution and use in source and binary forms, with or without
 | 
			
		||||
;   modification, are permitted provided that the following conditions are met:
 | 
			
		||||
;   - Redistributions of source code must retain the above copyright
 | 
			
		||||
;     notice, this list of conditions and the following disclaimer.
 | 
			
		||||
;   - Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
;     notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
;     documentation and/or other materials provided with the distribution.
 | 
			
		||||
;   - Neither the name of ARM nor the names of its contributors may be used
 | 
			
		||||
;     to endorse or promote products derived from this software without
 | 
			
		||||
;     specific prior written permission.
 | 
			
		||||
;   *
 | 
			
		||||
;   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
;   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
;   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
;   ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
 | 
			
		||||
;   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
;   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
;   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
;   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
;   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
;   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
;   POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
;   ---------------------------------------------------------------------------*/
 | 
			
		||||
;/*
 | 
			
		||||
;  //-------- <<< Use Configuration Wizard in Context Menu >>> ------------------
 | 
			
		||||
;*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; <h> Stack Configuration
 | 
			
		||||
;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
 | 
			
		||||
; </h>
 | 
			
		||||
 | 
			
		||||
Stack_Size      EQU     0x00000400
 | 
			
		||||
 | 
			
		||||
                AREA    STACK, NOINIT, READWRITE, ALIGN=3
 | 
			
		||||
Stack_Mem       SPACE   Stack_Size
 | 
			
		||||
__initial_sp
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; <h> Heap Configuration
 | 
			
		||||
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
 | 
			
		||||
; </h>
 | 
			
		||||
 | 
			
		||||
Heap_Size       EQU     0x00000C00
 | 
			
		||||
 | 
			
		||||
                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
 | 
			
		||||
__heap_base
 | 
			
		||||
Heap_Mem        SPACE   Heap_Size
 | 
			
		||||
__heap_limit
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                PRESERVE8
 | 
			
		||||
                THUMB
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; Vector Table Mapped to Address 0 at Reset
 | 
			
		||||
 | 
			
		||||
                AREA    RESET, DATA, READONLY
 | 
			
		||||
                EXPORT  __Vectors
 | 
			
		||||
                EXPORT  __Vectors_End
 | 
			
		||||
                EXPORT  __Vectors_Size
 | 
			
		||||
 | 
			
		||||
__Vectors       DCD     __initial_sp              ; Top of Stack
 | 
			
		||||
                DCD     Reset_Handler             ; Reset Handler
 | 
			
		||||
                DCD     NMI_Handler               ; NMI Handler
 | 
			
		||||
                DCD     HardFault_Handler         ; Hard Fault Handler
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     SVC_Handler               ; SVCall Handler
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     PendSV_Handler            ; PendSV Handler
 | 
			
		||||
                DCD     SysTick_Handler           ; SysTick Handler
 | 
			
		||||
__Vectors_End
 | 
			
		||||
 | 
			
		||||
__Vectors_Size  EQU     __Vectors_End - __Vectors
 | 
			
		||||
 | 
			
		||||
                AREA    |.text|, CODE, READONLY
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; Reset Handler
 | 
			
		||||
 | 
			
		||||
Reset_Handler   PROC
 | 
			
		||||
                EXPORT  Reset_Handler             [WEAK]
 | 
			
		||||
                IMPORT  SystemInit
 | 
			
		||||
                IMPORT  __main
 | 
			
		||||
                LDR     R0, =SystemInit
 | 
			
		||||
                BLX     R0
 | 
			
		||||
                LDR     R0, =__main
 | 
			
		||||
                BX      R0
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; Dummy Exception Handlers (infinite loops which can be modified)
 | 
			
		||||
 | 
			
		||||
NMI_Handler     PROC
 | 
			
		||||
                EXPORT  NMI_Handler               [WEAK]
 | 
			
		||||
                BKPT #0
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
HardFault_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  HardFault_Handler         [WEAK]
 | 
			
		||||
                BKPT #0
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
SVC_Handler     PROC
 | 
			
		||||
                EXPORT  SVC_Handler               [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
PendSV_Handler  PROC
 | 
			
		||||
                EXPORT  PendSV_Handler            [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
SysTick_Handler PROC
 | 
			
		||||
                EXPORT  SysTick_Handler           [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
                ALIGN
 | 
			
		||||
 | 
			
		||||
; User Initial Stack & Heap
 | 
			
		||||
                IF      :DEF:__MICROLIB
 | 
			
		||||
 | 
			
		||||
                EXPORT  __initial_sp
 | 
			
		||||
                EXPORT  __heap_base
 | 
			
		||||
                EXPORT  __heap_limit
 | 
			
		||||
 | 
			
		||||
                ELSE
 | 
			
		||||
 | 
			
		||||
                IMPORT  __use_two_region_memory
 | 
			
		||||
 | 
			
		||||
;/*
 | 
			
		||||
;  __user_setup_stackheap() returns the:
 | 
			
		||||
;     - heap base in r0 (if the program uses the heap)
 | 
			
		||||
;     - stack base in sp
 | 
			
		||||
;     - heap limit in r2 (if the program uses the heap and uses two-region memory).
 | 
			
		||||
; */
 | 
			
		||||
                EXPORT  __user_setup_stackheap
 | 
			
		||||
 | 
			
		||||
__user_setup_stackheap PROC
 | 
			
		||||
                LDR     R0, = __initial_sp
 | 
			
		||||
                MOV     SP, R0
 | 
			
		||||
				IF Heap_Size > 0
 | 
			
		||||
                LDR     R2, = __heap_limit
 | 
			
		||||
                LDR     R0, = __heap_base
 | 
			
		||||
				ELSE
 | 
			
		||||
                MOV     R0, #0
 | 
			
		||||
                MOV     R2, #0
 | 
			
		||||
                ENDIF
 | 
			
		||||
                BX      LR
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
;/*
 | 
			
		||||
;__user_initial_stackheap() returns the:
 | 
			
		||||
;   - heap base in r0
 | 
			
		||||
;   - stack base in r1, that is, the highest address in the stack region
 | 
			
		||||
;   - heap limit in r2
 | 
			
		||||
;   - stack limit in r3, that is, the lowest address in the stack region.
 | 
			
		||||
; */
 | 
			
		||||
;
 | 
			
		||||
;/* DEPRICATED
 | 
			
		||||
;                EXPORT  __user_initial_stackheap
 | 
			
		||||
;
 | 
			
		||||
;__user_initial_stackheap PROC
 | 
			
		||||
;                LDR     R0, =  Heap_Mem
 | 
			
		||||
;                LDR     R1, =(Stack_Mem + Stack_Size)
 | 
			
		||||
;                LDR     R2, = (Heap_Mem +  Heap_Size)
 | 
			
		||||
;                LDR     R3, = Stack_Mem
 | 
			
		||||
;                BX      LR
 | 
			
		||||
;                ENDP
 | 
			
		||||
; */
 | 
			
		||||
 | 
			
		||||
                ALIGN
 | 
			
		||||
 | 
			
		||||
                ENDIF
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                END
 | 
			
		||||
@ -0,0 +1,218 @@
 | 
			
		||||
;/* File: startup_armv7-m.s
 | 
			
		||||
; * Purpose: startup file for armv7-m architecture devices.
 | 
			
		||||
; *          Should be used with ARMCC
 | 
			
		||||
; * Version: V2.00
 | 
			
		||||
; * Date: 16 November 2015
 | 
			
		||||
; *
 | 
			
		||||
; */
 | 
			
		||||
;/* Copyright (c) 2011 - 2014 ARM LIMITED
 | 
			
		||||
;
 | 
			
		||||
;   All rights reserved.
 | 
			
		||||
;   Redistribution and use in source and binary forms, with or without
 | 
			
		||||
;   modification, are permitted provided that the following conditions are met:
 | 
			
		||||
;   - Redistributions of source code must retain the above copyright
 | 
			
		||||
;     notice, this list of conditions and the following disclaimer.
 | 
			
		||||
;   - Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
;     notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
;     documentation and/or other materials provided with the distribution.
 | 
			
		||||
;   - Neither the name of ARM nor the names of its contributors may be used
 | 
			
		||||
;     to endorse or promote products derived from this software without
 | 
			
		||||
;     specific prior written permission.
 | 
			
		||||
;   *
 | 
			
		||||
;   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
;   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
;   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
;   ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
 | 
			
		||||
;   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
;   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
;   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
;   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
;   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
;   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
;   POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
;   ---------------------------------------------------------------------------*/
 | 
			
		||||
;/*
 | 
			
		||||
;  //-------- <<< Use Configuration Wizard in Context Menu >>> ------------------
 | 
			
		||||
;*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; <h> Stack Configuration
 | 
			
		||||
;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
 | 
			
		||||
; </h>
 | 
			
		||||
 | 
			
		||||
Stack_Size      EQU     0x00000400
 | 
			
		||||
 | 
			
		||||
                AREA    STACK, NOINIT, READWRITE, ALIGN=3
 | 
			
		||||
Stack_Mem       SPACE   Stack_Size
 | 
			
		||||
__initial_sp
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; <h> Heap Configuration
 | 
			
		||||
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
 | 
			
		||||
; </h>
 | 
			
		||||
 | 
			
		||||
Heap_Size       EQU     0x00000C00
 | 
			
		||||
 | 
			
		||||
                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
 | 
			
		||||
__heap_base
 | 
			
		||||
Heap_Mem        SPACE   Heap_Size
 | 
			
		||||
__heap_limit
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                PRESERVE8
 | 
			
		||||
                THUMB
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; Vector Table Mapped to Address 0 at Reset
 | 
			
		||||
 | 
			
		||||
                AREA    RESET, DATA, READONLY
 | 
			
		||||
                EXPORT  __Vectors
 | 
			
		||||
                EXPORT  __Vectors_End
 | 
			
		||||
                EXPORT  __Vectors_Size
 | 
			
		||||
 | 
			
		||||
__Vectors       DCD     __initial_sp              ; Top of Stack
 | 
			
		||||
                DCD     Reset_Handler             ; Reset Handler
 | 
			
		||||
                DCD     NMI_Handler               ; NMI Handler
 | 
			
		||||
                DCD     HardFault_Handler         ; Hard Fault Handler
 | 
			
		||||
                DCD     MemManage_Handler         ; MPU Fault Handler
 | 
			
		||||
                DCD     BusFault_Handler          ; Bus Fault Handler
 | 
			
		||||
                DCD     UsageFault_Handler        ; Usage Fault Handler
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     SVC_Handler               ; SVCall Handler
 | 
			
		||||
                DCD     DebugMon_Handler          ; Debug Monitor Handler
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     PendSV_Handler            ; PendSV Handler
 | 
			
		||||
                DCD     SysTick_Handler           ; SysTick Handler
 | 
			
		||||
__Vectors_End
 | 
			
		||||
 | 
			
		||||
__Vectors_Size  EQU     __Vectors_End - __Vectors
 | 
			
		||||
 | 
			
		||||
                AREA    |.text|, CODE, READONLY
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; Reset Handler
 | 
			
		||||
 | 
			
		||||
Reset_Handler   PROC
 | 
			
		||||
                EXPORT  Reset_Handler             [WEAK]
 | 
			
		||||
                IMPORT  SystemInit
 | 
			
		||||
                IMPORT  __main
 | 
			
		||||
                LDR     R0, =SystemInit
 | 
			
		||||
                BLX     R0
 | 
			
		||||
                LDR     R0, =__main
 | 
			
		||||
                BX      R0
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; Dummy Exception Handlers (infinite loops which can be modified)
 | 
			
		||||
 | 
			
		||||
NMI_Handler     PROC
 | 
			
		||||
                EXPORT  NMI_Handler               [WEAK]
 | 
			
		||||
                BKPT #0
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
HardFault_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  HardFault_Handler         [WEAK]
 | 
			
		||||
                BKPT #0
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
MemManage_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  MemManage_Handler         [WEAK]
 | 
			
		||||
                BKPT #0
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
BusFault_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  BusFault_Handler          [WEAK]
 | 
			
		||||
                BKPT #0
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
UsageFault_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  UsageFault_Handler        [WEAK]
 | 
			
		||||
                BKPT #0
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
SVC_Handler     PROC
 | 
			
		||||
                EXPORT  SVC_Handler               [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
DebugMon_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  DebugMon_Handler          [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
PendSV_Handler  PROC
 | 
			
		||||
                EXPORT  PendSV_Handler            [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
SysTick_Handler PROC
 | 
			
		||||
                EXPORT  SysTick_Handler           [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
                ALIGN
 | 
			
		||||
 | 
			
		||||
; User Initial Stack & Heap
 | 
			
		||||
                IF      :DEF:__MICROLIB
 | 
			
		||||
 | 
			
		||||
                EXPORT  __initial_sp
 | 
			
		||||
                EXPORT  __heap_base
 | 
			
		||||
                EXPORT  __heap_limit
 | 
			
		||||
 | 
			
		||||
                ELSE
 | 
			
		||||
 | 
			
		||||
                IMPORT  __use_two_region_memory
 | 
			
		||||
 | 
			
		||||
;/*
 | 
			
		||||
;  __user_setup_stackheap() returns the:
 | 
			
		||||
;     - heap base in r0 (if the program uses the heap)
 | 
			
		||||
;     - stack base in sp
 | 
			
		||||
;     - heap limit in r2 (if the program uses the heap and uses two-region memory).
 | 
			
		||||
; */
 | 
			
		||||
                EXPORT  __user_setup_stackheap
 | 
			
		||||
 | 
			
		||||
__user_setup_stackheap PROC
 | 
			
		||||
                LDR     R0, = __initial_sp
 | 
			
		||||
                MOV     SP, R0
 | 
			
		||||
				IF Heap_Size > 0
 | 
			
		||||
                LDR     R2, = __heap_limit
 | 
			
		||||
                LDR     R0, = __heap_base
 | 
			
		||||
				ELSE
 | 
			
		||||
                MOV     R0, #0
 | 
			
		||||
                MOV     R2, #0
 | 
			
		||||
                ENDIF
 | 
			
		||||
                BX      LR
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
;/*
 | 
			
		||||
;__user_initial_stackheap() returns the:
 | 
			
		||||
;   - heap base in r0
 | 
			
		||||
;   - stack base in r1, that is, the highest address in the stack region
 | 
			
		||||
;   - heap limit in r2
 | 
			
		||||
;   - stack limit in r3, that is, the lowest address in the stack region.
 | 
			
		||||
; */
 | 
			
		||||
;
 | 
			
		||||
;/* DEPRICATED
 | 
			
		||||
;                EXPORT  __user_initial_stackheap
 | 
			
		||||
;
 | 
			
		||||
;__user_initial_stackheap PROC
 | 
			
		||||
;                LDR     R0, =  Heap_Mem
 | 
			
		||||
;                LDR     R1, =(Stack_Mem + Stack_Size)
 | 
			
		||||
;                LDR     R2, = (Heap_Mem +  Heap_Size)
 | 
			
		||||
;                LDR     R3, = Stack_Mem
 | 
			
		||||
;                BX      LR
 | 
			
		||||
;                ENDP
 | 
			
		||||
; */
 | 
			
		||||
 | 
			
		||||
                ALIGN
 | 
			
		||||
 | 
			
		||||
                ENDIF
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                END
 | 
			
		||||
@ -0,0 +1,203 @@
 | 
			
		||||
/* File: startup_armv6-m.S
 | 
			
		||||
 * Purpose: startup file for armv6-m architecture devices.
 | 
			
		||||
 *          Should be used with ARMCLANG
 | 
			
		||||
 * Version: V2.00
 | 
			
		||||
 * Date: 16 November 2015
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/* Copyright (c) 2011 - 2015 ARM LIMITED
 | 
			
		||||
 | 
			
		||||
   All rights reserved.
 | 
			
		||||
   Redistribution and use in source and binary forms, with or without
 | 
			
		||||
   modification, are permitted provided that the following conditions are met:
 | 
			
		||||
   - Redistributions of source code must retain the above copyright
 | 
			
		||||
     notice, this list of conditions and the following disclaimer.
 | 
			
		||||
   - Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
     notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
     documentation and/or other materials provided with the distribution.
 | 
			
		||||
   - Neither the name of ARM nor the names of its contributors may be used
 | 
			
		||||
     to endorse or promote products derived from this software without
 | 
			
		||||
     specific prior written permission.
 | 
			
		||||
   *
 | 
			
		||||
   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
   ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
 | 
			
		||||
   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
   POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
   ---------------------------------------------------------------------------*/
 | 
			
		||||
/*
 | 
			
		||||
  ;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    .syntax unified
 | 
			
		||||
    .arch   armv6-m
 | 
			
		||||
 | 
			
		||||
/* .eabi_attribute Tag_ABI_align8_preserved,1    www.support.code-red-tech.com/CodeRedWiki/Preserve8 */
 | 
			
		||||
.eabi_attribute 25, 1   /* Tag_ABI_align_preserved */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  ;<h> Stack Configuration
 | 
			
		||||
  ;  <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
 | 
			
		||||
  ;</h>
 | 
			
		||||
*/
 | 
			
		||||
    .equ    Stack_Size, 0x00000400
 | 
			
		||||
 | 
			
		||||
    .section STACK, "w"
 | 
			
		||||
    .align  3
 | 
			
		||||
    .globl  __StackTop
 | 
			
		||||
    .globl  __StackLimit
 | 
			
		||||
__StackLimit:
 | 
			
		||||
    .space  Stack_Size
 | 
			
		||||
__StackTop:   /* formerly known as __initial_sp */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  ;<h> Heap Configuration
 | 
			
		||||
  ;  <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
 | 
			
		||||
  ;</h>
 | 
			
		||||
*/
 | 
			
		||||
    .equ    Heap_Size, 0x00000C00
 | 
			
		||||
 | 
			
		||||
    .section HEAP, "w"
 | 
			
		||||
    .align  3
 | 
			
		||||
    .globl  __HeapBase
 | 
			
		||||
    .globl  __HeapLimit
 | 
			
		||||
__HeapBase:
 | 
			
		||||
    .if Heap_Size
 | 
			
		||||
    .space  Heap_Size
 | 
			
		||||
    .endif
 | 
			
		||||
__HeapLimit:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    .section RESET, "x"
 | 
			
		||||
    .align  2
 | 
			
		||||
    .globl  __Vectors
 | 
			
		||||
    .globl  __Vectors_End
 | 
			
		||||
    .globl  __Vectors_Size
 | 
			
		||||
__Vectors:
 | 
			
		||||
    .long   __StackTop            /* Top of Stack */
 | 
			
		||||
    .long   Reset_Handler         /* Reset Handler */
 | 
			
		||||
    .long   NMI_Handler           /* NMI Handler */
 | 
			
		||||
    .long   HardFault_Handler     /* Hard Fault Handler */
 | 
			
		||||
    .long   0                     /* Reserved */
 | 
			
		||||
    .long   0                     /* Reserved */
 | 
			
		||||
    .long   0                     /* Reserved */
 | 
			
		||||
    .long   0                     /* Reserved */
 | 
			
		||||
    .long   0                     /* Reserved */
 | 
			
		||||
    .long   0                     /* Reserved */
 | 
			
		||||
    .long   0                     /* Reserved */
 | 
			
		||||
    .long   SVC_Handler           /* SVCall Handler */
 | 
			
		||||
    .long   0                     /* Reserved */
 | 
			
		||||
    .long   0                     /* Reserved */
 | 
			
		||||
    .long   PendSV_Handler        /* PendSV Handler */
 | 
			
		||||
    .long   SysTick_Handler       /* SysTick Handler */
 | 
			
		||||
__Vectors_End:
 | 
			
		||||
 | 
			
		||||
    .equ    __Vectors_Size, __Vectors_End - __Vectors
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    .text
 | 
			
		||||
    .thumb
 | 
			
		||||
    .align  2
 | 
			
		||||
 | 
			
		||||
    .globl  Reset_Handler
 | 
			
		||||
    .weak   Reset_Handler
 | 
			
		||||
    .type   Reset_Handler, %function
 | 
			
		||||
    .thumb_func
 | 
			
		||||
Reset_Handler:
 | 
			
		||||
    bl      SystemInit
 | 
			
		||||
    bl      __main
 | 
			
		||||
 | 
			
		||||
    .globl  NMI_Handler
 | 
			
		||||
    .weak   NMI_Handler
 | 
			
		||||
    .type   NMI_Handler, %function
 | 
			
		||||
    .thumb_func
 | 
			
		||||
NMI_Handler:
 | 
			
		||||
    bkpt    #0
 | 
			
		||||
    b       .
 | 
			
		||||
 | 
			
		||||
    .globl  HardFault_Handler
 | 
			
		||||
    .weak   HardFault_Handler
 | 
			
		||||
    .type   HardFault_Handler, %function
 | 
			
		||||
    .thumb_func
 | 
			
		||||
HardFault_Handler:
 | 
			
		||||
    bkpt    #0
 | 
			
		||||
    b       .
 | 
			
		||||
 | 
			
		||||
    .globl  SVC_Handler
 | 
			
		||||
    .weak   SVC_Handler
 | 
			
		||||
    .type   SVC_Handler, %function
 | 
			
		||||
    .thumb_func
 | 
			
		||||
SVC_Handler:
 | 
			
		||||
    bkpt    #0
 | 
			
		||||
    b       .
 | 
			
		||||
 | 
			
		||||
    .globl  PendSV_Handler
 | 
			
		||||
    .weak   PendSV_Handler
 | 
			
		||||
    .type   PendSV_Handler, %function
 | 
			
		||||
    .thumb_func
 | 
			
		||||
PendSV_Handler:
 | 
			
		||||
    bkpt    #0
 | 
			
		||||
    b       .
 | 
			
		||||
 | 
			
		||||
    .globl  SysTick_Handler
 | 
			
		||||
    .weak   SysTick_Handler
 | 
			
		||||
    .type   SysTick_Handler, %function
 | 
			
		||||
    .thumb_func
 | 
			
		||||
SysTick_Handler:
 | 
			
		||||
    bkpt    #0
 | 
			
		||||
    b       .
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    .global __use_two_region_memory
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  __user_setup_stackheap() returns the:
 | 
			
		||||
     - heap base in r0 (if the program uses the heap)
 | 
			
		||||
     - stack base in sp
 | 
			
		||||
     - heap limit in r2 (if the program uses the heap and uses two-region memory).
 | 
			
		||||
 */
 | 
			
		||||
    .globl  __user_setup_stackheap
 | 
			
		||||
    .type   __user_setup_stackheap, %function
 | 
			
		||||
    .thumb_func
 | 
			
		||||
__user_setup_stackheap:
 | 
			
		||||
    ldr     r0, =__StackTop
 | 
			
		||||
    mov     sp, r0
 | 
			
		||||
    .if Heap_Size
 | 
			
		||||
    ldr     r0, =__HeapBase
 | 
			
		||||
    ldr     r2, =__HeapLimit
 | 
			
		||||
    .else
 | 
			
		||||
    mov     r0, #0
 | 
			
		||||
    mov     r2, #0
 | 
			
		||||
    .endif
 | 
			
		||||
    bx      lr
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
__user_initial_stackheap() returns the:
 | 
			
		||||
   - heap base in r0
 | 
			
		||||
   - stack base in r1, that is, the highest address in the stack region
 | 
			
		||||
   - heap limit in r2
 | 
			
		||||
   - stack limit in r3, that is, the lowest address in the stack region.
 | 
			
		||||
 */
 | 
			
		||||
/* DEPRICATED
 | 
			
		||||
    .globl  __user_initial_stackheap
 | 
			
		||||
    .type   __user_initial_stackheap, %function
 | 
			
		||||
    .thumb_func
 | 
			
		||||
__user_initial_stackheap:
 | 
			
		||||
    ldr     r0, = __HeapBase
 | 
			
		||||
    ldr     r1, = __StackTop
 | 
			
		||||
    ldr     r2, = __HeapLimit
 | 
			
		||||
    ldr     r3, = __StackLimit
 | 
			
		||||
    bx      lr
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
    .end
 | 
			
		||||
@ -0,0 +1,235 @@
 | 
			
		||||
/* File: startup_armv7-m.S
 | 
			
		||||
 * Purpose: startup file for armv7-m architecture devices.
 | 
			
		||||
 *          Should be used with ARMCLANG
 | 
			
		||||
 * Version: V2.00
 | 
			
		||||
 * Date: 16 November 2015
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/* Copyright (c) 2011 - 2015 ARM LIMITED
 | 
			
		||||
 | 
			
		||||
   All rights reserved.
 | 
			
		||||
   Redistribution and use in source and binary forms, with or without
 | 
			
		||||
   modification, are permitted provided that the following conditions are met:
 | 
			
		||||
   - Redistributions of source code must retain the above copyright
 | 
			
		||||
     notice, this list of conditions and the following disclaimer.
 | 
			
		||||
   - Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
     notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
     documentation and/or other materials provided with the distribution.
 | 
			
		||||
   - Neither the name of ARM nor the names of its contributors may be used
 | 
			
		||||
     to endorse or promote products derived from this software without
 | 
			
		||||
     specific prior written permission.
 | 
			
		||||
   *
 | 
			
		||||
   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
   ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
 | 
			
		||||
   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
   POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
   ---------------------------------------------------------------------------*/
 | 
			
		||||
/*
 | 
			
		||||
  ;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    .syntax unified
 | 
			
		||||
    .arch   armv6-m
 | 
			
		||||
 | 
			
		||||
/* .eabi_attribute Tag_ABI_align8_preserved,1    www.support.code-red-tech.com/CodeRedWiki/Preserve8 */
 | 
			
		||||
.eabi_attribute 25, 1   /* Tag_ABI_align_preserved */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  ;<h> Stack Configuration
 | 
			
		||||
  ;  <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
 | 
			
		||||
  ;</h>
 | 
			
		||||
*/
 | 
			
		||||
    .equ    Stack_Size, 0x00000400
 | 
			
		||||
 | 
			
		||||
    .section STACK, "w"
 | 
			
		||||
    .align  3
 | 
			
		||||
    .globl  __StackTop
 | 
			
		||||
    .globl  __StackLimit
 | 
			
		||||
__StackLimit:
 | 
			
		||||
    .space  Stack_Size
 | 
			
		||||
__StackTop:   /* formerly known as __initial_sp */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  ;<h> Heap Configuration
 | 
			
		||||
  ;  <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
 | 
			
		||||
  ;</h>
 | 
			
		||||
*/
 | 
			
		||||
    .equ    Heap_Size, 0x00000C00
 | 
			
		||||
 | 
			
		||||
    .section HEAP, "w"
 | 
			
		||||
    .align  3
 | 
			
		||||
    .globl  __HeapBase
 | 
			
		||||
    .globl  __HeapLimit
 | 
			
		||||
__HeapBase:
 | 
			
		||||
    .if Heap_Size
 | 
			
		||||
    .space  Heap_Size
 | 
			
		||||
    .endif
 | 
			
		||||
__HeapLimit:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    .section RESET, "x"
 | 
			
		||||
    .align  2
 | 
			
		||||
    .globl  __Vectors
 | 
			
		||||
    .globl  __Vectors_End
 | 
			
		||||
    .globl  __Vectors_Size
 | 
			
		||||
__Vectors:
 | 
			
		||||
    .long   __StackTop            /* Top of Stack */
 | 
			
		||||
    .long   Reset_Handler         /* Reset Handler */
 | 
			
		||||
    .long   NMI_Handler           /* NMI Handler */
 | 
			
		||||
    .long   HardFault_Handler     /* Hard Fault Handler */
 | 
			
		||||
    .long   MemManage_Handler     /* MPU Fault Handler */
 | 
			
		||||
    .long   BusFault_Handler      /* Bus Fault Handler */
 | 
			
		||||
    .long   UsageFault_Handler    /* Usage Fault Handler */
 | 
			
		||||
    .long   0                     /* Reserved */
 | 
			
		||||
    .long   0                     /* Reserved */
 | 
			
		||||
    .long   0                     /* Reserved */
 | 
			
		||||
    .long   0                     /* Reserved */
 | 
			
		||||
    .long   SVC_Handler           /* SVCall Handler */
 | 
			
		||||
    .long   DebugMon_Handler      /* Debug Monitor Handler */
 | 
			
		||||
    .long   0                     /* Reserved */
 | 
			
		||||
    .long   PendSV_Handler        /* PendSV Handler */
 | 
			
		||||
    .long   SysTick_Handler       /* SysTick Handler */
 | 
			
		||||
__Vectors_End:
 | 
			
		||||
 | 
			
		||||
    .equ    __Vectors_Size, __Vectors_End - __Vectors
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    .text
 | 
			
		||||
    .thumb
 | 
			
		||||
    .align  2
 | 
			
		||||
 | 
			
		||||
    .globl  Reset_Handler
 | 
			
		||||
    .weak   Reset_Handler
 | 
			
		||||
    .type   Reset_Handler, %function
 | 
			
		||||
    .thumb_func
 | 
			
		||||
Reset_Handler:
 | 
			
		||||
    bl      SystemInit
 | 
			
		||||
    bl      __main
 | 
			
		||||
 | 
			
		||||
    .globl  NMI_Handler
 | 
			
		||||
    .weak   NMI_Handler
 | 
			
		||||
    .type   NMI_Handler, %function
 | 
			
		||||
    .thumb_func
 | 
			
		||||
NMI_Handler:
 | 
			
		||||
    bkpt    #0
 | 
			
		||||
    b       .
 | 
			
		||||
 | 
			
		||||
    .globl  HardFault_Handler
 | 
			
		||||
    .weak   HardFault_Handler
 | 
			
		||||
    .type   HardFault_Handler, %function
 | 
			
		||||
    .thumb_func
 | 
			
		||||
HardFault_Handler:
 | 
			
		||||
    bkpt    #0
 | 
			
		||||
    b       .
 | 
			
		||||
 | 
			
		||||
    .globl  MemManage_Handler
 | 
			
		||||
    .weak   MemManage_Handler
 | 
			
		||||
    .type   MemManage_Handler, %function
 | 
			
		||||
    .thumb_func
 | 
			
		||||
MemManage_Handler:
 | 
			
		||||
    bkpt    #0
 | 
			
		||||
    b       .
 | 
			
		||||
 | 
			
		||||
    .globl  BusFault_Handler
 | 
			
		||||
    .weak   BusFault_Handler
 | 
			
		||||
    .type   BusFault_Handler, %function
 | 
			
		||||
    .thumb_func
 | 
			
		||||
BusFault_Handler:
 | 
			
		||||
    bkpt    #0
 | 
			
		||||
    b       .
 | 
			
		||||
 | 
			
		||||
    .globl  UsageFault_Handler
 | 
			
		||||
    .weak   UsageFault_Handler
 | 
			
		||||
    .type   UsageFault_Handler, %function
 | 
			
		||||
    .thumb_func
 | 
			
		||||
UsageFault_Handler:
 | 
			
		||||
    bkpt    #0
 | 
			
		||||
    b       .
 | 
			
		||||
 | 
			
		||||
    .globl  SVC_Handler
 | 
			
		||||
    .weak   SVC_Handler
 | 
			
		||||
    .type   SVC_Handler, %function
 | 
			
		||||
    .thumb_func
 | 
			
		||||
SVC_Handler:
 | 
			
		||||
    bkpt    #0
 | 
			
		||||
    b       .
 | 
			
		||||
 | 
			
		||||
    .globl  DebugMon_Handler
 | 
			
		||||
    .weak   DebugMon_Handler
 | 
			
		||||
    .type   DebugMon_Handler, %function
 | 
			
		||||
    .thumb_func
 | 
			
		||||
DebugMon_Handler:
 | 
			
		||||
    bkpt    #0
 | 
			
		||||
    b       .
 | 
			
		||||
 | 
			
		||||
    .globl  PendSV_Handler
 | 
			
		||||
    .weak   PendSV_Handler
 | 
			
		||||
    .type   PendSV_Handler, %function
 | 
			
		||||
    .thumb_func
 | 
			
		||||
PendSV_Handler:
 | 
			
		||||
    bkpt    #0
 | 
			
		||||
    b       .
 | 
			
		||||
 | 
			
		||||
    .globl  SysTick_Handler
 | 
			
		||||
    .weak   SysTick_Handler
 | 
			
		||||
    .type   SysTick_Handler, %function
 | 
			
		||||
    .thumb_func
 | 
			
		||||
SysTick_Handler:
 | 
			
		||||
    bkpt    #0
 | 
			
		||||
    b       .
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    .global __use_two_region_memory
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  __user_setup_stackheap() returns the:
 | 
			
		||||
     - heap base in r0 (if the program uses the heap)
 | 
			
		||||
     - stack base in sp
 | 
			
		||||
     - heap limit in r2 (if the program uses the heap and uses two-region memory).
 | 
			
		||||
 */
 | 
			
		||||
    .globl  __user_setup_stackheap
 | 
			
		||||
    .type   __user_setup_stackheap, %function
 | 
			
		||||
    .thumb_func
 | 
			
		||||
__user_setup_stackheap:
 | 
			
		||||
    ldr     r0, =__StackTop
 | 
			
		||||
    mov     sp, r0
 | 
			
		||||
    .if Heap_Size
 | 
			
		||||
    ldr     r0, =__HeapBase
 | 
			
		||||
    ldr     r2, =__HeapLimit
 | 
			
		||||
    .else
 | 
			
		||||
    mov     r0, #0
 | 
			
		||||
    mov     r2, #0
 | 
			
		||||
    .endif
 | 
			
		||||
    bx      lr
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
__user_initial_stackheap() returns the:
 | 
			
		||||
   - heap base in r0
 | 
			
		||||
   - stack base in r1, that is, the highest address in the stack region
 | 
			
		||||
   - heap limit in r2
 | 
			
		||||
   - stack limit in r3, that is, the lowest address in the stack region.
 | 
			
		||||
 */
 | 
			
		||||
/* DEPRICATED
 | 
			
		||||
    .globl  __user_initial_stackheap
 | 
			
		||||
    .type   __user_initial_stackheap, %function
 | 
			
		||||
    .thumb_func
 | 
			
		||||
__user_initial_stackheap:
 | 
			
		||||
    ldr     r0, = __HeapBase
 | 
			
		||||
    ldr     r1, = __StackTop
 | 
			
		||||
    ldr     r2, = __HeapLimit
 | 
			
		||||
    ldr     r3, = __StackLimit
 | 
			
		||||
    bx      lr
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
    .end
 | 
			
		||||
@ -0,0 +1,106 @@
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
 * Name:    Retarget.c
 | 
			
		||||
 * Purpose: 'Retarget' layer for target-dependent low level functions
 | 
			
		||||
 * Note(s):
 | 
			
		||||
 *----------------------------------------------------------------------------
 | 
			
		||||
 * This file is part of the uVision/ARM development tools.
 | 
			
		||||
 * This software may only be used under the terms of a valid, current,
 | 
			
		||||
 * end user licence from KEIL for a compatible version of KEIL software
 | 
			
		||||
 * development tools. Nothing else gives you the right to use this software.
 | 
			
		||||
 *
 | 
			
		||||
 * This software is supplied "AS IS" without warranties of any kind.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2012 Keil - An ARM Company. All rights reserved.
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
int SER_PutChar (int c) {
 | 
			
		||||
 | 
			
		||||
  return (c);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SER_GetChar (void) {
 | 
			
		||||
 | 
			
		||||
  return (-1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*-- GCC - Newlib runtime support --------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
extern int  __HeapBase;
 | 
			
		||||
extern int  __HeapLimit;
 | 
			
		||||
 | 
			
		||||
int _open (const char * path, int flags, ...) 
 | 
			
		||||
{
 | 
			
		||||
  return (-1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int _close (int fd) 
 | 
			
		||||
{
 | 
			
		||||
  return (-1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int _lseek (int fd, int ptr, int dir) 
 | 
			
		||||
{
 | 
			
		||||
  return (0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int __attribute__((weak)) _fstat (int fd, struct stat * st) 
 | 
			
		||||
{
 | 
			
		||||
  memset (st, 0, sizeof (* st));
 | 
			
		||||
  st->st_mode = S_IFCHR;
 | 
			
		||||
  return (0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int _isatty (int fd) 
 | 
			
		||||
{
 | 
			
		||||
  return (1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int _read (int fd, char * ptr, int len) 
 | 
			
		||||
{
 | 
			
		||||
  char c;
 | 
			
		||||
  int  i;
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < len; i++) 
 | 
			
		||||
  {
 | 
			
		||||
    c = SER_GetChar();
 | 
			
		||||
    if (c == 0x0D) break;
 | 
			
		||||
    *ptr++ = c;
 | 
			
		||||
    SER_PutChar(c);
 | 
			
		||||
  }
 | 
			
		||||
  return (len - i);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int _write (int fd, char * ptr, int len) 
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < len; i++) SER_PutChar (*ptr++);
 | 
			
		||||
  return (i);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
caddr_t _sbrk (int incr) 
 | 
			
		||||
{
 | 
			
		||||
  static char * heap;
 | 
			
		||||
         char * prev_heap;
 | 
			
		||||
 | 
			
		||||
  if (heap == NULL) 
 | 
			
		||||
  {
 | 
			
		||||
    heap = (char *)&__HeapBase;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  prev_heap = heap;
 | 
			
		||||
 | 
			
		||||
  if ((heap + incr) > (char *)&__HeapLimit) 
 | 
			
		||||
  {
 | 
			
		||||
    errno = ENOMEM;
 | 
			
		||||
    return (caddr_t) -1;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  heap += incr;
 | 
			
		||||
 | 
			
		||||
  return (caddr_t) prev_heap;
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,263 @@
 | 
			
		||||
/* File: startup_armv6-m.S
 | 
			
		||||
 * Purpose: startup file for armv6-m architecture devices.
 | 
			
		||||
 *          Should be used with GCC for ARM Embedded Processors
 | 
			
		||||
 * Version: V2.00
 | 
			
		||||
 * Date: 16 November 2015
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/* Copyright (c) 2011 - 2015 ARM LIMITED
 | 
			
		||||
 | 
			
		||||
   All rights reserved.
 | 
			
		||||
   Redistribution and use in source and binary forms, with or without
 | 
			
		||||
   modification, are permitted provided that the following conditions are met:
 | 
			
		||||
   - Redistributions of source code must retain the above copyright
 | 
			
		||||
     notice, this list of conditions and the following disclaimer.
 | 
			
		||||
   - Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
     notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
     documentation and/or other materials provided with the distribution.
 | 
			
		||||
   - Neither the name of ARM nor the names of its contributors may be used
 | 
			
		||||
     to endorse or promote products derived from this software without
 | 
			
		||||
     specific prior written permission.
 | 
			
		||||
   *
 | 
			
		||||
   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
   ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
 | 
			
		||||
   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
   POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
   ---------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	.syntax	unified
 | 
			
		||||
	.arch	armv6-m
 | 
			
		||||
 | 
			
		||||
	.section .stack
 | 
			
		||||
	.align	3
 | 
			
		||||
#ifdef __STACK_SIZE
 | 
			
		||||
	.equ	Stack_Size, __STACK_SIZE
 | 
			
		||||
#else
 | 
			
		||||
	.equ	Stack_Size, 0x00000400
 | 
			
		||||
#endif
 | 
			
		||||
	.globl	__StackTop
 | 
			
		||||
	.globl	__StackLimit
 | 
			
		||||
__StackLimit:
 | 
			
		||||
	.space	Stack_Size
 | 
			
		||||
	.size	__StackLimit, . - __StackLimit
 | 
			
		||||
__StackTop:
 | 
			
		||||
	.size	__StackTop, . - __StackTop
 | 
			
		||||
 | 
			
		||||
	.section .heap
 | 
			
		||||
	.align	3
 | 
			
		||||
#ifdef __HEAP_SIZE
 | 
			
		||||
	.equ	Heap_Size, __HEAP_SIZE
 | 
			
		||||
#else
 | 
			
		||||
	.equ	Heap_Size, 0x00000C00
 | 
			
		||||
#endif
 | 
			
		||||
	.globl	__HeapBase
 | 
			
		||||
	.globl	__HeapLimit
 | 
			
		||||
__HeapBase:
 | 
			
		||||
	.if	Heap_Size
 | 
			
		||||
	.space	Heap_Size
 | 
			
		||||
	.endif
 | 
			
		||||
	.size	__HeapBase, . - __HeapBase
 | 
			
		||||
__HeapLimit:
 | 
			
		||||
	.size	__HeapLimit, . - __HeapLimit
 | 
			
		||||
 | 
			
		||||
	.section .vectors
 | 
			
		||||
	.align 2
 | 
			
		||||
	.globl	__Vectors
 | 
			
		||||
__Vectors:
 | 
			
		||||
	.long	__StackTop            /* Top of Stack */
 | 
			
		||||
	.long	Reset_Handler         /* Reset Handler */
 | 
			
		||||
	.long	NMI_Handler           /* NMI Handler */
 | 
			
		||||
	.long	HardFault_Handler     /* Hard Fault Handler */
 | 
			
		||||
	.long	0                     /* Reserved */
 | 
			
		||||
	.long	0                     /* Reserved */
 | 
			
		||||
	.long	0                     /* Reserved */
 | 
			
		||||
	.long	0                     /* Reserved */
 | 
			
		||||
	.long	0                     /* Reserved */
 | 
			
		||||
	.long	0                     /* Reserved */
 | 
			
		||||
	.long	0                     /* Reserved */
 | 
			
		||||
	.long	SVC_Handler           /* SVCall Handler */
 | 
			
		||||
	.long	0                     /* Reserved */
 | 
			
		||||
	.long	0                     /* Reserved */
 | 
			
		||||
	.long	PendSV_Handler        /* PendSV Handler */
 | 
			
		||||
	.long	SysTick_Handler       /* SysTick Handler */
 | 
			
		||||
 | 
			
		||||
	.size	__Vectors, . - __Vectors
 | 
			
		||||
 | 
			
		||||
	.text
 | 
			
		||||
	.thumb
 | 
			
		||||
	.thumb_func
 | 
			
		||||
	.align	1
 | 
			
		||||
	.globl	Reset_Handler
 | 
			
		||||
	.type	Reset_Handler, %function
 | 
			
		||||
Reset_Handler:
 | 
			
		||||
/*  Firstly it copies data from read only memory to RAM. There are two schemes
 | 
			
		||||
 *  to copy. One can copy more than one sections. Another can only copy
 | 
			
		||||
 *  one section.  The former scheme needs more instructions and read-only
 | 
			
		||||
 *  data to implement than the latter.
 | 
			
		||||
 *  Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes.  */
 | 
			
		||||
 | 
			
		||||
#ifdef __STARTUP_COPY_MULTIPLE
 | 
			
		||||
/*  Multiple sections scheme.
 | 
			
		||||
 *
 | 
			
		||||
 *  Between symbol address __copy_table_start__ and __copy_table_end__,
 | 
			
		||||
 *  there are array of triplets, each of which specify:
 | 
			
		||||
 *    offset 0: LMA of start of a section to copy from
 | 
			
		||||
 *    offset 4: VMA of start of a section to copy to
 | 
			
		||||
 *    offset 8: size of the section to copy. Must be multiply of 4
 | 
			
		||||
 *
 | 
			
		||||
 *  All addresses must be aligned to 4 bytes boundary.
 | 
			
		||||
 */
 | 
			
		||||
	ldr	r4, =__copy_table_start__
 | 
			
		||||
	ldr	r5, =__copy_table_end__
 | 
			
		||||
 | 
			
		||||
.L_loop0:
 | 
			
		||||
	cmp	r4, r5
 | 
			
		||||
	bge	.L_loop0_done
 | 
			
		||||
	ldr	r1, [r4]
 | 
			
		||||
	ldr	r2, [r4, #4]
 | 
			
		||||
	ldr	r3, [r4, #8]
 | 
			
		||||
 | 
			
		||||
.L_loop0_0:
 | 
			
		||||
	subs	r3, #4
 | 
			
		||||
	blt	.L_loop0_0_done
 | 
			
		||||
	ldr	r0, [r1, r3]
 | 
			
		||||
	str	r0, [r2, r3]
 | 
			
		||||
	b	.L_loop0_0
 | 
			
		||||
 | 
			
		||||
.L_loop0_0_done:
 | 
			
		||||
	adds	r4, #12
 | 
			
		||||
	b	.L_loop0
 | 
			
		||||
 | 
			
		||||
.L_loop0_done:
 | 
			
		||||
#else
 | 
			
		||||
/*  Single section scheme.
 | 
			
		||||
 *
 | 
			
		||||
 *  The ranges of copy from/to are specified by following symbols
 | 
			
		||||
 *    __etext: LMA of start of the section to copy from. Usually end of text
 | 
			
		||||
 *    __data_start__: VMA of start of the section to copy to
 | 
			
		||||
 *    __data_end__: VMA of end of the section to copy to
 | 
			
		||||
 *
 | 
			
		||||
 *  All addresses must be aligned to 4 bytes boundary.
 | 
			
		||||
 */
 | 
			
		||||
	ldr	r1, =__etext
 | 
			
		||||
	ldr	r2, =__data_start__
 | 
			
		||||
	ldr	r3, =__data_end__
 | 
			
		||||
 | 
			
		||||
	subs	r3, r2
 | 
			
		||||
	ble	.L_loop1_done
 | 
			
		||||
 | 
			
		||||
.L_loop1:
 | 
			
		||||
	subs	r3, #4
 | 
			
		||||
	ldr	r0, [r1,r3]
 | 
			
		||||
	str	r0, [r2,r3]
 | 
			
		||||
	bgt	.L_loop1
 | 
			
		||||
 | 
			
		||||
.L_loop1_done:
 | 
			
		||||
#endif /*__STARTUP_COPY_MULTIPLE */
 | 
			
		||||
 | 
			
		||||
/*  This part of work usually is done in C library startup code. Otherwise,
 | 
			
		||||
 *  define this macro to enable it in this startup.
 | 
			
		||||
 *
 | 
			
		||||
 *  There are two schemes too. One can clear multiple BSS sections. Another
 | 
			
		||||
 *  can only clear one section. The former is more size expensive than the
 | 
			
		||||
 *  latter.
 | 
			
		||||
 *
 | 
			
		||||
 *  Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former.
 | 
			
		||||
 *  Otherwise efine macro __STARTUP_CLEAR_BSS to choose the later.
 | 
			
		||||
 */
 | 
			
		||||
#ifdef __STARTUP_CLEAR_BSS_MULTIPLE
 | 
			
		||||
/*  Multiple sections scheme.
 | 
			
		||||
 *
 | 
			
		||||
 *  Between symbol address __copy_table_start__ and __copy_table_end__,
 | 
			
		||||
 *  there are array of tuples specifying:
 | 
			
		||||
 *    offset 0: Start of a BSS section
 | 
			
		||||
 *    offset 4: Size of this BSS section. Must be multiply of 4
 | 
			
		||||
 */
 | 
			
		||||
	ldr	r3, =__zero_table_start__
 | 
			
		||||
	ldr	r4, =__zero_table_end__
 | 
			
		||||
 | 
			
		||||
.L_loop2:
 | 
			
		||||
	cmp	r3, r4
 | 
			
		||||
	bge	.L_loop2_done
 | 
			
		||||
	ldr	r1, [r3]
 | 
			
		||||
	ldr	r2, [r3, #4]
 | 
			
		||||
	movs	r0, 0
 | 
			
		||||
 | 
			
		||||
.L_loop2_0:
 | 
			
		||||
	subs	r2, #4
 | 
			
		||||
	blt	.L_loop2_0_done
 | 
			
		||||
	str	r0, [r1, r2]
 | 
			
		||||
	b	.L_loop2_0
 | 
			
		||||
.L_loop2_0_done:
 | 
			
		||||
 | 
			
		||||
	adds	r3, #8
 | 
			
		||||
	b	.L_loop2
 | 
			
		||||
.L_loop2_done:
 | 
			
		||||
#elif defined (__STARTUP_CLEAR_BSS)
 | 
			
		||||
/*  Single BSS section scheme.
 | 
			
		||||
 *
 | 
			
		||||
 *  The BSS section is specified by following symbols
 | 
			
		||||
 *    __bss_start__: start of the BSS section.
 | 
			
		||||
 *    __bss_end__: end of the BSS section.
 | 
			
		||||
 *
 | 
			
		||||
 *  Both addresses must be aligned to 4 bytes boundary.
 | 
			
		||||
 */
 | 
			
		||||
	ldr	r1, =__bss_start__
 | 
			
		||||
	ldr	r2, =__bss_end__
 | 
			
		||||
 | 
			
		||||
	movs	r0, 0
 | 
			
		||||
 | 
			
		||||
	subs	r2, r1
 | 
			
		||||
	ble	.L_loop3_done
 | 
			
		||||
 | 
			
		||||
.L_loop3:
 | 
			
		||||
	subs	r2, #4
 | 
			
		||||
	str	r0, [r1, r2]
 | 
			
		||||
	bgt	.L_loop3
 | 
			
		||||
.L_loop3_done:
 | 
			
		||||
#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */
 | 
			
		||||
 | 
			
		||||
#ifndef __NO_SYSTEM_INIT
 | 
			
		||||
	bl	SystemInit
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef __START
 | 
			
		||||
#define __START _start
 | 
			
		||||
#endif
 | 
			
		||||
	bl	__START
 | 
			
		||||
 | 
			
		||||
	.pool
 | 
			
		||||
	.size	Reset_Handler, . - Reset_Handler
 | 
			
		||||
 | 
			
		||||
	.align	1
 | 
			
		||||
	.thumb_func
 | 
			
		||||
	.weak	Default_Handler
 | 
			
		||||
	.type	Default_Handler, %function
 | 
			
		||||
Default_Handler:
 | 
			
		||||
    bkpt #0
 | 
			
		||||
	b	.
 | 
			
		||||
	.size	Default_Handler, . - Default_Handler
 | 
			
		||||
 | 
			
		||||
/*    Macro to define default handlers. Default handler
 | 
			
		||||
 *    will be weak symbol and just dead loops. They can be
 | 
			
		||||
 *    overwritten by other handlers */
 | 
			
		||||
	.macro	def_irq_handler	handler_name
 | 
			
		||||
	.weak	\handler_name
 | 
			
		||||
	.set	\handler_name, Default_Handler
 | 
			
		||||
	.endm
 | 
			
		||||
 | 
			
		||||
	def_irq_handler	NMI_Handler
 | 
			
		||||
	def_irq_handler	HardFault_Handler
 | 
			
		||||
	def_irq_handler	SVC_Handler
 | 
			
		||||
	def_irq_handler	PendSV_Handler
 | 
			
		||||
	def_irq_handler	SysTick_Handler
 | 
			
		||||
 | 
			
		||||
	.end
 | 
			
		||||
@ -0,0 +1,257 @@
 | 
			
		||||
/* File: startup_armv7-m.S
 | 
			
		||||
 * Purpose: startup file for armv7-m architecture devices.
 | 
			
		||||
 *          Should be used with GCC for ARM Embedded Processors
 | 
			
		||||
 * Version: V2.00
 | 
			
		||||
 * Date: 16 November 2015
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/* Copyright (c) 2011 - 2015 ARM LIMITED
 | 
			
		||||
 | 
			
		||||
   All rights reserved.
 | 
			
		||||
   Redistribution and use in source and binary forms, with or without
 | 
			
		||||
   modification, are permitted provided that the following conditions are met:
 | 
			
		||||
   - Redistributions of source code must retain the above copyright
 | 
			
		||||
     notice, this list of conditions and the following disclaimer.
 | 
			
		||||
   - Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
     notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
     documentation and/or other materials provided with the distribution.
 | 
			
		||||
   - Neither the name of ARM nor the names of its contributors may be used
 | 
			
		||||
     to endorse or promote products derived from this software without
 | 
			
		||||
     specific prior written permission.
 | 
			
		||||
   *
 | 
			
		||||
   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
   ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
 | 
			
		||||
   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
   POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
   ---------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	.syntax	unified
 | 
			
		||||
	.arch	armv7-m
 | 
			
		||||
 | 
			
		||||
	.section .stack
 | 
			
		||||
	.align	3
 | 
			
		||||
#ifdef __STACK_SIZE
 | 
			
		||||
	.equ	Stack_Size, __STACK_SIZE
 | 
			
		||||
#else
 | 
			
		||||
	.equ	Stack_Size, 0x00000400
 | 
			
		||||
#endif
 | 
			
		||||
	.globl	__StackTop
 | 
			
		||||
	.globl	__StackLimit
 | 
			
		||||
__StackLimit:
 | 
			
		||||
	.space	Stack_Size
 | 
			
		||||
	.size	__StackLimit, . - __StackLimit
 | 
			
		||||
__StackTop:
 | 
			
		||||
	.size	__StackTop, . - __StackTop
 | 
			
		||||
 | 
			
		||||
	.section .heap
 | 
			
		||||
	.align	3
 | 
			
		||||
#ifdef __HEAP_SIZE
 | 
			
		||||
	.equ	Heap_Size, __HEAP_SIZE
 | 
			
		||||
#else
 | 
			
		||||
	.equ	Heap_Size, 0x00000C00
 | 
			
		||||
#endif
 | 
			
		||||
	.globl	__HeapBase
 | 
			
		||||
	.globl	__HeapLimit
 | 
			
		||||
__HeapBase:
 | 
			
		||||
	.if	Heap_Size
 | 
			
		||||
	.space	Heap_Size
 | 
			
		||||
	.endif
 | 
			
		||||
	.size	__HeapBase, . - __HeapBase
 | 
			
		||||
__HeapLimit:
 | 
			
		||||
	.size	__HeapLimit, . - __HeapLimit
 | 
			
		||||
 | 
			
		||||
	.section .vectors
 | 
			
		||||
	.align	2
 | 
			
		||||
	.globl	__Vectors
 | 
			
		||||
__Vectors:
 | 
			
		||||
	.long	__StackTop            /* Top of Stack */
 | 
			
		||||
	.long	Reset_Handler         /* Reset Handler */
 | 
			
		||||
	.long	NMI_Handler           /* NMI Handler */
 | 
			
		||||
	.long	HardFault_Handler     /* Hard Fault Handler */
 | 
			
		||||
	.long	MemManage_Handler     /* MPU Fault Handler */
 | 
			
		||||
	.long	BusFault_Handler      /* Bus Fault Handler */
 | 
			
		||||
	.long	UsageFault_Handler    /* Usage Fault Handler */
 | 
			
		||||
	.long	0                     /* Reserved */
 | 
			
		||||
	.long	0                     /* Reserved */
 | 
			
		||||
	.long	0                     /* Reserved */
 | 
			
		||||
	.long	0                     /* Reserved */
 | 
			
		||||
	.long	SVC_Handler           /* SVCall Handler */
 | 
			
		||||
	.long	DebugMon_Handler      /* Debug Monitor Handler */
 | 
			
		||||
	.long	0                     /* Reserved */
 | 
			
		||||
	.long	PendSV_Handler        /* PendSV Handler */
 | 
			
		||||
	.long	SysTick_Handler       /* SysTick Handler */
 | 
			
		||||
 | 
			
		||||
	.size	__Vectors, . - __Vectors
 | 
			
		||||
 | 
			
		||||
	.text
 | 
			
		||||
	.thumb
 | 
			
		||||
	.thumb_func
 | 
			
		||||
	.align	2
 | 
			
		||||
	.globl	Reset_Handler
 | 
			
		||||
	.type	Reset_Handler, %function
 | 
			
		||||
Reset_Handler:
 | 
			
		||||
/*  Firstly it copies data from read only memory to RAM. There are two schemes
 | 
			
		||||
 *  to copy. One can copy more than one sections. Another can only copy
 | 
			
		||||
 *  one section.  The former scheme needs more instructions and read-only
 | 
			
		||||
 *  data to implement than the latter.
 | 
			
		||||
 *  Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes.  */
 | 
			
		||||
 | 
			
		||||
#ifdef __STARTUP_COPY_MULTIPLE
 | 
			
		||||
/*  Multiple sections scheme.
 | 
			
		||||
 *
 | 
			
		||||
 *  Between symbol address __copy_table_start__ and __copy_table_end__,
 | 
			
		||||
 *  there are array of triplets, each of which specify:
 | 
			
		||||
 *    offset 0: LMA of start of a section to copy from
 | 
			
		||||
 *    offset 4: VMA of start of a section to copy to
 | 
			
		||||
 *    offset 8: size of the section to copy. Must be multiply of 4
 | 
			
		||||
 *
 | 
			
		||||
 *  All addresses must be aligned to 4 bytes boundary.
 | 
			
		||||
 */
 | 
			
		||||
	ldr	r4, =__copy_table_start__
 | 
			
		||||
	ldr	r5, =__copy_table_end__
 | 
			
		||||
 | 
			
		||||
.L_loop0:
 | 
			
		||||
	cmp	r4, r5
 | 
			
		||||
	bge	.L_loop0_done
 | 
			
		||||
	ldr	r1, [r4]
 | 
			
		||||
	ldr	r2, [r4, #4]
 | 
			
		||||
	ldr	r3, [r4, #8]
 | 
			
		||||
 | 
			
		||||
.L_loop0_0:
 | 
			
		||||
	subs	r3, #4
 | 
			
		||||
	ittt	ge
 | 
			
		||||
	ldrge	r0, [r1, r3]
 | 
			
		||||
	strge	r0, [r2, r3]
 | 
			
		||||
	bge	.L_loop0_0
 | 
			
		||||
 | 
			
		||||
	adds	r4, #12
 | 
			
		||||
	b	.L_loop0
 | 
			
		||||
 | 
			
		||||
.L_loop0_done:
 | 
			
		||||
#else
 | 
			
		||||
/*  Single section scheme.
 | 
			
		||||
 *
 | 
			
		||||
 *  The ranges of copy from/to are specified by following symbols
 | 
			
		||||
 *    __etext: LMA of start of the section to copy from. Usually end of text
 | 
			
		||||
 *    __data_start__: VMA of start of the section to copy to
 | 
			
		||||
 *    __data_end__: VMA of end of the section to copy to
 | 
			
		||||
 *
 | 
			
		||||
 *  All addresses must be aligned to 4 bytes boundary.
 | 
			
		||||
 */
 | 
			
		||||
	ldr	r1, =__etext
 | 
			
		||||
	ldr	r2, =__data_start__
 | 
			
		||||
	ldr	r3, =__data_end__
 | 
			
		||||
 | 
			
		||||
.L_loop1:
 | 
			
		||||
	cmp	r2, r3
 | 
			
		||||
	ittt	lt
 | 
			
		||||
	ldrlt	r0, [r1], #4
 | 
			
		||||
	strlt	r0, [r2], #4
 | 
			
		||||
	blt	.L_loop1
 | 
			
		||||
#endif /*__STARTUP_COPY_MULTIPLE */
 | 
			
		||||
 | 
			
		||||
/*  This part of work usually is done in C library startup code. Otherwise,
 | 
			
		||||
 *  define this macro to enable it in this startup.
 | 
			
		||||
 *
 | 
			
		||||
 *  There are two schemes too. One can clear multiple BSS sections. Another
 | 
			
		||||
 *  can only clear one section. The former is more size expensive than the
 | 
			
		||||
 *  latter.
 | 
			
		||||
 *
 | 
			
		||||
 *  Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former.
 | 
			
		||||
 *  Otherwise efine macro __STARTUP_CLEAR_BSS to choose the later.
 | 
			
		||||
 */
 | 
			
		||||
#ifdef __STARTUP_CLEAR_BSS_MULTIPLE
 | 
			
		||||
/*  Multiple sections scheme.
 | 
			
		||||
 *
 | 
			
		||||
 *  Between symbol address __copy_table_start__ and __copy_table_end__,
 | 
			
		||||
 *  there are array of tuples specifying:
 | 
			
		||||
 *    offset 0: Start of a BSS section
 | 
			
		||||
 *    offset 4: Size of this BSS section. Must be multiply of 4
 | 
			
		||||
 */
 | 
			
		||||
	ldr	r3, =__zero_table_start__
 | 
			
		||||
	ldr	r4, =__zero_table_end__
 | 
			
		||||
 | 
			
		||||
.L_loop2:
 | 
			
		||||
	cmp	r3, r4
 | 
			
		||||
	bge	.L_loop2_done
 | 
			
		||||
	ldr	r1, [r3]
 | 
			
		||||
	ldr	r2, [r3, #4]
 | 
			
		||||
	movs	r0, 0
 | 
			
		||||
 | 
			
		||||
.L_loop2_0:
 | 
			
		||||
	subs	r2, #4
 | 
			
		||||
	itt	ge
 | 
			
		||||
	strge	r0, [r1, r2]
 | 
			
		||||
	bge	.L_loop2_0
 | 
			
		||||
 | 
			
		||||
	adds	r3, #8
 | 
			
		||||
	b	.L_loop2
 | 
			
		||||
.L_loop2_done:
 | 
			
		||||
#elif defined (__STARTUP_CLEAR_BSS)
 | 
			
		||||
/*  Single BSS section scheme.
 | 
			
		||||
 *
 | 
			
		||||
 *  The BSS section is specified by following symbols
 | 
			
		||||
 *    __bss_start__: start of the BSS section.
 | 
			
		||||
 *    __bss_end__: end of the BSS section.
 | 
			
		||||
 *
 | 
			
		||||
 *  Both addresses must be aligned to 4 bytes boundary.
 | 
			
		||||
 */
 | 
			
		||||
	ldr	r1, =__bss_start__
 | 
			
		||||
	ldr	r2, =__bss_end__
 | 
			
		||||
 | 
			
		||||
	movs	r0, 0
 | 
			
		||||
.L_loop3:
 | 
			
		||||
	cmp	r1, r2
 | 
			
		||||
	itt	lt
 | 
			
		||||
	strlt	r0, [r1], #4
 | 
			
		||||
	blt	.L_loop3
 | 
			
		||||
#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */
 | 
			
		||||
 | 
			
		||||
#ifndef __NO_SYSTEM_INIT
 | 
			
		||||
	bl	SystemInit
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef __START
 | 
			
		||||
#define __START _start
 | 
			
		||||
#endif
 | 
			
		||||
	bl	__START
 | 
			
		||||
 | 
			
		||||
	.pool
 | 
			
		||||
	.size	Reset_Handler, . - Reset_Handler
 | 
			
		||||
 | 
			
		||||
	.align	1
 | 
			
		||||
	.thumb_func
 | 
			
		||||
	.weak	Default_Handler
 | 
			
		||||
	.type	Default_Handler, %function
 | 
			
		||||
Default_Handler:
 | 
			
		||||
    bkpt #0
 | 
			
		||||
	b	.
 | 
			
		||||
	.size	Default_Handler, . - Default_Handler
 | 
			
		||||
 | 
			
		||||
/*    Macro to define default handlers. Default handler
 | 
			
		||||
 *    will be weak symbol and just dead loops. They can be
 | 
			
		||||
 *    overwritten by other handlers */
 | 
			
		||||
	.macro	def_irq_handler	handler_name
 | 
			
		||||
	.weak	\handler_name
 | 
			
		||||
	.set	\handler_name, Default_Handler
 | 
			
		||||
	.endm
 | 
			
		||||
 | 
			
		||||
	def_irq_handler	NMI_Handler
 | 
			
		||||
	def_irq_handler	HardFault_Handler
 | 
			
		||||
	def_irq_handler	MemManage_Handler
 | 
			
		||||
	def_irq_handler	BusFault_Handler
 | 
			
		||||
	def_irq_handler	UsageFault_Handler
 | 
			
		||||
	def_irq_handler	SVC_Handler
 | 
			
		||||
	def_irq_handler	DebugMon_Handler
 | 
			
		||||
	def_irq_handler	PendSV_Handler
 | 
			
		||||
	def_irq_handler	SysTick_Handler
 | 
			
		||||
 | 
			
		||||
	.end
 | 
			
		||||
@ -0,0 +1,62 @@
 | 
			
		||||
 | 
			
		||||
#if defined (__CC_ARM)
 | 
			
		||||
  #if   (defined (ARM_MATH_CM0))
 | 
			
		||||
    #include "ARMCC\startup_armv6-m.s"
 | 
			
		||||
  #elif (defined (ARM_MATH_CM0P))
 | 
			
		||||
    #include "ARMCC\startup_armv6-m.s"
 | 
			
		||||
  #elif (defined (ARM_MATH_CM3))
 | 
			
		||||
    #include "ARMCC\startup_armv7-m.s"
 | 
			
		||||
  #elif (defined (ARM_MATH_CM4))
 | 
			
		||||
    #include "ARMCC\startup_armv7-m.s"
 | 
			
		||||
  #elif (defined (ARM_MATH_CM7))
 | 
			
		||||
    #include "ARMCC\startup_armv7-m.s"
 | 
			
		||||
  #elif (defined (ARM_MATH_ARMV8MBL))
 | 
			
		||||
    #include "ARMCC\startup_armv6-m.s"
 | 
			
		||||
  #elif (defined (ARM_MATH_ARMV8MML))
 | 
			
		||||
    #include "ARMCC\startup_armv7-m.s"
 | 
			
		||||
  #else
 | 
			
		||||
    #error "No appropriate startup file found!"
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
 | 
			
		||||
  #if   (defined (ARM_MATH_CM0))
 | 
			
		||||
    #include "ARMCLANG\startup_armv6-m.S"
 | 
			
		||||
  #elif (defined (ARM_MATH_CM0P))
 | 
			
		||||
    #include "ARMCLANG\startup_armv6-m.S"
 | 
			
		||||
  #elif (defined (ARM_MATH_CM3))
 | 
			
		||||
    #include "ARMCLANG\startup_armv7-m.S"
 | 
			
		||||
  #elif (defined (ARM_MATH_CM4))
 | 
			
		||||
    #include "ARMCLANG\startup_armv7-m.S"
 | 
			
		||||
  #elif (defined (ARM_MATH_CM7))
 | 
			
		||||
    #include "ARMCLANG\startup_armv7-m.S"
 | 
			
		||||
  #elif (defined (ARM_MATH_ARMV8MBL))
 | 
			
		||||
    #include "ARMCLANG\startup_armv6-m.S"
 | 
			
		||||
  #elif (defined (ARM_MATH_ARMV8MML))
 | 
			
		||||
    #include "ARMCLANG\startup_armv7-m.S"
 | 
			
		||||
  #else
 | 
			
		||||
    #error "No appropriate startup file found!"
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
#elif defined (__GNUC__)
 | 
			
		||||
  #if   (defined (ARM_MATH_CM0))
 | 
			
		||||
    #include "GCC\startup_armv6-m.S"
 | 
			
		||||
  #elif (defined (ARM_MATH_CM0P))
 | 
			
		||||
    #include "GCC\startup_armv6-m.S"
 | 
			
		||||
  #elif (defined (ARM_MATH_CM3))
 | 
			
		||||
    #include "GCC\startup_armv7-m.S"
 | 
			
		||||
  #elif (defined (ARM_MATH_CM4))
 | 
			
		||||
    #include "GCC\startup_armv7-m.S"
 | 
			
		||||
  #elif (defined (ARM_MATH_CM7))
 | 
			
		||||
    #include "GCC\startup_armv7-m.S"
 | 
			
		||||
  #elif (defined (ARM_MATH_ARMV8MBL))
 | 
			
		||||
    #include "GCC\startup_armv6-m.S"
 | 
			
		||||
  #elif (defined (ARM_MATH_ARMV8MML))
 | 
			
		||||
    #include "GCC\startup_armv7-m.S"
 | 
			
		||||
  #else
 | 
			
		||||
    #error "No appropriate startup file found!"
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
  #error "Compiler not supported!"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,56 @@
 | 
			
		||||
/**************************************************************************//**
 | 
			
		||||
 * @file     system_ARMCM0.c
 | 
			
		||||
 * @brief    CMSIS Device System Source File for
 | 
			
		||||
 *           ARMCM0 Device Series
 | 
			
		||||
 * @version  V5.00
 | 
			
		||||
 * @date     07. September 2016
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2009-2016 ARM Limited. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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 "ARMCM0.h"
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Define clocks
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#define  XTAL            ( 5000000UL)      /* Oscillator frequency */
 | 
			
		||||
 | 
			
		||||
#define  SYSTEM_CLOCK    (5U * XTAL)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock Variable
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
uint32_t SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock update function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemCoreClockUpdate (void)
 | 
			
		||||
{
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System initialization function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemInit (void)
 | 
			
		||||
{
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,82 @@
 | 
			
		||||
/**************************************************************************//**
 | 
			
		||||
 * @file     system_ARMCM23.c
 | 
			
		||||
 * @brief    CMSIS Device System Source File for
 | 
			
		||||
 *           ARMCM23 Device Series
 | 
			
		||||
 * @version  V5.00
 | 
			
		||||
 * @date     21. October 2016
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2009-2016 ARM Limited. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if defined (ARMCM23)
 | 
			
		||||
  #include "ARMCM23.h"
 | 
			
		||||
#elif defined (ARMCM23_TZ)
 | 
			
		||||
  #include "ARMCM23_TZ.h"
 | 
			
		||||
 | 
			
		||||
  #if defined (__ARM_FEATURE_CMSE) &&  (__ARM_FEATURE_CMSE == 3U)
 | 
			
		||||
    #include "partition_ARMCM23.h"
 | 
			
		||||
  #endif
 | 
			
		||||
#else
 | 
			
		||||
  #error device not specified!
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Define clocks
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#define  XTAL            ( 5000000UL)      /* Oscillator frequency */
 | 
			
		||||
 | 
			
		||||
#define  SYSTEM_CLOCK    (5U * XTAL)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Externals
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
 | 
			
		||||
  extern uint32_t __Vectors;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock Variable
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
uint32_t SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock update function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemCoreClockUpdate (void)
 | 
			
		||||
{
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System initialization function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemInit (void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
 | 
			
		||||
  SCB->VTOR = (uint32_t) &__Vectors;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
 | 
			
		||||
  TZ_SAU_Setup();
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,68 @@
 | 
			
		||||
/**************************************************************************//**
 | 
			
		||||
 * @file     system_ARMCM3.c
 | 
			
		||||
 * @brief    CMSIS Device System Source File for
 | 
			
		||||
 *           ARMCM3 Device Series
 | 
			
		||||
 * @version  V5.00
 | 
			
		||||
 * @date     07. September 2016
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2009-2016 ARM Limited. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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 "ARMCM3.h"
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Define clocks
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#define  XTAL            ( 5000000UL)      /* Oscillator frequency */
 | 
			
		||||
 | 
			
		||||
#define  SYSTEM_CLOCK    (5U * XTAL)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Externals
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
 | 
			
		||||
  extern uint32_t __Vectors;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock Variable
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
uint32_t SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock update function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemCoreClockUpdate (void)
 | 
			
		||||
{
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System initialization function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemInit (void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
 | 
			
		||||
  SCB->VTOR = (uint32_t) &__Vectors;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,99 @@
 | 
			
		||||
/**************************************************************************//**
 | 
			
		||||
 * @file     system_ARMCM33.c
 | 
			
		||||
 * @brief    CMSIS Device System Source File for
 | 
			
		||||
 *           ARMCM33 Device Series
 | 
			
		||||
 * @version  V5.00
 | 
			
		||||
 * @date     02. November 2016
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2009-2016 ARM Limited. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if defined (ARMCM33)
 | 
			
		||||
  #include "ARMCM33.h"
 | 
			
		||||
#elif defined (ARMCM33_TZ)
 | 
			
		||||
  #include "ARMCM33_TZ.h"
 | 
			
		||||
 | 
			
		||||
  #if defined (__ARM_FEATURE_CMSE) &&  (__ARM_FEATURE_CMSE == 3U)
 | 
			
		||||
    #include "partition_ARMCM33.h"
 | 
			
		||||
  #endif
 | 
			
		||||
#elif defined (ARMCM33_DSP_FP)
 | 
			
		||||
  #include "ARMCM33_DSP_FP.h"
 | 
			
		||||
#elif defined (ARMCM33_DSP_FP_TZ)
 | 
			
		||||
  #include "ARMCM33_DSP_FP_TZ.h"
 | 
			
		||||
 | 
			
		||||
  #if defined (__ARM_FEATURE_CMSE) &&  (__ARM_FEATURE_CMSE == 3U)
 | 
			
		||||
    #include "partition_ARMCM33.h"
 | 
			
		||||
  #endif
 | 
			
		||||
#else
 | 
			
		||||
  #error device not specified!
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Define clocks
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#define  XTAL            ( 5000000UL)      /* Oscillator frequency */
 | 
			
		||||
 | 
			
		||||
#define  SYSTEM_CLOCK    (5U * XTAL)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Externals
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
 | 
			
		||||
  extern uint32_t __Vectors;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock Variable
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
uint32_t SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock update function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemCoreClockUpdate (void)
 | 
			
		||||
{
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System initialization function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemInit (void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
 | 
			
		||||
  SCB->VTOR = (uint32_t) &__Vectors;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined (__FPU_USED) && (__FPU_USED == 1U)
 | 
			
		||||
  SCB->CPACR |= ((3U << 10U*2U) |           /* set CP10 Full Access */
 | 
			
		||||
                 (3U << 11U*2U)  );         /* set CP11 Full Access */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef UNALIGNED_SUPPORT_DISABLE
 | 
			
		||||
  SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
 | 
			
		||||
  TZ_SAU_Setup();
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,83 @@
 | 
			
		||||
/**************************************************************************//**
 | 
			
		||||
 * @file     system_ARMCM4.c
 | 
			
		||||
 * @brief    CMSIS Device System Source File for
 | 
			
		||||
 *           ARMCM4 Device Series
 | 
			
		||||
 * @version  V5.00
 | 
			
		||||
 * @date     07. September 2016
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2009-2016 ARM Limited. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if defined (ARMCM4)
 | 
			
		||||
  #include "ARMCM4.h"
 | 
			
		||||
#elif defined (ARMCM4_FP)
 | 
			
		||||
  #include "ARMCM4_FP.h"
 | 
			
		||||
#else
 | 
			
		||||
  #error device not specified!
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Define clocks
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#define  XTAL            ( 5000000UL)      /* Oscillator frequency */
 | 
			
		||||
 | 
			
		||||
#define  SYSTEM_CLOCK    (5U * XTAL)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Externals
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
 | 
			
		||||
  extern uint32_t __Vectors;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock Variable
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
uint32_t SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock update function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemCoreClockUpdate (void)
 | 
			
		||||
{
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System initialization function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemInit (void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
 | 
			
		||||
  SCB->VTOR = (uint32_t) &__Vectors;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined (__FPU_USED) && (__FPU_USED == 1U)
 | 
			
		||||
  SCB->CPACR |= ((3U << 10U*2U) |           /* set CP10 Full Access */
 | 
			
		||||
                 (3U << 11U*2U)  );         /* set CP11 Full Access */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef UNALIGNED_SUPPORT_DISABLE
 | 
			
		||||
  SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,85 @@
 | 
			
		||||
/**************************************************************************//**
 | 
			
		||||
 * @file     system_ARMCM7.c
 | 
			
		||||
 * @brief    CMSIS Device System Source File for
 | 
			
		||||
 *           ARMCM7 Device Series
 | 
			
		||||
 * @version  V5.00
 | 
			
		||||
 * @date     07. September 2016
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2009-2016 ARM Limited. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if defined (ARMCM7)
 | 
			
		||||
  #include "ARMCM7.h"
 | 
			
		||||
#elif defined (ARMCM7_SP)
 | 
			
		||||
  #include "ARMCM7_SP.h"
 | 
			
		||||
#elif defined (ARMCM7_DP)
 | 
			
		||||
  #include "ARMCM7_DP.h"
 | 
			
		||||
#else
 | 
			
		||||
  #error device not specified!
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Define clocks
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#define  XTAL            ( 5000000UL)      /* Oscillator frequency */
 | 
			
		||||
 | 
			
		||||
#define  SYSTEM_CLOCK    (5U * XTAL)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Externals
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
 | 
			
		||||
  extern uint32_t __Vectors;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock Variable
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
uint32_t SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock update function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemCoreClockUpdate (void)
 | 
			
		||||
{
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System initialization function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemInit (void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
 | 
			
		||||
  SCB->VTOR = (uint32_t) &__Vectors;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined (__FPU_USED) && (__FPU_USED == 1U)
 | 
			
		||||
  SCB->CPACR |= ((3U << 10U*2U) |           /* set CP10 Full Access */
 | 
			
		||||
                 (3U << 11U*2U)  );         /* set CP11 Full Access */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef UNALIGNED_SUPPORT_DISABLE
 | 
			
		||||
  SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,56 @@
 | 
			
		||||
/**************************************************************************//**
 | 
			
		||||
 * @file     system_ARMSC000.c
 | 
			
		||||
 * @brief    CMSIS Device System Source File for
 | 
			
		||||
 *           for ARMSC000 Device Series
 | 
			
		||||
 * @version  V5.00
 | 
			
		||||
 * @date     07. September 2016
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2009-2016 ARM Limited. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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 "ARMSC000.h"
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Define clocks
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#define  XTAL            ( 5000000UL)      /* Oscillator frequency */
 | 
			
		||||
 | 
			
		||||
#define  SYSTEM_CLOCK    (5U * XTAL)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock Variable
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
uint32_t SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock update function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemCoreClockUpdate (void)
 | 
			
		||||
{
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System initialization function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemInit (void)
 | 
			
		||||
{
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,72 @@
 | 
			
		||||
/**************************************************************************//**
 | 
			
		||||
 * @file     system_ARMSC300.c
 | 
			
		||||
 * @brief    CMSIS Device System Source File for
 | 
			
		||||
 *           ARMSC300 Device Series
 | 
			
		||||
 * @version  V5.00
 | 
			
		||||
 * @date     07. September 2016
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2009-2016 ARM Limited. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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 "ARMSC300.h"
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Define clocks
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#define  XTAL            ( 5000000UL)      /* Oscillator frequency */
 | 
			
		||||
 | 
			
		||||
#define  SYSTEM_CLOCK    (5U * XTAL)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Externals
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
 | 
			
		||||
  extern uint32_t __Vectors;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock Variable
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
uint32_t SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock update function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemCoreClockUpdate (void)
 | 
			
		||||
{
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System initialization function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemInit (void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
 | 
			
		||||
  SCB->VTOR = (uint32_t) &__Vectors;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef UNALIGNED_SUPPORT_DISABLE
 | 
			
		||||
  SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,76 @@
 | 
			
		||||
/**************************************************************************//**
 | 
			
		||||
 * @file     system_ARMv8MBL.c
 | 
			
		||||
 * @brief    CMSIS Device System Source File for
 | 
			
		||||
 *           ARMv8MBL Device Series
 | 
			
		||||
 * @version  V5.00
 | 
			
		||||
 * @date     07. September 2016
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2009-2016 ARM Limited. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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 "ARMv8MBL.h"
 | 
			
		||||
 | 
			
		||||
#if defined (__ARM_FEATURE_CMSE) &&  (__ARM_FEATURE_CMSE == 3U)
 | 
			
		||||
  #include "partition_ARMv8MBL.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Define clocks
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#define  XTAL            ( 5000000UL)      /* Oscillator frequency */
 | 
			
		||||
 | 
			
		||||
#define  SYSTEM_CLOCK    (5U * XTAL)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Externals
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
 | 
			
		||||
  extern uint32_t __Vectors;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock Variable
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
uint32_t SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock update function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemCoreClockUpdate (void)
 | 
			
		||||
{
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System initialization function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemInit (void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
 | 
			
		||||
  SCB->VTOR = (uint32_t) &__Vectors;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
 | 
			
		||||
  TZ_SAU_Setup();
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,99 @@
 | 
			
		||||
/**************************************************************************//**
 | 
			
		||||
 * @file     system_ARMv8MML.c
 | 
			
		||||
 * @brief    CMSIS Device System Source File for
 | 
			
		||||
 *           ARMv8MML Device Series
 | 
			
		||||
 * @version  V5.00
 | 
			
		||||
 * @date     02. November 2016
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2009-2016 ARM Limited. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if defined (ARMv8MML)
 | 
			
		||||
  #include "ARMv8MML.h"
 | 
			
		||||
#elif defined (ARMv8MML_DSP)
 | 
			
		||||
  #include "ARMv8MML_DSP.h"
 | 
			
		||||
#elif defined (ARMv8MML_SP)
 | 
			
		||||
  #include "ARMv8MML_SP.h"
 | 
			
		||||
#elif defined (ARMv8MML_DSP_SP)
 | 
			
		||||
  #include "ARMv8MML_DSP_SP.h"
 | 
			
		||||
#elif defined (ARMv8MML_DP)
 | 
			
		||||
  #include "ARMv8MML_DP.h"
 | 
			
		||||
#elif defined (ARMv8MML_DSP_DP)
 | 
			
		||||
  #include "ARMv8MML_DSP_DP.h"
 | 
			
		||||
#else
 | 
			
		||||
  #error device not specified!
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined (__ARM_FEATURE_CMSE) &&  (__ARM_FEATURE_CMSE == 3U)
 | 
			
		||||
  #include "partition_ARMv8MML.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Define clocks
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#define  XTAL            ( 5000000UL)      /* Oscillator frequency */
 | 
			
		||||
 | 
			
		||||
#define  SYSTEM_CLOCK    (5U * XTAL)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Externals
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
 | 
			
		||||
  extern uint32_t __Vectors;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock Variable
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
uint32_t SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock update function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemCoreClockUpdate (void)
 | 
			
		||||
{
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System initialization function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemInit (void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
 | 
			
		||||
  SCB->VTOR = (uint32_t) &__Vectors;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined (__FPU_USED) && (__FPU_USED == 1U)
 | 
			
		||||
  SCB->CPACR |= ((3U << 10U*2U) |           /* set CP10 Full Access */
 | 
			
		||||
                 (3U << 11U*2U)  );         /* set CP11 Full Access */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef UNALIGNED_SUPPORT_DISABLE
 | 
			
		||||
  SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
 | 
			
		||||
  TZ_SAU_Setup();
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,27 @@
 | 
			
		||||
 | 
			
		||||
#if   (defined (ARMCM0))
 | 
			
		||||
  #include "system_ARMCM0.c"
 | 
			
		||||
 | 
			
		||||
#elif (defined (ARMCM0P))
 | 
			
		||||
  #include "system_ARMCM0plus.c"
 | 
			
		||||
 | 
			
		||||
#elif (defined (ARMCM3))
 | 
			
		||||
  #include "system_ARMCM3.c"
 | 
			
		||||
 | 
			
		||||
#elif (defined (ARMCM4) || defined (ARMCM4_FP))
 | 
			
		||||
  #include "system_ARMCM4.c"
 | 
			
		||||
 | 
			
		||||
#elif (defined (ARMCM7) || defined (ARMCM7_SP) || defined (ARMCM7_DP))
 | 
			
		||||
  #include "system_ARMCM7.c"
 | 
			
		||||
 | 
			
		||||
#elif defined (ARMv8MBL)
 | 
			
		||||
  #include "system_ARMv8MBL.c"
 | 
			
		||||
 | 
			
		||||
#elif (defined (ARMv8MML)    || defined (ARMv8MML_DSP)    || \
 | 
			
		||||
       defined (ARMv8MML_SP) || defined (ARMv8MML_DSP_SP) || \
 | 
			
		||||
       defined (ARMv8MML_DP) || defined (ARMv8MML_DSP_DP)   )
 | 
			
		||||
  #include "system_ARMv8MML.c"
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
  #error "No appropriate system file found!"
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										30
									
								
								Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/all_tests.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/all_tests.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,30 @@
 | 
			
		||||
#include "jtest.h"
 | 
			
		||||
#include "basic_math_test_group.h"
 | 
			
		||||
#include "complex_math_test_group.h"
 | 
			
		||||
#include "controller_test_group.h"
 | 
			
		||||
#include "fast_math_test_group.h"
 | 
			
		||||
#include "filtering_test_group.h"
 | 
			
		||||
#include "matrix_test_group.h"
 | 
			
		||||
#include "statistics_test_group.h"
 | 
			
		||||
#include "support_test_group.h"
 | 
			
		||||
#include "transform_test_group.h"
 | 
			
		||||
#include "intrinsics_test_group.h"
 | 
			
		||||
 | 
			
		||||
JTEST_DEFINE_GROUP(all_tests)
 | 
			
		||||
{
 | 
			
		||||
    /*
 | 
			
		||||
      To skip a test, comment it out
 | 
			
		||||
    */
 | 
			
		||||
    JTEST_GROUP_CALL(basic_math_tests);
 | 
			
		||||
    JTEST_GROUP_CALL(complex_math_tests);
 | 
			
		||||
    JTEST_GROUP_CALL(controller_tests);
 | 
			
		||||
    JTEST_GROUP_CALL(fast_math_tests);
 | 
			
		||||
    JTEST_GROUP_CALL(filtering_tests);
 | 
			
		||||
    JTEST_GROUP_CALL(matrix_tests);
 | 
			
		||||
    JTEST_GROUP_CALL(statistics_tests);
 | 
			
		||||
    JTEST_GROUP_CALL(support_tests);
 | 
			
		||||
    JTEST_GROUP_CALL(transform_tests);
 | 
			
		||||
    JTEST_GROUP_CALL(intrinsics_tests);
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,32 @@
 | 
			
		||||
#include "jtest.h"
 | 
			
		||||
#include "basic_math_test_data.h"
 | 
			
		||||
#include "arr_desc.h"
 | 
			
		||||
#include "arm_math.h"           /* FUTs */
 | 
			
		||||
#include "ref.h"                /* Reference Functions */
 | 
			
		||||
#include "test_templates.h"
 | 
			
		||||
#include "basic_math_templates.h"
 | 
			
		||||
#include "type_abbrev.h"
 | 
			
		||||
 | 
			
		||||
#define JTEST_ARM_ABS_TEST(suffix)              \
 | 
			
		||||
    BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF1_BLK(   \
 | 
			
		||||
        abs,                                    \
 | 
			
		||||
        suffix,                                 \
 | 
			
		||||
        TYPE_FROM_ABBREV(suffix),               \
 | 
			
		||||
        TYPE_FROM_ABBREV(suffix))
 | 
			
		||||
    
 | 
			
		||||
JTEST_ARM_ABS_TEST(f32);
 | 
			
		||||
JTEST_ARM_ABS_TEST(q31);
 | 
			
		||||
JTEST_ARM_ABS_TEST(q15);
 | 
			
		||||
JTEST_ARM_ABS_TEST(q7 );
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Collect all tests in a group. */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
JTEST_DEFINE_GROUP(abs_tests)
 | 
			
		||||
{
 | 
			
		||||
    JTEST_TEST_CALL(arm_abs_f32_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_abs_q31_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_abs_q15_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_abs_q7_test);
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,33 @@
 | 
			
		||||
#include "jtest.h"
 | 
			
		||||
#include "basic_math_test_data.h"
 | 
			
		||||
#include "arr_desc.h"
 | 
			
		||||
#include "arm_math.h"           /* FUTs */
 | 
			
		||||
#include "ref.h"                /* Reference Functions */
 | 
			
		||||
#include "test_templates.h"
 | 
			
		||||
#include "basic_math_templates.h"
 | 
			
		||||
#include "type_abbrev.h"
 | 
			
		||||
 | 
			
		||||
#define JTEST_ARM_ADD_TEST(suffix)              \
 | 
			
		||||
    BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF2_BLK(   \
 | 
			
		||||
        add,                                    \
 | 
			
		||||
        suffix,                                 \
 | 
			
		||||
        TYPE_FROM_ABBREV(suffix),               \
 | 
			
		||||
        TYPE_FROM_ABBREV(suffix),               \
 | 
			
		||||
        BASIC_MATH_COMPARE_INTERFACE)
 | 
			
		||||
 | 
			
		||||
JTEST_ARM_ADD_TEST(f32);
 | 
			
		||||
JTEST_ARM_ADD_TEST(q31);
 | 
			
		||||
JTEST_ARM_ADD_TEST(q15);
 | 
			
		||||
JTEST_ARM_ADD_TEST(q7);
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Collect all tests in a group. */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
JTEST_DEFINE_GROUP(add_tests)
 | 
			
		||||
{
 | 
			
		||||
    JTEST_TEST_CALL(arm_add_f32_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_add_q31_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_add_q15_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_add_q7_test);
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,101 @@
 | 
			
		||||
#include "basic_math_test_data.h"
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Input/Output Buffers */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
ARR_DESC_DEFINE(BASIC_MATH_BIGGEST_INPUT_TYPE,
 | 
			
		||||
                basic_math_output_fut,
 | 
			
		||||
                BASIC_MATH_MAX_INPUT_ELEMENTS,
 | 
			
		||||
                CURLY(0));
 | 
			
		||||
 | 
			
		||||
ARR_DESC_DEFINE(BASIC_MATH_BIGGEST_INPUT_TYPE,
 | 
			
		||||
                basic_math_output_ref,
 | 
			
		||||
                BASIC_MATH_MAX_INPUT_ELEMENTS,
 | 
			
		||||
                CURLY(0));
 | 
			
		||||
 | 
			
		||||
BASIC_MATH_BIGGEST_INPUT_TYPE
 | 
			
		||||
basic_math_output_f32_ref[BASIC_MATH_MAX_INPUT_ELEMENTS];
 | 
			
		||||
 | 
			
		||||
BASIC_MATH_BIGGEST_INPUT_TYPE
 | 
			
		||||
basic_math_output_f32_fut[BASIC_MATH_MAX_INPUT_ELEMENTS];
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Block Sizes */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* 
 | 
			
		||||
  To change test parameter values add/remove values inside CURLY and update 
 | 
			
		||||
  the preceeding parameter to reflect the number of values inside CURLY. 
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
ARR_DESC_DEFINE(uint32_t,
 | 
			
		||||
                basic_math_block_sizes,
 | 
			
		||||
                4,
 | 
			
		||||
                CURLY( 2, 7, 15, 32));
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Numbers */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* 
 | 
			
		||||
  To change test parameter values add/remove values inside CURLY and update 
 | 
			
		||||
  the preceeding parameter to reflect the number of values inside CURLY. 
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
ARR_DESC_DEFINE(uint32_t,
 | 
			
		||||
                basic_math_elts,
 | 
			
		||||
                4,
 | 
			
		||||
                CURLY( 0, 1, 0x80000000, 0x7fffffff));
 | 
			
		||||
 | 
			
		||||
ARR_DESC_DEFINE(int8_t,
 | 
			
		||||
                basic_math_elts2,
 | 
			
		||||
                5,
 | 
			
		||||
                CURLY( 0, 3, -3, -7, 7));
 | 
			
		||||
 | 
			
		||||
ARR_DESC_DEFINE(float32_t,
 | 
			
		||||
                basic_math_eltsf,
 | 
			
		||||
                6,
 | 
			
		||||
                CURLY( 0.0f, 1.0f, 1.254001, -1.665584, -127.435646, 245.34634267));
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Test Data */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
ARR_DESC_DEFINE(float32_t,
 | 
			
		||||
                basic_math_f_32,
 | 
			
		||||
                32,
 | 
			
		||||
                CURLY(
 | 
			
		||||
                      -0.432565, -1.665584,  0.125332,  0.287676, -1.146471,
 | 
			
		||||
                       1.190915,  1.189164, -0.037633,  0.327292,  0.174639,
 | 
			
		||||
                      -0.186709,  0.725791, -0.588317,  2.183186, -0.136396,
 | 
			
		||||
                       0.113931,  1.066768,  0.059281, -0.095648, -0.832349,
 | 
			
		||||
                       0.294411, -1.336182,  0.714325,  1.623562, -0.691776,
 | 
			
		||||
                       0.857997,  1.254001, -1.593730, -1.440964,  0.571148,
 | 
			
		||||
                      -0.399886,  0.689997
 | 
			
		||||
                      ));
 | 
			
		||||
 | 
			
		||||
/* Alias the 32 element array with wrappers that end sooner. */
 | 
			
		||||
ARR_DESC_DEFINE_SUBSET(basic_math_f_15,
 | 
			
		||||
                       basic_math_f_32,
 | 
			
		||||
                       15);
 | 
			
		||||
 | 
			
		||||
ARR_DESC_DEFINE_SUBSET(basic_math_f_2,
 | 
			
		||||
                       basic_math_f_32,
 | 
			
		||||
                       2);
 | 
			
		||||
 | 
			
		||||
ARR_DESC_DEFINE(float32_t,
 | 
			
		||||
                basic_math_zeros,
 | 
			
		||||
                32,
 | 
			
		||||
                CURLY(0));
 | 
			
		||||
 | 
			
		||||
/* Aggregate all float datasets. */
 | 
			
		||||
ARR_DESC_DEFINE(ARR_DESC_t *,
 | 
			
		||||
                basic_math_f_all,
 | 
			
		||||
                4,
 | 
			
		||||
                CURLY(
 | 
			
		||||
                      &basic_math_zeros,
 | 
			
		||||
                      &basic_math_f_2,
 | 
			
		||||
                      &basic_math_f_15,
 | 
			
		||||
                      &basic_math_f_32
 | 
			
		||||
                      ));
 | 
			
		||||
@ -0,0 +1,17 @@
 | 
			
		||||
#include "jtest.h"
 | 
			
		||||
#include "basic_math_tests.h"
 | 
			
		||||
 | 
			
		||||
JTEST_DEFINE_GROUP(basic_math_tests)
 | 
			
		||||
{
 | 
			
		||||
    JTEST_GROUP_CALL(abs_tests);
 | 
			
		||||
    JTEST_GROUP_CALL(add_tests);
 | 
			
		||||
    JTEST_GROUP_CALL(dot_prod_tests);
 | 
			
		||||
    JTEST_GROUP_CALL(mult_tests);
 | 
			
		||||
    JTEST_GROUP_CALL(negate_tests);
 | 
			
		||||
    JTEST_GROUP_CALL(offset_tests);
 | 
			
		||||
    JTEST_GROUP_CALL(scale_tests); 
 | 
			
		||||
    JTEST_GROUP_CALL(shift_tests);
 | 
			
		||||
    JTEST_GROUP_CALL(sub_tests);
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,33 @@
 | 
			
		||||
#include "jtest.h"
 | 
			
		||||
#include "basic_math_test_data.h"
 | 
			
		||||
#include "arr_desc.h"
 | 
			
		||||
#include "arm_math.h"           /* FUTs */
 | 
			
		||||
#include "ref.h"                /* Reference Functions */
 | 
			
		||||
#include "test_templates.h"
 | 
			
		||||
#include "basic_math_templates.h"
 | 
			
		||||
#include "type_abbrev.h"
 | 
			
		||||
 | 
			
		||||
#define JTEST_ARM_DOT_PROD_TEST(suffix)         \
 | 
			
		||||
    BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF2_BLK(   \
 | 
			
		||||
        dot_prod,                               \
 | 
			
		||||
        suffix,                                 \
 | 
			
		||||
        TYPE_FROM_ABBREV(suffix),               \
 | 
			
		||||
        TYPE_FROM_ABBREV(suffix),               \
 | 
			
		||||
        BASIC_MATH_SNR_ELT1_COMPARE_INTERFACE)
 | 
			
		||||
 | 
			
		||||
JTEST_ARM_DOT_PROD_TEST(f32);
 | 
			
		||||
JTEST_ARM_DOT_PROD_TEST(q31);
 | 
			
		||||
JTEST_ARM_DOT_PROD_TEST(q15);
 | 
			
		||||
JTEST_ARM_DOT_PROD_TEST(q7);
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Collect all tests in a group. */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
JTEST_DEFINE_GROUP(dot_prod_tests)
 | 
			
		||||
{
 | 
			
		||||
    JTEST_TEST_CALL(arm_dot_prod_f32_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_dot_prod_q31_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_dot_prod_q15_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_dot_prod_q7_test);
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,33 @@
 | 
			
		||||
#include "jtest.h"
 | 
			
		||||
#include "basic_math_test_data.h"
 | 
			
		||||
#include "arr_desc.h"
 | 
			
		||||
#include "arm_math.h"           /* FUTs */
 | 
			
		||||
#include "ref.h"                /* Reference Functions */
 | 
			
		||||
#include "test_templates.h"
 | 
			
		||||
#include "basic_math_templates.h"
 | 
			
		||||
#include "type_abbrev.h"
 | 
			
		||||
 | 
			
		||||
#define JTEST_ARM_MULT_TEST(suffix, compare_interface)  \
 | 
			
		||||
    BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF2_BLK(   \
 | 
			
		||||
        mult,                                   \
 | 
			
		||||
        suffix,                                 \
 | 
			
		||||
        TYPE_FROM_ABBREV(suffix),               \
 | 
			
		||||
        TYPE_FROM_ABBREV(suffix),               \
 | 
			
		||||
        compare_interface)
 | 
			
		||||
 | 
			
		||||
JTEST_ARM_MULT_TEST(f32, BASIC_MATH_COMPARE_INTERFACE);
 | 
			
		||||
JTEST_ARM_MULT_TEST(q31, BASIC_MATH_SNR_COMPARE_INTERFACE);
 | 
			
		||||
JTEST_ARM_MULT_TEST(q15, BASIC_MATH_COMPARE_INTERFACE);
 | 
			
		||||
JTEST_ARM_MULT_TEST(q7 , BASIC_MATH_COMPARE_INTERFACE);
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Collect all tests in a group. */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
JTEST_DEFINE_GROUP(mult_tests)
 | 
			
		||||
{
 | 
			
		||||
    JTEST_TEST_CALL(arm_mult_f32_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_mult_q31_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_mult_q15_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_mult_q7_test);
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,32 @@
 | 
			
		||||
#include "jtest.h"
 | 
			
		||||
#include "basic_math_test_data.h"
 | 
			
		||||
#include "arr_desc.h"
 | 
			
		||||
#include "arm_math.h"           /* FUTs */
 | 
			
		||||
#include "ref.h"                /* Reference Functions */
 | 
			
		||||
#include "test_templates.h"
 | 
			
		||||
#include "basic_math_templates.h"
 | 
			
		||||
#include "type_abbrev.h"
 | 
			
		||||
 | 
			
		||||
#define JTEST_ARM_NEGATE_TEST(suffix)           \
 | 
			
		||||
    BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF1_BLK(   \
 | 
			
		||||
        negate,                                 \
 | 
			
		||||
        suffix,                                 \
 | 
			
		||||
        TYPE_FROM_ABBREV(suffix),               \
 | 
			
		||||
        TYPE_FROM_ABBREV(suffix))
 | 
			
		||||
    
 | 
			
		||||
JTEST_ARM_NEGATE_TEST(f32);
 | 
			
		||||
JTEST_ARM_NEGATE_TEST(q31);
 | 
			
		||||
JTEST_ARM_NEGATE_TEST(q15);
 | 
			
		||||
JTEST_ARM_NEGATE_TEST(q7);
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Collect all tests in a group. */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
JTEST_DEFINE_GROUP(negate_tests)
 | 
			
		||||
{
 | 
			
		||||
    JTEST_TEST_CALL(arm_negate_f32_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_negate_q31_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_negate_q15_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_negate_q7_test);
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,33 @@
 | 
			
		||||
#include "jtest.h"
 | 
			
		||||
#include "basic_math_test_data.h"
 | 
			
		||||
#include "arr_desc.h"
 | 
			
		||||
#include "arm_math.h"           /* FUTs */
 | 
			
		||||
#include "ref.h"                /* Reference Functions */
 | 
			
		||||
#include "test_templates.h"
 | 
			
		||||
#include "basic_math_templates.h"
 | 
			
		||||
#include "type_abbrev.h"
 | 
			
		||||
 | 
			
		||||
#define JTEST_ARM_OFFSET_TEST(suffix)               \
 | 
			
		||||
    BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF1_ELT1_BLK(  \
 | 
			
		||||
        offset,                                     \
 | 
			
		||||
        suffix,                                     \
 | 
			
		||||
        TYPE_FROM_ABBREV(suffix),                   \
 | 
			
		||||
        TYPE_FROM_ABBREV(suffix),                   \
 | 
			
		||||
        TYPE_FROM_ABBREV(suffix))
 | 
			
		||||
 | 
			
		||||
JTEST_ARM_OFFSET_TEST(f32);
 | 
			
		||||
JTEST_ARM_OFFSET_TEST(q31);
 | 
			
		||||
JTEST_ARM_OFFSET_TEST(q15);
 | 
			
		||||
JTEST_ARM_OFFSET_TEST(q7);
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Collect all tests in a group. */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
JTEST_DEFINE_GROUP(offset_tests)
 | 
			
		||||
{
 | 
			
		||||
    JTEST_TEST_CALL(arm_offset_f32_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_offset_q31_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_offset_q15_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_offset_q7_test);
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,52 @@
 | 
			
		||||
#include "jtest.h"
 | 
			
		||||
#include "basic_math_test_data.h"
 | 
			
		||||
#include "arr_desc.h"
 | 
			
		||||
#include "arm_math.h"           /* FUTs */
 | 
			
		||||
#include "ref.h"                /* Reference Functions */
 | 
			
		||||
#include "test_templates.h"
 | 
			
		||||
#include "basic_math_templates.h"
 | 
			
		||||
#include "type_abbrev.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define JTEST_ARM_SCALE_TEST(suffix)                \
 | 
			
		||||
    BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF1_ELT2_BLK(  \
 | 
			
		||||
        scale,                                      \
 | 
			
		||||
        suffix,                                     \
 | 
			
		||||
        TYPE_FROM_ABBREV(suffix),                   \
 | 
			
		||||
        TYPE_FROM_ABBREV(suffix), /*elt1_type*/     \
 | 
			
		||||
        int8_t, /*elt2_type*/                       \
 | 
			
		||||
        TYPE_FROM_ABBREV(suffix))
 | 
			
		||||
 | 
			
		||||
/* float32_t defined separately because it has less arguments */
 | 
			
		||||
JTEST_DEFINE_TEST(arm_scale_f32_test,
 | 
			
		||||
                  arm_scale_f32)
 | 
			
		||||
{
 | 
			
		||||
    TEST_TEMPLATE_BUF1_ELT1_BLK(
 | 
			
		||||
        basic_math_f_all,
 | 
			
		||||
        basic_math_eltsf,
 | 
			
		||||
        basic_math_block_sizes,
 | 
			
		||||
        float32_t,
 | 
			
		||||
        float32_t,
 | 
			
		||||
        float32_t,
 | 
			
		||||
        arm_scale_f32,
 | 
			
		||||
        ARM_scale_float_INPUT_INTERFACE,
 | 
			
		||||
        ref_scale_f32,
 | 
			
		||||
        REF_scale_float_INPUT_INTERFACE,
 | 
			
		||||
        BASIC_MATH_COMPARE_INTERFACE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
JTEST_ARM_SCALE_TEST(q31);
 | 
			
		||||
JTEST_ARM_SCALE_TEST(q15);
 | 
			
		||||
JTEST_ARM_SCALE_TEST(q7);
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Collect all tests in a group. */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
JTEST_DEFINE_GROUP(scale_tests)
 | 
			
		||||
{
 | 
			
		||||
    JTEST_TEST_CALL(arm_scale_f32_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_scale_q31_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_scale_q15_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_scale_q7_test);
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,31 @@
 | 
			
		||||
#include "jtest.h"
 | 
			
		||||
#include "basic_math_test_data.h"
 | 
			
		||||
#include "arr_desc.h"
 | 
			
		||||
#include "arm_math.h"           /* FUTs */
 | 
			
		||||
#include "ref.h"                /* Reference Functions */
 | 
			
		||||
#include "test_templates.h"
 | 
			
		||||
#include "basic_math_templates.h"
 | 
			
		||||
#include "type_abbrev.h"
 | 
			
		||||
 | 
			
		||||
#define JTEST_ARM_SHIFT_TEST(suffix)                \
 | 
			
		||||
    BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF1_ELT1_BLK(  \
 | 
			
		||||
        shift,                                      \
 | 
			
		||||
        suffix,                                     \
 | 
			
		||||
        TYPE_FROM_ABBREV(suffix),                   \
 | 
			
		||||
        int8_t, /*elt_type*/                        \
 | 
			
		||||
        TYPE_FROM_ABBREV(suffix))
 | 
			
		||||
 | 
			
		||||
JTEST_ARM_SHIFT_TEST(q31);
 | 
			
		||||
JTEST_ARM_SHIFT_TEST(q15);
 | 
			
		||||
JTEST_ARM_SHIFT_TEST(q7);
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Collect all tests in a group. */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
JTEST_DEFINE_GROUP(shift_tests)
 | 
			
		||||
{
 | 
			
		||||
    JTEST_TEST_CALL(arm_shift_q31_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_shift_q15_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_shift_q7_test);
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,33 @@
 | 
			
		||||
#include "jtest.h"
 | 
			
		||||
#include "basic_math_test_data.h"
 | 
			
		||||
#include "arr_desc.h"
 | 
			
		||||
#include "arm_math.h"           /* FUTs */
 | 
			
		||||
#include "ref.h"                /* Reference Functions */
 | 
			
		||||
#include "test_templates.h"
 | 
			
		||||
#include "basic_math_templates.h"
 | 
			
		||||
#include "type_abbrev.h"
 | 
			
		||||
 | 
			
		||||
#define JTEST_ARM_SUB_TEST(suffix)              \
 | 
			
		||||
    BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF2_BLK(   \
 | 
			
		||||
        sub,                                    \
 | 
			
		||||
        suffix,                                 \
 | 
			
		||||
        TYPE_FROM_ABBREV(suffix),               \
 | 
			
		||||
        TYPE_FROM_ABBREV(suffix),               \
 | 
			
		||||
        BASIC_MATH_COMPARE_INTERFACE)
 | 
			
		||||
 | 
			
		||||
JTEST_ARM_SUB_TEST(f32);
 | 
			
		||||
JTEST_ARM_SUB_TEST(q31);
 | 
			
		||||
JTEST_ARM_SUB_TEST(q15);
 | 
			
		||||
JTEST_ARM_SUB_TEST(q7);
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Collect all tests in a group. */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
JTEST_DEFINE_GROUP(sub_tests)
 | 
			
		||||
{
 | 
			
		||||
    JTEST_TEST_CALL(arm_sub_f32_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_sub_q31_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_sub_q15_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_sub_q7_test);
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,31 @@
 | 
			
		||||
#include "jtest.h"
 | 
			
		||||
#include "complex_math_test_data.h"
 | 
			
		||||
#include "arr_desc.h"
 | 
			
		||||
#include "arm_math.h"           /* FUTs */
 | 
			
		||||
#include "ref.h"                /* Reference Functions */
 | 
			
		||||
#include "test_templates.h"
 | 
			
		||||
#include "complex_math_templates.h"
 | 
			
		||||
#include "type_abbrev.h"
 | 
			
		||||
 | 
			
		||||
#define JTEST_ARM_CMPLX_CONJ_TEST(suffix)           \
 | 
			
		||||
    COMPLEX_MATH_DEFINE_TEST_TEMPLATE_BUF1_BLK(     \
 | 
			
		||||
        cmplx_conj,                                 \
 | 
			
		||||
        suffix,                                     \
 | 
			
		||||
        TYPE_FROM_ABBREV(suffix),                   \
 | 
			
		||||
        TYPE_FROM_ABBREV(suffix),                   \
 | 
			
		||||
        COMPLEX_MATH_SNR_COMPARE_CMPLX_INTERFACE)
 | 
			
		||||
 | 
			
		||||
JTEST_ARM_CMPLX_CONJ_TEST(f32);
 | 
			
		||||
JTEST_ARM_CMPLX_CONJ_TEST(q31);
 | 
			
		||||
JTEST_ARM_CMPLX_CONJ_TEST(q15);
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Collect all tests in a group. */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
JTEST_DEFINE_GROUP(cmplx_conj_tests)
 | 
			
		||||
{
 | 
			
		||||
    JTEST_TEST_CALL(arm_cmplx_conj_f32_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_cmplx_conj_q31_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_cmplx_conj_q15_test);
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,31 @@
 | 
			
		||||
#include "jtest.h"
 | 
			
		||||
#include "complex_math_test_data.h"
 | 
			
		||||
#include "arr_desc.h"
 | 
			
		||||
#include "arm_math.h"           /* FUTs */
 | 
			
		||||
#include "ref.h"                /* Reference Functions */
 | 
			
		||||
#include "test_templates.h"
 | 
			
		||||
#include "complex_math_templates.h"
 | 
			
		||||
#include "type_abbrev.h"
 | 
			
		||||
 | 
			
		||||
#define JTEST_ARM_CMPLX_DOT_PROD_TEST(suffix, comparison_interface) \
 | 
			
		||||
    COMPLEX_MATH_DEFINE_TEST_TEMPLATE_BUF2_BLK(                     \
 | 
			
		||||
        cmplx_dot_prod,                                             \
 | 
			
		||||
        suffix,                                                     \
 | 
			
		||||
        TYPE_FROM_ABBREV(suffix),                                   \
 | 
			
		||||
        TYPE_FROM_ABBREV(suffix),                                   \
 | 
			
		||||
        comparison_interface)
 | 
			
		||||
 | 
			
		||||
JTEST_ARM_CMPLX_DOT_PROD_TEST(f32, COMPLEX_MATH_SNR_COMPARE_SPLIT_INTERFACE);
 | 
			
		||||
JTEST_ARM_CMPLX_DOT_PROD_TEST(q31, COMPLEX_MATH_SNR_COMPARE_SPLIT_INTERFACE);
 | 
			
		||||
JTEST_ARM_CMPLX_DOT_PROD_TEST(q15, COMPLEX_MATH_SNR_COMPARE_SPLIT_INTERFACE);
 | 
			
		||||
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
/* Collect all tests in a group. */
 | 
			
		||||
/*--------------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
JTEST_DEFINE_GROUP(cmplx_dot_prod_tests)
 | 
			
		||||
{
 | 
			
		||||
    JTEST_TEST_CALL(arm_cmplx_dot_prod_f32_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_cmplx_dot_prod_q31_test);
 | 
			
		||||
    JTEST_TEST_CALL(arm_cmplx_dot_prod_q15_test);
 | 
			
		||||
}
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user