Moin, ich habe folgendes Problem: In meinem Projekt möchte ich den D- und I-Cache des Microblaze einschalten. Diese sind auch in der Hardware verfügbar und besitzen jeweils 8kB. Beide besitzen den Selben Adressbereich von 0x1C00 0000 bis 0x1DFF FFFF. Bevor ich diese in meinem Programm einschalte, führe ich einen Selbsttest durch. Hierzu rufe ich die folgenden Funktionen auf, welche von Xilinx zur Verfügung gestellt werden: Xil_TestICacheAll und Xil_TestDCacheAll. Beim Testen des D-Cache wird mit eine Fehlermeldung per printf ausgegeben: Error: Invalidate dcache all not working Leider habe ich hierzu keine Informationen finden können. Vielleicht hat ja von Euch jemand schon Erfahrung hiermit gemacht und kann mir sagen wie ich diesen Fehler beseitigen kann und was er genau aussagt. Man lernt ja gerne was dazu;-) Besten Dank schon mal im Voraus.
Tomi Tomsen schrieb: > Beide besitzen den Selben > Adressbereich von 0x1C00 0000 bis 0x1DFF FFFF. Ich hätte die ja auf verschiedene Adressbereiche gelegt, bin aber beim Microblaze nicht so firm... Duke
Moin Duke, also ich habe das mit den Adressen so verstanden, dass diese den Bereich angeben, welcher von den jeweiligen Caches adressiert werden können. Aus diesen Adressbereich können dann die Daten oder Instruktionen vom DDR-Speicher in den Cache geladen und bei einem Cache-Hit aus diesem ausgeführt werden. In dem Reference Guide vom Microblaze steht nichts davon das diese getrennt sein müssen, oder ich habe es überlesen. Trotzdem danke für die Antwort.
Tomi Tomsen schrieb: > also ich habe das mit den Adressen so verstanden, dass diese den Bereich > angeben, welcher von den jeweiligen Caches adressiert werden können. Stimmt. Aber ich habe im Datenblatt das hier gefunden:
1 | The MicroBlaze data cache can be configured from 64 bytes to 64 kB. |
Und 0x1C00 0000 bis 0x1DFF FFFF sind 32 MByte... Duke
Das eine ist die Grösse des Caches selbst, das andere der cachebare Bereich, das passt schon so. Der Code zu dem Call ist zB. hier: http://cdbae.hg.sourceforge.net/hgweb/cdbae/cdbae/file/tip/bsp/qnx_v2_00_a/src/common/xil_testcache.c Wenn das auch "dein" Code ist, hat der Test aber schon einige Haken. Der Testbereich wird da im Heap definiert (static u32 Data[DATA_LENGTH]). Das Linkersetup muss das natürlich auch in den cachebaren Bereich legen und nicht ins BRAM. Interrupts könnten den Test auch stören, weil die nicht gesperrt werden.
Moin,
also erst einmal vielen Dank für die Antworten:-)
@Duke:
> The MicroBlaze data cache can be configured from 64 bytes to 64 kB.
Den Abschnitt hatte ich auch gelesen, soweit ich das Verstehe wird damit
nur die Größe des Cache beschrieben, welche ich im EDK unter Option vom
Microblaze einstellen kann, meine beiden Caches sind jeweils 8kB groß.
Die waren aus einem Beispiel-Projekt so schon eingestellt. Ich habe nur
den cachbaren Bereich verkleinert, da der andere Adressbereich als
Framebuffer dient.
@ Georg:
Ich habe das genauso wie Du verstanden, die Adresse gibt den cachbaren
Bereich an (bei 32bit ca. 4Gb, minus der Peripherie) und die Größe des
Cache sagt nur aus wie viel Daten/Instruktionen vorgehalten werden
können.
Bei dem Code handelt es sich genau um den welcher ausgeführt wird. Ich
habe das Linkersetup geprüft, die Einstellungen sind so, dass die
folgenden Daten im DDR-RAM leigen:
Code Sections, Data Sections, Heap und Stack
Mit der Größe des Heap und dem Stack hatte ich ein wenig rum gespielt,
aber auch mit 100KB hatte ich Problem.
Mir stellt sich die Frage ob ich die Größe des Caches frei wählen kann,
oder gibt es dort Einschränkungen die ich übersehen habe, außer dass die
Grenze bei 64kB liegt.
Ach das hatte ich noch vergessen. Den Selbsttest führe ich bei der Initialisierung des Microblaze durch, erst nachdem dies erfolgreich ist wird der Interrupt-Controller eingeschaltet. Der Test läuft also ohne eine Störung durch einen Interrupt ab.
Blöde Frage: Ich kenn den Cache nur vom EDK9.2, und da kann der MB-Cache gar kein write-back, sondern nur write-through. Damit wäre natürlich auch ein Invalidate hinfällig und damit der ganze Test.
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.