diff options
-rw-r--r-- | Makefile | 9 | ||||
-rw-r--r-- | libc/gettimeofday.c | 26 | ||||
-rw-r--r-- | main.c | 12 | ||||
-rw-r--r-- | self-test/fmc-perf.c | 110 |
4 files changed, 147 insertions, 10 deletions
@@ -1,6 +1,6 @@ -SELF-TESTS = fmc-test led-test short-test uart-test fmc-probe +SELF-TESTS = fmc-test led-test short-test uart-test fmc-perf -LIBHAL-TESTS = test-hash test-aes-key-wrap test-pbkdf2 #test-ecdsa test-rsa +LIBHAL-TESTS = cores test-bus test-hash test-aes-key-wrap test-pbkdf2 test-ecdsa #test-rsa # put your *.o targets here, make should handle the rest! SRCS = stm32f4xx_hal_msp.c stm32f4xx_it.c stm-fmc.c stm-init.c stm-uart.c @@ -99,8 +99,8 @@ CFLAGS += -I libhal %.mo: %.c $(CC) -c $(CFLAGS) -Dmain=__main -o $@ $< -vpath %.c libc -%.bin: %.mo main.o syscalls.o printf.o $(OBJS) $(LIBS) +vpath %.c libc libhal/utils +%.bin: %.mo main.o syscalls.o printf.o gettimeofday.o $(OBJS) $(LIBS) $(CC) $(CFLAGS) $^ -o $*.elf -L$(LDSCRIPT_INC) -T$(MCU_LINKSCRIPT) -g -Wl,-Map=$*.map $(OBJCOPY) -O ihex $*.elf $*.hex $(OBJCOPY) -O binary $*.elf $*.bin @@ -122,3 +122,4 @@ distclean: clean $(MAKE) -C $(STD_PERIPH_LIB) clean $(MAKE) -C thirdparty/libtfm clean $(MAKE) -C libhal clean + diff --git a/libc/gettimeofday.c b/libc/gettimeofday.c new file mode 100644 index 0000000..b0561c3 --- /dev/null +++ b/libc/gettimeofday.c @@ -0,0 +1,26 @@ +#include <stdint.h> + +#include "stm32f4xx_hal.h" + +/* Don't #include <sys/time.h> because of conflicting prototype in newlib. */ + +/* from the manpage: */ +struct timeval { + time_t tv_sec; /* seconds */ + suseconds_t tv_usec; /* microseconds */ +}; + +struct timezone { + int tz_minuteswest; /* minutes west of Greenwich */ + int tz_dsttime; /* type of DST correction */ +}; + +int gettimeofday(struct timeval *tv, struct timezone *tz) +{ + uint32_t tick = HAL_GetTick(); /* uptime in ms */ + + tv->tv_sec = tick / 1000; + tv->tv_usec = (tick % 1000) * 1000; + + return 0; +} @@ -3,15 +3,15 @@ */ #include "stm-init.h" +#include "stm-fmc.h" #include "stm-uart.h" +extern void __main(void); + void main(void) { - stm_init(); - fmc_init(); - while(1) { + stm_init(); + fmc_init(); __main(); - uart_send_string("\r\n"); - HAL_Delay(2000); - } + uart_send_string("Done.\r\n\r\n"); } diff --git a/self-test/fmc-perf.c b/self-test/fmc-perf.c new file mode 100644 index 0000000..f0185a0 --- /dev/null +++ b/self-test/fmc-perf.c @@ -0,0 +1,110 @@ +/* + * Test read/write performance of the fmc bus + */ +#include "stm32f4xx_hal.h" +#include "stm-init.h" +#include "stm-fmc.h" +#include "stm-uart.h" + +#define TEST_NUM_ROUNDS 2000000 + +RNG_HandleTypeDef rng_inst; + +static void MX_RNG_Init(void) +{ + rng_inst.Instance = RNG; + HAL_RNG_Init(&rng_inst); +} + +static uint32_t random(void) +{ + uint32_t rnd; + if (HAL_RNG_GenerateRandomNumber(&rng_inst, &rnd) != HAL_OK) { + uart_send_string("HAL_RNG_GenerateRandomNumber failed\r\n"); + Error_Handler(); + } + return rnd; +} + +static void sanity(void) +{ + uint32_t rnd, data; + + rnd = random(); + if (fmc_write_32(0, &rnd) != 0) { + uart_send_string("fmc_write_32 failed\r\n"); + Error_Handler(); + } + if (fmc_read_32(0, &data) != 0) { + uart_send_string("fmc_read_32 failed\r\n"); + Error_Handler(); + } + if (data != rnd) { + uart_send_string("Data bus fail: expected "); + uart_send_hex(rnd, 8); + uart_send_string(", got "); + uart_send_hex(data, 8); + uart_send_string(", diff "); + uart_send_hex(data ^ rnd, 8); + uart_send_string("\r\n"); + Error_Handler(); + } +} + +static void _time_check(char *label, const uint32_t t0) +{ + uint32_t t = HAL_GetTick() - t0; + + uart_send_string(label); + uart_send_integer(t / 1000, 0); + uart_send_char('.'); + uart_send_integer(t % 1000, 999); + uart_send_string(" seconds, "); + uart_send_integer((1000 * TEST_NUM_ROUNDS) / t, 0); + uart_send_string("/sec\r\n"); +} + +#define time_check(_label_, _expr_) \ + do { \ + uint32_t _t = HAL_GetTick(); \ + (_expr_); \ + _time_check(_label_, _t); \ + } while (0) + +static void test_read(void) +{ + uint32_t i, data; + + for (i = 0; i < TEST_NUM_ROUNDS; ++i) { + if (fmc_read_32(0, &data) != 0) { + uart_send_string("fmc_read_32 failed\r\n"); + Error_Handler(); + } + } +} + +static void test_write(void) +{ + uint32_t i; + + for (i = 0; i < TEST_NUM_ROUNDS; ++i) { + if (fmc_write_32(0, &i) != 0) { + uart_send_string("fmc_write_32 failed\r\n"); + Error_Handler(); + } + } +} + +int main(void) +{ + stm_init(); + MX_RNG_Init(); + fmc_init(); + + sanity(); + + time_check("read ", test_read()); + time_check("write ", test_write()); + + return 0; +} |