Hallo Bei DMA werden ja z.B. die Daten von der Preipherie direkt zum Speicher transferiert, ohne dass die CPU belastet wird. Frage 1) Da die CPU während des DMA-Transfer vom Adress- und Datenbus getrennt ist, kann sie ja eh nur Däumchen drehen? Falls nicht, Frage 2) Wenn die CPU während eines DMA-Transfer zufällig die selbe Speicheradresse lesen möchte, welche durch DMA gerade beschrieben wird, was passiert dann genau? Wird die CPU warten oder wird sie Mist lesen?
CPU und DMA sind Busteilnehmer. zu 1. bei einem Buszugriff auf jeden Fall zu 2. kann nicht passieren da nicht beide gleichzeitig zugreifen können.
Hi, soweit ich mich erinnern kann (länger her und plattformabhängig) greift der DMA-Controller "phasenverschoben" auf den RAM zu, so kommt er sich nicht mit der CPU ins Gehege. Nachdem die CPU bzw. Dein Code den DMA-Transfer initiiert bist auch Du für die Datenkonsistenz verantwortlich. Der Controller schaufelt nur dumm die Daten von Peripherie <=> RAM.
> Da die CPU während des DMA-Transfer vom Adress- und Datenbus getrennt > ist, kann sie ja eh nur Däumchen drehen? Nicht unbedingt. Die CPU hat ja meistens auch einen Cache. Solange sie nicht auf Code oder Daten zugreifen muß, die nicht im Cache liegen oder auf Peripherie, kann sie währenddessen weiterarbeiten. > Wenn die CPU während eines DMA-Transfer zufällig die selbe > Speicheradresse lesen möchte, welche durch DMA gerade beschrieben wird, > was passiert dann genau? "zufällig" wird sie das eher nicht tun, denn die CPU greift ja nicht einfach mal so auf irgendwelche Speicherstellen zu. Sie führt die Zugriffe aus, die im Programm stehen, und da mußt du dann selbst dafür sorgen, daß es hier keine Konflikte gibt. Das kann z.B. durch double-Buffering geschehen oder durch einen Ringpuffer, der immer nur soweit gelesen wird, wie die Hardware schon geschrieben hat. > Wird die CPU warten oder wird sie Mist lesen? Warten muß sie eh, weil sie nicht gleichzeitig mit dem DMA-Controller zugreifen kann. Was nachher rauskommt, ist dann aber im Prinzip trotzdem Zufall, je nachdem, ob die CPU den Zugriff kurz vor oder kurz nach dem DMA-Controller durchführt.
Mit "zufällig" meinte ich bezogen auf die Zeit, falls nämlich die Synchronisation schief laufen würde. Die CPU liest die Daten entweder vor oder nach dem DMA-Zugriff. Sie bekommt also entweder die alten oder die neuen Daten. Daher kann ich davon ausgehen, dass die gelesenen Daten keinen "internen" Müll enthalten.
Es gibt ja nicht nur den tristate Adress- und Datenbus sondern auch noch den Controlbus. Die cpu übergibt dem DMA-Controller die Parameter woraufhin der über controlbus einen Busrequest anfordert und damit alle auffordert sich vom adress/datenbus zu verziehen. Sind alle weg, erhält der DMA einen busgranted und darf loslegen. Über den controlbus wird auch zurück gemeldet wenn der dma fertig ist. Das war es in ganz kurz. Check doch mal arbitration oder vme-bus.
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.