Forum: PC-Programmierung EEPROM schreiben/lesen/prüfen --> wie geht's schneller?


von Steffen A. (Gast)


Lesenswert?

Einen guten Morgen wünsche ich!

Ich möchte ein kleines C++ Programm im Hinblick auf 
Auslesegeschwindigkeit eines EEPROM optimieren.

Zum Stand der Dinge: Ich habe ein EEPROM, welches ich mit einer Datei 
beschreiben und anschließend den Schreibvorgang verifizieren möchte. Ein 
kleines Programm, was mir diese Wünsche erfüllt, habe ich bereits inkl. 
Sourcecode. Dieses setzt auf einer API für den verwendeten 
Programmieradapter auf, benötigt für den Schreib- und 
Lese-/Prüfungsvorgang jeweils etwa 5 Sekunden.

Vom Hersteller des Adapters existiert eine Software, mit der ich 
vergleichbare write-Zeiten erziele, was aber beim Lesen/Verifizieren 
SEHR viel schneller ist  (etwa 1 Sekunde). Da das Programm nur aus ner 
.exe und einigen .dll's besteht, habe ich darin leider keinen Einblick, 
gehe aber davon aus, dass dieses natürlich auch die selbe API benutzt. 
Somit ist mein Ansatzpunkt für Optimierung der oben erwähnte 
Sourcecode..

Kurzum: Das Auslesen des EEPROM dauert 4 Sekunden länger und möchte ich 
so gut es geht beschleunigen. Hat jemand von euch generelle Tipps, was 
in dem Aufbau der Flaschenhals sein kann? Worauf sollte ich achten, was 
prüfen? Wenn jemand sich die Mühe machen möchte, kann ich auch den 
relevanten Code zeigen, allerdings möchte ich vorab eher eine Art 
Brainstorming. :)


Das Equipment / der Aufbau ist stets der selbe, es muss also, wie 
gesagt, das eigene Prog (speziell die Read-Funktionalität) sein.

Prog-Adapter + API Doku:
http://www.totalphase.com/download/pdf/aardvark-v4.00.pdf

EEPROM:
http://www.st.com/stonline/products/literature/ds/6757.pdf


Besten Danke und viele Grüße
Steffen

von Joerg W. (joergwolfram)


Lesenswert?

Ich habe die zwei Dokumente kurz überflogen und habe drei Fragen dazu:

1. Welcher von den EEPROMs ist es denn?

2. Welche I2C Frequenz nutzt Du (100 oder 400KHz)

Beim Schreiben macht das nicht viel aus, da der Schreibvorgang von der 
Zeit her dominierend ist.

3. Liest Du jedes Byte einzeln oder fortlaufend?


Gruß Jörg

von Steffen A. (Gast)


Lesenswert?

Hi Jörg,

zu 1.: Sorry, dass ich das vergessen habe zu erwähnen: der M24256 ist´s

zu 2.: 400kHz mit beiden Programmen, wobei das auch bei beiden 
Programmen runter gesetzt werden kann.

zu 3.: da bin ich gerade dran, ich meld mich, wenn ich die Antwort habe 
:) Ziel sollte ja sein: Möglichst viel auf einmal, nicht wahr?

Gruß
Steffen

von Steffen A. (Gast)


Lesenswert?

Nachtrag: Ich habe gerade deine Aussage überprüft.

Bei dem Tool des Adapterherstellers nimmt die Änderung auf 100kHz 
tatsächlich nur spürbaren Einfluss auf den Lesevorgang, nicht aber auf 
den Schreibvorgang. Wie kommt das? Ein paar erklärende Worte dazu wären 
super. :)

Mit dem verbesserungswürden Tool allerdings ist beim lesen und schreiben 
eine Verlangsamung spürbar. Vielleicht hilft das?!

Gruß
Steffen

von Stefan E. (sternst)


Lesenswert?

Steffen A. wrote:

> Bei dem Tool des Adapterherstellers nimmt die Änderung auf 100kHz
> tatsächlich nur spürbaren Einfluss auf den Lesevorgang, nicht aber auf
> den Schreibvorgang. Wie kommt das? Ein paar erklärende Worte dazu wären
> super. :)

Weil beim Schreiben die Kommunikation den kleineren Teil der Zeit in 
Anspruch nimmt. Der Löwenanteil entfällt auf das tatsächliche Schreiben 
der Daten innerhalb des EEPROMs. Und diese Zeit ist unabhängig von der 
Kommunikationsgeschwindigkeit.

von Steffen A. (Gast)


Lesenswert?

@Stefan: Verstehe, danke. :)

Ich habe den Read-Ablauf zusammen gestellt. Wenn euch nochwas fehlen 
sollte, bitte bescheit geben.

Über einen Konsolenbefehl teilt man dem Programm mit, dass man lesen 
möchte (case OP_READ), dann bekommt man die gewünschten 
Speicherabschnitte nach und nach auf dem Bildschirm geworfen (je 16bit).

1
case OP_READ:
2
  {
3
    unsigned int i, count, rlen;
4
    unsigned char data[16];
5
6
    printf("Reading EEPROM,    start address 0x%04x... ", startaddr);
7
    
8
    if (outfile)
9
      printf("%8d Bytes", 0);
10
    else
11
      printf("\n");
12
13
    count = 0;
14
    while (count < length) {
15
      rlen = MIN(16, length - count);
16
      i2c_eep_rd(startaddr + count, data, rlen, addrsize);
17
18
      if (outfile) {
19
        printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b%8d Bytes", count + rlen);
20
        for (i = 0; i < rlen; i++)
21
          fputc(data[i], outfile);
22
      } else {
23
        printf("0x%04X: ", startaddr + count);
24
        for (i = 0; i < rlen; i++)
25
          printf("%02x ", data[i]);
26
        printf("\n");
27
      }
28
29
      count += rlen;
30
    }
31
    break;
32
  }


Hier gehts weiter:
1
// ------------------------------------------------------------
2
// i2c_eep_rd
3
// ------------------------------------------------------------
4
void i2c_eep_rd(unsigned int addr, unsigned char *data, unsigned int length, unsigned int addrsize)
5
{
6
  unsigned char buf[4];
7
  unsigned int i;
8
  unsigned int dev;
9
  unsigned int rlen;
10
11
  while (length) {
12
    // Determine I2C device address
13
    dev = 0x50 + ((addr >> (8*addrsize)) & 0x7);
14
15
    // Write address to EEPROM
16
    for (i = 0; i < addrsize; i++)
17
      buf[i] = (addr >> (8*(addrsize-i-1))) & 0xFF;
18
    globs.i2c_wr(dev, buf, addrsize);
19
    
20
    // Determine read length (stay within current device)
21
    rlen = MIN(length, (1 << (8*addrsize)) - addr % (1 << (8*addrsize))); 
22
    
23
    // Read
24
    globs.i2c_rd(dev, data, rlen);
25
    
26
    // Update variables
27
    data += rlen;
28
    length -= rlen;
29
    addr += rlen;
30
  }
31
}


Der Read Aufruf wird hier umgemünzt:
1
globs.i2c_rd = aa_i2c_rd;


Und mündet dann in der Readfunktion des API (siehe 
http://www.totalphase.com/download/pdf/aardvark-v4.00.pdf, Seite 37)
1
// ------------------------------------------------------------
2
// aa_i2c_rd
3
// ------------------------------------------------------------
4
void aa_i2c_rd(unsigned int devaddr, unsigned char *data, unsigned int length)
5
{
6
  // Read with acknowledge polling
7
  while (!aa_i2c_read(globs.aahandle, devaddr, AA_I2C_NO_FLAGS, length, data));
8
}

@Jörg: Vielleicht hast du´s ja schneller durchschaut, wieviel Byte pro 
Aufruf gelesen werden, ich komm jetzt erst wieder zum schauen.

von Steffen A. (Gast)


Angehängte Dateien:

Lesenswert?

Hmm.. Warum kann man seine Beiträge nicht editieren?! :(

Es sollte oben "jeweils 16 BYTE" heißen, nicht bit.. Ich habe mal einen 
Ausschnitt der Ausgabe angehängt.

von Timmo H. (masterfx)


Angehängte Dateien:

Lesenswert?

>Hmm.. Warum kann man seine Beiträge nicht editieren?! :(
Kann man (siehe Bild). Geht jedoch nur, wenn du dich registrierst und 
nicht als GAST drin bist.

von Steffen A. (stigmer)


Lesenswert?

Guten morgen,

Spam oder nicht: Ich wollte kurz Erfolg verkünden, habe das Problem 
gestern erschlagen können.

thx anyway,
Steffen

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.