Sie sind auf Seite 1von 39

Termin 3 - MCT-2

WiSe21/22

Stephan Schulze

19. Oktober 2021

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 1 / 39
Gliederung

1 Befehlsausführung

2 Stack und Unterprogramme

3 Programmieren in C

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 2 / 39
Abschnitt 1

Befehlsausführung

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 3 / 39
Befehlsausführung
Ausführungszeit von Befehlen

Befehl Anzahl Zyklen


MOV Rd, #<imm16> 1
MOV Rd, <op2> 1
LDR Rd, =#<imm32> 1 - 2 (abhängig von imm32)
MOV PC, Rs 2-4
Arithmetisch/logische Operationen,
1
Vergleiche/Tests
1 (falls Sprung nicht genommen)
Sprünge
2 – 4 (falls Sprung genommen)
LDR, LDRH, LDRB,
1-2
STR, STRH, STRB

STM32F303: Taktfrequenz standardmäßig: fCLK = 8MHz

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 4 / 39
Befehlsausführung
Ausführungszeit von Befehlen (Beispiel)

Beispielaufgabe:

mov r2 , #0x10000
m:
s u b s r2 , r2 , #1
bne m

Frage 1: Was macht das Programm?


Frage 2: Wie lange dauert ein Durchlauf des Programms?

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 5 / 39
Befehlsausführung
Befehlsabarbeitung

Typisch: Die Abarbeitung eines Maschinenbefehls wird auf mehrere


Taktzyklen aufgeteilt.
ARM: Einfache Befehle (z. B. ADD r1, r2, r5): 3 Taktzyklen:

Fetch Decode Execute

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 6 / 39
Befehlsausführung
Pipelining (I)

Ohne Pipelining:

Fetch Decode Execute


Fetch Decode Execute
Fetch
...

Latenz: ? Takte
Durchsatz: ? Befehle/Takt

Frage: Was verbirgt sich genau hinter ’Execute’ ?

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 7 / 39
Befehlsausführung
Pipelining (II)

Mit Pipelining:

Fetch Decode Execute


Fetch Decode Execute
Fetch Decode Execute
...

Latenz: ? Takte
Durchsatz: ? Befehle/Takt

(Cortex M0+: 2-staged)

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 8 / 39
Befehlsausführung
Pipelining (III)

Anzahl der Stufen einer Pipeline


Initial-Zustand
Pipeline-Interlock Beispiele:
Hauptspeicher (L1-Cache)
Resourcenkonflikt
Daten-Hazard (bspw. RAW-bzw. WAR-Hazard (→ NOP))
Branches:
Re-Init (Flush) bei Sprüngen
Speculative Branch Fetches (M3/M4)
Branch Target Address Cache (M7)

→ Ein optimierter Compiler kann auch bestimmte Probleme erkennen,


aber das Kompilat ist nicht mehr nachvollziehbar!

→Was genau dauert deterministisch x Maschinenzyklen?


Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 9 / 39
Befehlsausführung
RISC vs. CISC

CISC - Complex Instruction Set Computer


Aufwändiges Steuerwerk (aktive Dekodierung)
Wartbarkeit? (Beispiel: Intel-Problem)
Mikrocode
Intern dann gerne auch wieder RISC

RISC - Reduced Instruction Set Computer


”Hardwired” Steuerwerk
”Plain and simple”

→ Der (gefensterte) Bitstrom spiegelt den auszuführenden Befehl wieder


inkl. Parameter (→ Kodierung).

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 10 / 39
Befehlsausführung
Instruction Sets (ARM)

Folgende Tabelle zeigt den Unterschied zwischen den einzelnen Instruction


Sets von ARM (Befehle über Zeit):

ARM 32 32 32
Thumb 16 16 16 16 16 16 ...
Thumb-2 16 32 32 16

Daraus ergibt sich:


Steigerung Befehlsdurchsatz (DMIPS/MHz)
Codereduzierung

→ CMSIS? SIMD?

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 11 / 39
Befehlsausführung
Befehlsbeispiel: Thumb-2

Beispiel: SUBS
Syntax: SUBS <Rd>, <Rn>, #<imm3>

Beispiel: R5, R4, #1

Funktion: <Rd> = <Rn> - #<imm3>

Maschinencode:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 1 1 1 1 <imm3> <Rn> <Rd>

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 12 / 39
Abschnitt 2

Stack und Unterprogramme

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 13 / 39
Unterabschnitt 1

Stack

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 14 / 39
Stack und Unterprogramme
Stack

Der Stack ( Stapelspeicher“) ist ein Mechanismus zur Speicherung



von Daten nach dem LIFO“-Prinzip in einem Bereich des RAMs.

Realisierung bei uns:
Prozessor holt sich bei einem Reset den Wert von Stackpointer (SP =
R13; aus ”Vector Table”) - typisch: SP = 0x20010000 (Ende des
RAMs).
Anweisung PUSH {<reglist>} verringert SP und legt Register an der
Adresse ab, auf die SP zeigt.
Anweisung POP {<reglist>} speichert den Wert an der Adresse, auf
die SP zeigt, in Registern ab und erhöht SP.
Beispiel:

Abbildung 1: Stack [2]

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 15 / 39
Unterabschnitt 2

Unterprogramme

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 16 / 39
Stack und Unterprogramme
Unterprogramme

Motivation: Mehrfaches Wiederverwerten eines kleinen Programmstücks


(”Unterprogramm” englisch ”subroutine”) in einem Programm.

Abbildung 2: Unterprogramm [2]

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 17 / 39
Stack und Unterprogramme
C-Funktionen vs. Assembler-Unterprogramme I

Motivation: Mehrfaches Wiederverwerten eines kleinen Programmstücks


(”Unterprogramm” englisch ”subroutine”) in einem Programm.

C-Code Assembler
Funktionsaufrufe und Parameter

mov r0 , #3
pythagoras (3 , 7) ; mov r1 , #7
bl pythagoras
Rückgabewerte mit return

mov r0 , . . .
return c ;
mov pc , l r

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 18 / 39
Stack und Unterprogramme
C-Funktionen vs. Assembler-Unterprogramme II

C-Code Assembler
Lokale Variablen

{... push {< r e g l i s t >}


i n t a = 42; ...
...} pop {< r e g l i s t >}

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 19 / 39
Stack und Unterprogramme
Stack und C

Warnung:

Lokale Variablen → Stack


malloc/calloc → Heap
Die Größe des Stacks ist während der Laufzeit des Programms
veränderlich und i. a. vom Compiler nicht vorhersehbar.
Wird der Stack ”zu groß”, so überschreibt er andere Daten
(insbesondere globale Variablen) im RAM. (Keine Fehlermeldung!)
→ Stack Overflow

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 20 / 39
Abschnitt 3

Programmieren in C

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 21 / 39
Unterabschnitt 1

Datentypen

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 22 / 39
Programmieren in C
Basisdatentypen (Auswahl)

Typ Erklärung
Bool1 0 oder 1
char Ein Zeichen (bzw. Zahl)
signed char/unsigned char Ganzzahl, bei uns 8 Bits
short/unsigned short Ganzzahl, bei uns 16 Bits
int/unsigned int Ganzzahl, bei uns 32 Bits
long/unsigned long Ganzzahl, bei uns 32 Bits
float Fließkommazahl, bei uns 32 Bits
double Fließkommazahl, bei uns 64 Bits
1 Hinweis: nicht nativ!

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 23 / 39
Programmieren in C
Arrays

Beispiel:

int zeiten [15];


→ Reserviert Speicherplatz für 15 ints, zeiten[0] bis zeiten[14].

Berechnung der Summe der 15 Elemente:


i n t summe = 0 ;
int i ;
f o r ( i = 0 ; i < 1 5 ; i ++)
{
summe = summe + z e i t e n [ i ] ;
}

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 24 / 39
Programmieren in C
Konstruierte Datentypen I

Für Ganzzahlen mit garantierten Bitbreiten kann man mit


#include <stdint.h>
verwenden: uint8 t, int8 t, uint16 t, int16 t, uint32 t, int32 t.
Strukturen:
struct {
i n t wert ;
char e i n h e i t ;
} t;
→ Definiert eine Variable t, mit den zwei ”Komponenten” t.wert und
t.einheit.

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 25 / 39
Programmieren in C
Konstruierte Datentypen II

typedef:
typedef unsigned i n t uint32 t ;
→ Kann verwendet werden als uint32 t x, y;

struct mit typedef:


typedef struct {
i n t wert ;
char e i n h e i t ;
} temperatur t ;
→ Kann verwendet werden als temperatur t t1, t2;

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 26 / 39
Programmieren in C
Konstruierte Datentypen III

Pointer:
int ∗ p;
→ Kann verwendet werden als:
p = &x; Dem Zeiger p wird zugewiesen: eine ”Adresse auf x”.
*p = 7; ”Dem worauf p zeigt” (also x) wird die Zahl 7 zugewiesen.
p = p1 ”p zeigt auf die gleiche Adresse, wie p1”

Das gleiche gilt für Pointer auf Strukturen. Wichtig hierbei: korrekte
Dereferenzierung:
(∗ p ) . wert = 20;
→ Siehe auch: Mehrfachpointer

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 27 / 39
Programmieren in C
Konstruierte Datentypen IV

const:
const int p ;
→ Kann normal verwendet werden (aber nur einmal beschrieben
werden!)

Pointer lassen sich auch problemlos mit const verbinden:


c o n s t i n t ∗ p1 ;
i n t ∗ c o n s t p2 ;
i n t ∗∗ c o n s t p3 ;
i n t ∗ c o n s t ∗ p4 ;
i n t c o n s t ∗ c o n s t ∗ c o n s t p5 ;

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 28 / 39
Unterabschnitt 2

Operatoren in C

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 29 / 39
Programmieren in C
Prioritäten

Priorität Symbol
15 ( ) () (Funktionsaufruf) [ ] -> .
14 +-(VZ) ! ∼ ++ – & * (Typ) sizeof
13 */%
12 +-
11 
10 <≤≥>
9 == !=
8 &
7 ˆ
6 |
5 &&
4 k
3 ?:
2 = *= /= %= += -= &=ˆ= |= = gg =
1 ,

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 30 / 39
Programmieren in C
Operatoren (Auswahl)

Operator Erklärung Beispiel


! && k Logisches NOT/AND/OR if (!(x == 3 k y < 7)) {..
y = ∼x;
∼ & |ˆ Bitweises NOT/AND/OR/XOR
y = x & 3;
 Links-/Rechtsschieben y = x  2;
sizeof() Größe eines Elements im Speicher size t size = sizeof(int)

Es gibt unäre, binäre und ternäre Operatoren


Operatoren können überschrieben werden

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 31 / 39
Unterabschnitt 3

Allgemeines

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 32 / 39
Programmieren in C
Casts in C

Impliziter Cast:
Arithmetische Operationen werden in C im ”mächtigeren” der beiden
Operanden-Typen ausgeführt.
Expliziter Cast
int a , b;
float f ;

a = b ∗ 1.2 f ;
f = a / b;
f = a / ( float ) b;

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 33 / 39
Programmieren in C
Schleifen

for:
for(i = 0; i<10; i++){...}
while:
while(i < 10){...}
do-while:
do{...}while(i < 10);

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 34 / 39
Programmieren in C
Struktur eines Programms

#i n c l u d e <s t d i n t . h>
#i n c l u d e ” l c d . h”

#d e f i n e P I 3 . 1 4 1 5 9 2 6 f

uint16 t drehzahl ;

v o i d pruefeUmfang ( i n t r a d i u s )
{
f l o a t umfang ;
umfang = 2 ∗ PI ∗ r a d i u s ;
...
return ;
}

i n t main ( v o i d )
{
i n t x = 17;
...
pruefeUmfang (34) ;
}

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 35 / 39
Programmieren in C
Ablage von Variablen im Speicher

int x ;
int a [3];
int y ;

struct
{
int v ;
i n t w;
}s ;

Abbildung 3: Speicheranordnung [2]

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 36 / 39
Abschnitt 4

Anhang

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 37 / 39
Unterabschnitt 1

Quellen

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 38 / 39
Quellen I

Homepage von Herrn Prof. Dr. Gober


Linksammlung
https://prof.beuth-hochschule.de/gober/lehre/dokumentation-
mikrocontroller-stm32/
Unterlagen von Herrn Prof. Dr. Gober

Stephan Schulze (BHT Berlin / IAV GmbH) Termin 3 - MCT-2 19. Oktober 2021 39 / 39

Das könnte Ihnen auch gefallen