Próbuję zaimplementować symulację mikrokontrolera. Ta symulacja nie ma na celu dokładnego odwzorowania jednego taktycznego mikrokontrolera, ale sprawdza ogólną poprawność kodu.Jak zawiesić inny wątek (nie bieżący)?
Myślałem o "głównym wątku" wykonującym normalny kod i drugim wątku wykonującym kod ISR. Ilekroć ISR musi zostać uruchomiony, wątek ISR zawiesza "główny wątek".
Oczywiście, chcę mieć funkcję blokowania przerwań. Pomyślałem o rozwiązaniu tego przy pomocy muteksu, który wątek ISR zawiera za każdym razem, gdy wykonuje kod ISR, podczas gdy główny wątek utrzymuje go tak długo, jak "przerywane są zablokowane".
POR (power on reset) może zostać zaimplementowany nie tylko zawieszając, ale zabijając główny wątek (i uruchamiając nowy wykonujący funkcję POR).
Windows API zapewnia niezbędne funkcje. Ale wydaje się, że niemożliwe jest wykonanie powyższych czynności za pomocą wątków posix (w systemie Linux).
Nie chcę zmieniać rzeczywistego kodu niezależnego od mikrokontrolera sprzętu. Więc wstawianie czegokolwiek w celu sprawdzenia oczekujących przerw jest nieopcją.
Przyjmowanie przerwania w niezbyt dobrze zachowanych punktach jest pożądane, podobnie jak w mikrokontrolerach (chyba że blokujesz przerwania).
Czy istnieje sposób zawieszenia innego wątku na Linuksie? (Debugery muszą jakoś skorzystać z tej opcji.)
Proszę, nie mówcie mi, że to zły pomysł. Wiem, że tak jest w większości przypadków. Ale główny kod nie używa standardowych bibliotek lub lock/mutexes/semaphores.
Och kochanie. Zabijanie innych wątków jest bardzo niebezpieczną sprawą, która może trwale zepsuć wszelkie blokady lub inne zasoby w twoim programie. Zawieszenie kolejnego wątku w dowolnych punktach nie jest tak złe, ale nadal ... – ephemient
Główny kod wątku nie będzie używał żadnych blokad (z wyjątkiem opisanego, który uniemożliwia ich zawieszanie lub zabijanie) lub alokacji zasobów dynamicznych. Nie używa standardowych bibliotek. –
Zostało to również zadane na liście dyskusyjnej glibc [tutaj] (http: //sources.redhat.com/ml/libc-help/2010-05/msg00014.html). Jednak bez żadnego wyniku. – Albert