[[dtlab_t11]]

This is an old revision of the document!


Rust auf Pi Pico

Bei diesem Thema untersuchen Sie wie schnell der ARM Cortex M0 auf dem Raspberry Pi Pico arbeitet. Dazu wird der Ausgang an einem GPIO ge盲ndert und die 脛nderung wird mit dem Oszilloskop gemessen. Dazu kommt dann die Messung der Ausf眉hrungszeit einer Primzahlensuche auf dem RP2040 und der Vergleich mit einer Ausf眉hrung auf dem Hostsystem. Der Code ist in Rust geschrieben.

Die Toolchain ist die gleiche wie im von Claudia Meitinger.

  • auf ihrem Rechner
  • Installieren Sie oder Microsoft Codium
  • In Codium:

F眉r Rust noch

rustup target add thumbv6m-none-eabi
cargo install elf2uf2-rs

Im ist ein git Repository, das die zwei Projekte

  • blinky - F眉r den Pi Pico
  • prime - F眉r den Hostrechner

enth盲lt. Sie k枚nnen das Repository auf ihrem Rechner mit

git clone https://caeis.etech.fh-augsburg.de/beckmanf/picofirst.git

installieren.

Das Rustprojekt Blinky enth盲lt ein kleines Programm mit dem auf dem Pi Pico Board ohne Wifi die Onboard LED ein- und ausgeschaltet wird. Wechseln Sie in das Verzeichnis 鈥減icofirst/blinky鈥�. Sie k枚nnen das Programm mit

cargo run

kompilieren und auf den Raspberry Pi Pico laden. Das funktioniert nur wenn der Pi Pico im Mass Storage Mode ist. Dazu muss der 鈥淏OOTSEL鈥� Taster auf dem Board gedr眉ckt und gehalten werden w盲hrend man das USB Kabel mit dem Rechner verbindet. Man kann sehen, dass der Pi Pico im Mass Storage Mode ist, wenn ein neues Laufwerk im Betriebssystem angezeigt wird. Mit 鈥渃argo run鈥� wird das Programm kompiliert, auf den Pi Pico geladen. Damit wird der Mass Storage Mode verlassen und der Code ausgef眉hrt.

Auf dem Pi Pico sollte jetzt die LED blinken.

Die blinkende LED dient zur 脺berpr眉fung, dass die Toolchain und der Pi Pico richtig funktioniert. Auf dem Pi Pico W mit Wifi ist die LED nicht direkt am RP2040 Prozessor angeschlossen, sondern am Wifichip CYW43439. Um dort die LED anzusteuern muss der Wifichip in Betrieb genommen werden. Das habe ich deshalb hier nicht gemacht.

Das Projekt 鈥減rime鈥� enth盲lt ein Programm zur Suche nach Primzahlen. Das Programm soll nicht auf dem Pi Pico, sondern auf dem Host - also ihrem Rechner oder dem Laborrechner - ausgef眉hrt werden. Wechseln Sie in das Verzeichnis 鈥減icofirst/prime鈥�. Sie k枚nnen das Programm direkt mit

cargo run

starten. Das Programm in sucht die n盲chstkleinere Primzahl ausgehend von einer Zahl, die im Programm festgelegt ist. Die Zahl n ist im Code im Repository auf 鈥�1芦56鈥� = 2^56 = 72057594037927936 festgelegt. Sie sollten auf dem Terminal eine 盲hnliche Ausgabe wie diese sehen:

Mac:prime fritz$ cargo run
   Compiling prime v0.1.0 (/Users/fritz/pico/picofirst/prime)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s
     Running `target/debug/prime`
What is the next prime number smaller than 72057594037927936?
Found: 72057594037927931. This took 2.328603083s.
Mac:prime fritz$ 

Das Programm dient dazu eine Berechnung durchzuf眉hren, die etwas l盲nger dauert. Starten Sie das Programm einige Male und notieren Sie die Ausf眉hrungszeiten. In 鈥渂linky鈥� ist diese Primzahlensuchfunktion auch schon integriert, aber noch nicht aktiv.

Kompilieren Sie das Programm jetzt im 鈥淩elease鈥� Modus. Damit wird der Rustcompiler eine h枚here Codeoptimierung durchf眉hren.

cargo run --release

Sie k枚nnen das Programm nach dem Kompilieren auch direkt starten mit

./target/release/prime
./target/debug/prime

Vergleichen Sie die Ausf眉hrungszeiten.

  • Sch盲tzen Sie anhand des Rustcodes f眉r die Primzahlensuche ab, wie sich die Ausf眉hrungszeit mit der Zahl n verh盲lt. Es geht nicht um die absolute Zeit, sondern ob der Zusammenhang zwischen Ausf眉hrungszeit und Zahl konstant, linear oder sonstwie ist.

In diesem Versuch soll jetzt nicht mehr die LED wechseln, sondern der Pin GP15 in Abbildung 1 links unten.

Abb. 1: Rasperry Pi Pinout

Dazu muss der Code in ge盲ndert werden.

  • Kommentieren Sie die delays in der loop aus. In der loop soll nur der Pin aus- und eingeschaltet werden.
  • 脛ndern Sie den Pin von GP25 f眉r die LED auf GP15 f眉r den Pin links unten.
  • Messen Sie mit dem Oszilloskop die Frequenz und das an/aus Verh盲ltnis des Signals am Pin 15.

Man kann sich mit

cargo rustc --release -- --emit asm

den Assemblercode generieren lassen. Der Assemblercode ist im Verzeichnis target/thumbv6m-none-eabi/release/deps und f盲ngt mit dem Projektnamen 鈥渂linky鈥� and und endet mit der Endung 鈥�.s鈥�. Z.B.:

target/thumbv6m-none-eabi/release/deps/blinky-cbc27bc4200d17af.s

脰ffnen Sie die Datei mit Codium. Die Datei enth盲lt sehr viel Code鈥� Finden Sie die Schleife. F眉gen Sie dazu die delay Funktionen nochmal in den Code ein und kompilieren Sie nochmal. Dann sollten Sie etwas 盲hnliches wie das hier:

	ldr	r6, .LCPI2_8
.LBB2_6:
	ldr	r0, .LCPI2_5
	str	r4, [r0]
	add	r5, sp, #8
	mov	r0, r5
	mov	r1, r6
	bl	_ZN8cortex_m5delay5Delay8delay_us17hb904cf74fb062a91E
	ldr	r0, .LCPI2_5
	str	r4, [r0, #4]
	mov	r0, r5
	mov	r1, r6
	bl	_ZN8cortex_m5delay5Delay8delay_us17hb904cf74fb062a91E
	b	.LBB2_6
.LBB2_7:
	strb	r5, [r0]

finden. Sie sehen die 鈥渃ortex_m5delay鈥� Funktionen. Das sind die Aufrufe f眉r die delay Funktion. Nehmen Sie dann die Delayaufrufe wieder aus dem Code. Die Loop sollte jetzt k眉rzer sein. Erl盲utern Sie den Code, der den Pin 15 an- und ausschaltet.

Im finden Sie im Kapitel 2.3.1.7 die Register

  • SIO: GPIO_OUT_SET
  • SIO: GPIO_OUT_CLR

mit denen der Pegel an einem Pin eingestellt werden kann. Wenn man beispielsweise 1芦3 = 0x00000008 in das Register GPIO_OUT_SET schreibt, dann wird der Ausgangspegel von GP03 auf High gesetzt. Damit das funktioniert muss vorher die Konfiguration des Pins gemacht werden - also beispielsweise, dass das ein Ausgang ist.

  • Erl盲utern Sie im Code wie auf die beiden Register geschrieben wird.

Die Primzahlensuche dauert im Vergleich zu dem Ein- und Ausschalten der Pins relativ lang. Jetzt geht es darum die Ausf眉hrungszeiten auf dem Pi Pico mit den Ausf眉hrungszeiten auf dem Hostrechner zu vergleichen. Dazu sollen die Ausf眉hrungszeiten auf dem Pi Pico mit dem Oszilloskop gemessen werden.

  • F眉gen Sie die Primzahlensuchfunktion in die Loop ein.
  • Aktivieren Sie das Delay nach dem Ausschalten der LED/Pins.
  • Die Zeitdauer wie lange das Signal am Pin auf High ist, soll durch die Laufzeit der Primzahlensuche bestimmt sein. Die Zeitdauer wie lange das Signal auf low ist, soll konstant durch die Delayfunktion bestimmt sein.
  • Ver盲ndern Sie die Werte f眉r die Zahl n, messen Sie die Highphasen am Oszilloskop und notieren Sie die Zeiten
  • Erstellen Sie einen Graphen, der die Ausf眉hrungszeit gegen die Zahl n darstellt.
  • Vergleichen Sie den Graphen mit den 脺berlegungen aus Vorbereitung f眉r 鈥減rime鈥�
  • Vergleichen Sie die Ausf眉hrungszeit auf dem Pi Pico mit der Ausf眉hrungszeit auf dem Host.
  • dtlab_t11.1748802165.txt.gz
  • Last modified: 2025/06/01 20:22
  • by beckmanf