aboutsummaryrefslogtreecommitdiffstats
path: root/testhal/STM32/STM32F4xx/FSMC_SDRAM/membench.c
diff options
context:
space:
mode:
authorbarthess <barthess@yandex.ru>2015-06-30 23:53:35 +0300
committerbarthess <barthess@yandex.ru>2015-06-30 23:53:35 +0300
commit95da8798dd924b6eceb60c41f26d262d83799acb (patch)
tree1ead083c27d7e06cbd355bbe31e73ed294209ca9 /testhal/STM32/STM32F4xx/FSMC_SDRAM/membench.c
parentb7175b45107d5b0677266c8d4eb0c49e4cc2ca0b (diff)
downloadChibiOS-Contrib-95da8798dd924b6eceb60c41f26d262d83799acb.tar.gz
ChibiOS-Contrib-95da8798dd924b6eceb60c41f26d262d83799acb.tar.bz2
ChibiOS-Contrib-95da8798dd924b6eceb60c41f26d262d83799acb.zip
Added SDRAM teshtal. Not tested in hardware
Diffstat (limited to 'testhal/STM32/STM32F4xx/FSMC_SDRAM/membench.c')
-rw-r--r--testhal/STM32/STM32F4xx/FSMC_SDRAM/membench.c133
1 files changed, 133 insertions, 0 deletions
diff --git a/testhal/STM32/STM32F4xx/FSMC_SDRAM/membench.c b/testhal/STM32/STM32F4xx/FSMC_SDRAM/membench.c
new file mode 100644
index 0000000..91b9aee
--- /dev/null
+++ b/testhal/STM32/STM32F4xx/FSMC_SDRAM/membench.c
@@ -0,0 +1,133 @@
+/*
+ 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 "membench.h"
+#include "memcpy_dma.h"
+
+/*
+ ******************************************************************************
+ * DEFINES
+ ******************************************************************************
+ */
+
+/*
+ ******************************************************************************
+ * EXTERNS
+ ******************************************************************************
+ */
+
+/*
+ ******************************************************************************
+ * PROTOTYPES
+ ******************************************************************************
+ */
+
+/*
+ ******************************************************************************
+ * GLOBAL VARIABLES
+ ******************************************************************************
+ */
+volatile int warning_suppressor;
+
+/*
+ ******************************************************************************
+ ******************************************************************************
+ * LOCAL FUNCTIONS
+ ******************************************************************************
+ ******************************************************************************
+ */
+/*
+ * Calculates memory access time in MiB/s.
+ */
+double speed_mibps(const time_measurement_t *tmu, size_t len) {
+ double size; // MiB
+ double time; // sec
+
+ size = len;
+ size /= 1024 * 1024;
+
+ time = tmu->last;
+ time /= STM32_SYSCLK;
+
+ return size / time;
+}
+
+/*
+ * 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
+ ******************************************************************************
+ */
+
+/*
+ *
+ */
+void membench_run(membench_t *dest, const membench_t *src,
+ membench_result_t *result) {
+ time_measurement_t mem_tmu;
+ size_t len;
+
+ if (src->size < dest->size)
+ len = src->size;
+ else
+ len = dest->size;
+
+ /* memset */
+ chTMObjectInit(&mem_tmu);
+ chTMStartMeasurementX(&mem_tmu);
+ memset(dest->start, 0x55, dest->size);
+ chTMStopMeasurementX(&mem_tmu);
+ 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 = 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 = 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();
+}
+