logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

AT91SAM9260 ARM9 – nieprawidłowe działanie liczników po włączeniu data cache

at91sam79 15 Gru 2014 14:28 924 3
REKLAMA
  • #1 14224934
    at91sam79
    Poziom 9  
    Posty: 42
    Witam,

    Próbuję uruchomić data cache dla AT91SAM9260.
    Wszystko jest niby fajnie, prosty program z wyświetlaniem co sekundę countera przyśpiesza 6-cio krotnie ale problemy zaczynają się z bardziej rozbudowanymi programami.

    Mam taki kod:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Jeśli cache jest wyłączony to na ekranie widzę:

    1 0 28
    0 0 27
    0 0 27
    0 0 28
    0 0 27
    0 0 27
    1 0 28
    0 0 27
    0 0 27
    ...

    Czyli wszystko się zgadza bo widać że co 5Hz mam 1 w pierwszej kolumnie.

    Teraz po uruchomieniu data cache na ekranie mam coś takiego:
    1 1 28
    1 1 28
    1 1 28
    1 1 28
    1 1 28
    ...

    Przecież w pętli 30Hz kasuję zmienną n5HzLoopCounter więc dlaczego cały czas mam 1 na wyjściu?
    Optymalizację kodu w gcc mam na 0.
    Cache nie powinien tak działać.

    Ma ktoś jakiś pomysł co może być przyczyną?
    Chyba że coś mam źle skonfigurowane.
  • REKLAMA
  • #2 14226371
    at91sam79
    Poziom 9  
    Posty: 42
    Dziwna sprawa ponieważ po wyrzuceniu funkcji sprintf zaczęło działać (dane wysłałem bajt to bajcie na port i odczytałem w hex'ie w pliku i wszystko się zgadzało).
    Natomiast w kolejnym kroku zacząłem budować sobie ramkę danych 8 bajtów i wysyłać na port. I znów problem, ponieważ większość ramek wysłana na port jest zbudowana niepoprawnie. Dla przykładu w kodzie buduję ramkę (unsigned char buffer[8]) w pętli for:
    0xFA 0x10 0x11 0x12 0x13 0x14 0x15 0xFA

    w pliku otrzymuję:
    0xFA 0x10 0x11 0x12 0x13 0x14 0x15 0xFA
    0xFA 0x10 0x11 0x12 0x13 0x14 0x15 0x15
    0xFA 0x10 0x11 0x12 0x13 0x14 0x15 0x15
    0xFA 0x10 0x11 0x12 0x13 0x14 0x15 0x15
    0xFA 0x10 0x11 0x12 0x13 0x14 0x15 0x15
    0xFA 0x10 0x11 0x12 0x13 0x14 0x15 0xFA
    0xFA 0x10 0x11 0x12 0x13 0x14 0x15 0x15
    0xFA 0x10 0x11 0x12 0x13 0x14 0x15 0x15
    ...

    Czyli coś mi modyfikuje ostatni bajt.

    Po wyłączeniu cache wszystko działa poprawnie.
    Przy włączonym cache ale zadeklarowaniu tablicy buffer poza obszarem pamięci przypisanym dla cache też wszystko działa.

    Czy ktoś z Was w ogóle używa cache w AT91SAM9?
  • REKLAMA
  • #3 14226689
    Konto nie istnieje
    Poziom 1  
  • #4 14228436
    at91sam79
    Poziom 9  
    Posty: 42
    No coś w tym jest ale skoro do tego siadłem to chciałem rozwiązać ten problem i rozwiązałem. Przyczyn było wiele począwszy od bootloader'a, poprawnej konfiguracji MMU, jak i samego SDRAMu, aż po sensowne wykorzystanie (z trudem włączonego cache'u) tego dobrodziejstwa mając na uwadze jego ograniczenia.

    Odnośnie Cortex'a to mam go już u siebie od kilku tygodni ale nie miałem jeszcze okazji się nim pobawić.
REKLAMA