filmov
tv
026DE Arduino Piano Teil 6a - Bibliotheken, Zeitmessung und Festkommaarithmetik in C/C++
Показать описание
In diesem Video wird gezeigt, wie man
- in C/C++ eigene Programm-Bibliotheken mit Hilfe von Header- und CPP-Dateien anlegen kann
- die benötigten Taktzyklen für die Ausführung von bestimmten Befehlssequenzen messen kann
- effizient auf bestimmte Teile einer Integervariablen zugreifen kann
- mit Festkommazahlen rechnet
- die Festkommadivision effizient rechnen kann
0:00 Einleitung
0:20 Inhalt
0:50 Header- und CPP-Dateien Erklärung
6:02 Header- und CPP-Dateien in der Arduino Entwicklungsumgebung
7:19 Taktzyklenmessung Erklärung
8:28 Taktzyklenmessung mit dem Arduino Nano
10:11 Zugriff auf oberes Byte einer 16 Bit Zahl
11:35 Zugriff auf oberes Byte einer 32 Bit Zahl
12:14 Zugriff auf obere 2 Bytes einer 32 Bit Zahl
12:56 Erklärung FixPoint.h Datei
16:08 Zeitvergleich Schiebeoperation und direkter Zugriff auf Arduino Nano
19:34 Festkomma Addition und Subtraktion
20:40 Festkomma Multiplikation
21:41 Festkomma Multiplikation, Zeitmessung auf dem Arduino Nano
24:07 Festkomma Division
24:43 Festkomma Division schneller mit Multiplikation
27:04 Festkomma Division Zeitmessung auf dem Arduino Nano
29:45 Hinweise zur Software in der Videobeschreibung
31:44 Ende und Links zu anderen Videos
Software:
Die zweite Hälfte findet Ihr im Video "Arduino Piano Teil 6b - Software - eigene Bibliotheken, Zeitmessung und Festkommaarithmetik in C/C++"
// written by Walter Mayer
// youtube video channel: IURLC
// July 2022
// this code is written for Arduino boards with ATmega328
#include §LT§Arduino.h§BT§
#include §LT§stdint.h§BT§
#include "FixPoint.h"
#define Stopp do {} while( true )
void SetupTimer1()
{
TCCR1A=0b00000000; // normal operation no pin change
TCCR1B=0b00000001; // use system clock 1:1 (no prescaling)
TCCR1C=0b00000000; // no forced pin
}
uint16§t TimerStart()
{
return TCNT1;
}
uint16§t TimerEnd()
{
return TCNT1-4;
}
void setup()
{
SetupTimer1();
}
void OutTest8bit( char Msg[], int8§t Value, uint16§t Time )
{
Println();
Println( Msg );
Print( "A=" );
PrintlnHex( Value );
Print( "T=" );
Println( Time );
}
void OutTest16bit( char Msg[], int16§t Value, uint16§t Time )
{
Println();
Println( Msg );
Print( "B=" );
PrintlnHex( Value );
Print( "T=" );
Println( Time );
}
void TimerTest()
{
uint16§t T1, T2;
noInterrupts();
T1=TimerStart();
T2=TimerEnd();
interrupts();
OutTest8bit( "TimerTest", 0, T2-T1 );
Stopp;
}
void AccessTimingTest()
{
uint16§t T1, T2;
volatile int16§t X=0x1234;
volatile int32§t Y=0x12345678;
volatile int8§t A;
volatile int16§t B;
FixPoint16§t XX;
FixPoint32§t YY;
Println();
Println( "AccessTimingTest" );
Print( "X=" );
PrintlnHex( X );
Print( "Y=" );
PrintlnHex( Y );
noInterrupts();
T1=TimerStart();
A=X§BT§§BT§8;
T2=TimerEnd();
interrupts();
OutTest8bit( "A=X§BT§§BT§8;", A, T2-T1 );
XX.FixPoint1x16 = X;
noInterrupts();
T1=TimerStart();
A=UpperInt8§16(XX);
T2=TimerEnd();
interrupts();
OutTest8bit( "A=UpperInt8§16(XX);", A, T2-T1 );
noInterrupts();
T1=TimerStart();
A=Y§BT§§BT§24;
T2=TimerEnd();
interrupts();
OutTest8bit( "A=Y§BT§§BT§24;", A, T2-T1 );
YY.FixPoint1x32=Y;
noInterrupts();
T1=TimerStart();
A=UpperInt8§32(YY);
T2=TimerEnd();
interrupts();
OutTest8bit( "A=UpperInt8§32(YY);", A, T2-T1 );
noInterrupts();
T1=TimerStart();
B=Y§BT§§BT§16;
T2=TimerEnd();
interrupts();
OutTest16bit( "B=Y§BT§§BT§16;", B, T2-T1 );
YY.FixPoint1x32=Y;
noInterrupts();
T1=TimerStart();
B=UpperInt16§32(YY);
T2=TimerEnd();
interrupts();
OutTest16bit( "B=UpperInt16§32(YY);", B, T2-T1 );
Stopp;
}
void MultiplicatonTimingTest()
{
uint16§t T1, T2;
volatile int8§t V=0x10;
volatile uint8§t W=0x5A;
volatile int16§t X=0x7000;
volatile uint16§t Y=0xF169;
volatile int8§t A;
volatile int16§t B;
FixPoint16§t XX;
FixPoint32§t YY;
Println();
Println( "MultiplicationTimingTest" );
Print( "V=" );
PrintlnHex( V );
Print( "W=" );
PrintlnHex( W );
Print( "X=" );
PrintlnHex( X );
Print( "Y=" );
PrintlnHex( Y );
noInterrupts();
T1=TimerStart();
XX.FixPoint1x16 = int16§t(V)*W;
A=UpperInt8§16(XX);
T2=TimerEnd();
interrupts();
OutTest8bit( "A=UpperInt8§16(XX);", A, T2-T1 );
noInterrupts();
T1=TimerStart();
YY.FixPoint1x32 = int32§t(X)*Y;
A=UpperInt8§32(YY);
T2=TimerEnd();
interrupts();
OutTest8bit( "A=UpperInt8§32(YY);", A, T2-T1 );
noInterrupts();
T1=TimerStart();
YY.FixPoint1x32 = int32§t(X)*Y;
B=UpperInt16§32(YY);
T2=TimerEnd();
interrupts();
OutTest16bit( "B=UpperInt16§32(YY);", B, T2-T1 );
Stopp;
}
- in C/C++ eigene Programm-Bibliotheken mit Hilfe von Header- und CPP-Dateien anlegen kann
- die benötigten Taktzyklen für die Ausführung von bestimmten Befehlssequenzen messen kann
- effizient auf bestimmte Teile einer Integervariablen zugreifen kann
- mit Festkommazahlen rechnet
- die Festkommadivision effizient rechnen kann
0:00 Einleitung
0:20 Inhalt
0:50 Header- und CPP-Dateien Erklärung
6:02 Header- und CPP-Dateien in der Arduino Entwicklungsumgebung
7:19 Taktzyklenmessung Erklärung
8:28 Taktzyklenmessung mit dem Arduino Nano
10:11 Zugriff auf oberes Byte einer 16 Bit Zahl
11:35 Zugriff auf oberes Byte einer 32 Bit Zahl
12:14 Zugriff auf obere 2 Bytes einer 32 Bit Zahl
12:56 Erklärung FixPoint.h Datei
16:08 Zeitvergleich Schiebeoperation und direkter Zugriff auf Arduino Nano
19:34 Festkomma Addition und Subtraktion
20:40 Festkomma Multiplikation
21:41 Festkomma Multiplikation, Zeitmessung auf dem Arduino Nano
24:07 Festkomma Division
24:43 Festkomma Division schneller mit Multiplikation
27:04 Festkomma Division Zeitmessung auf dem Arduino Nano
29:45 Hinweise zur Software in der Videobeschreibung
31:44 Ende und Links zu anderen Videos
Software:
Die zweite Hälfte findet Ihr im Video "Arduino Piano Teil 6b - Software - eigene Bibliotheken, Zeitmessung und Festkommaarithmetik in C/C++"
// written by Walter Mayer
// youtube video channel: IURLC
// July 2022
// this code is written for Arduino boards with ATmega328
#include §LT§Arduino.h§BT§
#include §LT§stdint.h§BT§
#include "FixPoint.h"
#define Stopp do {} while( true )
void SetupTimer1()
{
TCCR1A=0b00000000; // normal operation no pin change
TCCR1B=0b00000001; // use system clock 1:1 (no prescaling)
TCCR1C=0b00000000; // no forced pin
}
uint16§t TimerStart()
{
return TCNT1;
}
uint16§t TimerEnd()
{
return TCNT1-4;
}
void setup()
{
SetupTimer1();
}
void OutTest8bit( char Msg[], int8§t Value, uint16§t Time )
{
Println();
Println( Msg );
Print( "A=" );
PrintlnHex( Value );
Print( "T=" );
Println( Time );
}
void OutTest16bit( char Msg[], int16§t Value, uint16§t Time )
{
Println();
Println( Msg );
Print( "B=" );
PrintlnHex( Value );
Print( "T=" );
Println( Time );
}
void TimerTest()
{
uint16§t T1, T2;
noInterrupts();
T1=TimerStart();
T2=TimerEnd();
interrupts();
OutTest8bit( "TimerTest", 0, T2-T1 );
Stopp;
}
void AccessTimingTest()
{
uint16§t T1, T2;
volatile int16§t X=0x1234;
volatile int32§t Y=0x12345678;
volatile int8§t A;
volatile int16§t B;
FixPoint16§t XX;
FixPoint32§t YY;
Println();
Println( "AccessTimingTest" );
Print( "X=" );
PrintlnHex( X );
Print( "Y=" );
PrintlnHex( Y );
noInterrupts();
T1=TimerStart();
A=X§BT§§BT§8;
T2=TimerEnd();
interrupts();
OutTest8bit( "A=X§BT§§BT§8;", A, T2-T1 );
XX.FixPoint1x16 = X;
noInterrupts();
T1=TimerStart();
A=UpperInt8§16(XX);
T2=TimerEnd();
interrupts();
OutTest8bit( "A=UpperInt8§16(XX);", A, T2-T1 );
noInterrupts();
T1=TimerStart();
A=Y§BT§§BT§24;
T2=TimerEnd();
interrupts();
OutTest8bit( "A=Y§BT§§BT§24;", A, T2-T1 );
YY.FixPoint1x32=Y;
noInterrupts();
T1=TimerStart();
A=UpperInt8§32(YY);
T2=TimerEnd();
interrupts();
OutTest8bit( "A=UpperInt8§32(YY);", A, T2-T1 );
noInterrupts();
T1=TimerStart();
B=Y§BT§§BT§16;
T2=TimerEnd();
interrupts();
OutTest16bit( "B=Y§BT§§BT§16;", B, T2-T1 );
YY.FixPoint1x32=Y;
noInterrupts();
T1=TimerStart();
B=UpperInt16§32(YY);
T2=TimerEnd();
interrupts();
OutTest16bit( "B=UpperInt16§32(YY);", B, T2-T1 );
Stopp;
}
void MultiplicatonTimingTest()
{
uint16§t T1, T2;
volatile int8§t V=0x10;
volatile uint8§t W=0x5A;
volatile int16§t X=0x7000;
volatile uint16§t Y=0xF169;
volatile int8§t A;
volatile int16§t B;
FixPoint16§t XX;
FixPoint32§t YY;
Println();
Println( "MultiplicationTimingTest" );
Print( "V=" );
PrintlnHex( V );
Print( "W=" );
PrintlnHex( W );
Print( "X=" );
PrintlnHex( X );
Print( "Y=" );
PrintlnHex( Y );
noInterrupts();
T1=TimerStart();
XX.FixPoint1x16 = int16§t(V)*W;
A=UpperInt8§16(XX);
T2=TimerEnd();
interrupts();
OutTest8bit( "A=UpperInt8§16(XX);", A, T2-T1 );
noInterrupts();
T1=TimerStart();
YY.FixPoint1x32 = int32§t(X)*Y;
A=UpperInt8§32(YY);
T2=TimerEnd();
interrupts();
OutTest8bit( "A=UpperInt8§32(YY);", A, T2-T1 );
noInterrupts();
T1=TimerStart();
YY.FixPoint1x32 = int32§t(X)*Y;
B=UpperInt16§32(YY);
T2=TimerEnd();
interrupts();
OutTest16bit( "B=UpperInt16§32(YY);", B, T2-T1 );
Stopp;
}