Nie mogę pojąć czy zadeklarowanie zmiennej jako volatile rozwiązuje problem synchronizacji. Próbowałem napisać kod bez użycia zmiennych volatile, jednak on nie działa z uwagi na optymalizację przeprowadzaną przez kompilator.
Moje pierwsze pytanie brzmi, czy można na chwilę potraktować zmienną jako volatile, czyli instrukcję między cli a sei?
Czy zadeklarowanie zmiennej jako volatile rozwiązuje problem? Nie można zmienić tylko wybranych bitów w pamięci, więc przynajmniej jeden bajt musi być przepisany do rejestrów, potem ustawione te bity i znopwu zapisany do pamięci:
Już całkiem zgłupiałem
.
struct
{
uint32_t semafor : 2;
uint32_t inne_pola : X;
} zmienna;
//gdzieś z main
cli();
zmienna.semafor++;
sei();
//operacje na innych polach struktury zmienna
zmienna.semafor--;
void irq_service(void)
{
if (!zmienna.semafor)
{
//operacje na innych polach struktury zmienna
}
}
Moje pierwsze pytanie brzmi, czy można na chwilę potraktować zmienną jako volatile, czyli instrukcję między cli a sei?
Czy zadeklarowanie zmiennej jako volatile rozwiązuje problem? Nie można zmienić tylko wybranych bitów w pamięci, więc przynajmniej jeden bajt musi być przepisany do rejestrów, potem ustawione te bity i znopwu zapisany do pamięci:
skopiuj_zmienną_z_pamięci_do_rejestru;
ustaw_bity;
IRQ!!!
zapisz_zmienną_do_pamięci;
//to co zostało zmienione w przerwaniu jest teraz tracone
IRQ:
skopiuj_zmienną_z_pamięci_do_rejestru;
ustaw_inne_bity;
zapisz_zmienną_do_pamięci;
Już całkiem zgłupiałem
