-
Data: 2011-02-10 21:31:01
Temat: Re: AVR ATmega, pomiar częstotliwości przebiegu, prośba o sprawdzenie kodu
Od: Michoo <m...@v...pl> szukaj wiadomości tego autora
[ pokaż wszystkie nagłówki ]W dniu 10.02.2011 19:35, Zbych pisze:
> W dniu 2011-02-10 17:00, Michoo pisze:
>> W dniu 10.02.2011 16:16, Zbych pisze:
>>> Nie używaj cli i sei do robienia sekcji atomowych, te makra nie są
>>> zabezpieczone przed optymalizacją i kompilator może zmienić kolejność
>>> instrukcji (choć oczywiście nie musi).
>> Chyba nie - definicja wyglądają tak:
>> # define sei() __asm__ __volatile__ ("sei" ::)
>> # define cli() __asm__ __volatile__ ("cli" ::)
>>
>> Co zabrania kompilatorowi zamiany kolejności ewaluacji wyrażeń.
>
> volatile zabrania usunięcia, optymalizacji, ale nie zabroni przesunięcia
> czegoś co jest pomiędzy sei i cli, czyli z kodu
> cli();[coś];sei();
> może wyjść:
> cli();sei(); [coś];
Tylko jeżeli [coś] jest kiepskim kodem ;) - Używanie w sekcji krytycznej
czegoś co nie jest volatile i nie zawiera bariery na przesyłanej
zmiennej jest sprzeczne zarówno ze standardem jak i ze zdrowym rozsądkiem.
Gdy [coś] operuje na zmiennych volatile wszystko musi działać a
jednocześnie nie ma konieczności synchronizacji wszystkich rejestrów jak
przy klasycznej barierze.
>
> Dodatkowo taka konstrukcja nie zmusza kompilatora do zapisania wartości
> tymczasowych trzymanych w rejestrach do pamięci, więc może się okazać,
> że zapis wielobajtowej zmiennej nastąpi już przy włączonych przerwaniach.
>
> Przykłady można znaleźć na liście dyskusyjnej avr-gcc.
Masz może linkę? Bo na szybko nie mogłem znaleźć.
>
>> Dziwne swoją drogą, że nie jest to zapisane na wszelki wypadek jako
>> # define sei() __asm__ __volatile__ ("sei" :::"memory")
>
> No właśnie o tę barierę na pamięci chodzi.
Tylko bariera jest wolna i nieoptymalna. W sumie jak się głębiej
zastanowić to to jest sensowne:
cli();[operacje na volatile]sei();
- działa jak należy
cli();[dowolne operacje i synchronizacja zmiennej współdzielonej]sei();
- też działa
cli();[operacje bez synchronizacji]sei();
- robi to co programista napisał a nie to co chciał, ale C jest znane z
tego że pozwala się postrzelić w stopę
--
Pozdrawiam
Michoo
Następne wpisy z tego wątku
- 11.02.11 07:36 Zbych
- 11.02.11 11:05 Robbo
- 11.02.11 11:43 Michoo
- 11.02.11 12:15 Zbych
- 11.02.11 12:22 Robbo
- 11.02.11 12:24 Zbych
- 11.02.11 12:33 Zbych
- 11.02.11 12:58 Robbo
- 11.02.11 13:09 Robbo
Najnowsze wątki z tej grupy
- 8080
- Portowanie CP/M
- radyjko
- Re: Basen i chłodzenie w w wentylacji mechanicznej
- Akumulatory VRLA
- ładowarka zmarła
- Podstawa bezpiecznikowa jako rozłącznik DC
- Napięcie akumulatora wyłączające UPS / jakie nowe akumulatory do UPS?
- nawigacja satelitarna
- SmartLife/Tuya i osuszanie -- mordowanie z zimną krwią...
- Głośnik piezoelektryczny
- Mala autonomiczna kamera monitoringu
- czas na emeryturę i EB
- Generowanie sumy kontrolnej z fragmentu pliku bin
- Re: Mala autonomiczna kamera monitoringu
Najnowsze wątki
- 2024-07-13 256 świadków nie ma racji
- 2024-07-11 Tokarze CNC czyli ciężkie życie prototypiarza
- 2024-07-12 Zgody na przetwarzanie danych
- 2024-07-13 IObit Uninstaller Pro 13.6.0.5 Multilingual: Installation Guide
- 2024-07-12 stare graty młode kozy
- 2024-07-11 8080
- 2024-07-13 Przyłącze dolne grzejnika
- 2024-07-13 IObit Uninstaller Pro 13.6.0.5 Multilingual Overview
- 2024-07-12 Czym wykonać otwór fi 100 w betonie komórkowym?
- 2024-07-12 Warszawa => Senior Rust Software Engineer <=
- 2024-07-12 Warszawa => Business Unit Manager (Recruitment Business) <=
- 2024-07-12 Warszawa => Head of WMS Competence Center for IT&D Contract Logistics
- 2024-07-12 Warszawa => Head od WMS Competence Center dla IT&D (Blue Yonder) <=
- 2024-07-12 Kraków => Ruby Backend Developer <=
- 2024-07-12 Warszawa => UX/UI Designer <=