SAMA5: Add support for the FPU OS test

This commit is contained in:
Gregory Nutt
2013-09-18 10:35:03 -06:00
parent 8f88387712
commit 0c62e5797e
6 changed files with 131 additions and 7 deletions
+2
View File
@@ -5588,4 +5588,6 @@
need to set a PHY configuration (2013-9-17). need to set a PHY configuration (2013-9-17).
* arch/arm/src/lpc17xx/lpc17_spi.c: Remove undefined spi_select() * arch/arm/src/lpc17xx/lpc17_spi.c: Remove undefined spi_select()
prototype. This was cause compile time warnings (2013-9-17). prototype. This was cause compile time warnings (2013-9-17).
* configs/sama5d3x-ek/src/sam_ostest.c: Add OS test support for
the FPU test (2013-9-18).
+8 -1
View File
@@ -187,7 +187,14 @@
#endif #endif
/* EMAC buffer sizes, number of buffers, and number of descriptors */ /* EMAC buffer sizes, number of buffers, and number of descriptors.
*
* REVISIT: The CONFIG_NET_MULTIBUFFER might be useful. It might be possible
* to use this option to send and receive messages directly into the DMA
* buffers, saving a copy. There might be complications on the receiving
* side, however, where buffers may wrap and where the size of the received
* frame will typically be smaller than a full packet.
*/
#ifdef CONFIG_NET_MULTIBUFFER #ifdef CONFIG_NET_MULTIBUFFER
# error CONFIG_NET_MULTIBUFFER must not be set # error CONFIG_NET_MULTIBUFFER must not be set
+1 -5
View File
@@ -2056,11 +2056,7 @@ Configurations
configuration to start the program in NOR FLASH (see just above). configuration to start the program in NOR FLASH (see just above).
See "Creating and Using NORBOOT" above. See "Creating and Using NORBOOT" above.
2013-7-31: The OS test configuration is basically functional, but 2013-7-31: The OS test configuration is functional.
takes a very long time in the round-robin scheduler test computing
prime numbers. This test is supposed to be slow -- like several
seconds -- but not many minutes. No idea why yet. The best guess
would be an excessive number of context switches.
2013-7-31: Using delay loop calibration from the hello configuration. 2013-7-31: Using delay loop calibration from the hello configuration.
That configuration runs out of internal SRAM and, as a result, this That configuration runs out of internal SRAM and, as a result, this
+3 -1
View File
@@ -88,6 +88,7 @@ CONFIG_ARCH_CHIP_SAMA5=y
# CONFIG_ARCH_CORTEXM3 is not set # CONFIG_ARCH_CORTEXM3 is not set
# CONFIG_ARCH_CORTEXM4 is not set # CONFIG_ARCH_CORTEXM4 is not set
CONFIG_ARCH_CORTEXA5=y CONFIG_ARCH_CORTEXA5=y
# CONFIG_ARCH_CORTEXA8 is not set
CONFIG_ARCH_FAMILY="armv7-a" CONFIG_ARCH_FAMILY="armv7-a"
CONFIG_ARCH_CHIP="sama5" CONFIG_ARCH_CHIP="sama5"
CONFIG_ARCH_HAVE_FPU=y CONFIG_ARCH_HAVE_FPU=y
@@ -148,7 +149,6 @@ CONFIG_SAMA5_USART1=y
# CONFIG_SAMA5_UHPHS is not set # CONFIG_SAMA5_UHPHS is not set
# CONFIG_SAMA5_UDPHS is not set # CONFIG_SAMA5_UDPHS is not set
# CONFIG_SAMA5_GMAC is not set # CONFIG_SAMA5_GMAC is not set
# CONFIG_SAMA5_EMAC is not set
# CONFIG_SAMA5_LCDC is not set # CONFIG_SAMA5_LCDC is not set
# CONFIG_SAMA5_ISI is not set # CONFIG_SAMA5_ISI is not set
# CONFIG_SAMA5_SSC0 is not set # CONFIG_SAMA5_SSC0 is not set
@@ -163,6 +163,8 @@ CONFIG_SAMA5_USART1=y
# CONFIG_SAMA5_FUSE is not set # CONFIG_SAMA5_FUSE is not set
# CONFIG_SAMA5_MPDDRC is not set # CONFIG_SAMA5_MPDDRC is not set
# CONFIG_SAMA5_PIO_IRQ is not set # CONFIG_SAMA5_PIO_IRQ is not set
CONFIG_SAMA5_HAVE_GMAC=y
# CONFIG_SAMA5_HAVE_EMAC is not set
# #
# External Memory Configuration # External Memory Configuration
+4
View File
@@ -110,6 +110,10 @@ ifeq ($(CONFIG_USBMSC),y)
CSRCS += sam_usbmsc.c CSRCS += sam_usbmsc.c
endif endif
ifeq ($(CONFIG_ARCH_FPU),y)
CSRCS += sam_ostest.c
endif
ifeq ($(CONFIG_ARCH_LEDS),y) ifeq ($(CONFIG_ARCH_LEDS),y)
CSRCS += sam_autoleds.c CSRCS += sam_autoleds.c
else else
+113
View File
@@ -0,0 +1,113 @@
/************************************************************************************
* configs/sama5d3x-ek/src/sam_ostest.c
*
* Copyright (C) 2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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.
*
************************************************************************************/
/************************************************************************************
* Included Files
************************************************************************************/
#include <nuttx/config.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <debug.h>
#include <arch/irq.h>
#include <arch/board/board.h>
#include "up_arch.h"
#include "up_internal.h"
#include "sama5d3x-ek.h"
/************************************************************************************
* Definitions
************************************************************************************/
/* Configuration ********************************************************************/
#undef HAVE_FPU
#if defined(CONFIG_ARCH_FPU) && !defined(CONFIG_EXAMPLES_OSTEST_FPUTESTDISABLE) && \
defined(CONFIG_EXAMPLES_OSTEST_FPUSIZE) && defined(CONFIG_SCHED_WAITPID) && \
!defined(CONFIG_DISABLE_SIGNALS)
# define HAVE_FPU 1
#endif
#ifdef HAVE_FPU
#if CONFIG_EXAMPLES_OSTEST_FPUSIZE != (4*FPU_CONTEXT_REGS)
# error "CONFIG_EXAMPLES_OSTEST_FPUSIZE has the wrong size"
#endif
/************************************************************************************
* Private Data
************************************************************************************/
static uint32_t g_saveregs[XCPTCONTEXT_REGS];
/************************************************************************************
* Private Functions
************************************************************************************/
/************************************************************************************
* Public Functions
************************************************************************************/
/* Given an array of size CONFIG_EXAMPLES_OSTEST_FPUSIZE, this function will return
* the current FPU registers.
*/
void arch_getfpu(FAR uint32_t *fpusave)
{
irqstate_t flags;
/* Take a snapshot of the thread context right now */
flags = irqsave();
up_saveusercontext(g_saveregs);
/* Return only the floating register values */
memcpy(fpusave, &g_saveregs[REG_S0], (4*FPU_CONTEXT_REGS));
irqrestore(flags);
}
/* Given two arrays of size CONFIG_EXAMPLES_OSTEST_FPUSIZE this function
* will compare them and return true if they are identical.
*/
bool arch_cmpfpu(FAR const uint32_t *fpusave1, FAR const uint32_t *fpusave2)
{
return memcmp(fpusave1, fpusave2, (4*FPU_CONTEXT_REGS)) == 0;
}
#endif /* HAVE_FPU */