INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Zerlegung eines Programmcodes
24.04.2016, 11:40 (Dieser Beitrag wurde zuletzt bearbeitet: 24.04.2016 11:54 von hello_world.)
Beitrag #1
Zerlegung eines Programmcodes
Hallo,
ich habe ein Problem mit der Auslagerung von Funktionen aus einem Code.
Es geht um die Packung, welche Michael Wessel für den Colorduino zusammengeführt hat: https://www.michael-wessel.info/blog.html
(Klick bei Colorduino "download this .zip archive" oder "this code is for you")

Bislang ist der Code wie folgt zerlegt:

Lib.:
Colorduino.h
Colorduino.cpp


Stellt Schriftsymbole bereit:
glcfont.c

Main:
colorduino-demo.ino


1. Frage: In der glcfont.c werden die Buchstaben in folgendes gefasst
Code:
#ifndef FONT5X7_H
#define FONT5X7_H

#ifdef __AVR__
#include <avr/io.h>
#include <avr/pgmspace.h>
#elif defined(ESP8266)
#include <pgmspace.h>
#else
#define PROGMEM
#endif

static const unsigned char font[] PROGMEM = { Buchstaben....};

#endif
Wieso muss das so sein?


2. Frage:
In der Main colorduino-demo.ino stehen noch sehr viele Funktionen und zwei Symbole (Herz und HI).
Ich hätte diese gerne hier raus und in extra Funnktion, wie schon für die Schrift vorhanden.

Wie kann ich die Funktionen und die Symbole in eine .c ausgliedern und in der main includen?

Gewünscht wäre am Ende:
Colorduino.h //Header
Colorduino.cpp // Definitionen Header
glcfont.c //Definition Schrift
colorduino-demo.ino //Main

funktionen.c //Hier her die Funktionen aus der Main
symbole.c //Hier her die Symbole aus der Main

Leider bekomme ich das nicht hin/nicht zum laufen. Es wäre super, wenn mir wer dabei helfen könnte!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.04.2016, 02:03
Beitrag #2
RE: Zerlegung eines Programmcodes
Hallo ???,
ich versuche mal deine Fragen einigermaßen sinnvoll zu beantworten.
zu 1.
Die Fonts sind eigentlich statische Arrays, ändern sich ja inhaltlich nicht.
Daher macht es Sinn die Fonts mittels "PROGMEM" in den Flash Speicher auszulagern und nicht im SRAM abzulegen. Der Flash Speicher ist der Speicherbereich in dem sich auch der Maschinencode des Programms/Sketches (der sich ja auch nicht ändert) befindet. Im SRAM werden die im Programm/Sketch benutzten Variablen (die sich änden können) vorgehalten. Ziel ist es damit so viel wie möglich Speicher für Variablen frei zu halten (der Arduino hat davon ja nicht allzu viel). Eine Übersicht über die Speichertypen gibt es zB. hier: https://learn.adafruit.com/memories-of-a...o-memories
Der von dir gezeigte Code-Abschnitt nutzt sogenannte Pre-Compiler-Direktiven. Diese bewirken, dass je nach Architektur des Mikrocontrollers verschiedene Libraries benutzt werden um die Fonts in den Flash Speicher zu laden. Wenn du dir sicher bist, dass du den Code ausschließlich auf einen Arduino UNO/Mega bringst kannst du den Abschnitt einfach auf
Code:
#ifndef FONT5X7_H
#define FONT5X7_H
#include <avr/io.h>
#include <avr/pgmspace.h>
....
#endif
kürzen. Nur wenn Code für den UNO/Mega erzeugt wird ist die Makro-Variable "__AVR__" für den Compiler überhaupt sichtbar, daher die beiden Zeilen aus dem zugehörigen Ifdef-Zweig.
Zu 2.
Zitat:Colorduino.h //Header
Colorduino.cpp // Definitionen Header
Das sind die beiden Hauptdateien der Library, von daher nicht anfassen, sondern die Library nach Standard installieren
Zitat:glcfont.c //Definition Schrift
colorduino-demo.ino //Main
funktionen.c //Hier her die Funktionen aus der Main
symbole.c //Hier her die Symbole aus der Main
a) Die glcfont.c bleibt wie sie ist
b) Programmcode wird beim Arduino (besser bei der IDE des Arduino) immer in .ino - Dateien geschrieben. Daher kann man noch eine Datei "Funktionen.ino" erzeugen, jedoch keine Datei "Funktionen.c"
c) Die Zeichen Herz und HI kann man in eine eigene .h Datei schreiben (ich nehme dafür immer "settings.h") und diese in den Sketch einbinden. Laut Code (habe nicht wirklich durchgeguckt) werden die Zeichen aber wohl verändert. Von daher ist es nur eine Frage der Übersichtlichkeit die Zeichen in eine .h - Datei auszulagern.

Sowohl die "funktionen.ino" wie auch die "settings.h" befinden sich im gleichen Verzeichnis wie der "Hauptsketch". Da .ino - Dateien automatisch beim Compilerlauf eingebunden werden, braucht man nur die "settings.h" einbinden.
Wie das alles dann aussehen kann im Anhang.
Hoffe das hilft ein bischen weiter.
Grüße Ricardo


Angehängte Datei(en)
.zip  Colorduino.zip (Größe: 3,82 KB / Downloads: 13)

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.04.2016, 18:02 (Dieser Beitrag wurde zuletzt bearbeitet: 29.04.2016 18:13 von hello_world.)
Beitrag #3
RE: Zerlegung eines Programmcodes
(25.04.2016 02:03)rkuehle schrieb:  Hallo ???,
ich versuche mal deine Fragen einigermaßen sinnvoll zu beantworten.
Tut mir leid, dass dir die Frage nicht sinnvoll erscheint, ich finde sie schon recht sinnvoll.

Zitat:b) Programmcode wird beim Arduino (besser bei der IDE des Arduino) immer in .ino - Dateien geschrieben. Daher kann man noch eine Datei "Funktionen.ino" erzeugen, jedoch keine Datei "Funktionen.c"
Was spricht denn dagegen den Code sauber zu halten, die Funktionen auszulagern und
- in einer .h zu deklarieren
- in einer .c zu definieren
--> in der .ino zu includen
?!?!?

In die .h kommt demnach:
Code:
/*
//Funktionen.h
#ifndef FUNKTIONEN_H
#def FUNKTIONEN_H

void setColor(uint8_t ci);
void saveColor();
void restoreColor();
boolean isBgColor(uint8_t ci);
void setBgColor(uint8_t ci);
void plot(int8_t x, int8_t y);
void bg_plot(int8_t x, int8_t y);
void drawLine(int8_t x0, int8_t y0, int8_t x1, int8_t y1);
void drawCircle(int8_t x0, int8_t y0, int8_t r);
void drawCircleHelper( int8_t x0, int8_t y0, int8_t r, uint8_t cornername );
void fillCircle(int8_t x0, int8_t y0, int8_t r);
void fillCircleHelper(int8_t x0, int8_t y0, int8_t r, uint8_t cornername, int8_t delta);
void drawFastVLine(int8_t x, int8_t y, int8_t h);
void drawFastHLine(int8_t x, int8_t y, int8_t w);
void fillRect(int8_t x, int8_t y, int8_t w, int8_t h);
void fillScreen();
void clearScreen();
void drawChar(int8_t x, int8_t y, unsigned char c);
void drawCharTransparent(int8_t x, int8_t y, unsigned char c);
void getChar(String buffer[], unsigned char c, unsigned char col, int8_t x, int8_t y) ;
void scroll(String text, int scrollspeed, int offset);
void scrollOverImg(String text, String img[], int scrollspeed, int offset);
void drawImage(String img[], int8_t x, int8_t y);
void drawImageTransparent(String img[], int8_t x, int8_t y);
void rotateLeft(String img[], String tempImage[], String returnImage[]);
void scrollDown(String img[], String tempImage[], String returnImage[], uint8_t bgi);
void scrollLeft(String img[], String tempImage[], String returnImage[], uint8_t bgi);
void letItSnow(String img[], String tempImage[], String returnImage[]);
void dropImage(String img1[], String tempImage[], String returnImage[]);
void wipeImageLeft(String img1[], String tempImage[], String returnImage[]);
void spinImageLeft(String img1[], String tempImage[], String returnImage[]);

#endif

Die .c mit den Definitionen:
Code:
//Funktionen.c

#include Funktionen.h


void setColor(uint8_t ci) {

  red   = colors[ci][0];
  green = colors[ci][1];
  blue  = colors[ci][2];

}

void saveColor() {

  red_saved = red;
  green_saved = green;
  blue_saved = blue;

}

void restoreColor() {

  red = red_saved;
  green = green_saved;
  blue = blue_saved;

}


boolean isBgColor(uint8_t ci) {

  int red   = colors[ci][0];
  int green = colors[ci][1];
  int blue  = colors[ci][2];

  return  red == bg_red && green == bg_green && blue == bg_blue;

}



void setBgColor(uint8_t ci) {

  bg_red   = colors[ci][0];
  bg_green = colors[ci][1];
  bg_blue  = colors[ci][2];

}

void plot(int8_t x, int8_t y) {

  if (x < 0 || x > 7 || y < 0 || y > 7)
    return;

  Colorduino.SetPixel(x, y, red, green, blue);

}


void bg_plot(int8_t x, int8_t y) {

  if (x < 0 || x > 7 || y < 0 || y > 7)
    return;

  Colorduino.SetPixel(x, y, bg_red, bg_green, bg_blue);

}


void drawLine(int8_t x0, int8_t y0,
              int8_t x1, int8_t y1) {
  int8_t steep = abs(y1 - y0) > abs(x1 - x0);
  if (steep) {
    adagfxswap(x0, y0);
    adagfxswap(x1, y1);
  }

  if (x0 > x1) {
    adagfxswap(x0, x1);
    adagfxswap(y0, y1);
  }

  int8_t dx, dy;
  dx = x1 - x0;
  dy = abs(y1 - y0);

  int8_t err = dx / 2;
  int8_t ystep;

  if (y0 < y1) {
    ystep = 1;
  } else {
    ystep = -1;
  }

  for (; x0 <= x1; x0++) {
    if (steep) {
      plot(y0, x0);
    } else {
      plot(x0, y0);
    }
    err -= dy;
    if (err < 0) {
      y0 += ystep;
      err += dx;
    }
  }
}



void drawCircle(int8_t x0, int8_t y0, int8_t r) {

  int8_t f = 1 - r;
  int8_t ddF_x = 1;
  int8_t ddF_y = -2 * r;
  int8_t x = 0;
  int8_t y = r;

  plot(x0  , y0 + r);
  plot(x0  , y0 - r);
  plot(x0 + r, y0);
  plot(x0 - r, y0);

  while (x < y) {
    if (f >= 0) {
      y--;
      ddF_y += 2;
      f += ddF_y;
    }
    x++;
    ddF_x += 2;
    f += ddF_x;

    plot(x0 + x, y0 + y);
    plot(x0 - x, y0 + y);
    plot(x0 + x, y0 - y);
    plot(x0 - x, y0 - y);
    plot(x0 + y, y0 + x);
    plot(0 - y, y0 + x);
    plot(x0 + y, y0 - x);
    plot(x0 - y, y0 - x);
  }
}


void fillCircle(int8_t x0, int8_t y0, int8_t r) {
  drawFastVLine(x0, y0 - r, 2 * r + 1);
  fillCircleHelper(x0, y0, r, 3, 0);
}



void drawCircleHelper( int8_t x0, int8_t y0,
                       int8_t r, uint8_t cornername ) {
  int8_t f     = 1 - r;
  int8_t ddF_x = 1;
  int8_t ddF_y = -2 * r;
  int8_t x     = 0;
  int8_t y     = r;

  while (x < y) {
    if (f >= 0) {
      y--;
      ddF_y += 2;
      f     += ddF_y;
    }
    x++;
    ddF_x += 2;
    f     += ddF_x;
    if (cornername & 0x4) {
      plot(x0 + x, y0 + y);
      plot(x0 + y, y0 + x);
    }
    if (cornername & 0x2) {
      plot(x0 + x, y0 - y);
      plot(x0 + y, y0 - x);
    }
    if (cornername & 0x8) {
      plot(x0 - y, y0 + x);
      plot(x0 - x, y0 + y);
    }
    if (cornername & 0x1) {
      plot(x0 - y, y0 - x);
      plot(x0 - x, y0 - y);
    }
  }
}



void fillCircle(int8_t x0, int8_t y0, int8_t r) {
  drawFastVLine(x0, y0 - r, 2 * r + 1);
  fillCircleHelper(x0, y0, r, 3, 0);
}



void drawFastVLine(int8_t x, int8_t y,
                   int8_t h) {
  drawLine(x, y, x, y + h - 1);
}



void drawFastHLine(int8_t x, int8_t y, int8_t w) {
  drawLine(x, y, x + w - 1, y);
}



void fillRect(int8_t x, int8_t y, int8_t w, int8_t h) {
  for (int8_t i = x; i < x + w; i++) {
    drawFastVLine(i, y, h);
  }
}



void fillScreen() {fillRect(0, 0, 8, 8);
}


void clearScreen() {
  saveColor();
  red = bg_red;
  green = bg_green;
  blue = bg_blue;
  fillRect(0, 0, 8, 8);
  restoreColor();
}


void drawChar(int8_t x, int8_t y, unsigned char c) {
  if (c >= 176) c++; // Handle 'classic' charset behavior

  for (int8_t i = 0; i < 6; i++ ) {
    uint8_t line;
    if (i == 5)
      line = 0x0;
    else
      line = pgm_read_byte(font + (c * 5) + i);

    for (int8_t j = 0; j < 8; j++) {
      if (line & 0x1)
        plot(x + i, 8 + y - j);
      else if ( bg_red != red || bg_green != green || bg_blue != blue)
        bg_plot(x + i, 8 + y - j);

      line >>= 1;
    }
  }
}



void drawCharTransparent(int8_t x, int8_t y, unsigned char c) {

  if (c >= 176) c++; // Handle 'classic' charset behavior

  for (int8_t i = 0; i < 6; i++ ) {
    uint8_t line;
    if (i == 5)
      line = 0x0;
    else
      line = pgm_read_byte(font + (c * 5) + i);

    for (int8_t j = 0; j < 8; j++) {
      if (line & 0x1)
        plot(x + i, 8 + y - j);

      line >>= 1;
    }
  }
}



void getChar(String buffer[], unsigned char c, unsigned char col, int8_t x, int8_t y) {


  for (int8_t yi = 0; yi < 8; yi++)
    for (int8_t xi = 0; xi < 8; xi++)
      buffer[xi][yi] = '-';

  if (c >= 176) c++; // Handle 'classic' charset behavior

  for (int8_t i = 0; i < 6; i++ ) {
    uint8_t line;
    if (i == 5)
      line = 0x0;
    else
      line = pgm_read_byte(font + (c * 5) + i);

    for (int8_t j = 0; j < 8; j++) {
      if (x + i >= 0 && x + i < 8 && y + j >= 0 && y + j < 8) {
        if (line & 0x1)
          buffer[y + j][x + i] = col;
        else
          buffer[y + j][x + i] = '-';
      }
      line >>= 1;
    }
  }
}



void scroll(String text, int scrollspeed, int offset) {

  int numberofcharacters = text.length();

  for (int xv = 7; xv > -((numberofcharacters) * 6) ; xv--) {

    clearScreen();

    for (int index = 0; index < numberofcharacters ; index++) {
      drawChar(xv + 6 * index, offset, text.charAt(index));
    }

    Colorduino.FlipPage();
    delay(scrollspeed);

  }
}



void scrollOverImg(String text, String img[], int scrollspeed, int offset) {

  int numberofcharacters = text.length();

  for (int xv = 7; xv > -((numberofcharacters) * 6) ; xv--) {

    clearScreen();
    drawImage(img, 0, 0);

    for (int index = 0; index < numberofcharacters ; index++) {
      drawCharTransparent(xv + 6 * index, offset, text.charAt(index));
    }

    Colorduino.FlipPage();
    delay(scrollspeed);

  }
}



void drawImage(String img[], int8_t x, int8_t y) {

  int index = 0;

  for (int8_t yi = 0; yi < 8; yi++) {
    for (int8_t xi = 0; xi < 8; xi++) {

      uint8_t c = img[yi][xi];
      if (c != ' ' && c != '\n' ) {
        if (c == '-')
          bg_plot(xi, 7 - yi);

        else {

          uint8_t ci = c - 48;

          saveColor();
          setColor(ci);
          plot(xi, 7 - yi);
          restoreColor();

        }
      }
    }
  }
}



void drawImageTransparent(String img[], int8_t x, int8_t y) {

  int index = 0;

  for (int8_t yi = 0; yi < 8; yi++) {
    for (int8_t xi = 0; xi < 8; xi++) {

      uint8_t c = img[yi][xi];
      if (c != ' ' && c != '\n' ) {
        if (c != '-') {

          uint8_t ci = c - 48;

          saveColor();
          setColor(ci);
          plot(xi, 7 - yi);
          restoreColor();

        }
      }
    }
  }
}


void rotateLeft(String img[], String tempImage[], String returnImage[]) {

  for (int8_t yi = 0; yi < 8; yi++) {
    for (int8_t xi = 0; xi < 8; xi++) {

      char c = img[yi][xi];
      tempImage[yi][xi] = c;
    }
  }

  for (int8_t yi = 0; yi < 8; yi++) {
    for (int8_t xi = 0; xi < 8; xi++) {

      char c = tempImage[yi][xi];
      returnImage[7 - xi][yi] = c;
    }
  }
}



void scrollDown(String img[], String tempImage[], String returnImage[], uint8_t bgi) {

  uint8_t bg = bgi + 48; // convert to '0', '1', ...

  for (int8_t yi = 0; yi < 8; yi++) {
    for (int8_t xi = 0; xi < 8; xi++) {

      char c = img[yi][xi];
      tempImage[yi][xi] = c;
    }
  }

  for (int8_t yi = 0; yi < 8; yi++) {
    for (int8_t xi = 0; xi < 8; xi++) {
      returnImage[yi][xi] = '-';
    }
  }

  for (int8_t yi = 1; yi < 8; yi++) {
    for (int8_t xi = 0; xi < 8; xi++) {

      char c = tempImage[yi - 1][xi];
      if ( c != bg && c != '-')
        returnImage[yi][xi] = c;
    }
  }

  for (int8_t i = 0; i < 8; i++)
    returnImage[0][i] = bg;

}


void scrollLeft(String img[], String tempImage[], String returnImage[], uint8_t bgi) {

  uint8_t bg = bgi + 48; // convert to '0', '1', ...

  for (int8_t yi = 0; yi < 8; yi++) {
    for (int8_t xi = 0; xi < 8; xi++) {

      char c = img[yi][xi];
      tempImage[yi][xi] = c;
    }
  }

  for (int8_t yi = 0; yi < 8; yi++) {
    for (int8_t xi = 0; xi < 8; xi++) {
      returnImage[yi][xi] = '-';
    }
  }

  for (int8_t yi = 0; yi < 8; yi++) {
    for (int8_t xi = 1; xi < 8; xi++) {

      char c = tempImage[yi][xi-1];
      if ( c != bg && c != '-')
        returnImage[yi][xi] = c;
    }
  }

  for (int8_t i = 0; i < 8; i++)
    returnImage[i][0] = bg;

}



void letItSnow(String img[], String tempImage[], String returnImage[]) {

  unsigned long time = millis();

  for (int8_t yi = 1; yi < 8; yi++) {
    for (int8_t xi = 0; xi < 8; xi++) {
      tempImage[yi][xi] = '-';
    }
  }
  
  for (int x = 0; x < 8; x++) {
    if (random(4) == 0)
      tempImage[0][x] = '9';
  }

  clearScreen();
  
  drawImage(img, 0, 0);
  drawImageTransparent(tempImage, 0, 0);
  Colorduino.FlipPage();
  
  //
  //
  //

  String* img0 = tempImage;

  while (millis() - time < 30000) {

    scrollDown(img0, tempImage, returnImage, 8);
    for (int x = 0; x < 8; x++) {
      if (random(4) == 0)
        img0[0][x] = '9';
      else
        img0[0][x] = '-';
    }

    if (millis() - time > 5000) {
      img0[7][1] = '9';
      img0[7][2] = '9';
      img0[7][3] = '9';
      img0[7][6] = '9';
    }
    if (millis() - time > 10000) {
      img0[7][0] = '9';
      img0[7][5] = '9';
    }
    if (millis() - time > 15000) {
      img0[7][4] = '9';
      img0[7][7] = '9';
      img0[7][6] = '9';
    }
    if (millis() - time > 20000) {
      img0[6][1] = '9';
      img0[6][2] = '9';
      img0[6][3] = '9';
      img0[6][6] = '9';
    }
    if (millis() - time > 20000) {
      img0[5][1] = '9';
      img0[5][2] = '9';
      img0[5][3] = '9';
      img0[5][6] = '9';
      img0[6][0] = '9';
      img0[6][5] = '9';
    }
    
    
    clearScreen();
    drawImage(img, 0, 0);

    
    drawImageTransparent(returnImage,  0, 0);
    Colorduino.FlipPage();
    delay(100);
    img0 = returnImage;
  }

}


void dropImage(String img1[], String tempImage[], String returnImage[]) {

  clearScreen();
  scrollDown(img1, tempImage, returnImage, 8);
  drawImage(returnImage,  0, 0);
  Colorduino.FlipPage();
  delay(100);

  for (int i = 0; i < 8; i++) {
    clearScreen();
    scrollDown(returnImage, tempImage, returnImage, 8);
    drawImage(returnImage,  0, 0);
    Colorduino.FlipPage();
    delay(100);
  }
}

void wipeImageLeft(String img1[], String tempImage[], String returnImage[]) {

  clearScreen();
  scrollLeft(img1, tempImage, returnImage, 8);
  drawImage(returnImage,  0, 0);
  Colorduino.FlipPage();
  delay(100);

  for (int i = 0; i < 8; i++) {
    clearScreen();
    scrollLeft(returnImage, tempImage, returnImage, 8);
    drawImage(returnImage,  0, 0);
    Colorduino.FlipPage();
    delay(100);
  }
}


void spinImageLeft(String img1[], String tempImage[], String returnImage[]) {
    
  rotateLeft(img1, tempImage, returnImage);
  clearScreen();
  drawImage(returnImage,  0, 0);
  Colorduino.FlipPage();
  delay(100);

  for (int i = 0; i < 15; i++) {
    rotateLeft(returnImage, tempImage, returnImage);
    clearScreen();
    drawImage(returnImage,  0, 0);
    Colorduino.FlipPage();
    delay(100);
  }
}

Wie kann ich Funktionen.h und Funktionen.c nun in der .ino Datei einbinden, so dass das ganze übersichtlich ist und läuft?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.04.2016, 20:02
Beitrag #4
RE: Zerlegung eines Programmcodes
Hallo hello_world,
Zitat:Tut mir leid, dass dir die Frage nicht sinnvoll erscheint, ich finde sie schon recht sinnvoll.
Ähm, das sollte nicht heißen, dass deine Frage nicht sinnvoll ist, ganz im Gegenteil.
Die Fragezeichen waren nur da, weil ich gerne die leute mit ihrem realen Namen anspreche und "Hallo hello_world" irgendwie eigenartig klingt Huh
Zitat:Was spricht denn dagegen den Code sauber zu halten, die Funktionen auszulagern und ...--> in der .ino zu includen
Die Tatsache, dass du keinen Split in .h und .c Datei machen kannst. Du kannst natürlich auch ausführbaren Code in eine .h schreiben, aber eben nur in die.
So kenn ich es zumindest nur.
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.04.2016, 09:56
Beitrag #5
RE: Zerlegung eines Programmcodes
So ganz ist es mir noch nicht klar, aber es scheint schon wie im normalen c-Program zu laufen:
https://www.arduino.cc/en/Hacking/BuildProcess

Huh
Keiner da, der sich dem kurz mal annehmen könnte? ich denke die Fehler kommen nur durch die c++ datei (Colorduino.cpp).


Angehängte Datei(en)
.zip  splitTest3.zip (Größe: 12,76 KB / Downloads: 9)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.04.2016, 11:01
Beitrag #6
RE: Zerlegung eines Programmcodes
Hallo hello_world,
ich habe mal den Text aus dem Link mit dem Translator grob übersetzt
Zitat:Multi-file-sketches
Ein Sketch kann mehrere Dateien (Tabs ) enthalten. ...
Tabs haben eine von vier Erweiterungen : ohne Erweiterung , C, CPP oder .h Wenn der Sketch kompiliert wird, werden alle Registerkarten ohne Erweiterung zusammen verkettet, um die " Hauptsketchendatei " zu bilden. Tabs mit .c oder CPP- Erweiterungen werden separat erstellt. Um Registerkarten mit einer Erweiterung von H zu verwenden , müssen Sie mit # include ( " doppelte Anführungszeichen " includen...
Transformationen in die Hauptsketchdatei
Die Arduino -Umgebung führt einige Transformationen in die HauptSketch-Datei ( die Verkettung aller Registerkarten im Sketch ohne Erweiterungen) durch , bevor an den avr- gcc-Compiler übergeben wird....
Build Process
Die .c und CPP-Dateien werden verlinkt und als Objeckdatei ausgegeben , dazu gehören die Hauptsketchdatei und alle anderen .c oder CPP-Dateien im Sketchverzeichnis und alle .c oder CPP-Dateien in jeder Bibliothek...

Ergebnis:
1. Ja, es werden alle möglichen Dateien in das Objektformat compiliert.
2. In den Hauptsketch fließen aber nur der Sketch selbst, eingebundene Libraries und mit
Code:
#include "Datei.h"
eingebundene Dateien ein.
3. Die geschriebenen .c Dateien im Sketchverzeichnis werden zwar auch in das Objektformat kompiliert, aber nicht in den Hauptsketch eingebunden
4.Verlinkt werden nur die Objektdateien aus dem Hauptsketch, die Coredateien und die Libraries.

Genau wegen Punkt 3. gibt es zB. bei der UTFT-Lib von Henning Karlsen die Möglichkeit Fonts ( die .c -Dateien) mittels "extern" einzubinden. Die werden in den Flash-Ram (Variablenspeicher) geladen und nicht in den SRAM (Sketchspeicher). Die Fonts sind ja auch kein eigentlicher Programm-/Sketchcode sondern Konstanten.

Hoffe das hilft weiter.

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Frage zur Programmierung eines Ultraschallsensors jalu4601 10 357 21.09.2016 15:06
Letzter Beitrag: Bitklopfer
  Ansteuern eines Schrittmotors Uwe1475 28 1.025 03.09.2016 21:03
Letzter Beitrag: Uwe1475
  Steuern von 4 Servo mittels eines Taster und eines Potis Jackie09 17 764 16.07.2016 11:43
Letzter Beitrag: Binatone
  Oszillation eines Steppermotors Nimes 12 909 07.03.2016 17:47
Letzter Beitrag: Binatone
  Probleme beim Auslesen eines IR Empfängers linuxpaul 7 576 06.03.2016 14:44
Letzter Beitrag: hotsystems
Bug Mit zwei Ultraschallsensoren die Drehbewegung eines Servos steuern Poet 5 564 21.02.2016 18:37
Letzter Beitrag: Carlo
  Suche Konzept für ein Inhaltsverzeichnis eines EEPROM avoid 0 313 27.01.2016 10:49
Letzter Beitrag: avoid
  Fehlermeldung beim compilieren eines RF24 Programmes. arduinofan 5 548 14.01.2016 22:52
Letzter Beitrag: ardu_arne
  Steuerung eines Remotekopfes mit Joystick, 2Stck DC Motore und Arduino max123 6 610 30.12.2015 14:56
Letzter Beitrag: max123
  Problem Wiederholung eines Case im Switch via Bluetooth Ecki1212 6 906 16.09.2015 23:06
Letzter Beitrag: Ecki1212

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste