Frage

Ich bin mit ARM926EJS. Ich erhalte 20% mehr Speichergeschwindigkeit im Speicher Kopiertest, ohne Linux (Just als Ersten ausführbaren Schritte). Aber in Linux gleichen Code ausgeführt wird 20% langsamer.

-Code ist

 
/// Below code just performs burst mode memcopy test.        
void asmcpy(void *a, void *b, int iSize)
{
   do
  {
    asm volatile (
             "ldmia %0!, {r3-r10} \n\t"
             "stmia %0!, {r3-r10} \n\t"
             :"+r"(a), "+r"(b)
             :
             :"r"(r3),"r"(r4),"r"(r5),"r"(r6),"r"(r7),"r"(r8),"r"(r9),"r"(r10)
             );
  }while(size--)
}

ich festgestellt, dass kein anderer Prozess CPU-Zeit auf Linux nimmt. (Ich dies mit dem Einsatz von Zeitbefehl überprüft, es zeigt Echtzeit ist die gleiche wie usr Zeit )

Bitte sagen Sie mir, was das Problem mit Linux sein kann?

Danke & Grüße.

ADDED:

mein Testcode ist

int main()
{
  int a[320 * 120], b[320 * 120];

 for(int i=0; i != 10000; i++)
 {
   /// Size is divided by 8 because our memcpy function performs 8 integer load stores in the iteration
   asmcpy(a, b, (320 * 120) / 8);
 }
}

Erste Schritte ausführbar ist eine bin-Datei, die in den RAM gesendet wird serielle Schnittstelle und führt direkt durch die im RAM zu dieser Adresse zu springen. (Ohne die Notwendigkeit eines OS)

wurde hinzugefügt.

Ich habe nicht solcher Performance-Unterschied zu anderen processors.They wurde unter Verwendung von SD-RAM, gesehen Dieser Prozessor ist mit DDR Ram. Kann es ein Grund sein?

HINZUGEFüGT.   Data Cache nicht aktiviert ist in dem ersten Schritten Code und Daten-Cache in Linux-Modus eabled, So Im Idealfall sollten alle Daten zwischengespeichert werden und ohne RAM-Latenz zugegriffen, aber immer noch Linux 20% langsamer.

ADDED:   Mein Mikrocontroller LPC3250. Sowohl die Tests sind bereits auf derselben externen DDR RAM getestet.

War es hilfreich?

Lösung

Dieser Chip hat eine MMU, so Linux nutzt es wahrscheinlich, Speicher zu verwalten. Vielleicht nur ermöglicht es einige Leistungseinbußen führt. Auch Linux verwendet eine faule Speicherzuweisungsstrategie, nur Speicherseiten zu einem Prozess zugeordnet werden, wenn es zuerst trifft. Wenn Sie einen großen Teil des Speichers zu kopieren, wird die MMU Seitenfehler zu erzeugen, um den Kernel zu bitten, eine Seite, während im Innern der Schleife zuzuordnen. Auf einem Low-End-Prozessor, alle diese Kontextwechsel verursachen Cache Wallungen und eine spürbare Verlangsamung einzuführen.

Wenn Ihr System klein genug ist, versuchen, eine MMU lose Version von Linux (wie uClinux ). Vielleicht wäre es läßt Sie einen billigeren Chip mit ähnlicher Leistung verwenden. Auf Embedded-Systemen zählt jeder Cent.

Update: Einige zusätzliche Details:

Jeder Linux-Prozess wird es eigene Speicherzuordnungen ist, zunächst diese nur den Kernel und (vielleicht) ausführbaren Code enthalten. Der ganze Rest des linearen 4GB (auf 32-Bit) scheint zur Verfügung, aber es gibt keine RAM-Seiten, die ihnen zugewiesen. Sobald Sie eine nicht zugeordneten Speicheradresse lesen oder schreiben, signalisiert die MMU einen Seitenfehler und schaltet auf den Kernel. Der Kernel sieht, dass es noch viele freien RAM-Seiten hat, so nimmt man, weist sie den fehlerbehafteten Punkt und kehrt in den Code, der die unterbrochene Anweisung beendet. Die sehr nächste wird nicht scheitern, weil die ganze Seite (typischerweise 4 KB) bereits belegt ist; aber ein paar Iterationen später, wird es ein anderes nicht-zugewiesenen Raum treffen und die MMU den Kernel wieder aufrufen.

Andere Tipps

Wie ausführen Sie das Timing? Es gibt keinen Zeitcode in Ihrem Beispiel.

Sind Sie sicher, dass Sie nicht verarbeiten Lade / Entlade-Zeit messen?

Ist die Prozessortaktfrequenz des in beiden Fällen gleich?

Bei Verwendung eines externen SDRAM ist die RAM-Timings der in beiden Fällen gleich?

Ist die Datencache in beiden Fällen aktiviert?

Clifford

Alle Anfang ist nicht „nur eine ausführbare Datei“. Es muss ein Code, das DDR-Controller-Register zu setzen.

Wenn Cache ebenfalls aktiviert ist, muss so der MMU sein. Ich denke, auf ARM926EJS, können Sie keine Daten-Cache ohne MMU haben.

ich glaube, alle Kontextwechsel führen zu einem Cache-Flush, da der Cache praktisch indiziert ist, praktisch markiert und Kernel und Userspace nicht den gleichen Adressraum teilen, so dass Sie wahrscheinlich viel mehr unerwünschten Cache-Flush in der haben als ohne OS.

Hier ist ein Papier mit einem Aspekt auf die Kosten für VIVT Cache-Flush, wenn unter Linux

Was für Mikrocontroller (nicht nur, was CPU ARM) verwenden Sie?

Ist es möglich, dass in dem Nicht-Linux läuft die Array Sie testen RAM auf dem Mikrocontroller-Gerät selbst, während im Linux-Test wird das Array im externen RAM getestet? Interner RAM ist in der Regel viel schneller als externer RAM zugegriffen -. Dies für die Linux-Test-Konto könnte langsamer ist, selbst wenn die Daten-Caching nur für den Linux-Lauf aktiviert ist

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top