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
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
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
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
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.
@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.
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.
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.