예제 #1
0
파일: forktest.c 프로젝트: knilch1/OSsource
int main()
{
  pid_t k, pid;
  int p, status, q;

  k = fork();
  if (k != 0) { /* falls <> 0 --> THEN Eltern*/
    /* Eltern mit k= Prozessnummer des Kindes*/
    for (p=0; p<20; p++) {
      printf("\t\t\tElternteil %d, Kind=%d\n",p,k); 
      warten();
    }
    //pid=wait(&status); 
    printf("\t\t\tIst Kindprozess beendet? PID war, %d\n",pid);
    //while(1); /*auf  Abbruch durch <CTRL/C> warten*/
  }
  else { /* Kind mit k=0 */
    printf("Kindprozessnummer= %d \n", getpid());
    for (p=0; p<10; p++) {
      printf ("Kind %d,%d\n",p,k); 
     warten();
    }
    exit(1);        
  }  
}
/*
 * workAS()
 * Schnittstelle nur fuer das Modul Betriebsmittelverwaltung. Die
 * Schnittstelle dient dem Auslesen von maximal vier Meldungen der Module aus
 * dem Ringpuffer und deren Versendung ueber den I2C-Bus.
 * Fuer diese Uebertragung werden werden maximal 29 Bytes + Start- und
 * Stoppbits versendet.
 * 
 * Nach Aufruf dieser Schnittstelle wird ueberprueft, ob der Ringpuffer leer
 * ist. Wenn dem so ist, muessen keine Daten untersucht werden und der Vorgang
 * wird beendet.
 * Andernfalls wird ueberprueft, ob der Lesezeiger AS_read_next_msg auf einen
 * gueltigen Index zeigt. Ggf. wird dieser durch Nullsetzen korrigiert.
 * Dadurch soll sichergestellt werden, dass im Folgenden nicht wahllose Werte
 * aus dem Speicher gelesen werden.
 * Es wird eine Wartepause von 1,568 ms eingelegt.
 * Dann wird versucht die I2C-Bus-Verbindung zum AD herzustellen. Dazu wird die
 * Funktion I2CSendAddr(addr, rd) mit den Parametern (8, WRITE) benutzt.
 * Schlaegt die Verbindung fehl, wird der Vorgang beendet.
 * Danach wird versucht maximal vier Meldungen zu versenden. Dazu werden
 * jeweils die naechsten 7 Daten aus dem Ringpuffer an der Stelle des
 * Lesezeigers AS_read_next_msg gelesen und mit Hilfe der Funktion
 * I2CSendByte(bt) wird sucht, sie zu versenden. Schlaegt die Verbindung fehl,
 * wird erst versucht die Verbindung zu beenden und danach wird der Vorgang
 * beendet.
 * Ist der Vorgang des Daten aus dem Ringpuffers versenden abgeschlossen, wird
 * versucht die Verbindung zu beenden. Dazu wird die Funktion I2CSendStop()
 * benutzt.
 * 
 * Rueckgabe: Keine
 * 
 * Autor: Felix Blueml
 */
void workAS()
{
	// Maximale Anzahl Mitteilungen, die versendet werden.
	// byte maxSendMsg_workAS; // ist globale Variable

	// Zaehler fuer die beiden for-Schleifen, fuer die Versendung von
	// Mitteilungen.
	// byte i_workAS, j_workAS; // sind globale Variablen


	// Keine Elemente im Puffer zum versenden?
	if(!AS_msg_counter)
	{
		// Abbruch!
		return;
	}
	
	// Enthaellt AS_read_next_msg einen falschen Wert?
	if(AS_read_next_msg >= MAX_MELDUNGEN)
	{
		// Sicherstellen, dass nicht wahllos irgendwelche Werte aus
		// dem Speicher gelesen werden
		AS_read_next_msg = 0;
	}
	
	warten(); // eine Wartepause einlegen


	// Versuche eine schreibende Verbindung zum Arduino mit der
	// Adresse 4 herzustellen

	_i2c_error = 255; // Status: Kein Fehler

	I2CSendAddr(8, WRITE);

	if(_i2c_error != 255) // Fehler erkannt?
	{
		// Abbruch!
		return;
	}


	// Lese maximal 4 Mitteilungen aus dem Ringpuffer und versende sie
	if(AS_msg_counter<4)
	{
		maxSendMsg_workAS = AS_msg_counter;
	}
	else
	{
		maxSendMsg_workAS = 4;
	}

	for(i_workAS=0; i_workAS<maxSendMsg_workAS; i_workAS++)
	{
		for(j_workAS=0; j_workAS<7; j_workAS++)
		{
			// Versuche ein Byte aus dem Ringpuffer an den Arduino
			// zu versenden

			_i2c_error = 255; // Status: Kein Fehler

			I2CSendByte(AS_msg_array[AS_read_next_msg][j_workAS]);
			
			if(_i2c_error != 255) // Fehler erkannt?
			{
				// Versuche die Verbindung zu beenden
				I2CSendStop();

				// Abbruch!
				return;
			}
		}
		

		// Eine komplette Statusmeldung wurde versendet,
		// Lesezeiger auf die naechste zu sendende Meldung setzen
		AS_read_next_msg = (AS_read_next_msg+1) % MAX_MELDUNGEN;

		// Fuellstand um 1 verringern
		AS_msg_counter--;
	}

	// Versuche die Verbindung zu beenden
	I2CSendStop();
}