From 2e16f5125261e22c2c1cd5b058b31bae1cd6419a Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 19 Jun 2012 23:09:42 -0700 Subject: [PATCH 1/5] Python program to verify logic on the Lollipop board. --- firmware/sgpio/Makefile | 4 +- firmware/sgpio/sgpio.c | 8 +- hardware/lollipop/lollipop_logic.py | 201 ++++++++++++++++++++++++++++ 3 files changed, 209 insertions(+), 4 deletions(-) create mode 100755 hardware/lollipop/lollipop_logic.py diff --git a/firmware/sgpio/Makefile b/firmware/sgpio/Makefile index 7eefb0de..24eefbd1 100644 --- a/firmware/sgpio/Makefile +++ b/firmware/sgpio/Makefile @@ -4,6 +4,8 @@ BINARY = sgpio SRC = $(BINARY).c \ ../common/hackrf_core.c \ - ../common/si5351c.c + ../common/si5351c.c \ + ../common/max2837.c \ + ../common/max5864.c include ../common/Makefile_inc.mk diff --git a/firmware/sgpio/sgpio.c b/firmware/sgpio/sgpio.c index c270592c..cc200142 100644 --- a/firmware/sgpio/sgpio.c +++ b/firmware/sgpio/sgpio.c @@ -27,6 +27,7 @@ #include #include +#include void pin_setup(void) { /* Configure SCU Pin Mux as GPIO */ @@ -286,6 +287,7 @@ int main(void) { pin_setup(); enable_1v8_power(); cpu_clock_init(); + ssp1_init(); CGU_BASE_PERIPH_CLK = (CGU_BASE_CLK_AUTOBLOCK | (CGU_SRC_PLL1 << CGU_BASE_CLK_SEL_SHIFT)); @@ -293,10 +295,10 @@ int main(void) { CGU_BASE_APB1_CLK = (CGU_BASE_CLK_AUTOBLOCK | (CGU_SRC_PLL1 << CGU_BASE_CLK_SEL_SHIFT)); - gpio_set(PORT_LED1_3, (PIN_LED1 | PIN_LED2 | PIN_LED3)); /* LEDs on */ + gpio_set(PORT_LED1_3, PIN_LED1); - //test_sgpio_interface(); - configure_sgpio_test_rx(); + ssp1_set_mode_max5864(); + max5864_xcvr(); while (1) { diff --git a/hardware/lollipop/lollipop_logic.py b/hardware/lollipop/lollipop_logic.py new file mode 100755 index 00000000..4fea2c6e --- /dev/null +++ b/hardware/lollipop/lollipop_logic.py @@ -0,0 +1,201 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 Jared Boone +# +# This file is part of HackRF. +# +# This is a free hardware design; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This design is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this design; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +# This program is used to verify the logic on the Lollipop board, to +# make sure control of the various RF paths is correct. + +class Component(object): + def __init__(self, **kwargs): + self.state = kwargs + + def __repr__(self): + state_key = ''.join( + map(str, + map(int, + (self.state[input] for input in self.inputs) + ) + ) + ) + if state_key not in self.states: + return 'Invalid' + else: + return self.functions[self.states[state_key]] + +class SKY13317(Component): + inputs = ( + 'V1', + 'V2', + 'V3', + ) + + states = { + # V1, V2, V3 + '100': 'RFC to RF1', + '010': 'RFC to RF2', + '001': 'RFC to RF3', + } + +class SKY13351(Component): + inputs = ( + 'VCTL1', + 'VCTL2', + ) + + states = { + # VCTL1, VCTL2 + '01': 'INPUT to OUTPUT1', + '10': 'INPUT to OUTPUT2', + } + +class U2_4(SKY13351): + name = 'U2/4' + functions = { + 'INPUT to OUTPUT1': 'tx bandpass', + 'INPUT to OUTPUT2': 'tx mixer' + } + +class U6_9(SKY13351): + name = 'U6/9' + functions = { + 'INPUT to OUTPUT1': 'tx lowpass', + 'INPUT to OUTPUT2': 'tx highpass', + } + +class U3(SKY13317): + name = 'U3' + functions = { + 'RFC to RF1': 'tx highpass', + 'RFC to RF2': 'tx lowpass', + 'RFC to RF3': 'tx bandpass', + } + +class U7(SKY13351): + name = 'U7' + functions = { + 'INPUT to OUTPUT1': 'rx switch', + 'INPUT to OUTPUT2': 'tx path', + } + +class U10(SKY13351): + name = 'U10' + functions = { + 'INPUT to OUTPUT1': 'tx/rx switch', + 'INPUT to OUTPUT2': 'rx antenna', + } + +class U15(SKY13317): + name = 'U15' + functions = { + 'RFC to RF1': 'rx bandpass', + 'RFC to RF2': 'rx highpass', + 'RFC to RF3': 'rx lowpass', + } + +class U12_14(SKY13351): + name = 'U12/14' + functions = { + 'INPUT to OUTPUT1': 'rx lowpass', + 'INPUT to OUTPUT2': 'rx highpass', + } + +class U16_18(SKY13351): + name = 'U16/18' + functions = { + 'INPUT to OUTPUT1': 'rx mixer', + 'INPUT to OUTPUT2': 'rx bandpass', + } + +def compute_logic(**inputs): + outputs = dict(inputs) + outputs['swtxb2'] = not inputs['swtxb1'] + outputs['swrxb2'] = not inputs['swrxb1'] + outputs['swtxa2'] = not inputs['swtxa1'] + outputs['swrxa2'] = not inputs['swrxa1'] + outputs['swd2'] = not inputs['swd1'] + outputs['swrxv2'] = outputs['swrxb2'] and outputs['swrxa1'] + outputs['swrxv3'] = outputs['swrxb2'] and outputs['swrxa2'] + outputs['swtxv1'] = outputs['swtxa1'] and outputs['swtxb1'] + outputs['swtxv2'] = outputs['swtxa2'] and outputs['swtxb1'] + + # Force boolean True/False (result of "not" operator) to 1 or 0. + for key in outputs: + outputs[key] = int(outputs[key]) + + return outputs + +def print_signals(signals): + print(', '.join(('%s=%s' % (name, signals[name]) for name in sorted(signals)))) + +def print_circuit_state(signals): + components = ( + U2_4(VCTL1=signals['swtxb1'], VCTL2=signals['swtxb2']), + U6_9(VCTL1=signals['swtxa1'], VCTL2=signals['swtxa2']), + U3(V1=signals['swtxv1'], V2=signals['swtxv2'], V3=signals['swtxb2']), + U7(VCTL1=signals['swd2'], VCTL2=signals['swd1']), + U10(VCTL1=signals['swd2'], VCTL2=signals['swd1']), + U15(V1=signals['swrxb1'], V2=signals['swrxv2'], V3=signals['swrxv3']), + U12_14(VCTL1=signals['swrxa1'], VCTL2=signals['swrxa2']), + U16_18(VCTL1=signals['swrxb1'], VCTL2=signals['swrxb2']) + ) + + for component in components: + print('%s: %s' % (component.name, component)) + +def make_bits_from_numbers(i, bit_count): + return [int(c) for c in bin(i)[2:].zfill(bit_count)] + +print('Transmit') +print('========') +print +for i in range(4): + inputs = { + 'swtxb1': (i >> 1) & 1, + 'swtxa1': (i >> 0) & 1, + 'swrxa1': 0, + 'swrxb1': 0, + 'swd1': 0, + } + + outputs = compute_logic(**inputs) + print_signals(outputs) + print_circuit_state(outputs) + + print + +print('Receive') +print('========') +print +for i in range(4): + inputs = { + 'swtxb1': 0, + 'swtxa1': 0, + 'swrxa1': (i >> 1) & 1, + 'swrxb1': (i >> 0) & 1, + 'swd1': 0, + } + + outputs = compute_logic(**inputs) + print_signals(outputs) + print_circuit_state(outputs) + + print From dfb38a5a5906f1b3e9e459810fa04e207b0875b1 Mon Sep 17 00:00:00 2001 From: TitanMKD Date: Mon, 25 Jun 2012 22:02:55 +0200 Subject: [PATCH 2/5] Fix asm macro --- .../startup_systick.c | 204 +++++++++--------- 1 file changed, 102 insertions(+), 102 deletions(-) diff --git a/firmware/startup_systick_rom_to_ram/startup_systick.c b/firmware/startup_systick_rom_to_ram/startup_systick.c index b80a1b59..a388a241 100644 --- a/firmware/startup_systick_rom_to_ram/startup_systick.c +++ b/firmware/startup_systick_rom_to_ram/startup_systick.c @@ -64,7 +64,7 @@ void systick_setup(void) g_ulSysTickCount = 0; /* Disable IRQ globally */ - asm volatile ("cpsid i"); + __asm__("cpsid i"); /* Set processor Clock as Source Clock */ systick_set_clocksource(STK_CTRL_CLKSOURCE); @@ -90,7 +90,7 @@ void systick_setup(void) nvic_set_priority(NVIC_SYSTICK_IRQ, 0xFF); /* Enable IRQ globally */ - asm volatile ("cpsie i"); + __asm__("cpsie i"); } void scs_dwt_cycle_counter_enabled(void) @@ -166,115 +166,115 @@ u32 test_nb_instruction_per_sec(void) do { - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); + __asm__("nop "); nb_instructions_per_sec += 100; end = sys_tick_get_time_ms(); From 53c7fcf768d1ee8784698b73eb7a7722f08e88d3 Mon Sep 17 00:00:00 2001 From: TitanMKD Date: Mon, 25 Jun 2012 22:15:10 +0200 Subject: [PATCH 3/5] * Fixed linker script form SPIFI and RAM execution. * Added performance checks and results on SPIFI & SRAM code execution. --- firmware/common/LPC4330_M4.ld | 2 +- firmware/startup_systick_perfo/Makefile | 10 + firmware/startup_systick_perfo/README | 17 + firmware/startup_systick_perfo/perf_mips.c | 2220 +++++++++++++++++ .../result_exec_from_SPIFI.txt | 33 + .../startup_systick.c | 190 +- .../startup_systick_perfo_rom_to_ram/Makefile | 11 + .../startup_systick_perfo_rom_to_ram/README | 17 + .../perf_mips.c | 2220 +++++++++++++++++ .../result_exec_from_SRAM.txt | 22 + .../startup_systick.c | 235 ++ 11 files changed, 4836 insertions(+), 141 deletions(-) create mode 100644 firmware/startup_systick_perfo/Makefile create mode 100644 firmware/startup_systick_perfo/README create mode 100644 firmware/startup_systick_perfo/perf_mips.c create mode 100644 firmware/startup_systick_perfo/result_exec_from_SPIFI.txt rename firmware/{startup_systick => startup_systick_perfo}/startup_systick.c (56%) create mode 100644 firmware/startup_systick_perfo_rom_to_ram/Makefile create mode 100644 firmware/startup_systick_perfo_rom_to_ram/README create mode 100644 firmware/startup_systick_perfo_rom_to_ram/perf_mips.c create mode 100644 firmware/startup_systick_perfo_rom_to_ram/result_exec_from_SRAM.txt create mode 100644 firmware/startup_systick_perfo_rom_to_ram/startup_systick.c diff --git a/firmware/common/LPC4330_M4.ld b/firmware/common/LPC4330_M4.ld index d73b4d47..3fb0df8b 100644 --- a/firmware/common/LPC4330_M4.ld +++ b/firmware/common/LPC4330_M4.ld @@ -24,7 +24,7 @@ MEMORY { /* rom is really the shadow region that points to SPI flash or elsewhere */ - rom (rx) : ORIGIN = 0x00000000, LENGTH = 1M + rom (rx) : ORIGIN = 0x14000000, LENGTH = 1M ram (rwx) : ORIGIN = 0x10000000, LENGTH = 128K /* there are some additional RAM regions */ } diff --git a/firmware/startup_systick_perfo/Makefile b/firmware/startup_systick_perfo/Makefile new file mode 100644 index 00000000..b667e1db --- /dev/null +++ b/firmware/startup_systick_perfo/Makefile @@ -0,0 +1,10 @@ +# Hey Emacs, this is a -*- makefile -*- + +BINARY = startup_systick_perfo_SPIFI + +SRC = startup_systick.c \ + perf_mips.c \ + ../common/hackrf_core.c \ + ../common/si5351c.c + +include ../common/Makefile_inc.mk diff --git a/firmware/startup_systick_perfo/README b/firmware/startup_systick_perfo/README new file mode 100644 index 00000000..1014d873 --- /dev/null +++ b/firmware/startup_systick_perfo/README @@ -0,0 +1,17 @@ +This program is an example of the startup sequence for HackRF (Jellybean with +Lemondrop attached). +Test number of instruction per second (MIPS) slow blink ON 1s, OFF 1s +Then after 16s (the 16tests) it blink LED1/2/3 ON/OFF each 250ms. +This example compute the number of instructions per second executed called also MIPS (Millions of Instructions Per Second) + +This example code run from SPIFI (SPI Quad mode) and the tests check different loop size to compute the cache size used with SPIFI and estimated to less than 256Bytes (about 128 instructions in best case and in Thumb2). +See result_exec_from_SPIFI.txt for more details. + +Required Lemondrop -> Jellybean connections: + +SCL: Lemondrop P7 pin 3 -> Jellybean P6 pin 3 +SDA: Lemondrop P7 pin 5 -> Jellybean P6 pin 5 +SDA: Lemondrop P7 pin 6 -> Jellybean P6 pin 6 +VCC: Lemondrop P4 pin 2, 4, or 6 -> Jellybean P17 pin 2, 4, or 6 +1V8: Lemondrop P11 pin 2, 4, or 6 -> Jellybean P16 pin 2, 4, or 6 +GND: Lemondrop P5 -> Jellybean P13 diff --git a/firmware/startup_systick_perfo/perf_mips.c b/firmware/startup_systick_perfo/perf_mips.c new file mode 100644 index 00000000..ef3d1f52 --- /dev/null +++ b/firmware/startup_systick_perfo/perf_mips.c @@ -0,0 +1,2220 @@ +/* + * Copyright 2010 - 2012 Michael Ossmann + * + * This file is part of HackRF. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include +#include +#include + +#include "hackrf_core.h" + +/* Global counter incremented by SysTick Interrupt each millisecond */ +extern volatile u32 g_ulSysTickCount; +extern u32 g_NbCyclePerSecond; + +extern u32 sys_tick_get_time_ms(void); +extern u32 sys_tick_delta_time_ms(u32 start, u32 end); +extern void sys_tick_wait_time_ms(u32 wait_ms); + + +u32 test_nb_instruction_per_sec_100_nop_asm(void) +{ + register u32 val __asm__("r0"); + + __asm__(" ldr r1, =g_ulSysTickCount"); + __asm__(" ldr r2, [r1]"); /* g_ulSysTickCount */ + __asm__(" push {r4}"); + __asm__(" movs r0, #0"); /* nb_instructions_per_sec = 0; */ + __asm__(" movw r4, #999"); /* wait_ms = 1000; */ + + __asm__("test_nb_instruction_per_sec_loop_100_nop:"); +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + + __asm__(" ldr r3, [r1]"); /* tickms = g_ulSysTickCount */ + __asm__(" adds r0, #108"); /* nb_instructions_per_sec += 108 */ + __asm__(" cmp r2, r3"); + __asm__(" it CS"); /* IF THEN Higher or same */ + __asm__(" addcs r3, #34"); + __asm__(" subs r3, r3, r2"); + __asm__(" cmp r3, r4"); + __asm__(" bls test_nb_instruction_per_sec_loop_100_nop"); /* tickms < wait_ms ? */ + + __asm__(" POP {r4}"); + + return val; +}; + +u32 test_nb_instruction_per_sec_105_nop_asm(void) +{ + register u32 val __asm__("r0"); + + __asm__(" ldr r1, =g_ulSysTickCount"); + __asm__(" ldr r2, [r1]"); /* g_ulSysTickCount */ + __asm__(" push {r4}"); + __asm__(" movs r0, #0"); /* nb_instructions_per_sec = 0; */ + __asm__(" movw r4, #999"); /* wait_ms = 1000; */ + + __asm__("test_nb_instruction_per_sec_loop_105_nop:"); +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 5 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 5 nop */ +/* Total 105 nop */ + + __asm__(" ldr r3, [r1]"); /* tickms = g_ulSysTickCount */ + __asm__(" adds r0, #113"); /* nb_instructions_per_sec += 105+8=113; */ + __asm__(" cmp r2, r3"); + __asm__(" it CS"); /* IF THEN Higher or same */ + __asm__(" addcs r3, #34"); + __asm__(" subs r3, r3, r2"); + __asm__(" cmp r3, r4"); + __asm__(" bls test_nb_instruction_per_sec_loop_105_nop"); /* tickms < wait_ms ? */ + + __asm__(" POP {r4}"); + + return val; +}; + +u32 test_nb_instruction_per_sec_110_nop_asm(void) +{ + register u32 val __asm__("r0"); + + __asm__(" ldr r1, =g_ulSysTickCount"); + __asm__(" ldr r2, [r1]"); /* g_ulSysTickCount */ + __asm__(" push {r4}"); + __asm__(" movs r0, #0"); /* nb_instructions_per_sec = 0; */ + __asm__(" movw r4, #999"); /* wait_ms = 1000; */ + + __asm__("test_nb_instruction_per_sec_loop_110_nop:"); +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 10 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 10 nop */ +/* Total 110 nop */ + + __asm__(" ldr r3, [r1]"); /* tickms = g_ulSysTickCount */ + __asm__(" adds r0, #118"); /* nb_instructions_per_sec += 118; */ + __asm__(" cmp r2, r3"); + __asm__(" it CS"); /* IF THEN Higher or same */ + __asm__(" addcs r3, #34"); + __asm__(" subs r3, r3, r2"); + __asm__(" cmp r3, r4"); + __asm__(" bls test_nb_instruction_per_sec_loop_110_nop"); /* tickms < wait_ms ? */ + + __asm__(" POP {r4}"); + + return val; +}; + +u32 test_nb_instruction_per_sec_115_nop_asm(void) +{ + register u32 val __asm__("r0"); + + __asm__(" ldr r1, =g_ulSysTickCount"); + __asm__(" ldr r2, [r1]"); /* g_ulSysTickCount */ + __asm__(" push {r4}"); + __asm__(" movs r0, #0"); /* nb_instructions_per_sec = 0; */ + __asm__(" movw r4, #999"); /* wait_ms = 1000; */ + + __asm__("test_nb_instruction_per_sec_loop_115_nop:"); +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 15 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 15 nop */ +/* Total 115 nop */ + + __asm__(" ldr r3, [r1]"); /* tickms = g_ulSysTickCount */ + __asm__(" adds r0, #123"); /* nb_instructions_per_sec += 115+8 = 123; */ + __asm__(" cmp r2, r3"); + __asm__(" it CS"); /* IF THEN Higher or same */ + __asm__(" addcs r3, #34"); + __asm__(" subs r3, r3, r2"); + __asm__(" cmp r3, r4"); + __asm__(" bls test_nb_instruction_per_sec_loop_115_nop"); /* tickms < wait_ms ? */ + + __asm__(" POP {r4}"); + + return val; +}; + +u32 test_nb_instruction_per_sec_120_nop_asm(void) +{ + register u32 val __asm__("r0"); + + __asm__(" ldr r1, =g_ulSysTickCount"); + __asm__(" ldr r2, [r1]"); /* g_ulSysTickCount */ + __asm__(" push {r4}"); + __asm__(" movs r0, #0"); /* nb_instructions_per_sec = 0; */ + __asm__(" movw r4, #999"); /* wait_ms = 1000; */ + + __asm__("test_nb_instruction_per_sec_loop_120_nop:"); +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 20 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 20 nop */ +/* Total 120 nop */ + + __asm__(" ldr r3, [r1]"); /* tickms = g_ulSysTickCount */ + __asm__(" adds r0, #128"); /* nb_instructions_per_sec += 128; */ + __asm__(" cmp r2, r3"); + __asm__(" it CS"); /* IF THEN Higher or same */ + __asm__(" addcs r3, #34"); + __asm__(" subs r3, r3, r2"); + __asm__(" cmp r3, r4"); + __asm__(" bls test_nb_instruction_per_sec_loop_120_nop"); /* tickms < wait_ms ? */ + + __asm__(" POP {r4}"); + + return val; +}; + +u32 test_nb_instruction_per_sec_150_nop_asm(void) +{ + register u32 val __asm__("r0"); + + __asm__(" ldr r1, =g_ulSysTickCount"); + __asm__(" ldr r2, [r1]"); /* g_ulSysTickCount */ + __asm__(" push {r4}"); + __asm__(" movs r0, #0"); /* nb_instructions_per_sec = 0; */ + __asm__(" movw r4, #999"); /* wait_ms = 1000; */ + + __asm__("test_nb_instruction_per_sec_loop_150_nop:"); +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 50 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 50 nop */ +/* Total 150 nop */ + + __asm__(" ldr r3, [r1]"); /* tickms = g_ulSysTickCount */ + __asm__(" adds r0, #158"); /* nb_instructions_per_sec += 158; */ + __asm__(" cmp r2, r3"); + __asm__(" it CS"); /* IF THEN Higher or same */ + __asm__(" addcs r3, #34"); + __asm__(" subs r3, r3, r2"); + __asm__(" cmp r3, r4"); + __asm__(" bls test_nb_instruction_per_sec_loop_150_nop"); /* tickms < wait_ms ? */ + + __asm__(" POP {r4}"); + + return val; +}; + +u32 test_nb_instruction_per_sec_200_nop_asm(void) +{ + register u32 val __asm__("r0"); + + __asm__(" ldr r1, =g_ulSysTickCount"); + __asm__(" ldr r2, [r1]"); /* g_ulSysTickCount */ + __asm__(" push {r4}"); + __asm__(" movs r0, #0"); /* nb_instructions_per_sec = 0; */ + __asm__(" movw r4, #999"); /* wait_ms = 1000; */ + + __asm__("test_nb_instruction_per_sec_loop_200_nop:"); +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ +/* Total 200 nop */ + + __asm__(" ldr r3, [r1]"); /* tickms = g_ulSysTickCount */ + __asm__(" adds r0, #208"); /* nb_instructions_per_sec += 208; */ + __asm__(" cmp r2, r3"); + __asm__(" it CS"); /* IF THEN Higher or same */ + __asm__(" addcs r3, #34"); + __asm__(" subs r3, r3, r2"); + __asm__(" cmp r3, r4"); + __asm__(" bls test_nb_instruction_per_sec_loop_200_nop"); /* tickms < wait_ms ? */ + + __asm__(" POP {r4}"); + + return val; +}; + +u32 test_nb_instruction_per_sec_1000_nop_asm(void) +{ + register u32 val __asm__("r0"); + + __asm__(" ldr r1, =g_ulSysTickCount"); + __asm__(" ldr r2, [r1]"); /* g_ulSysTickCount */ + __asm__(" push {r4}"); + __asm__(" movs r0, #0"); /* nb_instructions_per_sec = 0; */ + __asm__(" movw r4, #999"); /* wait_ms = 1000; */ + + __asm__("test_nb_instruction_per_sec_loop_1000nop:"); +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ +/* Total 200 nop */ + + __asm__(" ldr r3, [r1]"); /* tickms = g_ulSysTickCount */ + __asm__(" adds r0, #1008"); /* nb_instructions_per_sec += 1008; */ + __asm__(" cmp r2, r3"); + __asm__(" it CS"); /* IF THEN Higher or same */ + __asm__(" addcs r3, #34"); + __asm__(" subs r3, r3, r2"); + __asm__(" cmp r3, r4"); + __asm__(" bls test_nb_instruction_per_sec_loop_1000nop"); /* tickms < wait_ms ? */ + + __asm__(" POP {r4}"); + + return val; +}; diff --git a/firmware/startup_systick_perfo/result_exec_from_SPIFI.txt b/firmware/startup_systick_perfo/result_exec_from_SPIFI.txt new file mode 100644 index 00000000..4d335b33 --- /dev/null +++ b/firmware/startup_systick_perfo/result_exec_from_SPIFI.txt @@ -0,0 +1,33 @@ +Frequency MCU Core M4 = 204MHz + +"nb_inst_per_sec" 0x10000008 + nb_inst_per_sec[0] 195609816 test_nb_instruction_per_sec_100_nop_asm(); + nb_inst_per_sec[1] 195577462 test_nb_instruction_per_sec_105_nop_asm(); + nb_inst_per_sec[2] 195525410 test_nb_instruction_per_sec_110_nop_asm(); + nb_inst_per_sec[3] 35423508 test_nb_instruction_per_sec_115_nop_asm(); + nb_inst_per_sec[4] 5058688 test_nb_instruction_per_sec_120_nop_asm(); + nb_inst_per_sec[5] 5094868 test_nb_instruction_per_sec_150_nop_asm(); + nb_inst_per_sec[6] 5162144 test_nb_instruction_per_sec_200_nop_asm(); + nb_inst_per_sec[7] 5505696 test_nb_instruction_per_sec_1000_nop_asm(); + + nb_inst_per_sec[8] 195600420 test_nb_instruction_per_sec_100_nop_asm(); + nb_inst_per_sec[9] 195578027 test_nb_instruction_per_sec_105_nop_asm(); + nb_inst_per_sec[10] 195525882 test_nb_instruction_per_sec_110_nop_asm(); + nb_inst_per_sec[11] 35422647 test_nb_instruction_per_sec_115_nop_asm(); + nb_inst_per_sec[12] 5058688 test_nb_instruction_per_sec_120_nop_asm(); + nb_inst_per_sec[13] 5094868 test_nb_instruction_per_sec_150_nop_asm(); + nb_inst_per_sec[14] 5162144 test_nb_instruction_per_sec_200_nop_asm(); + nb_inst_per_sec[15] 5505696 test_nb_instruction_per_sec_1000_nop_asm(); + +Real speed expected from SPIFI without cache (with lot of nop) +Oscilloscope Freq SPIFI SCK = 22.50MHz to 22.83MHz (in reality 22.67MHz => 204/9 => SPIFI_CLK connected to IDIVB & IDIVB default=9) +So worst case 22.50Mbits*4 = 90Mbits/s => 11.25MBytes/s with an overhead of about 50% due to SPIFI protocol addr ... => 5.625MB +1 nop = 2 bytes (THUMB 0x00 0xBF) => Max 5.625 Millions instruction per second + +110 NOP is in fact 110 + 9 (including loop overhead) +119*2 = 238 bytes + +115NOP + 9 => does not enter in cache !! (248bytes) +Internal Cache size is about 256Bytes maybe shared Code/Data. + +SPIFI obtained min=5.05 MIPS, max=195.6 MIPS \ No newline at end of file diff --git a/firmware/startup_systick/startup_systick.c b/firmware/startup_systick_perfo/startup_systick.c similarity index 56% rename from firmware/startup_systick/startup_systick.c rename to firmware/startup_systick_perfo/startup_systick.c index ab7cd9fd..a8be4b05 100644 --- a/firmware/startup_systick/startup_systick.c +++ b/firmware/startup_systick_perfo/startup_systick.c @@ -64,7 +64,7 @@ void systick_setup(void) g_ulSysTickCount = 0; /* Disable IRQ globally */ - asm volatile ("cpsid i"); + __asm__("cpsid i"); /* Set processor Clock as Source Clock */ systick_set_clocksource(STK_CTRL_CLKSOURCE); @@ -90,7 +90,7 @@ void systick_setup(void) nvic_set_priority(NVIC_SYSTICK_IRQ, 0xFF); /* Enable IRQ globally */ - asm volatile ("cpsie i"); + __asm__("cpsie i"); } void scs_dwt_cycle_counter_enabled(void) @@ -153,140 +153,18 @@ void sys_tick_handler(void) g_ulSysTickCount++; } -u32 test_nb_instruction_per_sec(void) -{ - u32 start, end, wait_ms; - u32 tickms; - u32 nb_instructions_per_sec; +u32 nb_inst_per_sec[16]; - nb_instructions_per_sec = 0; - wait_ms = 1000; +extern u32 test_nb_instruction_per_sec_100_nop_asm(); +extern u32 test_nb_instruction_per_sec_105_nop_asm(); +extern u32 test_nb_instruction_per_sec_110_nop_asm(); +extern u32 test_nb_instruction_per_sec_115_nop_asm(); +extern u32 test_nb_instruction_per_sec_120_nop_asm(); +extern u32 test_nb_instruction_per_sec_150_nop_asm(); +extern u32 test_nb_instruction_per_sec_200_nop_asm(); +extern u32 test_nb_instruction_per_sec_1000_nop_asm(); - start = sys_tick_get_time_ms(); - - do - { - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - asm volatile ("nop "); - nb_instructions_per_sec += 108; - - end = sys_tick_get_time_ms(); - tickms = sys_tick_delta_time_ms(start, end); - }while(tickms < wait_ms); - - return nb_instructions_per_sec; -} - - -u32 nb_inst_per_sec0; -u32 nb_inst_per_sec1; +#define LED1_TOGGLE() (gpio_toggle(PORT_LED1_3, (PIN_LED1))) int main(void) { @@ -300,25 +178,57 @@ int main(void) systick_setup(); - /* Test number of instruction per second */ - nb_inst_per_sec0 = test_nb_instruction_per_sec(); - nb_inst_per_sec1 = test_nb_instruction_per_sec(); + gpio_clear(PORT_LED1_3, (PIN_LED1)); /* LED1 off */ - gpio_set(PORT_LED1_3, (PIN_LED1|PIN_LED2|PIN_LED3)); /* LEDs on */ + /* Test number of instruction per second (MIPS) slow blink ON 1s, OFF 1s */ +LED1_TOGGLE(); + nb_inst_per_sec[0] = test_nb_instruction_per_sec_100_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[1]= test_nb_instruction_per_sec_105_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[2]= test_nb_instruction_per_sec_110_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[3]= test_nb_instruction_per_sec_115_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[4] = test_nb_instruction_per_sec_120_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[5] = test_nb_instruction_per_sec_150_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[6] = test_nb_instruction_per_sec_200_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[7] = test_nb_instruction_per_sec_1000_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[8] = test_nb_instruction_per_sec_100_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[9]= test_nb_instruction_per_sec_105_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[10]= test_nb_instruction_per_sec_110_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[11]= test_nb_instruction_per_sec_115_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[12] = test_nb_instruction_per_sec_120_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[13] = test_nb_instruction_per_sec_150_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[14] = test_nb_instruction_per_sec_200_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[15] = test_nb_instruction_per_sec_1000_nop_asm(); +LED1_TOGGLE(); + /* Test finished fast blink */ while (1) { gpio_set(PORT_LED1_3, (PIN_LED1)); /* LED1 on */ gpio_set(PORT_LED1_3, (PIN_LED2)); /* LED2 on */ gpio_set(PORT_LED1_3, (PIN_LED3)); /* LED3 on */ - sys_tick_wait_time_ms(500); + sys_tick_wait_time_ms(250); gpio_clear(PORT_LED1_3, (PIN_LED3)); /* LED3 off */ gpio_clear(PORT_LED1_3, (PIN_LED2)); /* LED2 off */ gpio_clear(PORT_LED1_3, (PIN_LED1)); /* LED1 off */ - sys_tick_wait_time_ms(500); + sys_tick_wait_time_ms(250); } return 0; diff --git a/firmware/startup_systick_perfo_rom_to_ram/Makefile b/firmware/startup_systick_perfo_rom_to_ram/Makefile new file mode 100644 index 00000000..a52531e6 --- /dev/null +++ b/firmware/startup_systick_perfo_rom_to_ram/Makefile @@ -0,0 +1,11 @@ +# Hey Emacs, this is a -*- makefile -*- + +BINARY = startup_systick_perfo_rom_to_ram + +SRC = startup_systick.c \ + perf_mips.c \ + ../common/hackrf_core.c \ + ../common/si5351c.c + +LDSCRIPT = ../common/LPC4330_M4_rom_to_ram.ld +include ../common/Makefile_inc.mk diff --git a/firmware/startup_systick_perfo_rom_to_ram/README b/firmware/startup_systick_perfo_rom_to_ram/README new file mode 100644 index 00000000..4d9af838 --- /dev/null +++ b/firmware/startup_systick_perfo_rom_to_ram/README @@ -0,0 +1,17 @@ +This program is an example of the startup sequence for HackRF (Jellybean with +Lemondrop attached). +Test number of instruction per second (MIPS) slow blink ON 1s, OFF 1s +Then after 16s (the 16tests) it blink LED1/2/3 ON/OFF each 250ms. +This example compute the number of instructions per second executed called also MIPS (Millions of Instructions Per Second) + +This example code run from SRAM so maximum performance expected is 204MIPS. +See result details in result_exec_from_SRAM.txt + +Required Lemondrop -> Jellybean connections: + +SCL: Lemondrop P7 pin 3 -> Jellybean P6 pin 3 +SDA: Lemondrop P7 pin 5 -> Jellybean P6 pin 5 +SDA: Lemondrop P7 pin 6 -> Jellybean P6 pin 6 +VCC: Lemondrop P4 pin 2, 4, or 6 -> Jellybean P17 pin 2, 4, or 6 +1V8: Lemondrop P11 pin 2, 4, or 6 -> Jellybean P16 pin 2, 4, or 6 +GND: Lemondrop P5 -> Jellybean P13 diff --git a/firmware/startup_systick_perfo_rom_to_ram/perf_mips.c b/firmware/startup_systick_perfo_rom_to_ram/perf_mips.c new file mode 100644 index 00000000..ef3d1f52 --- /dev/null +++ b/firmware/startup_systick_perfo_rom_to_ram/perf_mips.c @@ -0,0 +1,2220 @@ +/* + * Copyright 2010 - 2012 Michael Ossmann + * + * This file is part of HackRF. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include +#include +#include + +#include "hackrf_core.h" + +/* Global counter incremented by SysTick Interrupt each millisecond */ +extern volatile u32 g_ulSysTickCount; +extern u32 g_NbCyclePerSecond; + +extern u32 sys_tick_get_time_ms(void); +extern u32 sys_tick_delta_time_ms(u32 start, u32 end); +extern void sys_tick_wait_time_ms(u32 wait_ms); + + +u32 test_nb_instruction_per_sec_100_nop_asm(void) +{ + register u32 val __asm__("r0"); + + __asm__(" ldr r1, =g_ulSysTickCount"); + __asm__(" ldr r2, [r1]"); /* g_ulSysTickCount */ + __asm__(" push {r4}"); + __asm__(" movs r0, #0"); /* nb_instructions_per_sec = 0; */ + __asm__(" movw r4, #999"); /* wait_ms = 1000; */ + + __asm__("test_nb_instruction_per_sec_loop_100_nop:"); +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + + __asm__(" ldr r3, [r1]"); /* tickms = g_ulSysTickCount */ + __asm__(" adds r0, #108"); /* nb_instructions_per_sec += 108 */ + __asm__(" cmp r2, r3"); + __asm__(" it CS"); /* IF THEN Higher or same */ + __asm__(" addcs r3, #34"); + __asm__(" subs r3, r3, r2"); + __asm__(" cmp r3, r4"); + __asm__(" bls test_nb_instruction_per_sec_loop_100_nop"); /* tickms < wait_ms ? */ + + __asm__(" POP {r4}"); + + return val; +}; + +u32 test_nb_instruction_per_sec_105_nop_asm(void) +{ + register u32 val __asm__("r0"); + + __asm__(" ldr r1, =g_ulSysTickCount"); + __asm__(" ldr r2, [r1]"); /* g_ulSysTickCount */ + __asm__(" push {r4}"); + __asm__(" movs r0, #0"); /* nb_instructions_per_sec = 0; */ + __asm__(" movw r4, #999"); /* wait_ms = 1000; */ + + __asm__("test_nb_instruction_per_sec_loop_105_nop:"); +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 5 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 5 nop */ +/* Total 105 nop */ + + __asm__(" ldr r3, [r1]"); /* tickms = g_ulSysTickCount */ + __asm__(" adds r0, #113"); /* nb_instructions_per_sec += 105+8=113; */ + __asm__(" cmp r2, r3"); + __asm__(" it CS"); /* IF THEN Higher or same */ + __asm__(" addcs r3, #34"); + __asm__(" subs r3, r3, r2"); + __asm__(" cmp r3, r4"); + __asm__(" bls test_nb_instruction_per_sec_loop_105_nop"); /* tickms < wait_ms ? */ + + __asm__(" POP {r4}"); + + return val; +}; + +u32 test_nb_instruction_per_sec_110_nop_asm(void) +{ + register u32 val __asm__("r0"); + + __asm__(" ldr r1, =g_ulSysTickCount"); + __asm__(" ldr r2, [r1]"); /* g_ulSysTickCount */ + __asm__(" push {r4}"); + __asm__(" movs r0, #0"); /* nb_instructions_per_sec = 0; */ + __asm__(" movw r4, #999"); /* wait_ms = 1000; */ + + __asm__("test_nb_instruction_per_sec_loop_110_nop:"); +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 10 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 10 nop */ +/* Total 110 nop */ + + __asm__(" ldr r3, [r1]"); /* tickms = g_ulSysTickCount */ + __asm__(" adds r0, #118"); /* nb_instructions_per_sec += 118; */ + __asm__(" cmp r2, r3"); + __asm__(" it CS"); /* IF THEN Higher or same */ + __asm__(" addcs r3, #34"); + __asm__(" subs r3, r3, r2"); + __asm__(" cmp r3, r4"); + __asm__(" bls test_nb_instruction_per_sec_loop_110_nop"); /* tickms < wait_ms ? */ + + __asm__(" POP {r4}"); + + return val; +}; + +u32 test_nb_instruction_per_sec_115_nop_asm(void) +{ + register u32 val __asm__("r0"); + + __asm__(" ldr r1, =g_ulSysTickCount"); + __asm__(" ldr r2, [r1]"); /* g_ulSysTickCount */ + __asm__(" push {r4}"); + __asm__(" movs r0, #0"); /* nb_instructions_per_sec = 0; */ + __asm__(" movw r4, #999"); /* wait_ms = 1000; */ + + __asm__("test_nb_instruction_per_sec_loop_115_nop:"); +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 15 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 15 nop */ +/* Total 115 nop */ + + __asm__(" ldr r3, [r1]"); /* tickms = g_ulSysTickCount */ + __asm__(" adds r0, #123"); /* nb_instructions_per_sec += 115+8 = 123; */ + __asm__(" cmp r2, r3"); + __asm__(" it CS"); /* IF THEN Higher or same */ + __asm__(" addcs r3, #34"); + __asm__(" subs r3, r3, r2"); + __asm__(" cmp r3, r4"); + __asm__(" bls test_nb_instruction_per_sec_loop_115_nop"); /* tickms < wait_ms ? */ + + __asm__(" POP {r4}"); + + return val; +}; + +u32 test_nb_instruction_per_sec_120_nop_asm(void) +{ + register u32 val __asm__("r0"); + + __asm__(" ldr r1, =g_ulSysTickCount"); + __asm__(" ldr r2, [r1]"); /* g_ulSysTickCount */ + __asm__(" push {r4}"); + __asm__(" movs r0, #0"); /* nb_instructions_per_sec = 0; */ + __asm__(" movw r4, #999"); /* wait_ms = 1000; */ + + __asm__("test_nb_instruction_per_sec_loop_120_nop:"); +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 20 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 20 nop */ +/* Total 120 nop */ + + __asm__(" ldr r3, [r1]"); /* tickms = g_ulSysTickCount */ + __asm__(" adds r0, #128"); /* nb_instructions_per_sec += 128; */ + __asm__(" cmp r2, r3"); + __asm__(" it CS"); /* IF THEN Higher or same */ + __asm__(" addcs r3, #34"); + __asm__(" subs r3, r3, r2"); + __asm__(" cmp r3, r4"); + __asm__(" bls test_nb_instruction_per_sec_loop_120_nop"); /* tickms < wait_ms ? */ + + __asm__(" POP {r4}"); + + return val; +}; + +u32 test_nb_instruction_per_sec_150_nop_asm(void) +{ + register u32 val __asm__("r0"); + + __asm__(" ldr r1, =g_ulSysTickCount"); + __asm__(" ldr r2, [r1]"); /* g_ulSysTickCount */ + __asm__(" push {r4}"); + __asm__(" movs r0, #0"); /* nb_instructions_per_sec = 0; */ + __asm__(" movw r4, #999"); /* wait_ms = 1000; */ + + __asm__("test_nb_instruction_per_sec_loop_150_nop:"); +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 50 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 50 nop */ +/* Total 150 nop */ + + __asm__(" ldr r3, [r1]"); /* tickms = g_ulSysTickCount */ + __asm__(" adds r0, #158"); /* nb_instructions_per_sec += 158; */ + __asm__(" cmp r2, r3"); + __asm__(" it CS"); /* IF THEN Higher or same */ + __asm__(" addcs r3, #34"); + __asm__(" subs r3, r3, r2"); + __asm__(" cmp r3, r4"); + __asm__(" bls test_nb_instruction_per_sec_loop_150_nop"); /* tickms < wait_ms ? */ + + __asm__(" POP {r4}"); + + return val; +}; + +u32 test_nb_instruction_per_sec_200_nop_asm(void) +{ + register u32 val __asm__("r0"); + + __asm__(" ldr r1, =g_ulSysTickCount"); + __asm__(" ldr r2, [r1]"); /* g_ulSysTickCount */ + __asm__(" push {r4}"); + __asm__(" movs r0, #0"); /* nb_instructions_per_sec = 0; */ + __asm__(" movw r4, #999"); /* wait_ms = 1000; */ + + __asm__("test_nb_instruction_per_sec_loop_200_nop:"); +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ +/* Total 200 nop */ + + __asm__(" ldr r3, [r1]"); /* tickms = g_ulSysTickCount */ + __asm__(" adds r0, #208"); /* nb_instructions_per_sec += 208; */ + __asm__(" cmp r2, r3"); + __asm__(" it CS"); /* IF THEN Higher or same */ + __asm__(" addcs r3, #34"); + __asm__(" subs r3, r3, r2"); + __asm__(" cmp r3, r4"); + __asm__(" bls test_nb_instruction_per_sec_loop_200_nop"); /* tickms < wait_ms ? */ + + __asm__(" POP {r4}"); + + return val; +}; + +u32 test_nb_instruction_per_sec_1000_nop_asm(void) +{ + register u32 val __asm__("r0"); + + __asm__(" ldr r1, =g_ulSysTickCount"); + __asm__(" ldr r2, [r1]"); /* g_ulSysTickCount */ + __asm__(" push {r4}"); + __asm__(" movs r0, #0"); /* nb_instructions_per_sec = 0; */ + __asm__(" movw r4, #999"); /* wait_ms = 1000; */ + + __asm__("test_nb_instruction_per_sec_loop_1000nop:"); +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ + +/* Start 100 nop */ + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); + __asm__(" nop"); +/* End 100 nop */ +/* Total 200 nop */ + + __asm__(" ldr r3, [r1]"); /* tickms = g_ulSysTickCount */ + __asm__(" adds r0, #1008"); /* nb_instructions_per_sec += 1008; */ + __asm__(" cmp r2, r3"); + __asm__(" it CS"); /* IF THEN Higher or same */ + __asm__(" addcs r3, #34"); + __asm__(" subs r3, r3, r2"); + __asm__(" cmp r3, r4"); + __asm__(" bls test_nb_instruction_per_sec_loop_1000nop"); /* tickms < wait_ms ? */ + + __asm__(" POP {r4}"); + + return val; +}; diff --git a/firmware/startup_systick_perfo_rom_to_ram/result_exec_from_SRAM.txt b/firmware/startup_systick_perfo_rom_to_ram/result_exec_from_SRAM.txt new file mode 100644 index 00000000..ce4a4299 --- /dev/null +++ b/firmware/startup_systick_perfo_rom_to_ram/result_exec_from_SRAM.txt @@ -0,0 +1,22 @@ +Frequency MCU Core M4 = 204MHz + +"nb_inst_per_sec" 0x10080008 + nb_inst_per_sec[0] 202091544 test_nb_instruction_per_sec_100_nop_asm(); + nb_inst_per_sec[1] 202172820 test_nb_instruction_per_sec_105_nop_asm(); + nb_inst_per_sec[2] 202247988 test_nb_instruction_per_sec_110_nop_asm(); + nb_inst_per_sec[3] 202317165 test_nb_instruction_per_sec_115_nop_asm(); + nb_inst_per_sec[4] 202381696 test_nb_instruction_per_sec_120_nop_asm(); + nb_inst_per_sec[5] 202680030 test_nb_instruction_per_sec_150_nop_asm(); + nb_inst_per_sec[6] 202986160 test_nb_instruction_per_sec_200_nop_asm(); + nb_inst_per_sec[7] 203760144 test_nb_instruction_per_sec_1000_nop_asm(); + + nb_inst_per_sec[8] 202091220 test_nb_instruction_per_sec_100_nop_asm(); + nb_inst_per_sec[9] 202172820 test_nb_instruction_per_sec_105_nop_asm(); + nb_inst_per_sec[10] 202247988 test_nb_instruction_per_sec_110_nop_asm(); + nb_inst_per_sec[11] 202317165 test_nb_instruction_per_sec_115_nop_asm(); + nb_inst_per_sec[12] 202381696 test_nb_instruction_per_sec_120_nop_asm(); + nb_inst_per_sec[13] 202680030 test_nb_instruction_per_sec_150_nop_asm(); + nb_inst_per_sec[14] 202986160 test_nb_instruction_per_sec_200_nop_asm(); + nb_inst_per_sec[15] 203760144 test_nb_instruction_per_sec_1000_nop_asm(); + +SRAM execution, expected 204 MIPS best case obtained min=202 MIPS, max=203.7 MIPS diff --git a/firmware/startup_systick_perfo_rom_to_ram/startup_systick.c b/firmware/startup_systick_perfo_rom_to_ram/startup_systick.c new file mode 100644 index 00000000..a8be4b05 --- /dev/null +++ b/firmware/startup_systick_perfo_rom_to_ram/startup_systick.c @@ -0,0 +1,235 @@ +/* + * Copyright 2010 - 2012 Michael Ossmann + * + * This file is part of HackRF. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include +#include +#include + +#include "hackrf_core.h" + +/* Global counter incremented by SysTick Interrupt each millisecond */ +volatile u32 g_ulSysTickCount; +u32 g_NbCyclePerSecond; + +void gpio_setup(void) +{ + /* Configure SCU Pin Mux as GPIO */ + scu_pinmux(SCU_PINMUX_LED1, SCU_GPIO_FAST); + scu_pinmux(SCU_PINMUX_LED2, SCU_GPIO_FAST); + scu_pinmux(SCU_PINMUX_LED3, SCU_GPIO_FAST); + + scu_pinmux(SCU_PINMUX_EN1V8, SCU_GPIO_FAST); + + /* Configure all GPIO as Input (safe state) */ + GPIO0_DIR = 0; + GPIO1_DIR = 0; + GPIO2_DIR = 0; + GPIO3_DIR = 0; + GPIO4_DIR = 0; + GPIO5_DIR = 0; + GPIO6_DIR = 0; + GPIO7_DIR = 0; + + /* Configure GPIO2[1/2/8] (P4_1/2 P6_12) as output. */ + GPIO2_DIR |= (PIN_LED1|PIN_LED2|PIN_LED3); + + /* GPIO3[6] on P6_10 as output. */ + GPIO3_DIR |= PIN_EN1V8; +} + +void systick_setup(void) +{ + u32 systick_reload_val; + g_ulSysTickCount = 0; + + /* Disable IRQ globally */ + __asm__("cpsid i"); + + /* Set processor Clock as Source Clock */ + systick_set_clocksource(STK_CTRL_CLKSOURCE); + + /* Get SysTick calibration value to obtain by default 1 tick = 10ms */ + systick_reload_val = systick_get_calib(); + /* + * Calibration seems wrong on LPC43xx(TBC) for default Freq it assume System Clock is 12MHz but it is 12*17=204MHz + * Fix the Calibration value bu multiplication by 17 + */ + systick_reload_val = (systick_reload_val*17); + + /* To obtain 1ms per tick just divide by 10 the 10ms base tick and set the reload */ + systick_reload_val = systick_reload_val/10; + systick_set_reload(systick_reload_val); + + systick_interrupt_enable(); + + /* Start counting. */ + systick_counter_enable(); + + /* Set SysTick Priority to maximum */ + nvic_set_priority(NVIC_SYSTICK_IRQ, 0xFF); + + /* Enable IRQ globally */ + __asm__("cpsie i"); +} + +void scs_dwt_cycle_counter_enabled(void) +{ + SCS_DEMCR |= SCS_DEMCR_TRCENA; + SCS_DWT_CTRL |= SCS_DWT_CTRL_CYCCNTENA; +} + +u32 sys_tick_get_time_ms(void) +{ + return g_ulSysTickCount; +} + +u32 sys_tick_delta_time_ms(u32 start, u32 end) +{ + #define MAX_T_U32 ((2^32)-1) + u32 diff; + + if(end > start) + { + diff=end-start; + }else + { + diff=MAX_T_U32-(start-end)+1; + } + + return diff; +} + +void sys_tick_wait_time_ms(u32 wait_ms) +{ + u32 start, end; + u32 tickms; + + start = sys_tick_get_time_ms(); + + do + { + end = sys_tick_get_time_ms(); + tickms = sys_tick_delta_time_ms(start, end); + }while(tickms < wait_ms); +} + +/* Called each 1ms/1000Hz by interrupt + 1) Count the number of cycle per second. + 2) Increment g_ulSysTickCount counter. +*/ +void sys_tick_handler(void) +{ + if(g_ulSysTickCount==0) + { + /* Clear Cycle Counter*/ + SCS_DWT_CYCCNT = 0; + }else if(g_ulSysTickCount==1000) + { + /* Capture number of cycle elapsed during 1 second */ + g_NbCyclePerSecond = SCS_DWT_CYCCNT; + } + + g_ulSysTickCount++; +} + +u32 nb_inst_per_sec[16]; + +extern u32 test_nb_instruction_per_sec_100_nop_asm(); +extern u32 test_nb_instruction_per_sec_105_nop_asm(); +extern u32 test_nb_instruction_per_sec_110_nop_asm(); +extern u32 test_nb_instruction_per_sec_115_nop_asm(); +extern u32 test_nb_instruction_per_sec_120_nop_asm(); +extern u32 test_nb_instruction_per_sec_150_nop_asm(); +extern u32 test_nb_instruction_per_sec_200_nop_asm(); +extern u32 test_nb_instruction_per_sec_1000_nop_asm(); + +#define LED1_TOGGLE() (gpio_toggle(PORT_LED1_3, (PIN_LED1))) + +int main(void) +{ + gpio_setup(); + + gpio_set(PORT_EN1V8, PIN_EN1V8); /* 1V8 on */ + + cpu_clock_init(); + + scs_dwt_cycle_counter_enabled(); + + systick_setup(); + + gpio_clear(PORT_LED1_3, (PIN_LED1)); /* LED1 off */ + + /* Test number of instruction per second (MIPS) slow blink ON 1s, OFF 1s */ +LED1_TOGGLE(); + nb_inst_per_sec[0] = test_nb_instruction_per_sec_100_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[1]= test_nb_instruction_per_sec_105_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[2]= test_nb_instruction_per_sec_110_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[3]= test_nb_instruction_per_sec_115_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[4] = test_nb_instruction_per_sec_120_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[5] = test_nb_instruction_per_sec_150_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[6] = test_nb_instruction_per_sec_200_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[7] = test_nb_instruction_per_sec_1000_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[8] = test_nb_instruction_per_sec_100_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[9]= test_nb_instruction_per_sec_105_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[10]= test_nb_instruction_per_sec_110_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[11]= test_nb_instruction_per_sec_115_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[12] = test_nb_instruction_per_sec_120_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[13] = test_nb_instruction_per_sec_150_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[14] = test_nb_instruction_per_sec_200_nop_asm(); +LED1_TOGGLE(); + nb_inst_per_sec[15] = test_nb_instruction_per_sec_1000_nop_asm(); +LED1_TOGGLE(); + + /* Test finished fast blink */ + while (1) + { + gpio_set(PORT_LED1_3, (PIN_LED1)); /* LED1 on */ + gpio_set(PORT_LED1_3, (PIN_LED2)); /* LED2 on */ + gpio_set(PORT_LED1_3, (PIN_LED3)); /* LED3 on */ + + sys_tick_wait_time_ms(250); + + gpio_clear(PORT_LED1_3, (PIN_LED3)); /* LED3 off */ + gpio_clear(PORT_LED1_3, (PIN_LED2)); /* LED2 off */ + gpio_clear(PORT_LED1_3, (PIN_LED1)); /* LED1 off */ + + sys_tick_wait_time_ms(250); + } + + return 0; +} From bb12d3f601bc7581fd4196da8e8632550ed71fa3 Mon Sep 17 00:00:00 2001 From: TitanMKD Date: Mon, 25 Jun 2012 22:34:29 +0200 Subject: [PATCH 4/5] Example removed and replaced by startup_systick_perfo_rom_to_ram --- firmware/startup_systick_rom_to_ram/Makefile | 10 - firmware/startup_systick_rom_to_ram/README | 12 - .../startup_systick.c | 325 ------------------ 3 files changed, 347 deletions(-) delete mode 100644 firmware/startup_systick_rom_to_ram/Makefile delete mode 100644 firmware/startup_systick_rom_to_ram/README delete mode 100644 firmware/startup_systick_rom_to_ram/startup_systick.c diff --git a/firmware/startup_systick_rom_to_ram/Makefile b/firmware/startup_systick_rom_to_ram/Makefile deleted file mode 100644 index 8841bd0c..00000000 --- a/firmware/startup_systick_rom_to_ram/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -# Hey Emacs, this is a -*- makefile -*- - -BINARY = startup_systick - -SRC = $(BINARY).c \ - ../common/hackrf_core.c \ - ../common/si5351c.c - -LDSCRIPT = ../common/LPC4330_M4_rom_to_ram.ld -include ../common/Makefile_inc.mk diff --git a/firmware/startup_systick_rom_to_ram/README b/firmware/startup_systick_rom_to_ram/README deleted file mode 100644 index c99ad470..00000000 --- a/firmware/startup_systick_rom_to_ram/README +++ /dev/null @@ -1,12 +0,0 @@ -This program is an example of the startup sequence for HackRF (Jellybean with -Lemondrop attached). -LED1, LED2, and LED3 are blinking at exactly a frequency of 1Hz upon success. - -Required Lemondrop -> Jellybean connections: - -SCL: Lemondrop P7 pin 3 -> Jellybean P6 pin 3 -SDA: Lemondrop P7 pin 5 -> Jellybean P6 pin 5 -SDA: Lemondrop P7 pin 6 -> Jellybean P6 pin 6 -VCC: Lemondrop P4 pin 2, 4, or 6 -> Jellybean P17 pin 2, 4, or 6 -1V8: Lemondrop P11 pin 2, 4, or 6 -> Jellybean P16 pin 2, 4, or 6 -GND: Lemondrop P5 -> Jellybean P13 diff --git a/firmware/startup_systick_rom_to_ram/startup_systick.c b/firmware/startup_systick_rom_to_ram/startup_systick.c deleted file mode 100644 index a388a241..00000000 --- a/firmware/startup_systick_rom_to_ram/startup_systick.c +++ /dev/null @@ -1,325 +0,0 @@ -/* - * Copyright 2010 - 2012 Michael Ossmann - * - * This file is part of HackRF. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include -#include -#include -#include -#include -#include - -#include "hackrf_core.h" - -/* Global counter incremented by SysTick Interrupt each millisecond */ -volatile u32 g_ulSysTickCount; -u32 g_NbCyclePerSecond; - -void gpio_setup(void) -{ - /* Configure SCU Pin Mux as GPIO */ - scu_pinmux(SCU_PINMUX_LED1, SCU_GPIO_FAST); - scu_pinmux(SCU_PINMUX_LED2, SCU_GPIO_FAST); - scu_pinmux(SCU_PINMUX_LED3, SCU_GPIO_FAST); - - scu_pinmux(SCU_PINMUX_EN1V8, SCU_GPIO_FAST); - - /* Configure all GPIO as Input (safe state) */ - GPIO0_DIR = 0; - GPIO1_DIR = 0; - GPIO2_DIR = 0; - GPIO3_DIR = 0; - GPIO4_DIR = 0; - GPIO5_DIR = 0; - GPIO6_DIR = 0; - GPIO7_DIR = 0; - - /* Configure GPIO2[1/2/8] (P4_1/2 P6_12) as output. */ - GPIO2_DIR |= (PIN_LED1|PIN_LED2|PIN_LED3); - - /* GPIO3[6] on P6_10 as output. */ - GPIO3_DIR |= PIN_EN1V8; -} - -void systick_setup(void) -{ - u32 systick_reload_val; - g_ulSysTickCount = 0; - - /* Disable IRQ globally */ - __asm__("cpsid i"); - - /* Set processor Clock as Source Clock */ - systick_set_clocksource(STK_CTRL_CLKSOURCE); - - /* Get SysTick calibration value to obtain by default 1 tick = 10ms */ - systick_reload_val = systick_get_calib(); - /* - * Calibration seems wrong on LPC43xx(TBC) for default Freq it assume System Clock is 12MHz but it is 12*17=204MHz - * Fix the Calibration value bu multiplication by 17 - */ - systick_reload_val = (systick_reload_val*17); - - /* To obtain 1ms per tick just divide by 10 the 10ms base tick and set the reload */ - systick_reload_val = systick_reload_val/10; - systick_set_reload(systick_reload_val); - - systick_interrupt_enable(); - - /* Start counting. */ - systick_counter_enable(); - - /* Set SysTick Priority to maximum */ - nvic_set_priority(NVIC_SYSTICK_IRQ, 0xFF); - - /* Enable IRQ globally */ - __asm__("cpsie i"); -} - -void scs_dwt_cycle_counter_enabled(void) -{ - SCS_DEMCR |= SCS_DEMCR_TRCENA; - SCS_DWT_CTRL |= SCS_DWT_CTRL_CYCCNTENA; -} - -u32 sys_tick_get_time_ms(void) -{ - return g_ulSysTickCount; -} - -u32 sys_tick_delta_time_ms(u32 start, u32 end) -{ - #define MAX_T_U32 ((2^32)-1) - u32 diff; - - if(end > start) - { - diff=end-start; - }else - { - diff=MAX_T_U32-(start-end)+1; - } - - return diff; -} - -void sys_tick_wait_time_ms(u32 wait_ms) -{ - u32 start, end; - u32 tickms; - - start = sys_tick_get_time_ms(); - - do - { - end = sys_tick_get_time_ms(); - tickms = sys_tick_delta_time_ms(start, end); - }while(tickms < wait_ms); -} - -/* Called each 1ms/1000Hz by interrupt - 1) Count the number of cycle per second. - 2) Increment g_ulSysTickCount counter. -*/ -void sys_tick_handler(void) -{ - if(g_ulSysTickCount==0) - { - /* Clear Cycle Counter*/ - SCS_DWT_CYCCNT = 0; - }else if(g_ulSysTickCount==1000) - { - /* Capture number of cycle elapsed during 1 second */ - g_NbCyclePerSecond = SCS_DWT_CYCCNT; - } - - g_ulSysTickCount++; -} - -u32 test_nb_instruction_per_sec(void) -{ - u32 start, end, wait_ms; - u32 tickms; - u32 nb_instructions_per_sec; - - nb_instructions_per_sec = 0; - wait_ms = 1000; - - start = sys_tick_get_time_ms(); - - do - { - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - __asm__("nop "); - nb_instructions_per_sec += 100; - - end = sys_tick_get_time_ms(); - tickms = sys_tick_delta_time_ms(start, end); - }while(tickms < wait_ms); - - return nb_instructions_per_sec; -} - - -u32 nb_inst_per_sec0; -u32 nb_inst_per_sec1; - -int main(void) -{ - gpio_setup(); - - gpio_set(PORT_EN1V8, PIN_EN1V8); /* 1V8 on */ - - cpu_clock_init(); - - scs_dwt_cycle_counter_enabled(); - - systick_setup(); - - /* Test number of instruction per second */ - nb_inst_per_sec0 = test_nb_instruction_per_sec(); - nb_inst_per_sec1 = test_nb_instruction_per_sec(); - - gpio_set(PORT_LED1_3, (PIN_LED1|PIN_LED2|PIN_LED3)); /* LEDs on */ - - while (1) - { - gpio_set(PORT_LED1_3, (PIN_LED1)); /* LED1 on */ - gpio_set(PORT_LED1_3, (PIN_LED2)); /* LED2 on */ - gpio_set(PORT_LED1_3, (PIN_LED3)); /* LED3 on */ - - sys_tick_wait_time_ms(500); - - gpio_clear(PORT_LED1_3, (PIN_LED3)); /* LED3 off */ - gpio_clear(PORT_LED1_3, (PIN_LED2)); /* LED2 off */ - gpio_clear(PORT_LED1_3, (PIN_LED1)); /* LED1 off */ - - sys_tick_wait_time_ms(500); - } - - return 0; -} From 988b3e3a49f83663a3bc47c370155a5605d51f74 Mon Sep 17 00:00:00 2001 From: TitanMKD Date: Mon, 25 Jun 2012 22:45:18 +0200 Subject: [PATCH 5/5] Fixed simple systick example --- firmware/startup_systick/startup_systick.c | 186 +++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 firmware/startup_systick/startup_systick.c diff --git a/firmware/startup_systick/startup_systick.c b/firmware/startup_systick/startup_systick.c new file mode 100644 index 00000000..c7c3e01e --- /dev/null +++ b/firmware/startup_systick/startup_systick.c @@ -0,0 +1,186 @@ +/* + * Copyright 2012 Benjamin Vernoux + * + * This file is part of HackRF. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include +#include +#include + +#include "hackrf_core.h" + +/* Global counter incremented by SysTick Interrupt each millisecond */ +volatile u32 g_ulSysTickCount; +u32 g_NbCyclePerSecond; + +void gpio_setup(void) +{ + /* Configure SCU Pin Mux as GPIO */ + scu_pinmux(SCU_PINMUX_LED1, SCU_GPIO_FAST); + scu_pinmux(SCU_PINMUX_LED2, SCU_GPIO_FAST); + scu_pinmux(SCU_PINMUX_LED3, SCU_GPIO_FAST); + + scu_pinmux(SCU_PINMUX_EN1V8, SCU_GPIO_FAST); + + /* Configure all GPIO as Input (safe state) */ + GPIO0_DIR = 0; + GPIO1_DIR = 0; + GPIO2_DIR = 0; + GPIO3_DIR = 0; + GPIO4_DIR = 0; + GPIO5_DIR = 0; + GPIO6_DIR = 0; + GPIO7_DIR = 0; + + /* Configure GPIO2[1/2/8] (P4_1/2 P6_12) as output. */ + GPIO2_DIR |= (PIN_LED1|PIN_LED2|PIN_LED3); + + /* GPIO3[6] on P6_10 as output. */ + GPIO3_DIR |= PIN_EN1V8; +} + +void systick_setup(void) +{ + u32 systick_reload_val; + g_ulSysTickCount = 0; + + /* Disable IRQ globally */ + __asm__("cpsid i"); + + /* Set processor Clock as Source Clock */ + systick_set_clocksource(STK_CTRL_CLKSOURCE); + + /* Get SysTick calibration value to obtain by default 1 tick = 10ms */ + systick_reload_val = systick_get_calib(); + /* + * Calibration seems wrong on LPC43xx(TBC) for default Freq it assume System Clock is 12MHz but it is 12*17=204MHz + * Fix the Calibration value bu multiplication by 17 + */ + systick_reload_val = (systick_reload_val*17); + + /* To obtain 1ms per tick just divide by 10 the 10ms base tick and set the reload */ + systick_reload_val = systick_reload_val/10; + systick_set_reload(systick_reload_val); + + systick_interrupt_enable(); + + /* Start counting. */ + systick_counter_enable(); + + /* Set SysTick Priority to maximum */ + nvic_set_priority(NVIC_SYSTICK_IRQ, 0xFF); + + /* Enable IRQ globally */ + __asm__("cpsie i"); +} + +void scs_dwt_cycle_counter_enabled(void) +{ + SCS_DEMCR |= SCS_DEMCR_TRCENA; + SCS_DWT_CTRL |= SCS_DWT_CTRL_CYCCNTENA; +} + +u32 sys_tick_get_time_ms(void) +{ + return g_ulSysTickCount; +} + +u32 sys_tick_delta_time_ms(u32 start, u32 end) +{ + #define MAX_T_U32 ((2^32)-1) + u32 diff; + + if(end > start) + { + diff=end-start; + }else + { + diff=MAX_T_U32-(start-end)+1; + } + + return diff; +} + +void sys_tick_wait_time_ms(u32 wait_ms) +{ + u32 start, end; + u32 tickms; + + start = sys_tick_get_time_ms(); + + do + { + end = sys_tick_get_time_ms(); + tickms = sys_tick_delta_time_ms(start, end); + }while(tickms < wait_ms); +} + +/* Called each 1ms/1000Hz by interrupt + 1) Count the number of cycle per second. + 2) Increment g_ulSysTickCount counter. +*/ +void sys_tick_handler(void) +{ + if(g_ulSysTickCount==0) + { + /* Clear Cycle Counter*/ + SCS_DWT_CYCCNT = 0; + }else if(g_ulSysTickCount==1000) + { + /* Capture number of cycle elapsed during 1 second */ + g_NbCyclePerSecond = SCS_DWT_CYCCNT; + } + + g_ulSysTickCount++; +} + +int main(void) +{ + gpio_setup(); + + gpio_set(PORT_EN1V8, PIN_EN1V8); /* 1V8 on */ + + cpu_clock_init(); + + scs_dwt_cycle_counter_enabled(); + + systick_setup(); + + gpio_set(PORT_LED1_3, (PIN_LED1|PIN_LED2|PIN_LED3)); /* LEDs on */ + + while (1) + { + gpio_set(PORT_LED1_3, (PIN_LED1)); /* LED1 on */ + gpio_set(PORT_LED1_3, (PIN_LED2)); /* LED2 on */ + gpio_set(PORT_LED1_3, (PIN_LED3)); /* LED3 on */ + + sys_tick_wait_time_ms(500); + + gpio_clear(PORT_LED1_3, (PIN_LED3)); /* LED3 off */ + gpio_clear(PORT_LED1_3, (PIN_LED2)); /* LED2 off */ + gpio_clear(PORT_LED1_3, (PIN_LED1)); /* LED1 off */ + + sys_tick_wait_time_ms(500); + } + + return 0; +}