forked from Archive/PX4-Autopilot
Removed CMSIS.
This commit is contained in:
parent
425c5dea2a
commit
d02abf2cc0
|
@ -599,8 +599,7 @@ RECURSIVE = YES
|
||||||
# excluded from the INPUT source files. This way you can easily exclude a
|
# excluded from the INPUT source files. This way you can easily exclude a
|
||||||
# subdirectory from a directory tree whose root is specified with the INPUT tag.
|
# subdirectory from a directory tree whose root is specified with the INPUT tag.
|
||||||
|
|
||||||
EXCLUDE = ../src/lib/mathlib/CMSIS \
|
EXCLUDE = ../src/modules/attitude_estimator_ekf/codegen
|
||||||
../src/modules/attitude_estimator_ekf/codegen
|
|
||||||
|
|
||||||
# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
|
# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
|
||||||
# directories that are symbolic links (a Unix filesystem feature) are excluded
|
# directories that are symbolic links (a Unix filesystem feature) are excluded
|
||||||
|
|
|
@ -34,7 +34,6 @@ for fn in $(find src/examples \
|
||||||
-path './mavlink' -prune -o \
|
-path './mavlink' -prune -o \
|
||||||
-path './NuttX' -prune -o \
|
-path './NuttX' -prune -o \
|
||||||
-path './src/lib/eigen' -prune -o \
|
-path './src/lib/eigen' -prune -o \
|
||||||
-path './src/lib/mathlib/CMSIS' -prune -o \
|
|
||||||
-path './src/modules/uavcan/libuavcan' -prune -o \
|
-path './src/modules/uavcan/libuavcan' -prune -o \
|
||||||
-path './src/modules/attitude_estimator_ekf/codegen' -prune -o \
|
-path './src/modules/attitude_estimator_ekf/codegen' -prune -o \
|
||||||
-path './src/modules/ekf_att_pos_estimator' -prune -o \
|
-path './src/modules/ekf_att_pos_estimator' -prune -o \
|
||||||
|
|
|
@ -103,7 +103,6 @@ set(config_module_list
|
||||||
#
|
#
|
||||||
# Libraries
|
# Libraries
|
||||||
#
|
#
|
||||||
#lib/mathlib/CMSIS
|
|
||||||
lib/mathlib
|
lib/mathlib
|
||||||
lib/mathlib/math/filter
|
lib/mathlib/math/filter
|
||||||
lib/ecl
|
lib/ecl
|
||||||
|
@ -165,11 +164,9 @@ set(config_io_board
|
||||||
)
|
)
|
||||||
|
|
||||||
set(config_extra_libs
|
set(config_extra_libs
|
||||||
${CMAKE_SOURCE_DIR}/src/lib/mathlib/CMSIS/libarm_cortexM4lf_math.a
|
|
||||||
)
|
)
|
||||||
|
|
||||||
set(config_io_extra_libs
|
set(config_io_extra_libs
|
||||||
#${CMAKE_SOURCE_DIR}/src/lib/mathlib/CMSIS/libarm_cortexM3l_math.a
|
|
||||||
)
|
)
|
||||||
|
|
||||||
add_custom_target(sercon)
|
add_custom_target(sercon)
|
||||||
|
|
|
@ -112,7 +112,6 @@ set(config_module_list
|
||||||
#
|
#
|
||||||
# Libraries
|
# Libraries
|
||||||
#
|
#
|
||||||
#lib/mathlib/CMSIS
|
|
||||||
lib/mathlib
|
lib/mathlib
|
||||||
lib/mathlib/math/filter
|
lib/mathlib/math/filter
|
||||||
lib/ecl
|
lib/ecl
|
||||||
|
@ -174,13 +173,11 @@ set(config_io_board
|
||||||
)
|
)
|
||||||
|
|
||||||
set(config_extra_libs
|
set(config_extra_libs
|
||||||
${CMAKE_SOURCE_DIR}/src/lib/mathlib/CMSIS/libarm_cortexM4lf_math.a
|
|
||||||
uavcan
|
uavcan
|
||||||
uavcan_stm32_driver
|
uavcan_stm32_driver
|
||||||
)
|
)
|
||||||
|
|
||||||
set(config_io_extra_libs
|
set(config_io_extra_libs
|
||||||
#${CMAKE_SOURCE_DIR}/src/lib/mathlib/CMSIS/libarm_cortexM3l_math.a
|
|
||||||
)
|
)
|
||||||
|
|
||||||
add_custom_target(sercon)
|
add_custom_target(sercon)
|
||||||
|
|
|
@ -112,7 +112,6 @@ set(config_module_list
|
||||||
#
|
#
|
||||||
# Libraries
|
# Libraries
|
||||||
#
|
#
|
||||||
#lib/mathlib/CMSIS
|
|
||||||
lib/mathlib
|
lib/mathlib
|
||||||
lib/mathlib/math/filter
|
lib/mathlib/math/filter
|
||||||
lib/ecl
|
lib/ecl
|
||||||
|
@ -174,13 +173,11 @@ set(config_io_board
|
||||||
)
|
)
|
||||||
|
|
||||||
set(config_extra_libs
|
set(config_extra_libs
|
||||||
${CMAKE_SOURCE_DIR}/src/lib/mathlib/CMSIS/libarm_cortexM4lf_math.a
|
|
||||||
uavcan
|
uavcan
|
||||||
uavcan_stm32_driver
|
uavcan_stm32_driver
|
||||||
)
|
)
|
||||||
|
|
||||||
set(config_io_extra_libs
|
set(config_io_extra_libs
|
||||||
#${CMAKE_SOURCE_DIR}/src/lib/mathlib/CMSIS/libarm_cortexM3l_math.a
|
|
||||||
)
|
)
|
||||||
|
|
||||||
add_custom_target(sercon)
|
add_custom_target(sercon)
|
||||||
|
|
|
@ -111,7 +111,6 @@ set(config_module_list
|
||||||
#
|
#
|
||||||
# Libraries
|
# Libraries
|
||||||
#
|
#
|
||||||
#lib/mathlib/CMSIS
|
|
||||||
lib/mathlib
|
lib/mathlib
|
||||||
lib/mathlib/math/filter
|
lib/mathlib/math/filter
|
||||||
lib/rc
|
lib/rc
|
||||||
|
@ -170,13 +169,11 @@ set(config_extra_builtin_cmds
|
||||||
)
|
)
|
||||||
|
|
||||||
set(config_extra_libs
|
set(config_extra_libs
|
||||||
${CMAKE_SOURCE_DIR}/src/lib/mathlib/CMSIS/libarm_cortexM4lf_math.a
|
|
||||||
uavcan
|
uavcan
|
||||||
uavcan_stm32_driver
|
uavcan_stm32_driver
|
||||||
)
|
)
|
||||||
|
|
||||||
set(config_io_extra_libs
|
set(config_io_extra_libs
|
||||||
#${CMAKE_SOURCE_DIR}/src/lib/mathlib/CMSIS/libarm_cortexM3l_math.a
|
|
||||||
)
|
)
|
||||||
|
|
||||||
add_custom_target(sercon)
|
add_custom_target(sercon)
|
||||||
|
|
|
@ -1,264 +0,0 @@
|
||||||
/**************************************************************************//**
|
|
||||||
* @file ARMCM3.h
|
|
||||||
* @brief CMSIS Core Peripheral Access Layer Header File for
|
|
||||||
* ARMCM3 Device Series
|
|
||||||
* @version V1.07
|
|
||||||
* @date 30. January 2012
|
|
||||||
*
|
|
||||||
* @note
|
|
||||||
* Copyright (C) 2012 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* @par
|
|
||||||
* ARM Limited (ARM) is supplying this software for use with Cortex-M
|
|
||||||
* processor based microcontrollers. This file can be freely distributed
|
|
||||||
* within development tools that are supporting such ARM based processors.
|
|
||||||
*
|
|
||||||
* @par
|
|
||||||
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
|
|
||||||
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
|
|
||||||
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
#ifndef ARMCM3_H
|
|
||||||
#define ARMCM3_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------- Interrupt Number Definition ------------------------ */
|
|
||||||
|
|
||||||
typedef enum IRQn
|
|
||||||
{
|
|
||||||
/* ------------------- Cortex-M3 Processor Exceptions Numbers ------------------- */
|
|
||||||
NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */
|
|
||||||
HardFault_IRQn = -13, /*!< 3 HardFault Interrupt */
|
|
||||||
MemoryManagement_IRQn = -12, /*!< 4 Memory Management Interrupt */
|
|
||||||
BusFault_IRQn = -11, /*!< 5 Bus Fault Interrupt */
|
|
||||||
UsageFault_IRQn = -10, /*!< 6 Usage Fault Interrupt */
|
|
||||||
SVCall_IRQn = -5, /*!< 11 SV Call Interrupt */
|
|
||||||
DebugMonitor_IRQn = -4, /*!< 12 Debug Monitor Interrupt */
|
|
||||||
PendSV_IRQn = -2, /*!< 14 Pend SV Interrupt */
|
|
||||||
SysTick_IRQn = -1, /*!< 15 System Tick Interrupt */
|
|
||||||
|
|
||||||
/* ---------------------- ARMCM3 Specific Interrupt Numbers --------------------- */
|
|
||||||
WDT_IRQn = 0, /*!< Watchdog Timer Interrupt */
|
|
||||||
RTC_IRQn = 1, /*!< Real Time Clock Interrupt */
|
|
||||||
TIM0_IRQn = 2, /*!< Timer0 / Timer1 Interrupt */
|
|
||||||
TIM2_IRQn = 3, /*!< Timer2 / Timer3 Interrupt */
|
|
||||||
MCIA_IRQn = 4, /*!< MCIa Interrupt */
|
|
||||||
MCIB_IRQn = 5, /*!< MCIb Interrupt */
|
|
||||||
UART0_IRQn = 6, /*!< UART0 Interrupt */
|
|
||||||
UART1_IRQn = 7, /*!< UART1 Interrupt */
|
|
||||||
UART2_IRQn = 8, /*!< UART2 Interrupt */
|
|
||||||
UART4_IRQn = 9, /*!< UART4 Interrupt */
|
|
||||||
AACI_IRQn = 10, /*!< AACI / AC97 Interrupt */
|
|
||||||
CLCD_IRQn = 11, /*!< CLCD Combined Interrupt */
|
|
||||||
ENET_IRQn = 12, /*!< Ethernet Interrupt */
|
|
||||||
USBDC_IRQn = 13, /*!< USB Device Interrupt */
|
|
||||||
USBHC_IRQn = 14, /*!< USB Host Controller Interrupt */
|
|
||||||
CHLCD_IRQn = 15, /*!< Character LCD Interrupt */
|
|
||||||
FLEXRAY_IRQn = 16, /*!< Flexray Interrupt */
|
|
||||||
CAN_IRQn = 17, /*!< CAN Interrupt */
|
|
||||||
LIN_IRQn = 18, /*!< LIN Interrupt */
|
|
||||||
I2C_IRQn = 19, /*!< I2C ADC/DAC Interrupt */
|
|
||||||
CPU_CLCD_IRQn = 28, /*!< CPU CLCD Combined Interrupt */
|
|
||||||
UART3_IRQn = 30, /*!< UART3 Interrupt */
|
|
||||||
SPI_IRQn = 31, /*!< SPI Touchscreen Interrupt */
|
|
||||||
} IRQn_Type;
|
|
||||||
|
|
||||||
|
|
||||||
/* ================================================================================ */
|
|
||||||
/* ================ Processor and Core Peripheral Section ================ */
|
|
||||||
/* ================================================================================ */
|
|
||||||
|
|
||||||
/* -------- Configuration of the Cortex-M4 Processor and Core Peripherals ------- */
|
|
||||||
#define __CM3_REV 0x0201 /*!< Core revision r2p1 */
|
|
||||||
#define __MPU_PRESENT 1 /*!< MPU present or not */
|
|
||||||
#define __NVIC_PRIO_BITS 3 /*!< Number of Bits used for Priority Levels */
|
|
||||||
#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */
|
|
||||||
|
|
||||||
#include <core_cm3.h> /* Processor and core peripherals */
|
|
||||||
/* NuttX */
|
|
||||||
//#include "system_ARMCM3.h" /* System Header */
|
|
||||||
|
|
||||||
|
|
||||||
/* ================================================================================ */
|
|
||||||
/* ================ Device Specific Peripheral Section ================ */
|
|
||||||
/* ================================================================================ */
|
|
||||||
|
|
||||||
/* ------------------- Start of section using anonymous unions ------------------ */
|
|
||||||
#if defined(__CC_ARM)
|
|
||||||
#pragma push
|
|
||||||
#pragma anon_unions
|
|
||||||
#elif defined(__ICCARM__)
|
|
||||||
#pragma language=extended
|
|
||||||
#elif defined(__GNUC__)
|
|
||||||
/* anonymous unions are enabled by default */
|
|
||||||
#elif defined(__TMS470__)
|
|
||||||
/* anonymous unions are enabled by default */
|
|
||||||
#elif defined(__TASKING__)
|
|
||||||
#pragma warning 586
|
|
||||||
#else
|
|
||||||
#warning Not supported compiler type
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* ================================================================================ */
|
|
||||||
/* ================ CPU FPGA System (CPU_SYS) ================ */
|
|
||||||
/* ================================================================================ */
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
__I uint32_t ID; /* Offset: 0x000 (R/ ) Board and FPGA Identifier */
|
|
||||||
__IO uint32_t MEMCFG; /* Offset: 0x004 (R/W) Remap and Alias Memory Control */
|
|
||||||
__I uint32_t SW; /* Offset: 0x008 (R/ ) Switch States */
|
|
||||||
__IO uint32_t LED; /* Offset: 0x00C (R/W) LED Output States */
|
|
||||||
__I uint32_t TS; /* Offset: 0x010 (R/ ) Touchscreen Register */
|
|
||||||
__IO uint32_t CTRL1; /* Offset: 0x014 (R/W) Misc Control Functions */
|
|
||||||
uint32_t RESERVED0[2];
|
|
||||||
__IO uint32_t CLKCFG; /* Offset: 0x020 (R/W) System Clock Configuration */
|
|
||||||
__IO uint32_t WSCFG; /* Offset: 0x024 (R/W) Flash Waitstate Configuration */
|
|
||||||
__IO uint32_t CPUCFG; /* Offset: 0x028 (R/W) Processor Configuration */
|
|
||||||
uint32_t RESERVED1[3];
|
|
||||||
__IO uint32_t BASE; /* Offset: 0x038 (R/W) ROM Table base Address */
|
|
||||||
__IO uint32_t ID2; /* Offset: 0x03C (R/W) Secondary Identification Register */
|
|
||||||
} ARM_CPU_SYS_TypeDef;
|
|
||||||
|
|
||||||
|
|
||||||
/* ================================================================================ */
|
|
||||||
/* ================ DUT FPGA System (DUT_SYS) ================ */
|
|
||||||
/* ================================================================================ */
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
__I uint32_t ID; /* Offset: 0x000 (R/ ) Board and FPGA Identifier */
|
|
||||||
__IO uint32_t PERCFG; /* Offset: 0x004 (R/W) Peripheral Control Signals */
|
|
||||||
__I uint32_t SW; /* Offset: 0x008 (R/ ) Switch States */
|
|
||||||
__IO uint32_t LED; /* Offset: 0x00C (R/W) LED Output States */
|
|
||||||
__IO uint32_t SEG7; /* Offset: 0x010 (R/W) 7-segment LED Output States */
|
|
||||||
__I uint32_t CNT25MHz; /* Offset: 0x014 (R/ ) Freerunning counter incrementing at 25MHz */
|
|
||||||
__I uint32_t CNT100Hz; /* Offset: 0x018 (R/ ) Freerunning counter incrementing at 100Hz */
|
|
||||||
} ARM_DUT_SYS_TypeDef;
|
|
||||||
|
|
||||||
|
|
||||||
/* ================================================================================ */
|
|
||||||
/* ================ Timer (TIM) ================ */
|
|
||||||
/* ================================================================================ */
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
__IO uint32_t Timer1Load; /* Offset: 0x000 (R/W) Timer 1 Load */
|
|
||||||
__I uint32_t Timer1Value; /* Offset: 0x004 (R/ ) Timer 1 Counter Current Value */
|
|
||||||
__IO uint32_t Timer1Control; /* Offset: 0x008 (R/W) Timer 1 Control */
|
|
||||||
__O uint32_t Timer1IntClr; /* Offset: 0x00C ( /W) Timer 1 Interrupt Clear */
|
|
||||||
__I uint32_t Timer1RIS; /* Offset: 0x010 (R/ ) Timer 1 Raw Interrupt Status */
|
|
||||||
__I uint32_t Timer1MIS; /* Offset: 0x014 (R/ ) Timer 1 Masked Interrupt Status */
|
|
||||||
__IO uint32_t Timer1BGLoad; /* Offset: 0x018 (R/W) Background Load Register */
|
|
||||||
uint32_t RESERVED0[1];
|
|
||||||
__IO uint32_t Timer2Load; /* Offset: 0x020 (R/W) Timer 2 Load */
|
|
||||||
__I uint32_t Timer2Value; /* Offset: 0x024 (R/ ) Timer 2 Counter Current Value */
|
|
||||||
__IO uint32_t Timer2Control; /* Offset: 0x028 (R/W) Timer 2 Control */
|
|
||||||
__O uint32_t Timer2IntClr; /* Offset: 0x02C ( /W) Timer 2 Interrupt Clear */
|
|
||||||
__I uint32_t Timer2RIS; /* Offset: 0x030 (R/ ) Timer 2 Raw Interrupt Status */
|
|
||||||
__I uint32_t Timer2MIS; /* Offset: 0x034 (R/ ) Timer 2 Masked Interrupt Status */
|
|
||||||
__IO uint32_t Timer2BGLoad; /* Offset: 0x038 (R/W) Background Load Register */
|
|
||||||
} ARM_TIM_TypeDef;
|
|
||||||
|
|
||||||
|
|
||||||
/* ================================================================================ */
|
|
||||||
/* ============== Universal Asyncronous Receiver / Transmitter (UART) ============= */
|
|
||||||
/* ================================================================================ */
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
__IO uint32_t DR; /* Offset: 0x000 (R/W) Data */
|
|
||||||
union {
|
|
||||||
__I uint32_t RSR; /* Offset: 0x000 (R/ ) Receive Status */
|
|
||||||
__O uint32_t ECR; /* Offset: 0x000 ( /W) Error Clear */
|
|
||||||
};
|
|
||||||
uint32_t RESERVED0[4];
|
|
||||||
__IO uint32_t FR; /* Offset: 0x018 (R/W) Flags */
|
|
||||||
uint32_t RESERVED1[1];
|
|
||||||
__IO uint32_t ILPR; /* Offset: 0x020 (R/W) IrDA Low-power Counter */
|
|
||||||
__IO uint32_t IBRD; /* Offset: 0x024 (R/W) Interger Baud Rate */
|
|
||||||
__IO uint32_t FBRD; /* Offset: 0x028 (R/W) Fractional Baud Rate */
|
|
||||||
__IO uint32_t LCR_H; /* Offset: 0x02C (R/W) Line Control */
|
|
||||||
__IO uint32_t CR; /* Offset: 0x030 (R/W) Control */
|
|
||||||
__IO uint32_t IFLS; /* Offset: 0x034 (R/W) Interrupt FIFO Level Select */
|
|
||||||
__IO uint32_t IMSC; /* Offset: 0x038 (R/W) Interrupt Mask Set / Clear */
|
|
||||||
__IO uint32_t RIS; /* Offset: 0x03C (R/W) Raw Interrupt Status */
|
|
||||||
__IO uint32_t MIS; /* Offset: 0x040 (R/W) Masked Interrupt Status */
|
|
||||||
__O uint32_t ICR; /* Offset: 0x044 ( /W) Interrupt Clear */
|
|
||||||
__IO uint32_t DMACR; /* Offset: 0x048 (R/W) DMA Control */
|
|
||||||
} ARM_UART_TypeDef;
|
|
||||||
|
|
||||||
|
|
||||||
/* -------------------- End of section using anonymous unions ------------------- */
|
|
||||||
#if defined(__CC_ARM)
|
|
||||||
#pragma pop
|
|
||||||
#elif defined(__ICCARM__)
|
|
||||||
/* leave anonymous unions enabled */
|
|
||||||
#elif defined(__GNUC__)
|
|
||||||
/* anonymous unions are enabled by default */
|
|
||||||
#elif defined(__TMS470__)
|
|
||||||
/* anonymous unions are enabled by default */
|
|
||||||
#elif defined(__TASKING__)
|
|
||||||
#pragma warning restore
|
|
||||||
#else
|
|
||||||
#warning Not supported compiler type
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* ================================================================================ */
|
|
||||||
/* ================ Peripheral memory map ================ */
|
|
||||||
/* ================================================================================ */
|
|
||||||
/* -------------------------- CPU FPGA memory map ------------------------------- */
|
|
||||||
#define ARM_FLASH_BASE (0x00000000UL)
|
|
||||||
#define ARM_RAM_BASE (0x20000000UL)
|
|
||||||
#define ARM_RAM_FPGA_BASE (0x1EFF0000UL)
|
|
||||||
#define ARM_CPU_CFG_BASE (0xDFFF0000UL)
|
|
||||||
|
|
||||||
#define ARM_CPU_SYS_BASE (ARM_CPU_CFG_BASE + 0x00000)
|
|
||||||
#define ARM_UART3_BASE (ARM_CPU_CFG_BASE + 0x05000)
|
|
||||||
|
|
||||||
/* -------------------------- DUT FPGA memory map ------------------------------- */
|
|
||||||
#define ARM_APB_BASE (0x40000000UL)
|
|
||||||
#define ARM_AHB_BASE (0x4FF00000UL)
|
|
||||||
#define ARM_DMC_BASE (0x60000000UL)
|
|
||||||
#define ARM_SMC_BASE (0xA0000000UL)
|
|
||||||
|
|
||||||
#define ARM_TIM0_BASE (ARM_APB_BASE + 0x02000)
|
|
||||||
#define ARM_TIM2_BASE (ARM_APB_BASE + 0x03000)
|
|
||||||
#define ARM_DUT_SYS_BASE (ARM_APB_BASE + 0x04000)
|
|
||||||
#define ARM_UART0_BASE (ARM_APB_BASE + 0x06000)
|
|
||||||
#define ARM_UART1_BASE (ARM_APB_BASE + 0x07000)
|
|
||||||
#define ARM_UART2_BASE (ARM_APB_BASE + 0x08000)
|
|
||||||
#define ARM_UART4_BASE (ARM_APB_BASE + 0x09000)
|
|
||||||
|
|
||||||
|
|
||||||
/* ================================================================================ */
|
|
||||||
/* ================ Peripheral declaration ================ */
|
|
||||||
/* ================================================================================ */
|
|
||||||
/* -------------------------- CPU FPGA Peripherals ------------------------------ */
|
|
||||||
#define ARM_CPU_SYS ((ARM_CPU_SYS_TypeDef *) ARM_CPU_SYS_BASE)
|
|
||||||
#define ARM_UART3 (( ARM_UART_TypeDef *) ARM_UART3_BASE)
|
|
||||||
|
|
||||||
/* -------------------------- DUT FPGA Peripherals ------------------------------ */
|
|
||||||
#define ARM_DUT_SYS ((ARM_DUT_SYS_TypeDef *) ARM_DUT_SYS_BASE)
|
|
||||||
#define ARM_TIM0 (( ARM_TIM_TypeDef *) ARM_TIM0_BASE)
|
|
||||||
#define ARM_TIM2 (( ARM_TIM_TypeDef *) ARM_TIM2_BASE)
|
|
||||||
#define ARM_UART0 (( ARM_UART_TypeDef *) ARM_UART0_BASE)
|
|
||||||
#define ARM_UART1 (( ARM_UART_TypeDef *) ARM_UART1_BASE)
|
|
||||||
#define ARM_UART2 (( ARM_UART_TypeDef *) ARM_UART2_BASE)
|
|
||||||
#define ARM_UART4 (( ARM_UART_TypeDef *) ARM_UART4_BASE)
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* ARMCM3_H */
|
|
|
@ -1,265 +0,0 @@
|
||||||
/**************************************************************************//**
|
|
||||||
* @file ARMCM4.h
|
|
||||||
* @brief CMSIS Core Peripheral Access Layer Header File for
|
|
||||||
* ARMCM4 Device Series
|
|
||||||
* @version V1.07
|
|
||||||
* @date 30. January 2012
|
|
||||||
*
|
|
||||||
* @note
|
|
||||||
* Copyright (C) 2012 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* @par
|
|
||||||
* ARM Limited (ARM) is supplying this software for use with Cortex-M
|
|
||||||
* processor based microcontrollers. This file can be freely distributed
|
|
||||||
* within development tools that are supporting such ARM based processors.
|
|
||||||
*
|
|
||||||
* @par
|
|
||||||
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
|
|
||||||
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
|
|
||||||
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
#ifndef ARMCM4_H
|
|
||||||
#define ARMCM4_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------- Interrupt Number Definition ------------------------ */
|
|
||||||
|
|
||||||
typedef enum IRQn
|
|
||||||
{
|
|
||||||
/* ------------------- Cortex-M4 Processor Exceptions Numbers ------------------- */
|
|
||||||
NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */
|
|
||||||
HardFault_IRQn = -13, /*!< 3 HardFault Interrupt */
|
|
||||||
MemoryManagement_IRQn = -12, /*!< 4 Memory Management Interrupt */
|
|
||||||
BusFault_IRQn = -11, /*!< 5 Bus Fault Interrupt */
|
|
||||||
UsageFault_IRQn = -10, /*!< 6 Usage Fault Interrupt */
|
|
||||||
SVCall_IRQn = -5, /*!< 11 SV Call Interrupt */
|
|
||||||
DebugMonitor_IRQn = -4, /*!< 12 Debug Monitor Interrupt */
|
|
||||||
PendSV_IRQn = -2, /*!< 14 Pend SV Interrupt */
|
|
||||||
SysTick_IRQn = -1, /*!< 15 System Tick Interrupt */
|
|
||||||
|
|
||||||
/* ---------------------- ARMCM4 Specific Interrupt Numbers --------------------- */
|
|
||||||
WDT_IRQn = 0, /*!< Watchdog Timer Interrupt */
|
|
||||||
RTC_IRQn = 1, /*!< Real Time Clock Interrupt */
|
|
||||||
TIM0_IRQn = 2, /*!< Timer0 / Timer1 Interrupt */
|
|
||||||
TIM2_IRQn = 3, /*!< Timer2 / Timer3 Interrupt */
|
|
||||||
MCIA_IRQn = 4, /*!< MCIa Interrupt */
|
|
||||||
MCIB_IRQn = 5, /*!< MCIb Interrupt */
|
|
||||||
UART0_IRQn = 6, /*!< UART0 Interrupt */
|
|
||||||
UART1_IRQn = 7, /*!< UART1 Interrupt */
|
|
||||||
UART2_IRQn = 8, /*!< UART2 Interrupt */
|
|
||||||
UART4_IRQn = 9, /*!< UART4 Interrupt */
|
|
||||||
AACI_IRQn = 10, /*!< AACI / AC97 Interrupt */
|
|
||||||
CLCD_IRQn = 11, /*!< CLCD Combined Interrupt */
|
|
||||||
ENET_IRQn = 12, /*!< Ethernet Interrupt */
|
|
||||||
USBDC_IRQn = 13, /*!< USB Device Interrupt */
|
|
||||||
USBHC_IRQn = 14, /*!< USB Host Controller Interrupt */
|
|
||||||
CHLCD_IRQn = 15, /*!< Character LCD Interrupt */
|
|
||||||
FLEXRAY_IRQn = 16, /*!< Flexray Interrupt */
|
|
||||||
CAN_IRQn = 17, /*!< CAN Interrupt */
|
|
||||||
LIN_IRQn = 18, /*!< LIN Interrupt */
|
|
||||||
I2C_IRQn = 19, /*!< I2C ADC/DAC Interrupt */
|
|
||||||
CPU_CLCD_IRQn = 28, /*!< CPU CLCD Combined Interrupt */
|
|
||||||
UART3_IRQn = 30, /*!< UART3 Interrupt */
|
|
||||||
SPI_IRQn = 31, /*!< SPI Touchscreen Interrupt */
|
|
||||||
} IRQn_Type;
|
|
||||||
|
|
||||||
|
|
||||||
/* ================================================================================ */
|
|
||||||
/* ================ Processor and Core Peripheral Section ================ */
|
|
||||||
/* ================================================================================ */
|
|
||||||
|
|
||||||
/* -------- Configuration of the Cortex-M4 Processor and Core Peripherals ------- */
|
|
||||||
#define __CM4_REV 0x0001 /*!< Core revision r0p1 */
|
|
||||||
#define __MPU_PRESENT 1 /*!< MPU present or not */
|
|
||||||
#define __NVIC_PRIO_BITS 3 /*!< Number of Bits used for Priority Levels */
|
|
||||||
#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */
|
|
||||||
#define __FPU_PRESENT 1 /*!< FPU present or not */
|
|
||||||
|
|
||||||
#include <core_cm4.h> /* Processor and core peripherals */
|
|
||||||
/* NuttX */
|
|
||||||
//#include "system_ARMCM4.h" /* System Header */
|
|
||||||
|
|
||||||
|
|
||||||
/* ================================================================================ */
|
|
||||||
/* ================ Device Specific Peripheral Section ================ */
|
|
||||||
/* ================================================================================ */
|
|
||||||
|
|
||||||
/* ------------------- Start of section using anonymous unions ------------------ */
|
|
||||||
#if defined(__CC_ARM)
|
|
||||||
#pragma push
|
|
||||||
#pragma anon_unions
|
|
||||||
#elif defined(__ICCARM__)
|
|
||||||
#pragma language=extended
|
|
||||||
#elif defined(__GNUC__)
|
|
||||||
/* anonymous unions are enabled by default */
|
|
||||||
#elif defined(__TMS470__)
|
|
||||||
/* anonymous unions are enabled by default */
|
|
||||||
#elif defined(__TASKING__)
|
|
||||||
#pragma warning 586
|
|
||||||
#else
|
|
||||||
#warning Not supported compiler type
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* ================================================================================ */
|
|
||||||
/* ================ CPU FPGA System (CPU_SYS) ================ */
|
|
||||||
/* ================================================================================ */
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
__I uint32_t ID; /* Offset: 0x000 (R/ ) Board and FPGA Identifier */
|
|
||||||
__IO uint32_t MEMCFG; /* Offset: 0x004 (R/W) Remap and Alias Memory Control */
|
|
||||||
__I uint32_t SW; /* Offset: 0x008 (R/ ) Switch States */
|
|
||||||
__IO uint32_t LED; /* Offset: 0x00C (R/W) LED Output States */
|
|
||||||
__I uint32_t TS; /* Offset: 0x010 (R/ ) Touchscreen Register */
|
|
||||||
__IO uint32_t CTRL1; /* Offset: 0x014 (R/W) Misc Control Functions */
|
|
||||||
uint32_t RESERVED0[2];
|
|
||||||
__IO uint32_t CLKCFG; /* Offset: 0x020 (R/W) System Clock Configuration */
|
|
||||||
__IO uint32_t WSCFG; /* Offset: 0x024 (R/W) Flash Waitstate Configuration */
|
|
||||||
__IO uint32_t CPUCFG; /* Offset: 0x028 (R/W) Processor Configuration */
|
|
||||||
uint32_t RESERVED1[3];
|
|
||||||
__IO uint32_t BASE; /* Offset: 0x038 (R/W) ROM Table base Address */
|
|
||||||
__IO uint32_t ID2; /* Offset: 0x03C (R/W) Secondary Identification Register */
|
|
||||||
} ARM_CPU_SYS_TypeDef;
|
|
||||||
|
|
||||||
|
|
||||||
/* ================================================================================ */
|
|
||||||
/* ================ DUT FPGA System (DUT_SYS) ================ */
|
|
||||||
/* ================================================================================ */
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
__I uint32_t ID; /* Offset: 0x000 (R/ ) Board and FPGA Identifier */
|
|
||||||
__IO uint32_t PERCFG; /* Offset: 0x004 (R/W) Peripheral Control Signals */
|
|
||||||
__I uint32_t SW; /* Offset: 0x008 (R/ ) Switch States */
|
|
||||||
__IO uint32_t LED; /* Offset: 0x00C (R/W) LED Output States */
|
|
||||||
__IO uint32_t SEG7; /* Offset: 0x010 (R/W) 7-segment LED Output States */
|
|
||||||
__I uint32_t CNT25MHz; /* Offset: 0x014 (R/ ) Freerunning counter incrementing at 25MHz */
|
|
||||||
__I uint32_t CNT100Hz; /* Offset: 0x018 (R/ ) Freerunning counter incrementing at 100Hz */
|
|
||||||
} ARM_DUT_SYS_TypeDef;
|
|
||||||
|
|
||||||
|
|
||||||
/* ================================================================================ */
|
|
||||||
/* ================ Timer (TIM) ================ */
|
|
||||||
/* ================================================================================ */
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
__IO uint32_t Timer1Load; /* Offset: 0x000 (R/W) Timer 1 Load */
|
|
||||||
__I uint32_t Timer1Value; /* Offset: 0x004 (R/ ) Timer 1 Counter Current Value */
|
|
||||||
__IO uint32_t Timer1Control; /* Offset: 0x008 (R/W) Timer 1 Control */
|
|
||||||
__O uint32_t Timer1IntClr; /* Offset: 0x00C ( /W) Timer 1 Interrupt Clear */
|
|
||||||
__I uint32_t Timer1RIS; /* Offset: 0x010 (R/ ) Timer 1 Raw Interrupt Status */
|
|
||||||
__I uint32_t Timer1MIS; /* Offset: 0x014 (R/ ) Timer 1 Masked Interrupt Status */
|
|
||||||
__IO uint32_t Timer1BGLoad; /* Offset: 0x018 (R/W) Background Load Register */
|
|
||||||
uint32_t RESERVED0[1];
|
|
||||||
__IO uint32_t Timer2Load; /* Offset: 0x020 (R/W) Timer 2 Load */
|
|
||||||
__I uint32_t Timer2Value; /* Offset: 0x024 (R/ ) Timer 2 Counter Current Value */
|
|
||||||
__IO uint32_t Timer2Control; /* Offset: 0x028 (R/W) Timer 2 Control */
|
|
||||||
__O uint32_t Timer2IntClr; /* Offset: 0x02C ( /W) Timer 2 Interrupt Clear */
|
|
||||||
__I uint32_t Timer2RIS; /* Offset: 0x030 (R/ ) Timer 2 Raw Interrupt Status */
|
|
||||||
__I uint32_t Timer2MIS; /* Offset: 0x034 (R/ ) Timer 2 Masked Interrupt Status */
|
|
||||||
__IO uint32_t Timer2BGLoad; /* Offset: 0x038 (R/W) Background Load Register */
|
|
||||||
} ARM_TIM_TypeDef;
|
|
||||||
|
|
||||||
|
|
||||||
/* ================================================================================ */
|
|
||||||
/* ============== Universal Asyncronous Receiver / Transmitter (UART) ============= */
|
|
||||||
/* ================================================================================ */
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
__IO uint32_t DR; /* Offset: 0x000 (R/W) Data */
|
|
||||||
union {
|
|
||||||
__I uint32_t RSR; /* Offset: 0x000 (R/ ) Receive Status */
|
|
||||||
__O uint32_t ECR; /* Offset: 0x000 ( /W) Error Clear */
|
|
||||||
};
|
|
||||||
uint32_t RESERVED0[4];
|
|
||||||
__IO uint32_t FR; /* Offset: 0x018 (R/W) Flags */
|
|
||||||
uint32_t RESERVED1[1];
|
|
||||||
__IO uint32_t ILPR; /* Offset: 0x020 (R/W) IrDA Low-power Counter */
|
|
||||||
__IO uint32_t IBRD; /* Offset: 0x024 (R/W) Interger Baud Rate */
|
|
||||||
__IO uint32_t FBRD; /* Offset: 0x028 (R/W) Fractional Baud Rate */
|
|
||||||
__IO uint32_t LCR_H; /* Offset: 0x02C (R/W) Line Control */
|
|
||||||
__IO uint32_t CR; /* Offset: 0x030 (R/W) Control */
|
|
||||||
__IO uint32_t IFLS; /* Offset: 0x034 (R/W) Interrupt FIFO Level Select */
|
|
||||||
__IO uint32_t IMSC; /* Offset: 0x038 (R/W) Interrupt Mask Set / Clear */
|
|
||||||
__IO uint32_t RIS; /* Offset: 0x03C (R/W) Raw Interrupt Status */
|
|
||||||
__IO uint32_t MIS; /* Offset: 0x040 (R/W) Masked Interrupt Status */
|
|
||||||
__O uint32_t ICR; /* Offset: 0x044 ( /W) Interrupt Clear */
|
|
||||||
__IO uint32_t DMACR; /* Offset: 0x048 (R/W) DMA Control */
|
|
||||||
} ARM_UART_TypeDef;
|
|
||||||
|
|
||||||
|
|
||||||
/* -------------------- End of section using anonymous unions ------------------- */
|
|
||||||
#if defined(__CC_ARM)
|
|
||||||
#pragma pop
|
|
||||||
#elif defined(__ICCARM__)
|
|
||||||
/* leave anonymous unions enabled */
|
|
||||||
#elif defined(__GNUC__)
|
|
||||||
/* anonymous unions are enabled by default */
|
|
||||||
#elif defined(__TMS470__)
|
|
||||||
/* anonymous unions are enabled by default */
|
|
||||||
#elif defined(__TASKING__)
|
|
||||||
#pragma warning restore
|
|
||||||
#else
|
|
||||||
#warning Not supported compiler type
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* ================================================================================ */
|
|
||||||
/* ================ Peripheral memory map ================ */
|
|
||||||
/* ================================================================================ */
|
|
||||||
/* -------------------------- CPU FPGA memory map ------------------------------- */
|
|
||||||
#define ARM_FLASH_BASE (0x00000000UL)
|
|
||||||
#define ARM_RAM_BASE (0x20000000UL)
|
|
||||||
#define ARM_RAM_FPGA_BASE (0x1EFF0000UL)
|
|
||||||
#define ARM_CPU_CFG_BASE (0xDFFF0000UL)
|
|
||||||
|
|
||||||
#define ARM_CPU_SYS_BASE (ARM_CPU_CFG_BASE + 0x00000)
|
|
||||||
#define ARM_UART3_BASE (ARM_CPU_CFG_BASE + 0x05000)
|
|
||||||
|
|
||||||
/* -------------------------- DUT FPGA memory map ------------------------------- */
|
|
||||||
#define ARM_APB_BASE (0x40000000UL)
|
|
||||||
#define ARM_AHB_BASE (0x4FF00000UL)
|
|
||||||
#define ARM_DMC_BASE (0x60000000UL)
|
|
||||||
#define ARM_SMC_BASE (0xA0000000UL)
|
|
||||||
|
|
||||||
#define ARM_TIM0_BASE (ARM_APB_BASE + 0x02000)
|
|
||||||
#define ARM_TIM2_BASE (ARM_APB_BASE + 0x03000)
|
|
||||||
#define ARM_DUT_SYS_BASE (ARM_APB_BASE + 0x04000)
|
|
||||||
#define ARM_UART0_BASE (ARM_APB_BASE + 0x06000)
|
|
||||||
#define ARM_UART1_BASE (ARM_APB_BASE + 0x07000)
|
|
||||||
#define ARM_UART2_BASE (ARM_APB_BASE + 0x08000)
|
|
||||||
#define ARM_UART4_BASE (ARM_APB_BASE + 0x09000)
|
|
||||||
|
|
||||||
|
|
||||||
/* ================================================================================ */
|
|
||||||
/* ================ Peripheral declaration ================ */
|
|
||||||
/* ================================================================================ */
|
|
||||||
/* -------------------------- CPU FPGA Peripherals ------------------------------ */
|
|
||||||
#define ARM_CPU_SYS ((ARM_CPU_SYS_TypeDef *) ARM_CPU_SYS_BASE)
|
|
||||||
#define ARM_UART3 (( ARM_UART_TypeDef *) ARM_UART3_BASE)
|
|
||||||
|
|
||||||
/* -------------------------- DUT FPGA Peripherals ------------------------------ */
|
|
||||||
#define ARM_DUT_SYS ((ARM_DUT_SYS_TypeDef *) ARM_DUT_SYS_BASE)
|
|
||||||
#define ARM_TIM0 (( ARM_TIM_TypeDef *) ARM_TIM0_BASE)
|
|
||||||
#define ARM_TIM2 (( ARM_TIM_TypeDef *) ARM_TIM2_BASE)
|
|
||||||
#define ARM_UART0 (( ARM_UART_TypeDef *) ARM_UART0_BASE)
|
|
||||||
#define ARM_UART1 (( ARM_UART_TypeDef *) ARM_UART1_BASE)
|
|
||||||
#define ARM_UART2 (( ARM_UART_TypeDef *) ARM_UART2_BASE)
|
|
||||||
#define ARM_UART4 (( ARM_UART_TypeDef *) ARM_UART4_BASE)
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* ARMCM4_H */
|
|
|
@ -1,93 +0,0 @@
|
||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010-2013 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 17. January 2013
|
|
||||||
* $Revision: V1.4.1
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_common_tables.h
|
|
||||||
*
|
|
||||||
* Description: This file has extern declaration for common tables like Bitreverse, reciprocal etc which are used across different functions
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3
|
|
||||||
*
|
|
||||||
* 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 LIMITED 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 THE
|
|
||||||
* COPYRIGHT OWNER OR 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.
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#ifndef _ARM_COMMON_TABLES_H
|
|
||||||
#define _ARM_COMMON_TABLES_H
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
|
|
||||||
extern const uint16_t armBitRevTable[1024];
|
|
||||||
extern const q15_t armRecipTableQ15[64];
|
|
||||||
extern const q31_t armRecipTableQ31[64];
|
|
||||||
extern const q31_t realCoefAQ31[1024];
|
|
||||||
extern const q31_t realCoefBQ31[1024];
|
|
||||||
extern const float32_t twiddleCoef_16[32];
|
|
||||||
extern const float32_t twiddleCoef_32[64];
|
|
||||||
extern const float32_t twiddleCoef_64[128];
|
|
||||||
extern const float32_t twiddleCoef_128[256];
|
|
||||||
extern const float32_t twiddleCoef_256[512];
|
|
||||||
extern const float32_t twiddleCoef_512[1024];
|
|
||||||
extern const float32_t twiddleCoef_1024[2048];
|
|
||||||
extern const float32_t twiddleCoef_2048[4096];
|
|
||||||
extern const float32_t twiddleCoef_4096[8192];
|
|
||||||
#define twiddleCoef twiddleCoef_4096
|
|
||||||
extern const q31_t twiddleCoefQ31[6144];
|
|
||||||
extern const q15_t twiddleCoefQ15[6144];
|
|
||||||
extern const float32_t twiddleCoef_rfft_32[32];
|
|
||||||
extern const float32_t twiddleCoef_rfft_64[64];
|
|
||||||
extern const float32_t twiddleCoef_rfft_128[128];
|
|
||||||
extern const float32_t twiddleCoef_rfft_256[256];
|
|
||||||
extern const float32_t twiddleCoef_rfft_512[512];
|
|
||||||
extern const float32_t twiddleCoef_rfft_1024[1024];
|
|
||||||
extern const float32_t twiddleCoef_rfft_2048[2048];
|
|
||||||
extern const float32_t twiddleCoef_rfft_4096[4096];
|
|
||||||
|
|
||||||
|
|
||||||
#define ARMBITREVINDEXTABLE__16_TABLE_LENGTH ((uint16_t)20 )
|
|
||||||
#define ARMBITREVINDEXTABLE__32_TABLE_LENGTH ((uint16_t)48 )
|
|
||||||
#define ARMBITREVINDEXTABLE__64_TABLE_LENGTH ((uint16_t)56 )
|
|
||||||
#define ARMBITREVINDEXTABLE_128_TABLE_LENGTH ((uint16_t)208 )
|
|
||||||
#define ARMBITREVINDEXTABLE_256_TABLE_LENGTH ((uint16_t)440 )
|
|
||||||
#define ARMBITREVINDEXTABLE_512_TABLE_LENGTH ((uint16_t)448 )
|
|
||||||
#define ARMBITREVINDEXTABLE1024_TABLE_LENGTH ((uint16_t)1800)
|
|
||||||
#define ARMBITREVINDEXTABLE2048_TABLE_LENGTH ((uint16_t)3808)
|
|
||||||
#define ARMBITREVINDEXTABLE4096_TABLE_LENGTH ((uint16_t)4032)
|
|
||||||
|
|
||||||
extern const uint16_t armBitRevIndexTable16[ARMBITREVINDEXTABLE__16_TABLE_LENGTH];
|
|
||||||
extern const uint16_t armBitRevIndexTable32[ARMBITREVINDEXTABLE__32_TABLE_LENGTH];
|
|
||||||
extern const uint16_t armBitRevIndexTable64[ARMBITREVINDEXTABLE__64_TABLE_LENGTH];
|
|
||||||
extern const uint16_t armBitRevIndexTable128[ARMBITREVINDEXTABLE_128_TABLE_LENGTH];
|
|
||||||
extern const uint16_t armBitRevIndexTable256[ARMBITREVINDEXTABLE_256_TABLE_LENGTH];
|
|
||||||
extern const uint16_t armBitRevIndexTable512[ARMBITREVINDEXTABLE_512_TABLE_LENGTH];
|
|
||||||
extern const uint16_t armBitRevIndexTable1024[ARMBITREVINDEXTABLE1024_TABLE_LENGTH];
|
|
||||||
extern const uint16_t armBitRevIndexTable2048[ARMBITREVINDEXTABLE2048_TABLE_LENGTH];
|
|
||||||
extern const uint16_t armBitRevIndexTable4096[ARMBITREVINDEXTABLE4096_TABLE_LENGTH];
|
|
||||||
|
|
||||||
#endif /* ARM_COMMON_TABLES_H */
|
|
|
@ -1,85 +0,0 @@
|
||||||
/* ----------------------------------------------------------------------
|
|
||||||
* Copyright (C) 2010-2013 ARM Limited. All rights reserved.
|
|
||||||
*
|
|
||||||
* $Date: 17. January 2013
|
|
||||||
* $Revision: V1.4.1
|
|
||||||
*
|
|
||||||
* Project: CMSIS DSP Library
|
|
||||||
* Title: arm_const_structs.h
|
|
||||||
*
|
|
||||||
* Description: This file has constant structs that are initialized for
|
|
||||||
* user convenience. For example, some can be given as
|
|
||||||
* arguments to the arm_cfft_f32() function.
|
|
||||||
*
|
|
||||||
* Target Processor: Cortex-M4/Cortex-M3
|
|
||||||
*
|
|
||||||
* 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 LIMITED 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 THE
|
|
||||||
* COPYRIGHT OWNER OR 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.
|
|
||||||
* -------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#ifndef _ARM_CONST_STRUCTS_H
|
|
||||||
#define _ARM_CONST_STRUCTS_H
|
|
||||||
|
|
||||||
#include "arm_math.h"
|
|
||||||
#include "arm_common_tables.h"
|
|
||||||
|
|
||||||
const arm_cfft_instance_f32 arm_cfft_sR_f32_len16 = {
|
|
||||||
16, twiddleCoef_16, armBitRevIndexTable16, ARMBITREVINDEXTABLE__16_TABLE_LENGTH
|
|
||||||
};
|
|
||||||
|
|
||||||
const arm_cfft_instance_f32 arm_cfft_sR_f32_len32 = {
|
|
||||||
32, twiddleCoef_32, armBitRevIndexTable32, ARMBITREVINDEXTABLE__32_TABLE_LENGTH
|
|
||||||
};
|
|
||||||
|
|
||||||
const arm_cfft_instance_f32 arm_cfft_sR_f32_len64 = {
|
|
||||||
64, twiddleCoef_64, armBitRevIndexTable64, ARMBITREVINDEXTABLE__64_TABLE_LENGTH
|
|
||||||
};
|
|
||||||
|
|
||||||
const arm_cfft_instance_f32 arm_cfft_sR_f32_len128 = {
|
|
||||||
128, twiddleCoef_128, armBitRevIndexTable128, ARMBITREVINDEXTABLE_128_TABLE_LENGTH
|
|
||||||
};
|
|
||||||
|
|
||||||
const arm_cfft_instance_f32 arm_cfft_sR_f32_len256 = {
|
|
||||||
256, twiddleCoef_256, armBitRevIndexTable256, ARMBITREVINDEXTABLE_256_TABLE_LENGTH
|
|
||||||
};
|
|
||||||
|
|
||||||
const arm_cfft_instance_f32 arm_cfft_sR_f32_len512 = {
|
|
||||||
512, twiddleCoef_512, armBitRevIndexTable512, ARMBITREVINDEXTABLE_512_TABLE_LENGTH
|
|
||||||
};
|
|
||||||
|
|
||||||
const arm_cfft_instance_f32 arm_cfft_sR_f32_len1024 = {
|
|
||||||
1024, twiddleCoef_1024, armBitRevIndexTable1024, ARMBITREVINDEXTABLE1024_TABLE_LENGTH
|
|
||||||
};
|
|
||||||
|
|
||||||
const arm_cfft_instance_f32 arm_cfft_sR_f32_len2048 = {
|
|
||||||
2048, twiddleCoef_2048, armBitRevIndexTable2048, ARMBITREVINDEXTABLE2048_TABLE_LENGTH
|
|
||||||
};
|
|
||||||
|
|
||||||
const arm_cfft_instance_f32 arm_cfft_sR_f32_len4096 = {
|
|
||||||
4096, twiddleCoef_4096, armBitRevIndexTable4096, ARMBITREVINDEXTABLE4096_TABLE_LENGTH
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,673 +0,0 @@
|
||||||
/**************************************************************************//**
|
|
||||||
* @file core_cm4_simd.h
|
|
||||||
* @brief CMSIS Cortex-M4 SIMD Header File
|
|
||||||
* @version V3.20
|
|
||||||
* @date 25. February 2013
|
|
||||||
*
|
|
||||||
* @note
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
/* Copyright (c) 2009 - 2013 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.
|
|
||||||
---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __CORE_CM4_SIMD_H
|
|
||||||
#define __CORE_CM4_SIMD_H
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Hardware Abstraction Layer
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/* ################### Compiler specific Intrinsics ########################### */
|
|
||||||
/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics
|
|
||||||
Access to dedicated SIMD instructions
|
|
||||||
@{
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
|
|
||||||
/* ARM armcc specific functions */
|
|
||||||
|
|
||||||
/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/
|
|
||||||
#define __SADD8 __sadd8
|
|
||||||
#define __QADD8 __qadd8
|
|
||||||
#define __SHADD8 __shadd8
|
|
||||||
#define __UADD8 __uadd8
|
|
||||||
#define __UQADD8 __uqadd8
|
|
||||||
#define __UHADD8 __uhadd8
|
|
||||||
#define __SSUB8 __ssub8
|
|
||||||
#define __QSUB8 __qsub8
|
|
||||||
#define __SHSUB8 __shsub8
|
|
||||||
#define __USUB8 __usub8
|
|
||||||
#define __UQSUB8 __uqsub8
|
|
||||||
#define __UHSUB8 __uhsub8
|
|
||||||
#define __SADD16 __sadd16
|
|
||||||
#define __QADD16 __qadd16
|
|
||||||
#define __SHADD16 __shadd16
|
|
||||||
#define __UADD16 __uadd16
|
|
||||||
#define __UQADD16 __uqadd16
|
|
||||||
#define __UHADD16 __uhadd16
|
|
||||||
#define __SSUB16 __ssub16
|
|
||||||
#define __QSUB16 __qsub16
|
|
||||||
#define __SHSUB16 __shsub16
|
|
||||||
#define __USUB16 __usub16
|
|
||||||
#define __UQSUB16 __uqsub16
|
|
||||||
#define __UHSUB16 __uhsub16
|
|
||||||
#define __SASX __sasx
|
|
||||||
#define __QASX __qasx
|
|
||||||
#define __SHASX __shasx
|
|
||||||
#define __UASX __uasx
|
|
||||||
#define __UQASX __uqasx
|
|
||||||
#define __UHASX __uhasx
|
|
||||||
#define __SSAX __ssax
|
|
||||||
#define __QSAX __qsax
|
|
||||||
#define __SHSAX __shsax
|
|
||||||
#define __USAX __usax
|
|
||||||
#define __UQSAX __uqsax
|
|
||||||
#define __UHSAX __uhsax
|
|
||||||
#define __USAD8 __usad8
|
|
||||||
#define __USADA8 __usada8
|
|
||||||
#define __SSAT16 __ssat16
|
|
||||||
#define __USAT16 __usat16
|
|
||||||
#define __UXTB16 __uxtb16
|
|
||||||
#define __UXTAB16 __uxtab16
|
|
||||||
#define __SXTB16 __sxtb16
|
|
||||||
#define __SXTAB16 __sxtab16
|
|
||||||
#define __SMUAD __smuad
|
|
||||||
#define __SMUADX __smuadx
|
|
||||||
#define __SMLAD __smlad
|
|
||||||
#define __SMLADX __smladx
|
|
||||||
#define __SMLALD __smlald
|
|
||||||
#define __SMLALDX __smlaldx
|
|
||||||
#define __SMUSD __smusd
|
|
||||||
#define __SMUSDX __smusdx
|
|
||||||
#define __SMLSD __smlsd
|
|
||||||
#define __SMLSDX __smlsdx
|
|
||||||
#define __SMLSLD __smlsld
|
|
||||||
#define __SMLSLDX __smlsldx
|
|
||||||
#define __SEL __sel
|
|
||||||
#define __QADD __qadd
|
|
||||||
#define __QSUB __qsub
|
|
||||||
|
|
||||||
#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \
|
|
||||||
((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) )
|
|
||||||
|
|
||||||
#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \
|
|
||||||
((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) )
|
|
||||||
|
|
||||||
#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \
|
|
||||||
((int64_t)(ARG3) << 32) ) >> 32))
|
|
||||||
|
|
||||||
/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
|
|
||||||
/* IAR iccarm specific functions */
|
|
||||||
|
|
||||||
/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/
|
|
||||||
#include <cmsis_iar.h>
|
|
||||||
|
|
||||||
/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/
|
|
||||||
/* TI CCS specific functions */
|
|
||||||
|
|
||||||
/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/
|
|
||||||
#include <cmsis_ccs.h>
|
|
||||||
|
|
||||||
/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
|
|
||||||
/* GNU gcc specific functions */
|
|
||||||
|
|
||||||
/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SASX(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QASX(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UASX(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAX(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define __SSAT16(ARG1,ARG2) \
|
|
||||||
({ \
|
|
||||||
uint32_t __RES, __ARG1 = (ARG1); \
|
|
||||||
__ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
|
|
||||||
__RES; \
|
|
||||||
})
|
|
||||||
|
|
||||||
#define __USAT16(ARG1,ARG2) \
|
|
||||||
({ \
|
|
||||||
uint32_t __RES, __ARG1 = (ARG1); \
|
|
||||||
__ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
|
|
||||||
__RES; \
|
|
||||||
})
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTB16(uint32_t op1)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1));
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTB16(uint32_t op1)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1));
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define __SMLALD(ARG1,ARG2,ARG3) \
|
|
||||||
({ \
|
|
||||||
uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((uint64_t)(ARG3) >> 32), __ARG3_L = (uint32_t)((uint64_t)(ARG3) & 0xFFFFFFFFUL); \
|
|
||||||
__ASM volatile ("smlald %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \
|
|
||||||
(uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \
|
|
||||||
})
|
|
||||||
|
|
||||||
#define __SMLALDX(ARG1,ARG2,ARG3) \
|
|
||||||
({ \
|
|
||||||
uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((uint64_t)(ARG3) >> 32), __ARG3_L = (uint32_t)((uint64_t)(ARG3) & 0xFFFFFFFFUL); \
|
|
||||||
__ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \
|
|
||||||
(uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \
|
|
||||||
})
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define __SMLSLD(ARG1,ARG2,ARG3) \
|
|
||||||
({ \
|
|
||||||
uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((ARG3) >> 32), __ARG3_L = (uint32_t)((ARG3) & 0xFFFFFFFFUL); \
|
|
||||||
__ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \
|
|
||||||
(uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \
|
|
||||||
})
|
|
||||||
|
|
||||||
#define __SMLSLDX(ARG1,ARG2,ARG3) \
|
|
||||||
({ \
|
|
||||||
uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((ARG3) >> 32), __ARG3_L = (uint32_t)((ARG3) & 0xFFFFFFFFUL); \
|
|
||||||
__ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \
|
|
||||||
(uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \
|
|
||||||
})
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SEL (uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define __PKHBT(ARG1,ARG2,ARG3) \
|
|
||||||
({ \
|
|
||||||
uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \
|
|
||||||
__ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \
|
|
||||||
__RES; \
|
|
||||||
})
|
|
||||||
|
|
||||||
#define __PKHTB(ARG1,ARG2,ARG3) \
|
|
||||||
({ \
|
|
||||||
uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \
|
|
||||||
if (ARG3 == 0) \
|
|
||||||
__ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \
|
|
||||||
else \
|
|
||||||
__ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \
|
|
||||||
__RES; \
|
|
||||||
})
|
|
||||||
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3)
|
|
||||||
{
|
|
||||||
int32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
|
|
||||||
/* TASKING carm specific functions */
|
|
||||||
|
|
||||||
|
|
||||||
/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/
|
|
||||||
/* not yet supported */
|
|
||||||
/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*@} end of group CMSIS_SIMD_intrinsics */
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __CORE_CM4_SIMD_H */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1,636 +0,0 @@
|
||||||
/**************************************************************************//**
|
|
||||||
* @file core_cmFunc.h
|
|
||||||
* @brief CMSIS Cortex-M Core Function Access Header File
|
|
||||||
* @version V3.20
|
|
||||||
* @date 25. February 2013
|
|
||||||
*
|
|
||||||
* @note
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
/* Copyright (c) 2009 - 2013 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.
|
|
||||||
---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __CORE_CMFUNC_H
|
|
||||||
#define __CORE_CMFUNC_H
|
|
||||||
|
|
||||||
|
|
||||||
/* ########################### Core Function Access ########################### */
|
|
||||||
/** \ingroup CMSIS_Core_FunctionInterface
|
|
||||||
\defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions
|
|
||||||
@{
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
|
|
||||||
/* ARM armcc specific functions */
|
|
||||||
|
|
||||||
#if (__ARMCC_VERSION < 400677)
|
|
||||||
#error "Please use ARM Compiler Toolchain V4.0.677 or later!"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* intrinsic void __enable_irq(); */
|
|
||||||
/* intrinsic void __disable_irq(); */
|
|
||||||
|
|
||||||
/** \brief Get Control Register
|
|
||||||
|
|
||||||
This function returns the content of the Control Register.
|
|
||||||
|
|
||||||
\return Control Register value
|
|
||||||
*/
|
|
||||||
__STATIC_INLINE uint32_t __get_CONTROL(void)
|
|
||||||
{
|
|
||||||
register uint32_t __regControl __ASM("control");
|
|
||||||
return(__regControl);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Set Control Register
|
|
||||||
|
|
||||||
This function writes the given value to the Control Register.
|
|
||||||
|
|
||||||
\param [in] control Control Register value to set
|
|
||||||
*/
|
|
||||||
__STATIC_INLINE void __set_CONTROL(uint32_t control)
|
|
||||||
{
|
|
||||||
register uint32_t __regControl __ASM("control");
|
|
||||||
__regControl = control;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Get IPSR Register
|
|
||||||
|
|
||||||
This function returns the content of the IPSR Register.
|
|
||||||
|
|
||||||
\return IPSR Register value
|
|
||||||
*/
|
|
||||||
__STATIC_INLINE uint32_t __get_IPSR(void)
|
|
||||||
{
|
|
||||||
register uint32_t __regIPSR __ASM("ipsr");
|
|
||||||
return(__regIPSR);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Get APSR Register
|
|
||||||
|
|
||||||
This function returns the content of the APSR Register.
|
|
||||||
|
|
||||||
\return APSR Register value
|
|
||||||
*/
|
|
||||||
__STATIC_INLINE uint32_t __get_APSR(void)
|
|
||||||
{
|
|
||||||
register uint32_t __regAPSR __ASM("apsr");
|
|
||||||
return(__regAPSR);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Get xPSR Register
|
|
||||||
|
|
||||||
This function returns the content of the xPSR Register.
|
|
||||||
|
|
||||||
\return xPSR Register value
|
|
||||||
*/
|
|
||||||
__STATIC_INLINE uint32_t __get_xPSR(void)
|
|
||||||
{
|
|
||||||
register uint32_t __regXPSR __ASM("xpsr");
|
|
||||||
return(__regXPSR);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Get Process Stack Pointer
|
|
||||||
|
|
||||||
This function returns the current value of the Process Stack Pointer (PSP).
|
|
||||||
|
|
||||||
\return PSP Register value
|
|
||||||
*/
|
|
||||||
__STATIC_INLINE uint32_t __get_PSP(void)
|
|
||||||
{
|
|
||||||
register uint32_t __regProcessStackPointer __ASM("psp");
|
|
||||||
return(__regProcessStackPointer);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Set Process Stack Pointer
|
|
||||||
|
|
||||||
This function assigns the given value to the Process Stack Pointer (PSP).
|
|
||||||
|
|
||||||
\param [in] topOfProcStack Process Stack Pointer value to set
|
|
||||||
*/
|
|
||||||
__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
|
|
||||||
{
|
|
||||||
register uint32_t __regProcessStackPointer __ASM("psp");
|
|
||||||
__regProcessStackPointer = topOfProcStack;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Get Main Stack Pointer
|
|
||||||
|
|
||||||
This function returns the current value of the Main Stack Pointer (MSP).
|
|
||||||
|
|
||||||
\return MSP Register value
|
|
||||||
*/
|
|
||||||
__STATIC_INLINE uint32_t __get_MSP(void)
|
|
||||||
{
|
|
||||||
register uint32_t __regMainStackPointer __ASM("msp");
|
|
||||||
return(__regMainStackPointer);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Set Main Stack Pointer
|
|
||||||
|
|
||||||
This function assigns the given value to the Main Stack Pointer (MSP).
|
|
||||||
|
|
||||||
\param [in] topOfMainStack Main Stack Pointer value to set
|
|
||||||
*/
|
|
||||||
__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
|
|
||||||
{
|
|
||||||
register uint32_t __regMainStackPointer __ASM("msp");
|
|
||||||
__regMainStackPointer = topOfMainStack;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Get Priority Mask
|
|
||||||
|
|
||||||
This function returns the current state of the priority mask bit from the Priority Mask Register.
|
|
||||||
|
|
||||||
\return Priority Mask value
|
|
||||||
*/
|
|
||||||
__STATIC_INLINE uint32_t __get_PRIMASK(void)
|
|
||||||
{
|
|
||||||
register uint32_t __regPriMask __ASM("primask");
|
|
||||||
return(__regPriMask);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Set Priority Mask
|
|
||||||
|
|
||||||
This function assigns the given value to the Priority Mask Register.
|
|
||||||
|
|
||||||
\param [in] priMask Priority Mask
|
|
||||||
*/
|
|
||||||
__STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
|
|
||||||
{
|
|
||||||
register uint32_t __regPriMask __ASM("primask");
|
|
||||||
__regPriMask = (priMask);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#if (__CORTEX_M >= 0x03)
|
|
||||||
|
|
||||||
/** \brief Enable FIQ
|
|
||||||
|
|
||||||
This function enables FIQ interrupts by clearing the F-bit in the CPSR.
|
|
||||||
Can only be executed in Privileged modes.
|
|
||||||
*/
|
|
||||||
#define __enable_fault_irq __enable_fiq
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Disable FIQ
|
|
||||||
|
|
||||||
This function disables FIQ interrupts by setting the F-bit in the CPSR.
|
|
||||||
Can only be executed in Privileged modes.
|
|
||||||
*/
|
|
||||||
#define __disable_fault_irq __disable_fiq
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Get Base Priority
|
|
||||||
|
|
||||||
This function returns the current value of the Base Priority register.
|
|
||||||
|
|
||||||
\return Base Priority register value
|
|
||||||
*/
|
|
||||||
__STATIC_INLINE uint32_t __get_BASEPRI(void)
|
|
||||||
{
|
|
||||||
register uint32_t __regBasePri __ASM("basepri");
|
|
||||||
return(__regBasePri);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Set Base Priority
|
|
||||||
|
|
||||||
This function assigns the given value to the Base Priority register.
|
|
||||||
|
|
||||||
\param [in] basePri Base Priority value to set
|
|
||||||
*/
|
|
||||||
__STATIC_INLINE void __set_BASEPRI(uint32_t basePri)
|
|
||||||
{
|
|
||||||
register uint32_t __regBasePri __ASM("basepri");
|
|
||||||
__regBasePri = (basePri & 0xff);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Get Fault Mask
|
|
||||||
|
|
||||||
This function returns the current value of the Fault Mask register.
|
|
||||||
|
|
||||||
\return Fault Mask register value
|
|
||||||
*/
|
|
||||||
__STATIC_INLINE uint32_t __get_FAULTMASK(void)
|
|
||||||
{
|
|
||||||
register uint32_t __regFaultMask __ASM("faultmask");
|
|
||||||
return(__regFaultMask);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Set Fault Mask
|
|
||||||
|
|
||||||
This function assigns the given value to the Fault Mask register.
|
|
||||||
|
|
||||||
\param [in] faultMask Fault Mask value to set
|
|
||||||
*/
|
|
||||||
__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
|
|
||||||
{
|
|
||||||
register uint32_t __regFaultMask __ASM("faultmask");
|
|
||||||
__regFaultMask = (faultMask & (uint32_t)1);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* (__CORTEX_M >= 0x03) */
|
|
||||||
|
|
||||||
|
|
||||||
#if (__CORTEX_M == 0x04)
|
|
||||||
|
|
||||||
/** \brief Get FPSCR
|
|
||||||
|
|
||||||
This function returns the current value of the Floating Point Status/Control register.
|
|
||||||
|
|
||||||
\return Floating Point Status/Control register value
|
|
||||||
*/
|
|
||||||
__STATIC_INLINE uint32_t __get_FPSCR(void)
|
|
||||||
{
|
|
||||||
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
|
|
||||||
register uint32_t __regfpscr __ASM("fpscr");
|
|
||||||
return(__regfpscr);
|
|
||||||
#else
|
|
||||||
return(0);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Set FPSCR
|
|
||||||
|
|
||||||
This function assigns the given value to the Floating Point Status/Control register.
|
|
||||||
|
|
||||||
\param [in] fpscr Floating Point Status/Control value to set
|
|
||||||
*/
|
|
||||||
__STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
|
|
||||||
{
|
|
||||||
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
|
|
||||||
register uint32_t __regfpscr __ASM("fpscr");
|
|
||||||
__regfpscr = (fpscr);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* (__CORTEX_M == 0x04) */
|
|
||||||
|
|
||||||
|
|
||||||
#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
|
|
||||||
/* IAR iccarm specific functions */
|
|
||||||
|
|
||||||
#include <cmsis_iar.h>
|
|
||||||
|
|
||||||
|
|
||||||
#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/
|
|
||||||
/* TI CCS specific functions */
|
|
||||||
|
|
||||||
#include <cmsis_ccs.h>
|
|
||||||
|
|
||||||
|
|
||||||
#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
|
|
||||||
/* GNU gcc specific functions */
|
|
||||||
|
|
||||||
/** \brief Enable IRQ Interrupts
|
|
||||||
|
|
||||||
This function enables IRQ interrupts by clearing the I-bit in the CPSR.
|
|
||||||
Can only be executed in Privileged modes.
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void)
|
|
||||||
{
|
|
||||||
__ASM volatile ("cpsie i" : : : "memory");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Disable IRQ Interrupts
|
|
||||||
|
|
||||||
This function disables IRQ interrupts by setting the I-bit in the CPSR.
|
|
||||||
Can only be executed in Privileged modes.
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void)
|
|
||||||
{
|
|
||||||
__ASM volatile ("cpsid i" : : : "memory");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Get Control Register
|
|
||||||
|
|
||||||
This function returns the content of the Control Register.
|
|
||||||
|
|
||||||
\return Control Register value
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CONTROL(void)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("MRS %0, control" : "=r" (result) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Set Control Register
|
|
||||||
|
|
||||||
This function writes the given value to the Control Register.
|
|
||||||
|
|
||||||
\param [in] control Control Register value to set
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_CONTROL(uint32_t control)
|
|
||||||
{
|
|
||||||
__ASM volatile ("MSR control, %0" : : "r" (control) : "memory");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Get IPSR Register
|
|
||||||
|
|
||||||
This function returns the content of the IPSR Register.
|
|
||||||
|
|
||||||
\return IPSR Register value
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_IPSR(void)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("MRS %0, ipsr" : "=r" (result) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Get APSR Register
|
|
||||||
|
|
||||||
This function returns the content of the APSR Register.
|
|
||||||
|
|
||||||
\return APSR Register value
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_APSR(void)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("MRS %0, apsr" : "=r" (result) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Get xPSR Register
|
|
||||||
|
|
||||||
This function returns the content of the xPSR Register.
|
|
||||||
|
|
||||||
\return xPSR Register value
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_xPSR(void)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("MRS %0, xpsr" : "=r" (result) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Get Process Stack Pointer
|
|
||||||
|
|
||||||
This function returns the current value of the Process Stack Pointer (PSP).
|
|
||||||
|
|
||||||
\return PSP Register value
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PSP(void)
|
|
||||||
{
|
|
||||||
register uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("MRS %0, psp\n" : "=r" (result) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Set Process Stack Pointer
|
|
||||||
|
|
||||||
This function assigns the given value to the Process Stack Pointer (PSP).
|
|
||||||
|
|
||||||
\param [in] topOfProcStack Process Stack Pointer value to set
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
|
|
||||||
{
|
|
||||||
__ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) : "sp");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Get Main Stack Pointer
|
|
||||||
|
|
||||||
This function returns the current value of the Main Stack Pointer (MSP).
|
|
||||||
|
|
||||||
\return MSP Register value
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void)
|
|
||||||
{
|
|
||||||
register uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("MRS %0, msp\n" : "=r" (result) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Set Main Stack Pointer
|
|
||||||
|
|
||||||
This function assigns the given value to the Main Stack Pointer (MSP).
|
|
||||||
|
|
||||||
\param [in] topOfMainStack Main Stack Pointer value to set
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
|
|
||||||
{
|
|
||||||
__ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) : "sp");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Get Priority Mask
|
|
||||||
|
|
||||||
This function returns the current state of the priority mask bit from the Priority Mask Register.
|
|
||||||
|
|
||||||
\return Priority Mask value
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PRIMASK(void)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("MRS %0, primask" : "=r" (result) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Set Priority Mask
|
|
||||||
|
|
||||||
This function assigns the given value to the Priority Mask Register.
|
|
||||||
|
|
||||||
\param [in] priMask Priority Mask
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
|
|
||||||
{
|
|
||||||
__ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#if (__CORTEX_M >= 0x03)
|
|
||||||
|
|
||||||
/** \brief Enable FIQ
|
|
||||||
|
|
||||||
This function enables FIQ interrupts by clearing the F-bit in the CPSR.
|
|
||||||
Can only be executed in Privileged modes.
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_fault_irq(void)
|
|
||||||
{
|
|
||||||
__ASM volatile ("cpsie f" : : : "memory");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Disable FIQ
|
|
||||||
|
|
||||||
This function disables FIQ interrupts by setting the F-bit in the CPSR.
|
|
||||||
Can only be executed in Privileged modes.
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_fault_irq(void)
|
|
||||||
{
|
|
||||||
__ASM volatile ("cpsid f" : : : "memory");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Get Base Priority
|
|
||||||
|
|
||||||
This function returns the current value of the Base Priority register.
|
|
||||||
|
|
||||||
\return Base Priority register value
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_BASEPRI(void)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("MRS %0, basepri_max" : "=r" (result) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Set Base Priority
|
|
||||||
|
|
||||||
This function assigns the given value to the Base Priority register.
|
|
||||||
|
|
||||||
\param [in] basePri Base Priority value to set
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_BASEPRI(uint32_t value)
|
|
||||||
{
|
|
||||||
__ASM volatile ("MSR basepri, %0" : : "r" (value) : "memory");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Get Fault Mask
|
|
||||||
|
|
||||||
This function returns the current value of the Fault Mask register.
|
|
||||||
|
|
||||||
\return Fault Mask register value
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FAULTMASK(void)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("MRS %0, faultmask" : "=r" (result) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Set Fault Mask
|
|
||||||
|
|
||||||
This function assigns the given value to the Fault Mask register.
|
|
||||||
|
|
||||||
\param [in] faultMask Fault Mask value to set
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
|
|
||||||
{
|
|
||||||
__ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory");
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* (__CORTEX_M >= 0x03) */
|
|
||||||
|
|
||||||
|
|
||||||
#if (__CORTEX_M == 0x04)
|
|
||||||
|
|
||||||
/** \brief Get FPSCR
|
|
||||||
|
|
||||||
This function returns the current value of the Floating Point Status/Control register.
|
|
||||||
|
|
||||||
\return Floating Point Status/Control register value
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPSCR(void)
|
|
||||||
{
|
|
||||||
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
/* Empty asm statement works as a scheduling barrier */
|
|
||||||
__ASM volatile ("");
|
|
||||||
__ASM volatile ("VMRS %0, fpscr" : "=r" (result) );
|
|
||||||
__ASM volatile ("");
|
|
||||||
return(result);
|
|
||||||
#else
|
|
||||||
return(0);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Set FPSCR
|
|
||||||
|
|
||||||
This function assigns the given value to the Floating Point Status/Control register.
|
|
||||||
|
|
||||||
\param [in] fpscr Floating Point Status/Control value to set
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
|
|
||||||
{
|
|
||||||
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
|
|
||||||
/* Empty asm statement works as a scheduling barrier */
|
|
||||||
__ASM volatile ("");
|
|
||||||
__ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc");
|
|
||||||
__ASM volatile ("");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* (__CORTEX_M == 0x04) */
|
|
||||||
|
|
||||||
|
|
||||||
#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
|
|
||||||
/* TASKING carm specific functions */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The CMSIS functions have been implemented as intrinsics in the compiler.
|
|
||||||
* Please use "carm -?i" to get an up to date list of all instrinsics,
|
|
||||||
* Including the CMSIS ones.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*@} end of CMSIS_Core_RegAccFunctions */
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __CORE_CMFUNC_H */
|
|
|
@ -1,688 +0,0 @@
|
||||||
/**************************************************************************//**
|
|
||||||
* @file core_cmInstr.h
|
|
||||||
* @brief CMSIS Cortex-M Core Instruction Access Header File
|
|
||||||
* @version V3.20
|
|
||||||
* @date 05. March 2013
|
|
||||||
*
|
|
||||||
* @note
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
/* Copyright (c) 2009 - 2013 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.
|
|
||||||
---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __CORE_CMINSTR_H
|
|
||||||
#define __CORE_CMINSTR_H
|
|
||||||
|
|
||||||
|
|
||||||
/* ########################## Core Instruction Access ######################### */
|
|
||||||
/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface
|
|
||||||
Access to dedicated instructions
|
|
||||||
@{
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
|
|
||||||
/* ARM armcc specific functions */
|
|
||||||
|
|
||||||
#if (__ARMCC_VERSION < 400677)
|
|
||||||
#error "Please use ARM Compiler Toolchain V4.0.677 or later!"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief No Operation
|
|
||||||
|
|
||||||
No Operation does nothing. This instruction can be used for code alignment purposes.
|
|
||||||
*/
|
|
||||||
#define __NOP __nop
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Wait For Interrupt
|
|
||||||
|
|
||||||
Wait For Interrupt is a hint instruction that suspends execution
|
|
||||||
until one of a number of events occurs.
|
|
||||||
*/
|
|
||||||
#define __WFI __wfi
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Wait For Event
|
|
||||||
|
|
||||||
Wait For Event is a hint instruction that permits the processor to enter
|
|
||||||
a low-power state until one of a number of events occurs.
|
|
||||||
*/
|
|
||||||
#define __WFE __wfe
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Send Event
|
|
||||||
|
|
||||||
Send Event is a hint instruction. It causes an event to be signaled to the CPU.
|
|
||||||
*/
|
|
||||||
#define __SEV __sev
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Instruction Synchronization Barrier
|
|
||||||
|
|
||||||
Instruction Synchronization Barrier flushes the pipeline in the processor,
|
|
||||||
so that all instructions following the ISB are fetched from cache or
|
|
||||||
memory, after the instruction has been completed.
|
|
||||||
*/
|
|
||||||
#define __ISB() __isb(0xF)
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Data Synchronization Barrier
|
|
||||||
|
|
||||||
This function acts as a special kind of Data Memory Barrier.
|
|
||||||
It completes when all explicit memory accesses before this instruction complete.
|
|
||||||
*/
|
|
||||||
#define __DSB() __dsb(0xF)
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Data Memory Barrier
|
|
||||||
|
|
||||||
This function ensures the apparent order of the explicit memory operations before
|
|
||||||
and after the instruction, without ensuring their completion.
|
|
||||||
*/
|
|
||||||
#define __DMB() __dmb(0xF)
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Reverse byte order (32 bit)
|
|
||||||
|
|
||||||
This function reverses the byte order in integer value.
|
|
||||||
|
|
||||||
\param [in] value Value to reverse
|
|
||||||
\return Reversed value
|
|
||||||
*/
|
|
||||||
#define __REV __rev
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Reverse byte order (16 bit)
|
|
||||||
|
|
||||||
This function reverses the byte order in two unsigned short values.
|
|
||||||
|
|
||||||
\param [in] value Value to reverse
|
|
||||||
\return Reversed value
|
|
||||||
*/
|
|
||||||
#ifndef __NO_EMBEDDED_ASM
|
|
||||||
__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value)
|
|
||||||
{
|
|
||||||
rev16 r0, r0
|
|
||||||
bx lr
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** \brief Reverse byte order in signed short value
|
|
||||||
|
|
||||||
This function reverses the byte order in a signed short value with sign extension to integer.
|
|
||||||
|
|
||||||
\param [in] value Value to reverse
|
|
||||||
\return Reversed value
|
|
||||||
*/
|
|
||||||
#ifndef __NO_EMBEDDED_ASM
|
|
||||||
__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value)
|
|
||||||
{
|
|
||||||
revsh r0, r0
|
|
||||||
bx lr
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Rotate Right in unsigned value (32 bit)
|
|
||||||
|
|
||||||
This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
|
|
||||||
|
|
||||||
\param [in] value Value to rotate
|
|
||||||
\param [in] value Number of Bits to rotate
|
|
||||||
\return Rotated value
|
|
||||||
*/
|
|
||||||
#define __ROR __ror
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Breakpoint
|
|
||||||
|
|
||||||
This function causes the processor to enter Debug state.
|
|
||||||
Debug tools can use this to investigate system state when the instruction at a particular address is reached.
|
|
||||||
|
|
||||||
\param [in] value is ignored by the processor.
|
|
||||||
If required, a debugger can use it to store additional information about the breakpoint.
|
|
||||||
*/
|
|
||||||
#define __BKPT(value) __breakpoint(value)
|
|
||||||
|
|
||||||
|
|
||||||
#if (__CORTEX_M >= 0x03)
|
|
||||||
|
|
||||||
/** \brief Reverse bit order of value
|
|
||||||
|
|
||||||
This function reverses the bit order of the given value.
|
|
||||||
|
|
||||||
\param [in] value Value to reverse
|
|
||||||
\return Reversed value
|
|
||||||
*/
|
|
||||||
#define __RBIT __rbit
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief LDR Exclusive (8 bit)
|
|
||||||
|
|
||||||
This function performs a exclusive LDR command for 8 bit value.
|
|
||||||
|
|
||||||
\param [in] ptr Pointer to data
|
|
||||||
\return value of type uint8_t at (*ptr)
|
|
||||||
*/
|
|
||||||
#define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr))
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief LDR Exclusive (16 bit)
|
|
||||||
|
|
||||||
This function performs a exclusive LDR command for 16 bit values.
|
|
||||||
|
|
||||||
\param [in] ptr Pointer to data
|
|
||||||
\return value of type uint16_t at (*ptr)
|
|
||||||
*/
|
|
||||||
#define __LDREXH(ptr) ((uint16_t) __ldrex(ptr))
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief LDR Exclusive (32 bit)
|
|
||||||
|
|
||||||
This function performs a exclusive LDR command for 32 bit values.
|
|
||||||
|
|
||||||
\param [in] ptr Pointer to data
|
|
||||||
\return value of type uint32_t at (*ptr)
|
|
||||||
*/
|
|
||||||
#define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr))
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief STR Exclusive (8 bit)
|
|
||||||
|
|
||||||
This function performs a exclusive STR command for 8 bit values.
|
|
||||||
|
|
||||||
\param [in] value Value to store
|
|
||||||
\param [in] ptr Pointer to location
|
|
||||||
\return 0 Function succeeded
|
|
||||||
\return 1 Function failed
|
|
||||||
*/
|
|
||||||
#define __STREXB(value, ptr) __strex(value, ptr)
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief STR Exclusive (16 bit)
|
|
||||||
|
|
||||||
This function performs a exclusive STR command for 16 bit values.
|
|
||||||
|
|
||||||
\param [in] value Value to store
|
|
||||||
\param [in] ptr Pointer to location
|
|
||||||
\return 0 Function succeeded
|
|
||||||
\return 1 Function failed
|
|
||||||
*/
|
|
||||||
#define __STREXH(value, ptr) __strex(value, ptr)
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief STR Exclusive (32 bit)
|
|
||||||
|
|
||||||
This function performs a exclusive STR command for 32 bit values.
|
|
||||||
|
|
||||||
\param [in] value Value to store
|
|
||||||
\param [in] ptr Pointer to location
|
|
||||||
\return 0 Function succeeded
|
|
||||||
\return 1 Function failed
|
|
||||||
*/
|
|
||||||
#define __STREXW(value, ptr) __strex(value, ptr)
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Remove the exclusive lock
|
|
||||||
|
|
||||||
This function removes the exclusive lock which is created by LDREX.
|
|
||||||
|
|
||||||
*/
|
|
||||||
#define __CLREX __clrex
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Signed Saturate
|
|
||||||
|
|
||||||
This function saturates a signed value.
|
|
||||||
|
|
||||||
\param [in] value Value to be saturated
|
|
||||||
\param [in] sat Bit position to saturate to (1..32)
|
|
||||||
\return Saturated value
|
|
||||||
*/
|
|
||||||
#define __SSAT __ssat
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Unsigned Saturate
|
|
||||||
|
|
||||||
This function saturates an unsigned value.
|
|
||||||
|
|
||||||
\param [in] value Value to be saturated
|
|
||||||
\param [in] sat Bit position to saturate to (0..31)
|
|
||||||
\return Saturated value
|
|
||||||
*/
|
|
||||||
#define __USAT __usat
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Count leading zeros
|
|
||||||
|
|
||||||
This function counts the number of leading zeros of a data value.
|
|
||||||
|
|
||||||
\param [in] value Value to count the leading zeros
|
|
||||||
\return number of leading zeros in value
|
|
||||||
*/
|
|
||||||
#define __CLZ __clz
|
|
||||||
|
|
||||||
#endif /* (__CORTEX_M >= 0x03) */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
|
|
||||||
/* IAR iccarm specific functions */
|
|
||||||
|
|
||||||
#include <cmsis_iar.h>
|
|
||||||
|
|
||||||
|
|
||||||
#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/
|
|
||||||
/* TI CCS specific functions */
|
|
||||||
|
|
||||||
#include <cmsis_ccs.h>
|
|
||||||
|
|
||||||
|
|
||||||
#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
|
|
||||||
/* GNU gcc specific functions */
|
|
||||||
|
|
||||||
/* Define macros for porting to both thumb1 and thumb2.
|
|
||||||
* For thumb1, use low register (r0-r7), specified by constrant "l"
|
|
||||||
* Otherwise, use general registers, specified by constrant "r" */
|
|
||||||
#if defined (__thumb__) && !defined (__thumb2__)
|
|
||||||
#define __CMSIS_GCC_OUT_REG(r) "=l" (r)
|
|
||||||
#define __CMSIS_GCC_USE_REG(r) "l" (r)
|
|
||||||
#else
|
|
||||||
#define __CMSIS_GCC_OUT_REG(r) "=r" (r)
|
|
||||||
#define __CMSIS_GCC_USE_REG(r) "r" (r)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** \brief No Operation
|
|
||||||
|
|
||||||
No Operation does nothing. This instruction can be used for code alignment purposes.
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __NOP(void)
|
|
||||||
{
|
|
||||||
__ASM volatile ("nop");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Wait For Interrupt
|
|
||||||
|
|
||||||
Wait For Interrupt is a hint instruction that suspends execution
|
|
||||||
until one of a number of events occurs.
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __WFI(void)
|
|
||||||
{
|
|
||||||
__ASM volatile ("wfi");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Wait For Event
|
|
||||||
|
|
||||||
Wait For Event is a hint instruction that permits the processor to enter
|
|
||||||
a low-power state until one of a number of events occurs.
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __WFE(void)
|
|
||||||
{
|
|
||||||
__ASM volatile ("wfe");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Send Event
|
|
||||||
|
|
||||||
Send Event is a hint instruction. It causes an event to be signaled to the CPU.
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __SEV(void)
|
|
||||||
{
|
|
||||||
__ASM volatile ("sev");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Instruction Synchronization Barrier
|
|
||||||
|
|
||||||
Instruction Synchronization Barrier flushes the pipeline in the processor,
|
|
||||||
so that all instructions following the ISB are fetched from cache or
|
|
||||||
memory, after the instruction has been completed.
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __ISB(void)
|
|
||||||
{
|
|
||||||
__ASM volatile ("isb");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Data Synchronization Barrier
|
|
||||||
|
|
||||||
This function acts as a special kind of Data Memory Barrier.
|
|
||||||
It completes when all explicit memory accesses before this instruction complete.
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __DSB(void)
|
|
||||||
{
|
|
||||||
__ASM volatile ("dsb");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Data Memory Barrier
|
|
||||||
|
|
||||||
This function ensures the apparent order of the explicit memory operations before
|
|
||||||
and after the instruction, without ensuring their completion.
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __DMB(void)
|
|
||||||
{
|
|
||||||
__ASM volatile ("dmb");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Reverse byte order (32 bit)
|
|
||||||
|
|
||||||
This function reverses the byte order in integer value.
|
|
||||||
|
|
||||||
\param [in] value Value to reverse
|
|
||||||
\return Reversed value
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV(uint32_t value)
|
|
||||||
{
|
|
||||||
#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
|
|
||||||
return __builtin_bswap32(value);
|
|
||||||
#else
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
|
|
||||||
return(result);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Reverse byte order (16 bit)
|
|
||||||
|
|
||||||
This function reverses the byte order in two unsigned short values.
|
|
||||||
|
|
||||||
\param [in] value Value to reverse
|
|
||||||
\return Reversed value
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV16(uint32_t value)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Reverse byte order in signed short value
|
|
||||||
|
|
||||||
This function reverses the byte order in a signed short value with sign extension to integer.
|
|
||||||
|
|
||||||
\param [in] value Value to reverse
|
|
||||||
\return Reversed value
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE int32_t __REVSH(int32_t value)
|
|
||||||
{
|
|
||||||
#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
|
|
||||||
return (short)__builtin_bswap16(value);
|
|
||||||
#else
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
|
|
||||||
return(result);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Rotate Right in unsigned value (32 bit)
|
|
||||||
|
|
||||||
This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
|
|
||||||
|
|
||||||
\param [in] value Value to rotate
|
|
||||||
\param [in] value Number of Bits to rotate
|
|
||||||
\return Rotated value
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2)
|
|
||||||
{
|
|
||||||
return (op1 >> op2) | (op1 << (32 - op2));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Breakpoint
|
|
||||||
|
|
||||||
This function causes the processor to enter Debug state.
|
|
||||||
Debug tools can use this to investigate system state when the instruction at a particular address is reached.
|
|
||||||
|
|
||||||
\param [in] value is ignored by the processor.
|
|
||||||
If required, a debugger can use it to store additional information about the breakpoint.
|
|
||||||
*/
|
|
||||||
#define __BKPT(value) __ASM volatile ("bkpt "#value)
|
|
||||||
|
|
||||||
|
|
||||||
#if (__CORTEX_M >= 0x03)
|
|
||||||
|
|
||||||
/** \brief Reverse bit order of value
|
|
||||||
|
|
||||||
This function reverses the bit order of the given value.
|
|
||||||
|
|
||||||
\param [in] value Value to reverse
|
|
||||||
\return Reversed value
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __RBIT(uint32_t value)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief LDR Exclusive (8 bit)
|
|
||||||
|
|
||||||
This function performs a exclusive LDR command for 8 bit value.
|
|
||||||
|
|
||||||
\param [in] ptr Pointer to data
|
|
||||||
\return value of type uint8_t at (*ptr)
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
|
|
||||||
__ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) );
|
|
||||||
#else
|
|
||||||
/* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
|
|
||||||
accepted by assembler. So has to use following less efficient pattern.
|
|
||||||
*/
|
|
||||||
__ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
|
|
||||||
#endif
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief LDR Exclusive (16 bit)
|
|
||||||
|
|
||||||
This function performs a exclusive LDR command for 16 bit values.
|
|
||||||
|
|
||||||
\param [in] ptr Pointer to data
|
|
||||||
\return value of type uint16_t at (*ptr)
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
|
|
||||||
__ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) );
|
|
||||||
#else
|
|
||||||
/* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
|
|
||||||
accepted by assembler. So has to use following less efficient pattern.
|
|
||||||
*/
|
|
||||||
__ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
|
|
||||||
#endif
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief LDR Exclusive (32 bit)
|
|
||||||
|
|
||||||
This function performs a exclusive LDR command for 32 bit values.
|
|
||||||
|
|
||||||
\param [in] ptr Pointer to data
|
|
||||||
\return value of type uint32_t at (*ptr)
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __LDREXW(volatile uint32_t *addr)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief STR Exclusive (8 bit)
|
|
||||||
|
|
||||||
This function performs a exclusive STR command for 8 bit values.
|
|
||||||
|
|
||||||
\param [in] value Value to store
|
|
||||||
\param [in] ptr Pointer to location
|
|
||||||
\return 0 Function succeeded
|
|
||||||
\return 1 Function failed
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief STR Exclusive (16 bit)
|
|
||||||
|
|
||||||
This function performs a exclusive STR command for 16 bit values.
|
|
||||||
|
|
||||||
\param [in] value Value to store
|
|
||||||
\param [in] ptr Pointer to location
|
|
||||||
\return 0 Function succeeded
|
|
||||||
\return 1 Function failed
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief STR Exclusive (32 bit)
|
|
||||||
|
|
||||||
This function performs a exclusive STR command for 32 bit values.
|
|
||||||
|
|
||||||
\param [in] value Value to store
|
|
||||||
\param [in] ptr Pointer to location
|
|
||||||
\return 0 Function succeeded
|
|
||||||
\return 1 Function failed
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Remove the exclusive lock
|
|
||||||
|
|
||||||
This function removes the exclusive lock which is created by LDREX.
|
|
||||||
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __CLREX(void)
|
|
||||||
{
|
|
||||||
__ASM volatile ("clrex" ::: "memory");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Signed Saturate
|
|
||||||
|
|
||||||
This function saturates a signed value.
|
|
||||||
|
|
||||||
\param [in] value Value to be saturated
|
|
||||||
\param [in] sat Bit position to saturate to (1..32)
|
|
||||||
\return Saturated value
|
|
||||||
*/
|
|
||||||
#define __SSAT(ARG1,ARG2) \
|
|
||||||
({ \
|
|
||||||
uint32_t __RES, __ARG1 = (ARG1); \
|
|
||||||
__ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
|
|
||||||
__RES; \
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Unsigned Saturate
|
|
||||||
|
|
||||||
This function saturates an unsigned value.
|
|
||||||
|
|
||||||
\param [in] value Value to be saturated
|
|
||||||
\param [in] sat Bit position to saturate to (0..31)
|
|
||||||
\return Saturated value
|
|
||||||
*/
|
|
||||||
#define __USAT(ARG1,ARG2) \
|
|
||||||
({ \
|
|
||||||
uint32_t __RES, __ARG1 = (ARG1); \
|
|
||||||
__ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
|
|
||||||
__RES; \
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Count leading zeros
|
|
||||||
|
|
||||||
This function counts the number of leading zeros of a data value.
|
|
||||||
|
|
||||||
\param [in] value Value to count the leading zeros
|
|
||||||
\return number of leading zeros in value
|
|
||||||
*/
|
|
||||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __CLZ(uint32_t value)
|
|
||||||
{
|
|
||||||
uint32_t result;
|
|
||||||
|
|
||||||
__ASM volatile ("clz %0, %1" : "=r" (result) : "r" (value) );
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* (__CORTEX_M >= 0x03) */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
|
|
||||||
/* TASKING carm specific functions */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The CMSIS functions have been implemented as intrinsics in the compiler.
|
|
||||||
* Please use "carm -?i" to get an up to date list of all intrinsics,
|
|
||||||
* Including the CMSIS ones.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*@}*/ /* end of group CMSIS_Core_InstructionInterface */
|
|
||||||
|
|
||||||
#endif /* __CORE_CMINSTR_H */
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,46 +0,0 @@
|
||||||
############################################################################
|
|
||||||
#
|
|
||||||
# Copyright (c) 2013 PX4 Development Team. All rights reserved.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions
|
|
||||||
# are met:
|
|
||||||
#
|
|
||||||
# 1. Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
# 2. 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.
|
|
||||||
# 3. Neither the name PX4 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 THE
|
|
||||||
# COPYRIGHT OWNER OR 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.
|
|
||||||
#
|
|
||||||
############################################################################
|
|
||||||
|
|
||||||
#
|
|
||||||
# ARM CMSIS DSP library
|
|
||||||
#
|
|
||||||
|
|
||||||
ifeq ($(CONFIG_ARCH),CORTEXM4F)
|
|
||||||
PREBUILT_LIB := libarm_cortexM4lf_math.a
|
|
||||||
else ifeq ($(CONFIG_ARCH),CORTEXM4)
|
|
||||||
PREBUILT_LIB := libarm_cortexM4l_math.a
|
|
||||||
else ifeq ($(CONFIG_ARCH),CORTEXM3)
|
|
||||||
PREBUILT_LIB := libarm_cortexM3l_math.a
|
|
||||||
else
|
|
||||||
$(error CONFIG_ARCH value '$(CONFIG_ARCH)' not supported by the DSP library)
|
|
||||||
endif
|
|
|
@ -1,27 +0,0 @@
|
||||||
All pre-built libraries are guided by the following license:
|
|
||||||
|
|
||||||
Copyright (C) 2009-2012 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.
|
|
|
@ -46,11 +46,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH_ARM
|
|
||||||
#include "../CMSIS/Include/arm_math.h"
|
|
||||||
#else
|
|
||||||
#include "matrix/math.hpp"
|
#include "matrix/math.hpp"
|
||||||
#endif
|
|
||||||
#include <platforms/px4_defines.h>
|
#include <platforms/px4_defines.h>
|
||||||
|
|
||||||
namespace math
|
namespace math
|
||||||
|
@ -72,11 +68,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* struct for using arm_math functions
|
* struct for using arm_math functions
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_ARCH_ARM
|
|
||||||
arm_matrix_instance_f32 arm_mat;
|
|
||||||
#else
|
|
||||||
eigen_matrix_instance arm_mat;
|
eigen_matrix_instance arm_mat;
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* trivial ctor
|
* trivial ctor
|
||||||
|
@ -302,47 +294,29 @@ public:
|
||||||
*/
|
*/
|
||||||
template <unsigned int P>
|
template <unsigned int P>
|
||||||
Matrix<M, P> operator *(const Matrix<N, P> &m) const {
|
Matrix<M, P> operator *(const Matrix<N, P> &m) const {
|
||||||
#ifdef CONFIG_ARCH_ARM
|
|
||||||
Matrix<M, P> res;
|
|
||||||
arm_mat_mult_f32(&arm_mat, &m.arm_mat, &res.arm_mat);
|
|
||||||
return res;
|
|
||||||
#else
|
|
||||||
matrix::Matrix<float, M, N> Me(this->arm_mat.pData);
|
matrix::Matrix<float, M, N> Me(this->arm_mat.pData);
|
||||||
matrix::Matrix<float, N, P> Him(m.arm_mat.pData);
|
matrix::Matrix<float, N, P> Him(m.arm_mat.pData);
|
||||||
matrix::Matrix<float, M, P> Product = Me * Him;
|
matrix::Matrix<float, M, P> Product = Me * Him;
|
||||||
Matrix<M, P> res(Product.data());
|
Matrix<M, P> res(Product.data());
|
||||||
return res;
|
return res;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* transpose the matrix
|
* transpose the matrix
|
||||||
*/
|
*/
|
||||||
Matrix<N, M> transposed(void) const {
|
Matrix<N, M> transposed(void) const {
|
||||||
#ifdef CONFIG_ARCH_ARM
|
|
||||||
Matrix<N, M> res;
|
|
||||||
arm_mat_trans_f32(&this->arm_mat, &res.arm_mat);
|
|
||||||
return res;
|
|
||||||
#else
|
|
||||||
matrix::Matrix<float, N, M> Me(this->arm_mat.pData);
|
matrix::Matrix<float, N, M> Me(this->arm_mat.pData);
|
||||||
Matrix<N, M> res(Me.transpose().data());
|
Matrix<N, M> res(Me.transpose().data());
|
||||||
return res;
|
return res;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* invert the matrix
|
* invert the matrix
|
||||||
*/
|
*/
|
||||||
Matrix<M, N> inversed(void) const {
|
Matrix<M, N> inversed(void) const {
|
||||||
#ifdef CONFIG_ARCH_ARM
|
|
||||||
Matrix<M, N> res;
|
|
||||||
arm_mat_inverse_f32(&this->arm_mat, &res.arm_mat);
|
|
||||||
return res;
|
|
||||||
#else
|
|
||||||
matrix::SquareMatrix<float, M> Me = matrix::Matrix<float, M, N>(this->arm_mat.pData);
|
matrix::SquareMatrix<float, M> Me = matrix::Matrix<float, M, N>(this->arm_mat.pData);
|
||||||
Matrix<M, N> res(Me.I().data());
|
Matrix<M, N> res(Me.I().data());
|
||||||
return res;
|
return res;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -401,15 +375,10 @@ public:
|
||||||
* multiplication by a vector
|
* multiplication by a vector
|
||||||
*/
|
*/
|
||||||
Vector<M> operator *(const Vector<N> &v) const {
|
Vector<M> operator *(const Vector<N> &v) const {
|
||||||
#ifdef CONFIG_ARCH_ARM
|
|
||||||
Vector<M> res;
|
|
||||||
arm_mat_mult_f32(&this->arm_mat, &v.arm_col, &res.arm_col);
|
|
||||||
#else
|
|
||||||
matrix::Matrix<float, M, N> Me(this->arm_mat.pData);
|
matrix::Matrix<float, M, N> Me(this->arm_mat.pData);
|
||||||
matrix::Matrix<float, N, 1> Vec(v.arm_col.pData);
|
matrix::Matrix<float, N, 1> Vec(v.arm_col.pData);
|
||||||
matrix::Matrix<float, M, 1> Product = Me * Vec;
|
matrix::Matrix<float, M, 1> Product = Me * Vec;
|
||||||
Vector<M> res(Product.data());
|
Vector<M> res(Product.data());
|
||||||
#endif
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -45,12 +45,9 @@
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH_ARM
|
|
||||||
#include "../CMSIS/Include/arm_math.h"
|
|
||||||
#else
|
|
||||||
#include <platforms/ros/eigen_math.h>
|
#include <platforms/ros/eigen_math.h>
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <platforms/px4_defines.h>
|
#include <platforms/px4_defines.h>
|
||||||
|
|
||||||
|
@ -72,11 +69,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* struct for using arm_math functions, represents column vector
|
* struct for using arm_math functions, represents column vector
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_ARCH_ARM
|
|
||||||
arm_matrix_instance_f32 arm_col;
|
|
||||||
#else
|
|
||||||
eigen_matrix_instance arm_col;
|
eigen_matrix_instance arm_col;
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -47,9 +47,3 @@
|
||||||
#include "math/Limits.hpp"
|
#include "math/Limits.hpp"
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH_ARM
|
|
||||||
|
|
||||||
#include "CMSIS/Include/arm_math.h"
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
Loading…
Reference in New Issue