EDF,SRP,SEMAFORI e RISORSE: Problema di prelazione.

Forum relativo alle schede FLEX, ERIKA Enterprise, RT-Druid, ScicosLab, ...

Moderator: paolo.gai

Locked
GigiBian
Newbie
Posts: 1
Joined: Thu Jan 28, 2010 11:03 pm

EDF,SRP,SEMAFORI e RISORSE: Problema di prelazione.

Post by GigiBian » Thu Jan 28, 2010 11:26 pm

Salve a tutti,
Sto sviluppando una tesina per conto del professor Aldo Franco Dragoni dell'università politecnica delle marche: l'oggetto di questa tesina è la creazione di una , oserei dire, "stupida" demo board da usare con la flex board.
La scheda consiste di 6 led: 2 task periodici, 1 task aperiodico, i led che segnala il background service, 1led che segnala la preemption, ed 1 led che segnala il bloccaggio. Diciamo un simpatico esercizio di stile a fini didattici :)

La scheda è quasi ultimata, mi sono avvicinato da poche settimane al mondo di erika e dei sistemi operativi in tempo reale, pero' devo dire che mi sn appassionato molto. Complimenti a chiunque abbia lavorato e sviluppato questo tipo di progetto, Paolo Gai, Giorgio Buttazzo e tutti gli altri :)

L'unico problema che ho incontrato è stato per quanto riguarda l'uso delle risorse, mi spiego meglio:
Quando uno dei 2 task periodici accede alla risorsa condivisa "A" , protetta da un semaforo binario , entra nella sua sezione critica: in questo caso l'altro task non riesce a fare preemption anche se dovrebbe. Se invece tolgo la sezione di codice per quanto riguarda l'accesso alle risorse, la preemption avviene correttamente.

I 2 task sono schedulati tramite EDF. La priorità l'ho impostata correttamente secondo SRP.

Il primo Task ha Periodo 5s, e tempo di computazione 2s. Il secondo Task ha Periodo 7s e tempo di computazione 4s. (sono 2 led che si accendono i task).
Entrambi i task per la prima metà del loro tempo di computazione entrano nella sezione critica accedendo alla risorsa A. per l'altra metà invece eseguono il loro normale lavoro.

Schedulando questi 2 task tramite EDF , il task 1 all'istante 15 dovrebbe fare prelazione sul task 2: ciò avviene correttamente se nessuno accede alla risorsa, ma se il task 2 all'istante 15 è sulla sua sezione critica, il task 1 non riesce a fare prelazione.

Non penso sia il comportamento corretto di erika...perchè avviene ciò? Come posso risolverlo?

Vi incollo parte del codice:

Code: Select all

 CONF.OIL

CPU mySystem {

	OS myOs {
		EE_OPT = "DEBUG";
		EE_OPT = "__SEM__";

		CPU_DATA = PIC30 {
			APP_SRC = "code.c";
			MULTI_STACK = TRUE{
				IRQ_STACK = FALSE;
			};
			ICD2 = TRUE;
		};

		MCU_DATA = PIC30 {
			MODEL = PIC33FJ256MC710;
		};

		BOARD_DATA = EE_FLEX {
			USELEDS = TRUE;
		};

		KERNEL_TYPE = EDF { NESTED_IRQ = TRUE; TICK_TIME = "500ns"; REL_DEADLINES_IN_RAM=TRUE;};
	};
	/* 
	 * Nell'assegnazione dei preemption level (attributo PRIORITY) bisogna
	 * rispettare il protocollo SRP, ovvero il task con la deadline minore
	 * deve avere priorità maggiore.
	 */
	TASK task1 {
		REL_DEADLINE = "5s"; //Tc= 2s Per=5s
		PRIORITY = 2;
		STACK = PRIVATE{
			SYS_SIZE = 128;
		};
		
	};
	
		TASK task2 {
		REL_DEADLINE = "7s"; //Tc= 4s Per= 7s
		PRIORITY = 1;
		STACK = PRIVATE{
			SYS_SIZE = 128;
		};
		
	};

	COUNTER myCounter;

	ALARM task1ActivationAlarm {
		COUNTER = "myCounter";
	    ACTION = ACTIVATETASK { TASK = "task1"; };
	};
	
	ALARM task2ActivationAlarm {
		COUNTER = "myCounter";
	    ACTION = ACTIVATETASK { TASK = "task2"; };
	};
};

Code: Select all

CODE.C

ResourceType A;

SemType S = STATICSEM(1);

TASK(task1)
{
	task1Running = 1;
	/* Se task2 è in esecuzione allora ho eseguito preempt e lo segnalo accendendo il led rosso */
	if (task2Running) {
             //spengo il led dell'altro task
		green_right_off();
             //accendo il led che mi indica che è avvenuta prelazione
		red_bottom_left_on();
	}


         // Quando un task accede ad una risorsa la prelazione viene DISABILITATA!!!?????
		 WaitSem(&S);
                //Se passo la wait accendo il led di questo task 
		green_left_on();
		 GetResource(A);
                //non faccio nulla per un tempo pari alla metà del TC
		 sec_delay(TASK1_COMPUTATION_TIME/2);
		 ReleaseResource(A);
		 PostSem(&S);
		 green_bottom_off();
	/* Non faccio nulla per la seconda metà del task */
	sec_delay(TASK1_COMPUTATION_TIME/2);

	/* L'esecuzione del task1 è terminata, quindi spengo il led di questo task */
	green_left_off();

	/* Se avevo eseguito preemption spengo il led rosso */
	if (task2Running) {
		red_bottom_left_off();
         //riaccendo il led dell'altro task
		green_right_on();
	}

	task1Running = 0;
}


//per l'altro task il codice è speculare
Ringrazio anticipatamente per l'aiuto :)

Saluti
Gianluigi

paolo.gai
Administrator
Posts: 875
Joined: Thu Dec 07, 2006 12:11 pm

Re: EDF,SRP,SEMAFORI e RISORSE: Problema di prelazione.

Post by paolo.gai » Thu Mar 04, 2010 12:48 pm

Buongiorno,

scusa del ritardo nella risposta, il forum era configurato male (mea culpa!)

Il comportamento è del tutto normale.

quando la risorsa viene bloccata, il system ceiling del sistema sia con SRP che con EDF viene innalzato, e se entrambe i task usano la stessa risorsa i due task diventano mutualmente escusivi (come deve del resto essere)... pertanto non ci sono comportamenti strani :-)

Ciao,

PJ

Locked