from machine import Pin from time import ticks_us, ticks_diff # Pin-Nummer und -Konfiguration pin_no = 22 pin = Pin(pin_no, Pin.OUT) # klassisches Python def toggle_python(n): for _ in range(n): pin.toggle() # klassisches Python, kompiliert @micropython.native def toggle_native(n): for _ in range(n): pin.toggle() gpio_out_xor = 0xd000001c # Viper, kompiliert, mit Type-Hints und mit direktem Registerzugriff @micropython.viper def toggle_viper(n: int): mask = 1 << int(pin_no) p = ptr32(gpio_out_xor) for _ in range(n): p[0] = mask # Assembler def toggle_assembler(n): @micropython.asm_thumb def asm_func(r0, r1, r2): label(loop) str(r2, [r1,0]) sub(r0, r0, 1) bgt(loop) asm_func(n, gpio_out_xor, 1 << pin_no) # Zeitmessung def duration(name, toggle_func): t0 = ticks_us() toggle_func(n) t1 = ticks_us() print('%9s: %9.6f s' % (name, ticks_diff(t1, t0) / 1e6)) # Anzahl Schleifendurchläufe n = 1000000 print('Zeit für %d Schleifendurchläufe:\n' % n) duration("Python", toggle_python) duration("Native", toggle_native) duration("Viper", toggle_viper) duration("Assembler", toggle_assembler)