026DE Arduino Piano Teil 6a - Bibliotheken, Zeitmessung und Festkommaarithmetik in C/C++

preview_player
Показать описание
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;
}
Рекомендации по теме