Wie kann man einen char* Puffer schnellstmöglich in eine physikalische Adresse schreiben
-
Hallo Zusammen,
Ich hocke schon den ganzen Tag an einem kniffligen Problem, wo ich noch nirgends eine Lösung gefunden habe.
Ich möchte einen "String" bzw. einen char* Puffer mit einer Größe von 100 Bytes möglichst schnell an eine physikalische Adresse schreiben.
Die physikalische BasisAdresse bekomm ich von einer Funktion als char* Wert. Der Puffer ist ebenfalls char*. Ich hab schon ziemlich vieles versucht, aber alles ist zu langsam, da das Programm auf einer Platine laufen soll.
Hier mal ein erster Ansatz von mir
char* DownloadZeiger = getMemTop();for(int i = 0; i<maxDaten;i++){
*DownloadZeiger = Puffer[i];
DownloadZeiger++;
}
Puffer und maxDaten sind Funktionsparameter.
Ich hoffe Ihr könnt mir helfen.
Vielen Dank schonmalGruß
Wolfi
-
Warum nicht einfach memcpy()?
-
oder auch strcpy()
-
ich hätte noch memmove() im Angebot.
-
Um da zu helfen müßte man etwas mehr über die Platine wissen.
Prinzipiell ist dein Verfahren nicht falsch.
memcpy, strcpy, memmove tun auch nichts anderes, Bei einer x86 CPU sind die routinen Processorspezifisch
etwas ausgefuchster. Bei einfachen Processoren PIC und ähnliches kann man es oft nur auf deine weise
machen oder genau diese Schleife in Assembler lösen, mehr geht nicht.
-
Deine Methode, dann aber vielleicht nicht char-weise sondern int-weise kopieren. Evtl. noch loop-unrolling manuell probieren (ich gehe dabei davon aus, dass der Compiler nicht groß rumoptimiert).
Einfach mal machen und schauen was geht.
-
Also die "Platine" ist ein Developmentboard mit einem 200 MHz PowerPC drauf. Der Compiler ist ein GCC für PPC. Mit strcpy habe ich es schon versucht, dauert aber noch länger als mit diesem Codeschnipsel. Da ich unter Umständen bis zu 60 MByte speicher zu schreiben habe, mutiere ich ja zum Metusalem.
memmove und memcopy habe ich noch gar nicht gehört? Sind die schneller als die strcpy Funktion?
@TactX int Weises Kopieren habe ich auch schon überlegt, aber um einen Puffer vom typ char* intweise schreiben zu können benötige ich doch itoa oder geht das auch mit einem Typecast?
Nochmals viele Grüße
Wolfi
-
Was verstehst du unter langsam?
Wenn du einen Powerpc mit 200MHz zur verfügung hast sollte das schreiben von 100 Bytes egal mit welcher Funktion "beliebig" schnell sein. Soweit ich den PowerPC kenne verpackt er so eine Kopie von 100 Bytes in 3 Assembler StatementsLadeSource Pointer to Register LadeDestination Pointer to Register Kopiere 100 von worauf reg1 zeigt nach worauf reg2 zeigt inclusive Autoincrement
Kann es nicht sein das dein Bottleneck woanders liegen.
Wie sind denn die 100 Bytes Buffer HW mässig angeschlossen. Nicht das hier soviel Waitstates sind, das die Performance davon in die Knie geht.
Da du GCC benutzt kannst du dort ja mal die Ausgabe des Assemblerlisting inclusive Code zuschalten. Dann kannst du genau sehen was er aus deinem Code macht.Deine 60 MB sollten grob geschätzt auf jeden Fall unter 30 Sekunden transferiert sein, das wären dan 1,9 MB per Sekunde
Wenn du anstelle von einem char pointer eine int pointer nimmst kann es sein das der PowerPC es mit 25 int moves schaft
Aber Vorsicht dies hab ich jetzt nur aus dem Kopf niedergechreiben// Im Compiler alle Optimierungen auf Speed setzen char* DownloadZeiger; int32 *intZeiger; char Buffer[100]; int32 *IntBuffer; DownloadZeiger = getMemTop(); volatile intZeiger=(int32 *)DownloadZeiger; volatile intBuffer=(int32 *)&Buffer[0]; for(int i = 0; i<maxDaten/4;i++) { *intZeiger = intBuffer++; // Vielleicht kann man diese beiden Zeilen intZeiger++; // noch zusammenfassen, muß aber im moment passen }
Viel Spaß, und bitte eine Rückmeldung
-
Hallo Nochmal
Vielen Dank für eure Hilfe...
Ihr hattet Recht, das Problem lag nicht an dem eigentlichen Speicherzugriff sondern woanders(die Funktion sollte ursprünglich ein Klassenobjekt zurückgeben, was die Sache verlangsamte). Ich hab aber festgestellt das beim schreiben memcpy() am schnellsten funktioniert.Nochmals Tausend Dank für eure Hilfe
Viele Grüße
Wolfi