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.