Sto provando ad implementare una simulazione di un microcontrollore. Questa simulazione non è pensata per eseguire una rappresentazione precisa del ciclo di clock di uno specifico microcontrollore ma controllare la correttezza generale del codice.Come sospendere un altro thread (non quello corrente)?
Ho pensato di avere un "thread principale" che eseguiva codice normale e un secondo thread che eseguiva codice ISR. Ogni volta che è necessario eseguire un ISR, il thread ISR sospende il "thread principale".
Naturalmente, voglio avere una funzione per bloccare gli interrupt. Ho pensato di risolvere questo problema con un mutex che il thread ISR contiene quando esegue il codice ISR mentre il thread principale lo tiene finché "gli interrupt sono bloccati".
Un POR (power on reset) può essere implementato non solo sospendendo ma uccidendo il thread principale (e iniziando uno nuovo eseguendo la funzione POR).
L'API di Windows fornisce le funzioni necessarie. Ma sembra impossibile fare quanto sopra con i thread posix (su linux).
Non voglio modificare il codice del microcontrollore indipendente dall'hardware. Quindi l'inserimento di qualsiasi cosa per verificare interruzioni in sospeso non è un'opzione.
La ricezione di interrupt a punti non ben funzionanti è auspicabile, come accade anche sui microcontrollori (a meno che non si blocchino interruzioni).
C'è un modo per sospendere un altro thread su linux? (I debuttanti devono usare questa opzione in qualche modo, credo.)
Per favore, non dirmi che questa è una cattiva idea. So che è vero nella maggior parte delle circostanze. Ma il codice principale non usa libs standard o lock/mutex/semaphores.
Oh caro. Uccidere altri thread è un'attività molto pericolosa, che può rovinare definitivamente eventuali blocchi o altre risorse nel programma. Sospendere un altro thread in punti arbitrari non è così male, ma comunque ... – ephemient
Il codice del thread principale non utilizzerà alcun blocco (tranne quello descritto che impedisce di essere sospeso o ucciso) o allocare risorse dinamiche. Non utilizza librerie standard. –
Questo è stato anche chiesto sulla mailing list di glibc [qui] (http: //sources.redhat.com/ml/libc-help/2010-05/msg00014.html). Tuttavia, senza alcun risultato. – Albert