<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    <title>Lothar Miller - Fifo</title>
    <link>http://www.lothar-miller.de/s9y/</link>
    <description>Elektronik und Musik</description>
    <dc:language>de</dc:language>
    <generator>Serendipity 1.3.1 - http://www.s9y.org/</generator>
    <pubDate>Thu, 04 Mar 2010 19:56:54 GMT</pubDate>

    <image>
        <url>http://www.lothar-miller.de/s9y/templates/bulletproof/img/s9y_banner_small.png</url>
        <title>RSS: Lothar Miller - Fifo - Elektronik und Musik</title>
        <link>http://www.lothar-miller.de/s9y/</link>
        <width>100</width>
        <height>21</height>
    </image>

<item>
    <title>FIFO</title>
    <link>http://www.lothar-miller.de/s9y/archives/66-FIFO.html</link>
            <category>Fifo</category>
    
    <comments>http://www.lothar-miller.de/s9y/archives/66-FIFO.html#comments</comments>
    <wfw:comment>http://www.lothar-miller.de/s9y/wfwcomment.php?cid=66</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.lothar-miller.de/s9y/rss.php?version=2.0&amp;type=comments&amp;cid=66</wfw:commentRss>
    

    <author>nospam@example.com (Lothar Miller)</author>
    <content:encoded>
    
Immer wieder braucht man einen &lt;font color=&quot;#990000&quot;&gt;&lt;b&gt;Fifo&lt;/b&gt;&lt;/font&gt;, wenn &lt;b&gt;zeitlich unabhängige Prozesse&lt;/b&gt; untereinander Daten austauschen müssen. Die &lt;b&gt;Berechnung&lt;/b&gt; eines Wertes ist z.B. schnell erledigt, wenn dieser Wert aber über die &lt;b&gt;serielle Schnittstelle&lt;/b&gt; verschickt werden (oder auch auf einem Display ausgegeben werden) muß, ist es unsinnig, auf das Übertragungsende jedes Zeichens zu warten. &lt;br /&gt;Also wird der Wert von einer Rotuine berechnet und anschliessend in einen Pufferspeicher abgelegt. Eine andere, zeit- und interruptgesteuerte Routine holt dann ein Zeichen nach dem anderen aus dem Puffer und versendet das Zeichen.&lt;br /&gt;&lt;br /&gt;Einfach und effizient zu implementieren ist ein Fifo, dessen Größe einer 2er-Potenz entspricht (8, 16, 32, 64...). Dann kann der Indexüberlauf einfach mit einer Bitmaske abgehandelt werden. Hier ist so eine Implementierung:&lt;br /&gt;&lt;hr size=&quot;2&quot; width=&quot;100%&quot; /&gt;&lt;pre&gt;&lt;span style=&quot;color: rgb(85, 119, 153);&quot;&gt;#define&lt;/span&gt; BLEN (&lt;span style=&quot;color: rgb(0, 0, 221); font-weight: bold;&quot;&gt;16&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: rgb(85, 119, 153);&quot;&gt;#define&lt;/span&gt; BMSK (BLEN-&lt;span style=&quot;color: rgb(0, 0, 221); font-weight: bold;&quot;&gt;1&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 136, 0); font-weight: bold;&quot;&gt;typedef&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 136, 0); font-weight: bold;&quot;&gt;struct&lt;/span&gt; {&lt;br /&gt;   &lt;span style=&quot;color: rgb(0, 136, 0); font-weight: bold;&quot;&gt;volatile&lt;/span&gt; &lt;span style=&quot;color: rgb(51, 68, 153); font-weight: bold;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: rgb(51, 68, 153); font-weight: bold;&quot;&gt;char&lt;/span&gt; w;&lt;br /&gt;   &lt;span style=&quot;color: rgb(0, 136, 0); font-weight: bold;&quot;&gt;volatile&lt;/span&gt; &lt;span style=&quot;color: rgb(51, 68, 153); font-weight: bold;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: rgb(51, 68, 153); font-weight: bold;&quot;&gt;char&lt;/span&gt; r;&lt;br /&gt;   &lt;span style=&quot;color: rgb(51, 68, 153); font-weight: bold;&quot;&gt;unsigned&lt;/span&gt; &lt;span style=&quot;color: rgb(51, 68, 153); font-weight: bold;&quot;&gt;char&lt;/span&gt; d[BLEN];  &lt;span style=&quot;color: rgb(136, 136, 136);&quot;&gt;// die Daten sind nicht volatil, sie können sich &lt;/span&gt;&lt;br /&gt;} fifotyp;                 &lt;span style=&quot;color: rgb(136, 136, 136);&quot;&gt;// nur geändert haben, wenn der Index sich ändert&lt;/span&gt;&lt;br /&gt;fifotyp fifo;&lt;br /&gt;:&lt;br /&gt;:&lt;br /&gt;   &lt;span style=&quot;color: rgb(136, 136, 136);&quot;&gt;// Fifo schreiben&lt;/span&gt;&lt;br /&gt;   &lt;span style=&quot;color: rgb(0, 136, 0); font-weight: bold;&quot;&gt;if&lt;/span&gt; ((fifo.w - fifo.r)&amp;amp;BMSK==BMSK) {&lt;br /&gt;       &lt;span style=&quot;color: rgb(136, 136, 136);&quot;&gt;// Fehlerbehandlung: Fifo ist voll&lt;/span&gt;&lt;br /&gt;   }&lt;br /&gt;   &lt;span style=&quot;color: rgb(0, 136, 0); font-weight: bold;&quot;&gt;else&lt;/span&gt; {&lt;br /&gt;      &lt;span style=&quot;color: rgb(136, 136, 136);&quot;&gt;// Zeichen eintragen&lt;/span&gt;&lt;br /&gt;      fifo.d[fifo.w&amp;amp;BMSK] = din;    &lt;br /&gt;      fifo.w++;&lt;br /&gt;   }&lt;br /&gt;    &lt;br /&gt;   &lt;span style=&quot;color: rgb(136, 136, 136);&quot;&gt;// Fifo lesen&lt;/span&gt;&lt;br /&gt;   &lt;span style=&quot;color: rgb(0, 136, 0); font-weight: bold;&quot;&gt;if&lt;/span&gt; (fifo.w != fifo.r) { &lt;span style=&quot;color: rgb(136, 136, 136);&quot;&gt;// Fifo belegt?&lt;/span&gt;&lt;br /&gt;      &lt;span style=&quot;color: rgb(136, 136, 136);&quot;&gt;// Zeichen auslesen&lt;/span&gt;&lt;br /&gt;      dout = fifo.d[fifo.r&amp;amp;BMSK];&lt;br /&gt;      fifo.r++;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span style=&quot;color: rgb(136, 136, 136);&quot;&gt;// Fifo leeren&lt;/span&gt;&lt;br /&gt;   &lt;span style=&quot;color: rgb(0, 136, 0); font-weight: bold;&quot;&gt;if&lt;/span&gt; (cleanupfifo=&lt;span style=&quot;color: rgb(0, 0, 221); font-weight: bold;&quot;&gt;1&lt;/span&gt;) {&lt;br /&gt;      fifo.w = fifo.r;&lt;br /&gt;   }&lt;/pre&gt;&lt;hr size=&quot;2&quot; width=&quot;100%&quot; /&gt;&lt;b&gt;Fifo leer:&lt;/b&gt; Wenn der Leseindex r gleich dem Schreibindex w ist, dann ist der Fifo leer.&lt;br /&gt;&lt;b&gt;Fifo belegt:&lt;/b&gt; Wenn der Leseindex r ungleich dem Schreibindex w ist, dann ist ein Zeichen im Puffer. Wichtig ist, dass zuerst das Zeichen in den Puffer geschrieben (bzw. gelesen) wird, und erst dann der Index erhöht wird. Denn sonst könnte nach der Indexmanipulation ein Interrupt kommen, und weil das Zeichen noch nicht eingetragen wurde, wird mit falschen Daten gearbeitet.
&lt;br /&gt;&lt;b&gt;Fifo Reset:&lt;/b&gt; Das Rücksetzen des Fifos erfolgt einfach, indem der Leseindex gleich dem Schreibindex gesetzt wird. Allerdings sollte dieser Vorgang nur im Notfall angewendet werden, denn dabei gehen garantiert irgendwelche gespeicherte Informationen verloren.&lt;br /&gt;&lt;b&gt;Fifo Overrun:&lt;/b&gt; Ob noch ein Zeichen in den Fifo passt oder dieser voll ist, kann durch die Subtraktion des Schreibindex w vom Leseindex r überprüft werden. Ist das Ergebnis dieser Operation -1, dann kann kein weiteres Zeichen gespeichert werden. 
    </content:encoded>

    <pubDate>Sat, 12 Dec 2009 14:05:30 +0100</pubDate>
    <guid isPermaLink="false">http://www.lothar-miller.de/s9y/archives/66-guid.html</guid>
    
</item>

</channel>
</rss>
