2012-02-22 13 views
10

Na architekturze ARM, niestety nie wiem dokładnie, jaki to chip, jest 32-bitowy atom int do odczytu/zapisu?ARM: Czy zapis/odczyt z int atomowej?

Czy istnieją jakieś gwarancje dotyczące odczytu/zapisu do podstawowych typów?

+0

Jeśli 'int' jest odpowiednio wyrównany (4 bajty), myślę, że podobnie jak w przypadku większości procesorów 32 bitowych, zapis jest w jakiś sposób atomowy. jednak prawdziwe pytanie jest modelem pamięci (szczególnie w sytuacjach wielordzeniowych: koherencją pamięci podręcznej itp.). –

+0

Nawet w przypadku braku spójności pamięci podręcznej, odczyt/zapis do pamięci głównej nadal będzie atomowy (ale opóźniony) –

+0

@BasileStarynkevitch yes model pamięci to dobry punkt, ale ja tylko h ave na ARM cpu z jednym rdzeniem. –

Odpowiedz

9

Powinien być atomowy, Z WYJĄTKIEM, jeśli int jest przechowywane na niezarządzonym adresie.

+0

Jak się dowiedzieć, czy jest przechowywany na niezarządzonym adresie? Nie zrobiłem żadnego specjalnego wyrównania. –

+2

Sprawdź, czy jego adres mod 4 wynosi 0. Chociaż nie zrobiłeś nic dziwnego (typowanie, itp.), Kompilator dostosuje go. – jjlin

+3

W rzeczywistości niektóre procesory ARM, takie jak Cortex-M3, obsługują niewyrównany dostęp w HW, więc nawet niepodpisany odczyt/zapis jest atomowy. Dostęp może obejmować wiele cykli magistralowych do pamięci, ale nie ma możliwości, aby inna instrukcja przeskakiwała pomiędzy nimi, więc jest ona atomistyczna dla programisty. – TJD

10

Jest to udokumentowane w TRM dla rdzenia lub w specyfikacji AMBA/AXI. Musisz sprawdzić, z jakiego rdzenia korzystasz, jeśli potrafisz określić, jaki jest smak autobusu AMBA/AXI, a w tym opisie określa on atomowy/nieatomowy charakter każdego z typów transakcji.

Na przykład swp i ldrex/strex są atomowe. Strd i stm również powinny być atomowe. Ale na ARM11 Mpcore, który jest mi najbardziej znany, łamie zapisy w jeden 64-bitowy cykl szyny, robię stm z 8 rejestrami, myślę, że staje się 4 oddzielną długością 1 cykli, gdzie ldm z 8 rejestrów uważam za pojedynczy transakcja o długości czterech.

To dobry moment, aby zauważyć, że ldrex i strex często nie są poprawnie używane przez programistów. Linux ma na przykład błąd. Służą do blokowania przy użyciu procesora wielordzeniowego w systemie pamięci współużytkowanej, a NIE do blokowania wątków programowych na jednym procesorze. Użyj do tego SWP. Masz szczęście, jeśli masz pamięć podręczną L1 włączoną tak, jak działa ldrex/strex (w tym jednym procesorze).

Uwaga ARM zawsze zezwalał na niealarmowany dostęp, czasami domyślnie (ARM7TDMI), po tym ustawieniem domyślnym było odrzucenie danych, ale można było zmienić ustawienie, aby nie było. Wyrównanie w ARM nie robi tego, co chcą na przykład programiści x86. jeśli czytasz 32 bity pod adresem 0x02, niekoniecznie otrzymasz kolekcję bajtów 0x02, 0x03, 0x04, 0x05, możesz/otrzymasz 0x02, 0x03, 0x00, 0x01, używając 32-bitowej magistrali AMBA/AXI. MOŻESZ uzyskać pożądany wynik na 64-bitowej magistrali AMBA/AXI, ale może nie, zdecydowanie na 32 i 64 bitach, jeśli czytasz 32 bity pod adresem 0x0E otrzymasz 0x0E 0x0F i albo 0x08 0x09 albo 0x0c 0x0D. Wcale nie oczekują tego programiści (zwykle ci, którzy wiedzą, jak to działa, używają go jako ładnego zamiennika bajtów), więc często jest to rzucanie danych przerwanych, a programista naprawia ich kod.

C kompilatory bardzo często tworzą aligné dostępy, dlatego trudno jest dla programistów x86 albo ich kodu portu lub przenieść z tej platformy do innego systemu. Płacą wysoką karę na x86 (fatalna wydajność), ale nie tak ciężko, jak inne procesory (pamięć przerywa). SO jest załadowany pytaniami na temat, w jaki sposób mogę uruchomić mój kod na procesorze xyz.

Wysiądę z pudełka na mydło. ARM wykonuje doskonałą robotę dokumentowania wszystkich tych rzeczy (w stosunku do innych producentów układów). Instrukcja TRM (podręcznik techniczny, każdy rdzeń ma jeden) opisuje opcje magistrali AMBA/AXI i magistrali, a także typy transakcji. Następnie dokumenty AMBA/AXI idą dalej, aby wyjaśnić, co się dzieje. Może tam być mapa pomiędzy instrukcjami a rodzajami transakcji. Kiedy zrobisz ldm 6 słów pod adresem 0x4 na 64-bitowej magistrali AXI, otrzymasz jeden 32-bitowy odczyt pod adresem 4, o długości 1. Następnie otrzymasz długość 2 64-bitowego odczytu (cztery bajty) pod adresem 0x8 (obejmujące słowa 0x8, 0xC, 0x10 i 0x14, a następnie osobny 32-bitowy adres 0x18, ponieważ samo to staje się transakcją 3-osiową, nie oznacza, że ​​jest ona nieatomowa, pozostawia możliwość, aby była ona nieatomowa, , ale trzeba by sprawdzić dokumenty ARM.

Powiązane problemy