aboutsummaryrefslogtreecommitdiffstats
path: root/testhal/STM32/STM32F4xx
diff options
context:
space:
mode:
authorbarthess <barthess@yandex.ru>2015-02-25 23:02:05 +0300
committerbarthess <barthess@yandex.ru>2015-02-25 23:02:05 +0300
commit7ac7d41b203681068a8ccd076a7f99bfac0e13f0 (patch)
treeabf771897170ac5d5814622244eb6abe42ba6c66 /testhal/STM32/STM32F4xx
parent900963482d2589fd752f0c7501c99b98ef4e8b82 (diff)
downloadChibiOS-Contrib-7ac7d41b203681068a8ccd076a7f99bfac0e13f0.tar.gz
ChibiOS-Contrib-7ac7d41b203681068a8ccd076a7f99bfac0e13f0.tar.bz2
ChibiOS-Contrib-7ac7d41b203681068a8ccd076a7f99bfac0e13f0.zip
FSMC_SRAM haltest. Added memcpy over DMA speed test
Diffstat (limited to 'testhal/STM32/STM32F4xx')
-rw-r--r--testhal/STM32/STM32F4xx/FSMC_SRAM/Makefile3
-rw-r--r--testhal/STM32/STM32F4xx/FSMC_SRAM/membench.c31
-rw-r--r--testhal/STM32/STM32F4xx/FSMC_SRAM/membench.h9
-rw-r--r--testhal/STM32/STM32F4xx/FSMC_SRAM/memcpy_dma.c113
-rw-r--r--testhal/STM32/STM32F4xx/FSMC_SRAM/memcpy_dma.h24
5 files changed, 170 insertions, 10 deletions
diff --git a/testhal/STM32/STM32F4xx/FSMC_SRAM/Makefile b/testhal/STM32/STM32F4xx/FSMC_SRAM/Makefile
index 7ae1c80..33fc717 100644
--- a/testhal/STM32/STM32F4xx/FSMC_SRAM/Makefile
+++ b/testhal/STM32/STM32F4xx/FSMC_SRAM/Makefile
@@ -101,7 +101,8 @@ CSRC = $(PORTSRC) \
$(PLATFORMSRC) \
$(BOARDSRC) \
main.c \
- membench.c
+ membench.c \
+ memcpy_dma.c
# C++ sources that can be compiled in ARM or THUMB mode depending on the global
# setting.
diff --git a/testhal/STM32/STM32F4xx/FSMC_SRAM/membench.c b/testhal/STM32/STM32F4xx/FSMC_SRAM/membench.c
index 4e9dfcb..91b9aee 100644
--- a/testhal/STM32/STM32F4xx/FSMC_SRAM/membench.c
+++ b/testhal/STM32/STM32F4xx/FSMC_SRAM/membench.c
@@ -20,6 +20,7 @@
#include "hal.h"
#include "membench.h"
+#include "memcpy_dma.h"
/*
******************************************************************************
@@ -54,9 +55,9 @@ volatile int warning_suppressor;
******************************************************************************
*/
/*
- * Calculates memory access time in MiB.
+ * Calculates memory access time in MiB/s.
*/
-double speed(const time_measurement_t *tmu, size_t len) {
+double speed_mibps(const time_measurement_t *tmu, size_t len) {
double size; // MiB
double time; // sec
@@ -70,6 +71,17 @@ double speed(const time_measurement_t *tmu, size_t len) {
}
/*
+ * Calculates memory access time in B/s.
+ */
+uint32_t speed_bps(const time_measurement_t *tmu, size_t len) {
+
+ uint64_t tmp = len;
+ tmp *= STM32_SYSCLK;
+
+ return tmp / tmu->last;
+}
+
+/*
******************************************************************************
* EXPORTED FUNCTIONS
******************************************************************************
@@ -93,20 +105,29 @@ void membench_run(membench_t *dest, const membench_t *src,
chTMStartMeasurementX(&mem_tmu);
memset(dest->start, 0x55, dest->size);
chTMStopMeasurementX(&mem_tmu);
- result->memset_spd = speed(&mem_tmu, dest->size);
+ result->memset = speed_bps(&mem_tmu, dest->size);
/* memcpy */
chTMObjectInit(&mem_tmu);
chTMStartMeasurementX(&mem_tmu);
memcpy(dest->start, src->start, len);
chTMStopMeasurementX(&mem_tmu);
- result->memcpy_spd = speed(&mem_tmu, len);
+ result->memcpy = speed_bps(&mem_tmu, len);
/* memcmp */
chTMObjectInit(&mem_tmu);
chTMStartMeasurementX(&mem_tmu);
warning_suppressor = memcmp(dest->start, src->start, len);
chTMStopMeasurementX(&mem_tmu);
- result->memcmp_spd = speed(&mem_tmu, len);
+ result->memcmp = speed_bps(&mem_tmu, len);
+
+ /* memcpy DMA */
+ memcpy_dma_start();
+ chTMObjectInit(&mem_tmu);
+ chTMStartMeasurementX(&mem_tmu);
+ memcpy_dma(dest->start, src->start, len);
+ chTMStopMeasurementX(&mem_tmu);
+ result->memcpy_dma = speed_bps(&mem_tmu, len);
+ memcpy_dma_stop();
}
diff --git a/testhal/STM32/STM32F4xx/FSMC_SRAM/membench.h b/testhal/STM32/STM32F4xx/FSMC_SRAM/membench.h
index 76ef46c..5f23e1c 100644
--- a/testhal/STM32/STM32F4xx/FSMC_SRAM/membench.h
+++ b/testhal/STM32/STM32F4xx/FSMC_SRAM/membench.h
@@ -10,12 +10,13 @@ typedef struct {
} membench_t;
/*
- *
+ * all values in B/s
*/
typedef struct {
- double memset_spd;
- double memcpy_spd;
- double memcmp_spd;
+ uint32_t memset;
+ uint32_t memcpy;
+ uint32_t memcpy_dma;
+ uint32_t memcmp;
} membench_result_t;
/*
diff --git a/testhal/STM32/STM32F4xx/FSMC_SRAM/memcpy_dma.c b/testhal/STM32/STM32F4xx/FSMC_SRAM/memcpy_dma.c
new file mode 100644
index 0000000..2705382
--- /dev/null
+++ b/testhal/STM32/STM32F4xx/FSMC_SRAM/memcpy_dma.c
@@ -0,0 +1,113 @@
+/*
+ ChibiOS/RT - Copyright (C) 2013-2014 Uladzimir Pylinsky aka barthess
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+#include <string.h>
+
+#include "ch.h"
+#include "hal.h"
+
+#include "memcpy_dma.h"
+
+/*
+ ******************************************************************************
+ * DEFINES
+ ******************************************************************************
+ */
+#define STM32_MEMCPY_DMA_PRIORITY 0
+#define STM32_MEMCPY_DMA_STREAM STM32_DMA_STREAM_ID(2, 6)
+
+/*
+ ******************************************************************************
+ * EXTERNS
+ ******************************************************************************
+ */
+
+/*
+ ******************************************************************************
+ * PROTOTYPES
+ ******************************************************************************
+ */
+
+/*
+ ******************************************************************************
+ * GLOBAL VARIABLES
+ ******************************************************************************
+ */
+static memcpy_dma_engine_t engine;
+
+/*
+ ******************************************************************************
+ ******************************************************************************
+ * LOCAL FUNCTIONS
+ ******************************************************************************
+ ******************************************************************************
+ */
+
+/*
+ ******************************************************************************
+ * EXPORTED FUNCTIONS
+ ******************************************************************************
+ */
+/*
+ *
+ */
+void memcpy_dma_start(void) {
+ bool b;
+
+ engine.dma = STM32_DMA_STREAM(STM32_MEMCPY_DMA_STREAM);
+ b = dmaStreamAllocate(engine.dma, STM32_NAND_DMA_PRIORITY, NULL, NULL);
+ osalDbgAssert(!b, "stream already allocated");
+}
+
+/*
+ *
+ */
+void memcpy_dma_stop(void) {
+ dmaStreamRelease(engine.dma);
+}
+
+/*
+ *
+ */
+void memcpy_dma(void *dest, const void *src, size_t size) {
+
+ size_t words = size / 4;
+ size_t remainder = size % 4;
+ size_t max_block = 0xFFFF; /* DMA limitation */
+
+ uint32_t cr = STM32_DMA_CR_PSIZE_WORD | STM32_DMA_CR_MSIZE_WORD;
+
+ while (words > max_block) {
+ dmaStartMemCopy(engine.dma, cr, src, dest, max_block)
+ dmaWaitCompletion(engine.dma);
+ words -= max_block;
+ }
+
+ dmaStartMemCopy(engine.dma, cr, src, dest, words)
+ dmaWaitCompletion(engine.dma);
+
+ if (remainder > 0)
+ memcpy(dest+size-remainder, src+size-remainder, remainder);
+}
+
+
+
+
+
+
+
+
+
diff --git a/testhal/STM32/STM32F4xx/FSMC_SRAM/memcpy_dma.h b/testhal/STM32/STM32F4xx/FSMC_SRAM/memcpy_dma.h
new file mode 100644
index 0000000..ceefee1
--- /dev/null
+++ b/testhal/STM32/STM32F4xx/FSMC_SRAM/memcpy_dma.h
@@ -0,0 +1,24 @@
+#ifndef MEMCPY_DMA_H_
+#define MEMCPY_DMA_H_
+
+/*
+ *
+ */
+typedef struct {
+ const stm32_dma_stream_t *dma;
+} memcpy_dma_engine_t;
+
+/*
+ *
+ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+ void memcpy_dma_start(void);
+ void memcpy_dma_stop(void);
+ void memcpy_dma(void *dest, const void *src, size_t size);
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* MEMCPY_DMA_H_ */