Skip to content
Snippets Groups Projects
Commit 68bc4bfd authored by Peter Gerwinski's avatar Peter Gerwinski
Browse files

Beispiele und Notizen 13.6.2022

parent 26930b1e
No related branches found
No related tags found
No related merge requests found
No preview for this file type
...@@ -237,11 +237,11 @@ ...@@ -237,11 +237,11 @@
Wertvolle Ressourcen Wertvolle Ressourcen
\begin{itemize} \begin{itemize}
\item \item
Fähigkeiten einer Raumsonde optimieren Fähigkeiten einer Raumsonde optimieren\\
% (Marsumlaufbahn: ab ca.~127\,000 Euro pro kg) (Marsumlaufbahn:\\ab ca.~127\,000 Euro pro kg)
% 70000000 / 550000 = 127._27 % 70000000 / 550000 = 127._27
% http://www.bernd-leitenberger.de/blog/2009/09/29/reduktion-der-kosten-von-planetenmissionen/ % http://www.bernd-leitenberger.de/blog/2009/09/29/reduktion-der-kosten-von-planetenmissionen/
\only<.(1)>{\\[\bigskipamount]\strut\hfill\makebox(0,0)[r]{\includegraphics[height=3.5cm]{curiosity.jpg}}\vspace*{-1cm}} \only<.(1)>{\\[\bigskipamount]\strut\hfill\makebox(0,0)[r]{\vspace*{1cm}\includegraphics[height=3.5cm]{curiosity.jpg}}\vspace*{-1cm}}
\pause \pause
\item \item
Implantat: Platz- und Stromverbrauch minimieren Implantat: Platz- und Stromverbrauch minimieren
......
Wertebereiche von Bitfeldern, 13.06.2022, 11:58:01
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Syntax:
struct {
unsigned LEDsR:3;
unsigned LEDsL:3;
unsigned reserved:2;
};
LEDsR ist ein vorzeichenloses Bit-Feld, bestehend aus 3 Bits.
Wertebereich: 0 bis 7
Dasselbe als vorzeichenbehaftetes Bit-Feld:
struct {
int LEDsR:3;
int LEDsL:3;
int reserved:2;
};
Wertebereich bei 3 Bit: -4 bis 3
Warum?
* 3 Bits --> Wir haben 8 Werte zur Verfügung.
* Welche wir als positiv und welche als negativ interpretieren,
ist Sache der Konvention.
Damit die Hardware mit den Zahlen effizient rechnen kann,
verwenden wir kein Offset, sondern behalten das Bitmuster
000 für den Wert 0, 001 für 1 usw.
000 001 010 011 100 101 110 111
- alle positiv --> vorzeichenlose Zahl 0 1 2 3 4 5 6 7
- -1 bis 6 0 1 2 3 4 5 6 -1
- -2 bis 5 0 1 2 3 4 5 -2 -1
- ...
- -7 bis 0 0 -7 -6 -5 -4 -3 -2 -1
In Hardware implementierte Konvention: MSB = Vorzeichen-Bit
Vorteil: Die Hardware erkennt anhand des MSB das Vorzeichen.
000 001 010 011 100 101 110 111
0 1 2 3 -4 -3 -2 -1
Aufgabe: Welchen Wertebereich hat eine vorzeichenbehaftete 1-Bit-Zahl?
Lösung (per Mehrheitsbeschluß;-): 0 und -1
Überprüfung (unions-03.c): Stimmt. :-)
Begründung: Das einzige Bit ist gleichzeitig das MSB.
Wenn es gesetzt ist, muß der Wert negativ interpretiert werden.
Dann sind alle Bits = 1, was der Zahl -1 entspricht.
Was ist ein Callback? 13.06.2022, 13:15:47
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ziel: Reaktion auf ein Ereignis
Beispiel: Ereignis: Bumper hat Hindernis erkannt. Reaktion: Anhalten.
Weg dorthin: Bibliothek stellt einen "Callback"-Mechanismus zur Verfügung.
Wir schreiben für die Reaktion eine Funktion. Hier z.B.: anhalten und blinken
void bumpersStateChanged(void)
{
if(bumper_left || bumper_right)
{
moveAtSpeed(0,0);
setLEDs(0b010000);
startStopwatch1();
}
}
Vor dem Losfahren teilen wir der Bibliothek mit, daß sie diese Funktion
aufrufen soll, wenn das Ereignis (hier: Bumper löst aus) eintritt.
BUMPERS_setStateChangedHandler(bumpersStateChanged);
"Wenn sich der Zustand der Bumper ändert,
bitte die Funktion bumpersStateChanged() aufrufen."
Später läuft dann die Hauptschleife der Bibliothek.
Diese ruft dann bei Bedarf die übergebene Funktion
("Callback-Funktion") auf.
Variante dieses Konzepts: virtuelle Methode überschreiben
Beispiel: GUI-Bibliothek
Ein GUI-Element hat eine virtuelle Methode, um seinen Inhalt darzustellen.
Wenn ich ein neues GUI-Element definiere, muß ich diese Methode überschreiben,
damit es seinen spezifischen Inhalt darstellen kann.
Die GUI ruft dann bei Bedarf die virtuelle Methode auf ("Callback").
Beispiel: GUI-Bibliothek
- GTK in C: Callback-Funktion installieren
- GTK in C++: virtuelle Methode überschreiben
Wie funktionieren Callbacks? 13.06.2022, 13:14:34
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Bumpers State changed handler:
void BUMPERS_stateChanged_DUMMY(void){}
static void (*BUMPERS_stateChangedHandler)(void) = BUMPERS_stateChanged_DUMMY;
/**
* Use this function to set the Bumpers state change handler.
*
*/
void BUMPERS_setStateChangedHandler(void (*bumperHandler)(void))
{
BUMPERS_stateChangedHandler = bumperHandler;
}
Callback installieren: Funktion BUMPERS_setStateChangedHandler()
Parameter der Funktion: void (*bumperHandler)(void)
"Funktion mit dem Namen '(*bumperHandler)'"
--> *bumerHandler ist eine Funktion.
--> Das, worauf bumerHandler zeigt, ist eine Funktion.
--> bumerHandler ist ein Zeiger auf eine Funktion.
Aufruf von BUMPERS_setStateChangedHandler:
BUMPERS_setStateChangedHandler(bumpersStateChanged);
Wir übergeben die Adresse der Funktion bumpersStateChanged().
Insbesondere rufen wir die Funktion bumpersStateChanged() nicht auf.
(Um sie aufzurufen, bräuchte man das Klammerpaar.)
BUMPERS_setStateChangedHandler() merkt sich den Funktionszeiger
auf einer globalen Variablen BUMPERS_stateChangedHandler gleichen Typs.
Diese Variable, ein Zeiger auf eine Funktion, zeigte vorher auf eine
Funktion BUMPERS_stateChanged_DUMMY, die nichts macht.
Aber wer ruft nun tatsächlich die Callback-Funktion auf?
Dies geschieht in der Funktion task_Bumpers().
Diese Funktion
- schaut auf die Uhr: Sie wird höchstens alle 50 Millisekunden aktiv (weiche Echtzeit).
- fragt den Zustand der Bumper ab.
- ruft, sofern sich der Zustand der Bumper geändert hat, die Callback-Funktion auf.
Verbleibende Fragen:
- Wie funktioniert die Abfrage des Zustands der Bumper?
- Wer ruft task_Bumpers() auf?
Wie funktioniert die Abfrage des Zustands der Bumper?
- Der linke Bumper und LED Nr. 6 teilen sich einen Port
(Bumper als Input, LED als Output).
- Wir schalten LED Nr. 6 aus.
- Wir schalten den Port als Input.
- Wir warten einen Taktzyklus, damit der Prozessor den Input auslesen kann.
- Wir lesen den Input-Port.
- Sofern LED Nr. 6 leuchten soll, schalten wir den Port zurück auf Output
und die LED ein.
Wer ruft task_Bumpers() auf?
- task_RP6System() ruft task_Bumpers() auf.
- Das Hauptprogramm ruft in seiner Hauptschleife task_RP6System() auf
("kooperatives Multitasking").
Ohne dies würden die Bumper nicht funktionieren.
#include <stdio.h>
#include <stdint.h>
typedef union
{
uint8_t byte;
struct
{
unsigned bit0 : 1;
unsigned bit1 : 1;
int bit2 : 1;
int bit3 : 1;
};
} data;
int main (void)
{
data d;
d.byte = 0x0a;
printf ("d.bit0 = %d, d.bit1 = %d, d.bit2 = %d, d.bit3 = %d\n",
d.bit0, d.bit1, d.bit2, d.bit3);
return 0;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment