Poiché i protothread non salvano il contesto dello stack, le variabili locali non sono conservate quando il protothread si blocca. Più correttamente, il valore di tali variabili locali non è definito.
MR_PT_THREAD(f) { unsigned char x; // <--- valore indefinito MR_PTI_BEGIN(); ... MR_PTI_END(); }
Questo significa che le variabili locali non possono essere utilizzate. L'alternativa è quindi quella di ricorrere o alle variabili globali oppure si deve ricorrre all'estensione del contesto del protothread.
La prima soluzione è la più semplice, ed è indicata quanto vi è un solo thread di quel tipo. In tal caso, la variabile andrà spostata dalla definizione locale per essere inclusa all'esterno della definizione del protothread:
unsigned char x; MR_PT_THREAD(f) { MR_PTI_BEGIN(); ... MR_PTI_END(); }
Quando i thread sono molteplici, è opportuno che ognuno di essi abbia la sua specifica copia di tale variabile locale. Questo è possibile estendendo il tipo mr_protothread
con la macro MR_PT_CTX
. Ad esempio:
MR_PT_CTX(f, unsigned char x); MR_PT_THREAD_EXT(f,f_protothread) { MR_PTI_BEGIN(); ... MR_PTI_END(); }
Da notare che abbiamo dovuto utilizzare la variante MR_PT_THREAD_EXT
per generare un thread che abbia un contesto esteso, definito da MR_PT_CTX
.