Technische Informatik; Hardwarenahe Programmierung
Interrupt Grundlegend
Aufbauend auf die Timer and Interrupts Slides verwende im Simulator folgende Programme:
Obige Programme funktionieren auch am mbed-Application-Board, allerdings der Timer funktioniert nur hier:
Das folgende Programm ist aus dem Simulator Interrupts Load demos :
- Ticker: LED1 will blink every second
- InterruptIn: LED2 can be toggled through BUTTON1
- Timeout: LED3 will toggle after 2.5 seconds
InterruptTicker.cpp
#include "mbed.h" #define BUTTON1 p14 // push joystick pin //#define BUTTON1 A1 // NUCLEO Taster A1 DigitalOut led1(LED1); DigitalOut led2(LED2); // NUCLEO D2 DigitalOut led3(LED3); // NUCLEO D3 Ticker t1; Timeout t2; InterruptIn btn(BUTTON1); void blink_led1() { printf("Ticker fired\n"); led1 = !led1; } void toggle_led2() { printf("BUTTON1 fall invoked\n"); led2 = !led2; } void turn_led3_on() { printf("Timeout fired\n"); led3 = 1; } int main() { printf("Hello world!\n"); printf("LED1 will blink every second, LED3 will toggle after 2.5 seconds, LED2 can be toggled through BUTTON1.\n"); printf("-----------------------------------\n\n"); t1.attach(callback(&blink_led1), 1.0f); t2.attach(callback(&turn_led3_on), 2.5f); btn.fall(callback(&toggle_led2)); while(1) {} // wait_ms(osWaitForever); }
Import programapp-InterruptIn-Ticker-Timeout
Program from Mbed-Simulator for InterruptIn, Ticker, and Timeout
ACHTUNG
- In der ISR (oben flip()) darf keine wait-Funktionen, Endlosschleifen oder blockierende System Calls verwendet werden.
- No printf, malloc, or new in ISR
Keine Bibliotheksfunktionen, die nicht re-entrant sind.
Aufgaben¶
- (Beispielhaft)Beschreiben Sie obiges Programm möglichst genau.
- (Beispielhaft) Unter welchen Bedingungen wird im obigen Programm:
- Led1 leuchten, was wird auf die serielle Schnittstelle ausgegeben?
- Led2 leuchten
- Led3 leuchten
- Wie können Sie die Zeit für einen bestimmten Code-Abschnitt messen? (Code Beispiel)
- Wofür wird time bei Mikrocontrollern verwendet?
- Schreiben Sie ein C++ Programm, das eine 100Hz Rechteckschwingung an der LED1 ausgibt. Wird eine Taste gedrückt soll bei steigender Flanke die Frequenz verdoppelt werden. Bei einem weiteren Tastendruck sollen bei fallender Flanke wieder die 100Hz ausgegeben werden.
- Schreiben Sie ein C++ Programm, das die Anzahl wie oft eine Taste gedrückt (steigende Flanke) wurde zählt und die LED1 leuchten soll wenn die Taste 10 Mal gedrückt wurde.
Anm.: Schreibe die Programme sowohl für Polling als auch Interrupt. Vergleiche beide Varianten.