-
Data: 2019-02-14 11:59:24
Temat: Re: Zagwozdka w C Keil - wyjaśnienie.
Od: q...@t...no1 (Queequeg) szukaj wiadomości tego autora
[ pokaż wszystkie nagłówki ]J.F. <j...@p...onet.pl> wrote:
> Cos w tym jest, ale z drugiej strony - skoro uzywamy volatile, to
> wiadomo ze zmienna moze sie zmieniac w przerwaniach czy w inny
> niekontrolowany sposob, i co - kompilator to olewa ?
Ale co kompilator może zrobić, jak sam procesor nie obsługuje atomicznego
dostępu do tej zmiennej (bo np. jest 8-bitowy, a zmienna 16-bitowa)?
Zresztą nawet w przypadku zmiennych o rozmiarze równym szerokości
magistrali danych nie ma gwarancji chociażby w przypadku operacji
read-modify-write. Przykład:
#v+ test.c
volatile int i;
void fn(void) { ++i; }
#v-
#v+ test.s
ldr r3, [r2] ; odczyt zmiennej z pamięci do rejestru r3
add r3, r3, #1 ; dodanie do rejestru r3 liczby 1
str r3, [r2] ; zapis rejestru r3 z powrotem do pamięci
#v-
Zmienna może się zmienić między każdą z tych instrukcji.
Bardziej realny przykład, AVR. Chcemy zmienić stan bitu 2 w porcie na
przeciwny.
#v+ avr.c
#include <avr/io.h>
void fn(void) { PORTB ^= _BV(2); }
#v-
Kompilacja: avr-gcc -mmcu=atmega8 -O2 -S avr.c
#v+ avr.s
in r24,0x18 ; załadowanie adresu portu do r24
ldi r25,lo8(4) ; załadowanie wartości _BV(2) do r25
eor r24,r25 ; wykonanie r24 xor r25, zapis do r24
out 0x18,r24 ; wysłanie wartości z r24 do portu
#v-
Między każdą z tych instrukcji również może wystąpić przerwanie, które np.
ustawi inny bit w tym porcie, który to bit zostanie ładnie wyczyszczony
podczas otatniej operacji (zapisu r24 do portu).
> No coz, przejsc na ARM i zapomniec o problemie ...
Czemu? Co ma do tego ARM? Chodzi o szerokość magistrali danych? To
rozwiązuje tylko jeden problem, ale inne (chociażby ten pierwszy
przykład wyżej) pozostają.
--
Eksperymentalnie: http://facebook.com/groups/pl.misc.elektronika
Następne wpisy z tego wątku
- 14.02.19 12:14 Queequeg
- 14.02.19 13:07 J.F.
- 14.02.19 13:11 J.F.
- 14.02.19 13:15 J.F.
- 14.02.19 13:25 Queequeg
- 14.02.19 13:36 Grzegorz Niemirowski
- 14.02.19 13:52 a...@m...uni.wroc.pl
- 14.02.19 13:59 Queequeg
- 14.02.19 14:01 Grzegorz Niemirowski
- 14.02.19 14:02 Queequeg
- 14.02.19 14:04 Queequeg
- 14.02.19 14:07 Queequeg
- 14.02.19 17:03 J.F.
- 14.02.19 17:10 J.F.
- 14.02.19 17:14 Queequeg
Najnowsze wątki z tej grupy
- LED
- System operacyjny dla 6800?
- Przyłączenie działki do sieci elektrycznej
- Działalność nierejestrowana/definicja sprzętu elektronicznego/misie i kolejki
- Smukły, długi ściągacz izolacji do kynaru
- rezystor 3 omy 400W
- [newbie] Jaki multimetr za 2-4 stówy?
- szafka sieciowa
- Raspberry Pi 5 + dyski SATA
- lutownica na węgiel
- Znów czary (albo niewiedza) - tym razem fotowoltaika
- Chess
- Vitruvian Man - parts 7-11a
- przeźroczyste koszulki
- Re: Win 10/11 nie lubi OKI
Najnowsze wątki
- 2024-05-20 Fiat 125p wer. pikup - w PRL moszna było, w III Reczy [pospolitej] nie moszna
- 2024-05-19 Pożar salonu z chińskimi elektrykami
- 2024-05-18 LED
- 2024-05-19 ceny nieruchomości
- 2024-05-18 Szczecin => UX/UI Designer <=
- 2024-05-18 Warszawa => Mid PHP Developer (Laravel) <=
- 2024-05-18 Warszawa => Software .Net Developer <=
- 2024-05-18 Warszawa => Mid/Senior QA Engineer <=
- 2024-05-18 Ulm => Solution Architect (sichere Kommunikation und IoT-Loesungen <=
- 2024-05-18 Katowice => Head of Virtualization Platform Management and Operating S
- 2024-05-18 Warszawa => SAP WM Consultant / Execution <=
- 2024-05-18 Wrocław => Consultant/Implementer Comarch ERP XL <=
- 2024-05-18 Gdańsk => Head of International Freight Forwarding Department <=
- 2024-05-18 Warszawa => Account Manager (Recruitment Services) <=
- 2024-05-18 Łódź => Salesperson - CRM Systems <=