EE_th_rnact_max

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

Moderator: paolo.gai

Locked
carlo.caione

EE_th_rnact_max

Post by carlo.caione »

Ciao,
sempre nella fase di porting per l' STM32F4XX mi sono imbattuto in questo problema.
Sono riuscito a compilare (e far funzionare) correttamente tutti gli EEtest (monotask) dall' 1 al 5. Per il 6 sto avendo un piccolo problema.
Nello specifico:

Code: Select all

Error: L6218E: Undefined symbol EE_th_rnact_max (referred from ee_thendin.o).
Di fatto sembrerebbe che EE_th_rnact_max (usato in ee_thendin.c e dichiarato extern in ee_common.h) non sia definito da nessuna parte.

Mi sfugge qualcosa? (per esempio potrebbe essere mcu-dependent?)

Grazie e ciao,

--
Carlo Caione
nicola.serreli

Re: EE_th_rnact_max

Post by nicola.serreli »

Ciao

EE_th_rnact_max e' un vettore richiesto dallo standard osek che e' stato aggiunto 2-3 giorni fa. Dovrebbe essere generato da RT-Druid durante la configurazione di erika ed ha un contenuto praticamente identico a quello di EE_th_rnact (unica differenza e' che e' un vettore costante).

Se lavori su svn, sia Erika che RT-Druid hanno questo supporto attivo, pero' ci sono alcune modifiche da completare prima di poter fare l'aggiornamento dei pacchetti sul sito.

La speranza e' quella di fare un upload in un paio di giorni.
Nel mentre, come work-around, dopo che si blocca la compilazione modifica il file eecfg.h:
- fai una copia del vettore EE_th_rnact
- aggiungi l'attributo const
- cambia il nome del vettore da EE_th_rnact ad EE_th_rnact_max
Poi rilancia la compilazione.
Nota: se vai da riga di comando, puoi usare il make dentro la cartella di output generata dal RT-Druid. Se usi RT-Druid da interfaccia grafica, se non apporti modifiche al file oil o alle propieta' del progetto, RT-Druid non dovrebbe rigenerare i file (e quindi le tue modifiche vengono correttamente utilizzate nella compilazione).

a presto

(ps. posto su questo topic non appena viene fatto l'upload)
nicola.serreli

Re: EE_th_rnact_max

Post by nicola.serreli »

Ciao,

abbiamo completato le modifiche e aggiornato i pacchetti sul sito (http://erika.tuxfamily.org/erika-for-mu ... vices.html)
Su http://software.evidence.eu.com/ee_161/log.html ci sono le differenze coi pacchetto di 10 giorni fa (i cambiamenti sono relativi sia ai componenti di erika che di RT-Druid).

Nicola
carlo.caione

Re: EE_th_rnact_max

Post by carlo.caione »

Grazie!

tra l'altro ero riuscito a compilare modificando eecfg.c e aggiungendo quanto mi avevi suggerito.

--
Carlo
carlo.caione

Re: EE_th_rnact_max

Post by carlo.caione »

Scusate se riapro il thread (e probabilmente faccio thread hijacking) ma ho un dubbio riguardo al significato proprio di EE_th_rnact_max. Mi spiego meglio:

- Durante la fase di porting di EEtest06, il comportamento che ottengo (da me presupposto corretto) è che (guardando per esempio ee\examples\cortex_mx\lpc12xx\porting_examples\monostack\EEtest6\code.c) task2_ended in Task2 non viene mai incrementato perché TerminateTask() in func5() di fatto fa terminare il task chiamante (per l'appunto il 2)

- Stavo ora lavorando sull' EEtest07 per testare il BCC2 mode. Dalle prove che ho fatto sembrerebbe che il comportamento corretto (così come indicato qui http://erika.tuxfamily.org/wiki/index.p ... minateTask (ovvero ottenere che il Task2 sia avviato sei volte) lo riesco ad ottenere solo modificando il valore di EE_th_rnact e EE_th_rnact_max in eecfg.c. E' questo il comportamento corretto?

Al momento non sto usando RT-Druid per la generazione dei file. Pertanto modifico di volta in volta makefile e eecfg.[c|h]

Grazie e ciao!
paolo.gai
Administrator
Posts: 877
Joined: Thu Dec 07, 2006 12:11 pm

Re: EE_th_rnact_max

Post by paolo.gai »

EE_th_rnact_max è stato inserito per la compliance con lo standard OSEK. L'idea è che nella fine del thread occorre testare se ci sono attivazioni accodate per il task, in tal caso deve andare in stato READY invece che SUSPENDED... Solo quello! Pertanto non occorre mai modificare quel valore (che dovrebbe essere stato messo in flash... (ora verifico...)

PJ
outlawch

Re: EE_th_rnact_max

Post by outlawch »

Ciao Carlo,
in effetti hai ragione infatti: la demo monostack EEtest07 per lpc12xx (scritta da me) controlla per mezzo di:

Code: Select all

  EE_assert(
      EE_ASSERT_TASK2_ACTIVATIONS, task2_fired == 5, EE_ASSERT_TASK1_FIRED
  );
che le attivazioni totali del task2 siano 5 e non sei (diversamente da quello indicato nel wiki).
Quindi in eecfg.c si deve avere:

Code: Select all

     EE_TYPEPRIO EE_th_rnact[EE_MAX_TASK] = {
        1U,		 /* thread Task1 */
        4U		 /* thread Task2 */
     };
ossia al max 4 attivazioni pendenti per il task2 come anche descritto dal conf.oil della demo.

Ciao,
Giuseppe.
carlo.caione

Re: EE_th_rnact_max

Post by carlo.caione »

Grazie delle risposte.
Il problema è che nel mio codice se non modifico il valore di EE_th_rnact, il mio Task2 nella demo EEtest07 viene chiamato solo 4 volte (non arrivando mai di fatto a 5). Se infatti faccio il debug del mio EEtest07, quello che ottengo è che il valore di task2_fired resta fisso su 4 (se EE_th_rnact[1] == 4U). Avete qualche idea su quale possa essere il motivo?
L'unica cosa che a questo punto posso pensare è che la mia TerminateTask() non funziona come dovrebbe. Al contrario però EEtest06 sembra funzionare correttamente, di fatto terminando il task (come ho scritto nel mio post precedente).
O semplicemente c'è qualcosa di veramente stupido che mi sfugge :)
outlawch

Re: EE_th_rnact_max

Post by outlawch »

Ciao Carlo,
se la demo che stai utilizzando è: "examples/cortex_mx/lpc12xx/porting_examples/monostack/EEtest7"; i due array CORRETTI che devono essere utilizzati sono i seguenti:

Code: Select all

    EE_TYPENACT EE_th_rnact[EE_MAX_TASK] = {
        1U,              /* thread Task1 */
        4U               /* thread Task2 */
    };

    const EE_TYPENACT EE_th_rnact_max[EE_MAX_TASK] = {
        1U,              /* thread Task1 */
        4U               /* thread Task2 */
    };
Il primo tiene conto delle attivazioni residue a run-time.
Il secondo (costante che va in flash - cui accenava Paolo nei suo post) memorizza le attivazioni residue massime possibili.
Se EE_th_rnact[1] resta fisso a 4U , vuol dire che hai scritto male le due routine assembly previste per l'implementazione HAL della TerminateTask(): void EE_hal_terminate_savestk(EE_TID tid); ed void EE_hal_terminate_task(EE_TID tid); /* NORETURN */ .
Puoi sicuramente reciclare tali funzioni da quelle già scritte per il Cortex-M0/4 che si trovano nei files:
- pkg/cpu/cortex_mx/src/ee_iar_oo.s (Cortex-M0 / NXP LPCXpresso LPC12xx / IAR)
- pkg/cpu/cortex_mx/src/ee_ccs_oo.s (Cortex-M4F / TI Stellaris LM4F232xxxx / TI CCS)
- pkg/cpu/cortex_mx/src/ee_keil_oo.s (Cortex-M4F / TI Stellaris LM4F232xxxx / Keil uVision)
Considera che ogni volta che un task termina (sia per chiamata diretta della TerminateTask(), sia per uscita diretta dalla sua funzione), il valore nell'array EE_th_rnact deve essere incrementato.
Questo viene fatto per mezzo della chiamata alla primiva si sistema void EE_thread_end_instance(void) situata in:
- pkg/kernel/oo/src/ee_thendin.c
Come consiglio ti invito, per mezzo di un debugger, a verificare se tale primitiva viene chiamata in entrambi i casi.
Ciao,
Giuseppe.
outlawch

Re: EE_th_rnact_max

Post by outlawch »

Ciao Carlo,
da un analisi più approfondita del tuo problema ho notato che tu stai utilizzando delle demo che necessitano del vecchio comportamento della StartOS():
- la StartOS() ritorna al chiamante.
Per soddisfare i requisiti AUTOSAR OS, la StartOS() non ritorna più al chiamante, ma cicla infinitamente: quindi non viene eseguita la ActivateTask() successiva alla StartOS() stessa ed il test non viene portato a termine (non viene chiamata nemmeno la EE_assert_last()).
Per ovviare a cio puoi dire ad erika di far ritornare la StartOS() per mezzo di EEOPT += __OO_STARTOS_OLD__ nel makefile e per mezzo di #define __OO_STARTOS_OLD__ nel file eecfg.h.
Ciao,
Giuseppe.
outlawch

Re: EE_th_rnact_max

Post by outlawch »

Ciao Carlo,
ho aggiornato i porting examples relativi al Cortex-MX aggiungendo di fatto l'array EE_th_rnact_max[] negli eecfg.c e la macro __OO_STARTOS_OLD__ nei makefile ed eecfg.h delle demo che lo necessitano.
Ti consiglio di fare un update dal repository.
Grazie per averci segnalato il problema.
Ciao,
Giuseppe.
carlo.caione

Re: EE_th_rnact_max

Post by carlo.caione »

Ok, fatto l'update ora sembrerebbe funzionare :)

Grazie ancora. Ciao!

--
Carlo
nicola.serreli

Re: EE_th_rnact_max

Post by nicola.serreli »

ciao Carlo,

volevo segnalarti la possibilita' di estendere in modo semplice il generatore di RT-Druid in modo da gestire anche l'architettura su cui stai lavorando.

Trovi dettagli su http://erika.tuxfamily.org/wiki/index.p ... formations

Per le cose piu' semplici, come gestire le eeopt e il multistack, si puo' partire da un esempio e cambiare complessivamente 4-5 righe.

a presto,
Nicola
carlo.caione

Re: EE_th_rnact_max

Post by carlo.caione »

Sì avevo visto. Diciamo che al momento mi stavo più concentrando sul porting dei vari test (purtroppo non sono full time su questo progetto) tralasciando al momento RT-Druid
In ogni caso è nella TODO list.

Vi tengo aggiornati, grazie ancora.

Ciao!

--
Carlo
Locked