lehrkraefte:blc:informatik:ffprg2-2020:esp32-io-and-vars

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
lehrkraefte:blc:informatik:ffprg2-2020:esp32-io-and-vars [2020/08/12 10:22]
Ivo Blöchliger
lehrkraefte:blc:informatik:ffprg2-2020:esp32-io-and-vars [2020/08/12 15:45]
Ivo Blöchliger [Ausgabe mit printf]
Line 1: Line 1:
 ====== Typen ====== ====== Typen ======
 Alles in C++ muss einen Typ haben. Der Typ einer Variablen kann nicht geändert werden.  Alles in C++ muss einen Typ haben. Der Typ einer Variablen kann nicht geändert werden. 
-===== Ganzzahl-Typen =====+===== Zahl-Typen =====
 Die Typen ''uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t'' sind in ihrer Bezeichnung klar, ob ohne Vorzeichen (**u**nsigned) und wieviele Bits diese umfassen. Eigentlich sollte ausschliesslich damit gearbeitet werden. Die Typen ''uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t'' sind in ihrer Bezeichnung klar, ob ohne Vorzeichen (**u**nsigned) und wieviele Bits diese umfassen. Eigentlich sollte ausschliesslich damit gearbeitet werden.
  
Line 9: Line 9:
   * **float** und **double** Fliesskommazahlen, 4 bzw. 8 Bytes.   * **float** und **double** Fliesskommazahlen, 4 bzw. 8 Bytes.
   * **bool** true oder false   * **bool** true oder false
-  * **char** +  * **char** oder **byte**. 
 + 
 +==== Umwandlung der Typen ==== 
 +Ist in einem Ausdruck ein float oder double involviert, ist auch das Resultat ein float oder double. 
 + 
 +Sind in einem Ausdruck nur ganzzahlige Typen involviert, ist auch das Resultat ganzzahlig, wobei immer gegen Null hin gerundet wird: 
 +<code c++> 
 +void setup() { 
 +  Serial.begin(115200); 
 +  delay(200); 
 +  int a=7; 
 +  int b=6; 
 +  int c = a/b; 
 +  Serial.printf("[int]  %d/%d ist gleich %d\n",a,b,c); 
 +  a = -7; 
 +  c = a/b; 
 +  Serial.printf("[int]  %d/%d ist gleich %d\n",a,b,c); 
 +
 + 
 +void loop() { 
 +  // tu nix 
 +
 +</code> 
 + 
 +==== Ausgabe mit Serial.printf ==== 
 +  * %d (int) 
 +  * %f (float, double) 
 +  * %l (long) 
 +  * %du, %llu (unsigned int, unsigned long long) 
 +  * %c (char) 
 +  * \n Zeilenumbruch 
 + 
 +==== Speicherbedarf und Umfang ====
  
 <code c++> <code c++>
Line 38: Line 70:
   HASSIGN(unsigned int);   HASSIGN(unsigned int);
   unsigned long long a = -1;   unsigned long long a = -1;
-  Serial.printf("unsigned long long -1 ist %llu", a); +  Serial.printf("unsigned long long -1 ist %llu", a);  
-   +
-   +
-  +
 } }
  
Line 49: Line 78:
 </code> </code>
  
 +==== Rechengeschwindigkeit ====
 +<code c++>
 +#define RUN(TYPE, FORMAT) addtest<TYPE>(1000000, #TYPE, FORMAT)
 +#define RUM(TYPE, FORMAT) multest<TYPE>(1000000, #TYPE, FORMAT)
 +
 +template<typename T>
 +void addtest(int n, char *t, char *f) {
 +  long zeit = micros();
 +  // volatile bezeichnet Variablen, die z.B. von Interrupts verändert werden könnten.
 +  // Damit kann der Kompiler keine Optimierungen machen, weil sich der Wert ausserhalb
 +  // des normalen Programmflusses ändern könnte.
 +  volatile T r = 0;     // Damit das Ding nicht wegoptimiert wird.
 +  volatile T a = 3456;  // Damit das Ding nicht wegoptimiert wird.
 +  for (int i=0; i<n; i++) {
 +    r = r+a;
 +  }
 +  zeit = micros()-zeit;
 +  Serial.printf("%d Additionen mit Typ %s braucht %d us\n", n, t, zeit);
 +  // Wenn das Resultat nicht gebraucht wird, wird die ganze Schleife
 +  // gnadenlos wegoptimiert ;-)
 +  Serial.print("Das Resultat: ");
 +  Serial.printf(f, r);
 +  Serial.println();
 +}
 +
 +template<typename T>
 +void multest(int n, char *t, char *f) {
 +  long zeit = micros();
 +  volatile T b = 27; // Damit das Ding nicht wegoptimiert wird.
 +  volatile T r = 0;  // Damit das Ding nicht wegoptimiert wird.
 +  T a = 5234;
 +  for (int i=0; i<n; i++) {
 +    r = a*b;
 +  }
 +  zeit = micros()-zeit;
 +  Serial.printf("%d Multiplikationen mit Typ %s braucht %d us\n", n, t, zeit);
 +  // Wenn das Resultat nicht gebraucht wird, wird die ganze Schleife
 +  // gnadenlos wegoptimiert ;-)
 +  Serial.print("Das Resultat: ");
 +  Serial.printf(f, r);
 +  Serial.println();
 +}
 +
 +
 +void setup() {
 +  Serial.begin(115200);
 +  delay(200);
 +  Serial.print("------------\n\n");
 +  RUN(int, "%d");
 +  RUN(long long, "%llu");
 +  RUN(float, "%f");
 +  RUN(double, "%f");
 +  
 +  Serial.println();
 +  
 +  RUM(int, "%d");
 +  RUM(long long, "%llu");
 +  RUM(float, "%f");
 +  RUM(double, "%f");
 +
 +}
 +
 +void loop() {
 +  // tu nix
 +}
 +</code>
  • lehrkraefte/blc/informatik/ffprg2-2020/esp32-io-and-vars.txt
  • Last modified: 2020/08/12 15:48
  • by Ivo Blöchliger