<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Fernstudent suchen Hilfe in Echtzeitprogramierung, per Teamviewer und Auszahlung per PayPal]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich studiere zur Zeit Informationstechnik.<br />
Ich schreibe nächste Woche im Studienfach &quot;Echtzeitprogrammierung&quot; meine Prüfung.</p>
<p>In der Prüfung muss ich ein C++ Code umschreiben. Und ein Petrinet erstellen.<br />
Als Übung habe ich paar C++-Codes. die ich leider nicht ganz verstehe.</p>
<p>Kann mir jemand, heute oder morgen über TeamView helfen? Ich denke eine 1-2 Stunden Sitzung würde ausreichen. Un eventuell noch 1-2 Mails wenn ich nachträgliche paar fragen haben sollte.</p>
<p>Ich möchte gerne dafür was Zahlen, um geholfen zu werden! Ich denke 50€ für die action ist fair <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>anbei ein Beispiel_Code den ich nicht verstehe.<br />
Und unten weiter ein Link zum Petrinet</p>
<p>Aufgabenstellung:</p>
<pre><code>Raucher-Problem:

In einer Kneipe sitzen 3 Raucher (&quot;Selbstdreher&quot;, welche die

Utensilien Tabak, Papier und Streichhˆlzer zum Rauchen benˆtigen).

Jeder besitzt je ein Utensil in unendlicher Menge, gibt aber

keinem anderen etwas ab.

Deshalb bringt die Wirtin 2 von 3 zuf‰llig ausgew‰hlten Utensilien,

wartet auf die Fertigmeldung eines Rauchers, um dann wiederholt

2 Utensilien zu bringen.

Die Raucher ergreifen die ihnen fehlenden Utensilien, rauchen und

geben die Fertigmeldung an die Wirtin, um erneut auf Utensilien

zu warten.

Der Zugriff auf die Utensilien (= Betriebsmittelzugriff) erfolgt

auch dann, wenn lediglich eines passt.

Deshalb kommt es sehr schnell zu Verklemmungen (sog. Deadlocks,

siehe Datei Ergebnisse.txt).

Generieren Sie folgende Petrinetze:

- Stellen-Transitionsnetz (nichtunterscheidbare Marken) mit

  zugelassener Verklemmung,

- Pr‰dikats-Transitionsnetz (unterscheidbare Marken) ebenfalls

  mit zugelassener Verklemmung,

- Pr‰dikats-Transitionsnetz mit Verhinderung der Verklemmung

  durch BM-Zugriff en bloc!

Leiten Sie schlieﬂlich ein unter RTAI-LINUX lauff‰higes ANSI-C-

Programm ab, das durch bedingte Compilierung folgende Funktiona-

lit‰ten abdeckt:

- unbehandelte Verklemmung (Prototyp),

- Verklemmungserkennung (Timeout f¸r Wartezeit auf Fertigmeldung),

- Verklemmungsverhinderung (BM-Zugriff en bloc)!
</code></pre>
<p>CODE:</p>
<pre><code>/**********************************************************************************
 *  	Raucherproblem unter RTAI-Linux							  *
 *	ohne &quot;wachen&quot;,	ohne &quot;verkl_frei&quot;:	Verklemmungen zulassen	  *
 *	mit &quot;wachen&quot;,	ohne &quot;verkl_frei&quot;:	Verklemmungen erkennen	  *
 *	ohne/mit &quot;wachen&quot;, mit &quot;verkl_frei&quot;:	Verklemmungen verhindern *
 **********************************************************************************/
#define wachen			// Verklemmung bei BM-Anford. erkennen
//#define verkl_frei		// verklemmungsfreie Anforderung der BM

#include &lt;linux/module.h&gt;
#include &lt;rtai_sched.h&gt;
#include &lt;rtai_sem.h&gt;

MODULE_LICENSE(&quot;GPL&quot;);
MODULE_DESCRIPTION(&quot;Raucherproblem (mit Zufallszahlengenerator)&quot;);
MODULE_AUTHOR(&quot;Juergen Ruck &lt;ruck@hs-mittweida.de&gt;, 26.10.2011&quot;);

RT_TASK Prozess[4];		// Prozessbeschreibungsvariablen
int PNR[4] = {1,2,3,4};		// Prozessnummern
SEM ut[3], fertig;			// Semaphore
char UT[3][8] = {&quot;Tabak&quot;, &quot;Papier&quot;, &quot;Hoelzer&quot;};

// Zufallszahlengenerator random(R)
// liefert gleichverteilte Zufallszahl im Bereich von 0..R-1
// Wertebereich fuer R: 1..2^32 (dargestellt mit 0),
// Initialisierung des Generators bei erstmaligem Aufruf
// Achtung: Zufallszahlen abwechselnd gerade und ungerade !!!
unsigned random(unsigned R)
{   static unsigned Z, I=1;
    if(I) I=0, Z=(unsigned)(rt_get_time()&gt;&gt;4);
    Z = Z*65537+257;
    if (R) return Z%R;
    return Z;
}

void Raucher(long NR)	// Rumpf der Raucherprozesse 1..3
{   unsigned u1=NR-1, u2=NR%3, i, k;
    while (1)
    {	rt_printk(&quot;Raucher %ld wartet auf %s und %s\n&quot;, NR, UT[u1], UT[u2]);
#ifdef verkl_frei
	while ( (i = rt_sem_wait_if(&amp;ut[u1]))  +  (k = rt_sem_wait_if(&amp;ut[u2]))  &lt;  2 )
	{	if (i)	rt_sem_signal(&amp;ut[u1]);
		if (k) rt_sem_signal(&amp;ut[u2]);
		rt_sleep(nano2count(10000000));	// 0.01 s Verzoegerung
	}
#else
	if (random(256)&lt;128)				// zufaellige Zugriffsreihenfolge
	{	i=u1; k=u2; }
	else
	{	i=u2; k=u1; }
	rt_sem_wait(&amp;ut[i]);				// nimmt Utensil 1
	rt_sleep(nano2count(10000000));	// 0.01s Verzoeg.
	rt_printk(&quot;Raucher %ld hat %s und wartet auf %s\n&quot;, NR, UT[i], UT[k]);
	rt_sem_wait(&amp;ut[k]);				// nimmt Utensil 2
#endif
	rt_printk(&quot;Raucher %ld hat %s und %s und raucht\n&quot;, NR, UT[u1], UT[u2]);
	rt_sleep(nano2count(random(100000000)+100000000)); // 0.1..0.2 s Verzoeg.
	rt_printk(&quot;Raucher %ld gibt Fertigmeldung\n&quot;, NR);
	rt_sem_signal(&amp;fertig);	// Fertigmeldung geben
    }
}

void Wirtin(long dummy)		// Rumpf des Wirtinnenprozesses
{   unsigned u1, u2;
    while (1)
    {	rt_printk(&quot;Wirtin ist am Tresen\n\n&quot;);
	rt_sleep(nano2count(100000000));	// 0.1 s Verzoegerung
	u1 = random(3);
	do u2 = random(3); while (u1==u2);
	rt_printk(&quot;Wirtin bringt %s und %s und wartet auf Fertigmeldung\n&quot;,
		    UT[u1], UT[u2]);
	rt_sem_signal(&amp;ut[u1]);	// Utensil 1 bringen
	rt_sleep(nano2count(random(10000000)+10000000)); // 0.01..0.02 s Verzoeg.
	rt_sem_signal(&amp;ut[u2]);	// Utensil 2 bringen
#ifdef wachen
	if (rt_sem_wait_timed(&amp;fertig, nano2count(300000000)))	// 0.3 s warten
		rt_printk(&quot;\n*********Verklemmung eingetreten **********\n\n\n&quot;);
	else continue;
#endif
	rt_sem_wait(&amp;fertig);		// Fertigmeldung erwarten
   }
}

int start(void)
{   int i;
    rt_set_oneshot_mode();	// CPU-Taktzaehler als Zeitgeber verwenden
    start_rt_timer(0);		// APIC-Zeitgeber starten

    for (i=0; i&lt;3; i++)		// Semaphore initialisieren
		rt_sem_init(&amp;ut[i], 0);
    rt_sem_init(&amp;fertig, 0);

    for (i=0; i&lt;3; i++)		// Raucher 1..3 starten und in ready versetzen
    {	rt_task_init(&amp;Prozess[i], Raucher, PNR[i], 2048, 1, 0 ,0);
        rt_task_resume(&amp;Prozess[i]);
    }
    rt_task_init(&amp;Prozess[3], Wirtin, PNR[3], 2048, 0, 0 ,0); // hoeher prior.
    rt_task_resume(&amp;Prozess[3]);// Wirtin starten und in ready versetzen
    return 0;
}

void cleanup(void)
{   int i;
    for (i=0; i&lt;4; i++)		// Prozesse stoppen
    	rt_task_delete(&amp;Prozess[i]);
    for (i=0; i&lt;3; i++)		// Semaphore zerstoeren
		rt_sem_delete(&amp;ut[i]);
    rt_sem_delete(&amp;fertig);
    stop_rt_timer();		// APIC-Zeitgeber stoppen
}

module_init(start);
module_exit(cleanup);
</code></pre>
<p>Petrinet:</p>
<p><a href="https://www.dropbox.com/s/jh810pdv9olqp6j/Raucher%20Petrinet.pdf?dl=0" rel="nofollow">https://www.dropbox.com/s/jh810pdv9olqp6j/Raucher Petrinet.pdf?dl=0</a></p>
<p>Anbei meine Email: <a href="mailto:christian.klein.torres@gmail.com" rel="nofollow">christian.klein.torres@gmail.com</a></p>
<p>Mit freundlichen Grüßen<br />
Christian aus Braunschweig</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/330471/fernstudent-suchen-hilfe-in-echtzeitprogramierung-per-teamviewer-und-auszahlung-per-paypal</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Jul 2026 06:12:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/330471.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 12 Jan 2015 09:15:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fernstudent suchen Hilfe in Echtzeitprogramierung, per Teamviewer und Auszahlung per PayPal on Mon, 12 Jan 2015 09:48:59 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich studiere zur Zeit Informationstechnik.<br />
Ich schreibe nächste Woche im Studienfach &quot;Echtzeitprogrammierung&quot; meine Prüfung.</p>
<p>In der Prüfung muss ich ein C++ Code umschreiben. Und ein Petrinet erstellen.<br />
Als Übung habe ich paar C++-Codes. die ich leider nicht ganz verstehe.</p>
<p>Kann mir jemand, heute oder morgen über TeamView helfen? Ich denke eine 1-2 Stunden Sitzung würde ausreichen. Un eventuell noch 1-2 Mails wenn ich nachträgliche paar fragen haben sollte.</p>
<p>Ich möchte gerne dafür was Zahlen, um geholfen zu werden! Ich denke 50€ für die action ist fair <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>anbei ein Beispiel_Code den ich nicht verstehe.<br />
Und unten weiter ein Link zum Petrinet</p>
<p>Aufgabenstellung:</p>
<pre><code>Raucher-Problem:

In einer Kneipe sitzen 3 Raucher (&quot;Selbstdreher&quot;, welche die

Utensilien Tabak, Papier und Streichhˆlzer zum Rauchen benˆtigen).

Jeder besitzt je ein Utensil in unendlicher Menge, gibt aber

keinem anderen etwas ab.

Deshalb bringt die Wirtin 2 von 3 zuf‰llig ausgew‰hlten Utensilien,

wartet auf die Fertigmeldung eines Rauchers, um dann wiederholt

2 Utensilien zu bringen.

Die Raucher ergreifen die ihnen fehlenden Utensilien, rauchen und

geben die Fertigmeldung an die Wirtin, um erneut auf Utensilien

zu warten.

Der Zugriff auf die Utensilien (= Betriebsmittelzugriff) erfolgt

auch dann, wenn lediglich eines passt.

Deshalb kommt es sehr schnell zu Verklemmungen (sog. Deadlocks,

siehe Datei Ergebnisse.txt).

Generieren Sie folgende Petrinetze:

- Stellen-Transitionsnetz (nichtunterscheidbare Marken) mit

  zugelassener Verklemmung,

- Pr‰dikats-Transitionsnetz (unterscheidbare Marken) ebenfalls

  mit zugelassener Verklemmung,

- Pr‰dikats-Transitionsnetz mit Verhinderung der Verklemmung

  durch BM-Zugriff en bloc!

Leiten Sie schlieﬂlich ein unter RTAI-LINUX lauff‰higes ANSI-C-

Programm ab, das durch bedingte Compilierung folgende Funktiona-

lit‰ten abdeckt:

- unbehandelte Verklemmung (Prototyp),

- Verklemmungserkennung (Timeout f¸r Wartezeit auf Fertigmeldung),

- Verklemmungsverhinderung (BM-Zugriff en bloc)!
</code></pre>
<p>CODE:</p>
<pre><code>/**********************************************************************************
 *  	Raucherproblem unter RTAI-Linux							  *
 *	ohne &quot;wachen&quot;,	ohne &quot;verkl_frei&quot;:	Verklemmungen zulassen	  *
 *	mit &quot;wachen&quot;,	ohne &quot;verkl_frei&quot;:	Verklemmungen erkennen	  *
 *	ohne/mit &quot;wachen&quot;, mit &quot;verkl_frei&quot;:	Verklemmungen verhindern *
 **********************************************************************************/
#define wachen			// Verklemmung bei BM-Anford. erkennen
//#define verkl_frei		// verklemmungsfreie Anforderung der BM

#include &lt;linux/module.h&gt;
#include &lt;rtai_sched.h&gt;
#include &lt;rtai_sem.h&gt;

MODULE_LICENSE(&quot;GPL&quot;);
MODULE_DESCRIPTION(&quot;Raucherproblem (mit Zufallszahlengenerator)&quot;);
MODULE_AUTHOR(&quot;Juergen Ruck &lt;ruck@hs-mittweida.de&gt;, 26.10.2011&quot;);

RT_TASK Prozess[4];		// Prozessbeschreibungsvariablen
int PNR[4] = {1,2,3,4};		// Prozessnummern
SEM ut[3], fertig;			// Semaphore
char UT[3][8] = {&quot;Tabak&quot;, &quot;Papier&quot;, &quot;Hoelzer&quot;};

// Zufallszahlengenerator random(R)
// liefert gleichverteilte Zufallszahl im Bereich von 0..R-1
// Wertebereich fuer R: 1..2^32 (dargestellt mit 0),
// Initialisierung des Generators bei erstmaligem Aufruf
// Achtung: Zufallszahlen abwechselnd gerade und ungerade !!!
unsigned random(unsigned R)
{   static unsigned Z, I=1;
    if(I) I=0, Z=(unsigned)(rt_get_time()&gt;&gt;4);
    Z = Z*65537+257;
    if (R) return Z%R;
    return Z;
}

void Raucher(long NR)	// Rumpf der Raucherprozesse 1..3
{   unsigned u1=NR-1, u2=NR%3, i, k;
    while (1)
    {	rt_printk(&quot;Raucher %ld wartet auf %s und %s\n&quot;, NR, UT[u1], UT[u2]);
#ifdef verkl_frei
	while ( (i = rt_sem_wait_if(&amp;ut[u1]))  +  (k = rt_sem_wait_if(&amp;ut[u2]))  &lt;  2 )
	{	if (i)	rt_sem_signal(&amp;ut[u1]);
		if (k) rt_sem_signal(&amp;ut[u2]);
		rt_sleep(nano2count(10000000));	// 0.01 s Verzoegerung
	}
#else
	if (random(256)&lt;128)				// zufaellige Zugriffsreihenfolge
	{	i=u1; k=u2; }
	else
	{	i=u2; k=u1; }
	rt_sem_wait(&amp;ut[i]);				// nimmt Utensil 1
	rt_sleep(nano2count(10000000));	// 0.01s Verzoeg.
	rt_printk(&quot;Raucher %ld hat %s und wartet auf %s\n&quot;, NR, UT[i], UT[k]);
	rt_sem_wait(&amp;ut[k]);				// nimmt Utensil 2
#endif
	rt_printk(&quot;Raucher %ld hat %s und %s und raucht\n&quot;, NR, UT[u1], UT[u2]);
	rt_sleep(nano2count(random(100000000)+100000000)); // 0.1..0.2 s Verzoeg.
	rt_printk(&quot;Raucher %ld gibt Fertigmeldung\n&quot;, NR);
	rt_sem_signal(&amp;fertig);	// Fertigmeldung geben
    }
}

void Wirtin(long dummy)		// Rumpf des Wirtinnenprozesses
{   unsigned u1, u2;
    while (1)
    {	rt_printk(&quot;Wirtin ist am Tresen\n\n&quot;);
	rt_sleep(nano2count(100000000));	// 0.1 s Verzoegerung
	u1 = random(3);
	do u2 = random(3); while (u1==u2);
	rt_printk(&quot;Wirtin bringt %s und %s und wartet auf Fertigmeldung\n&quot;,
		    UT[u1], UT[u2]);
	rt_sem_signal(&amp;ut[u1]);	// Utensil 1 bringen
	rt_sleep(nano2count(random(10000000)+10000000)); // 0.01..0.02 s Verzoeg.
	rt_sem_signal(&amp;ut[u2]);	// Utensil 2 bringen
#ifdef wachen
	if (rt_sem_wait_timed(&amp;fertig, nano2count(300000000)))	// 0.3 s warten
		rt_printk(&quot;\n*********Verklemmung eingetreten **********\n\n\n&quot;);
	else continue;
#endif
	rt_sem_wait(&amp;fertig);		// Fertigmeldung erwarten
   }
}

int start(void)
{   int i;
    rt_set_oneshot_mode();	// CPU-Taktzaehler als Zeitgeber verwenden
    start_rt_timer(0);		// APIC-Zeitgeber starten

    for (i=0; i&lt;3; i++)		// Semaphore initialisieren
		rt_sem_init(&amp;ut[i], 0);
    rt_sem_init(&amp;fertig, 0);

    for (i=0; i&lt;3; i++)		// Raucher 1..3 starten und in ready versetzen
    {	rt_task_init(&amp;Prozess[i], Raucher, PNR[i], 2048, 1, 0 ,0);
        rt_task_resume(&amp;Prozess[i]);
    }
    rt_task_init(&amp;Prozess[3], Wirtin, PNR[3], 2048, 0, 0 ,0); // hoeher prior.
    rt_task_resume(&amp;Prozess[3]);// Wirtin starten und in ready versetzen
    return 0;
}

void cleanup(void)
{   int i;
    for (i=0; i&lt;4; i++)		// Prozesse stoppen
    	rt_task_delete(&amp;Prozess[i]);
    for (i=0; i&lt;3; i++)		// Semaphore zerstoeren
		rt_sem_delete(&amp;ut[i]);
    rt_sem_delete(&amp;fertig);
    stop_rt_timer();		// APIC-Zeitgeber stoppen
}

module_init(start);
module_exit(cleanup);
</code></pre>
<p>Petrinet:</p>
<p><a href="https://www.dropbox.com/s/jh810pdv9olqp6j/Raucher%20Petrinet.pdf?dl=0" rel="nofollow">https://www.dropbox.com/s/jh810pdv9olqp6j/Raucher Petrinet.pdf?dl=0</a></p>
<p>Anbei meine Email: <a href="mailto:christian.klein.torres@gmail.com" rel="nofollow">christian.klein.torres@gmail.com</a></p>
<p>Mit freundlichen Grüßen<br />
Christian aus Braunschweig</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437089</guid><dc:creator><![CDATA[Crissmusic]]></dc:creator><pubDate>Mon, 12 Jan 2015 09:48:59 GMT</pubDate></item><item><title><![CDATA[Reply to Fernstudent suchen Hilfe in Echtzeitprogramierung, per Teamviewer und Auszahlung per PayPal on Tue, 13 Jan 2015 14:15:55 GMT]]></title><description><![CDATA[<p>Hallo zusammen.</p>
<p>Leider hat sich hier keiner gemeldet.<br />
Aber ich habe es jetzt doch durch eine andere Hilfe es hinbekommen.</p>
<p>Gruß,<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437345</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437345</guid><dc:creator><![CDATA[Crissmusic]]></dc:creator><pubDate>Tue, 13 Jan 2015 14:15:55 GMT</pubDate></item></channel></rss>