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

Xmega128A1U - Jak przekroczyć barierę 64KB w AtmelStudio z GCC 4.8.1?

karol75 26 Maj 2015 10:41 1485 20
  • #1 14721823
    karol75
    Poziom 16  
    AtmelStudio
    GCC 4.8.1
    Build started.
    ...
    Target "CoreBuild" in file "C:\Program Files\Atmel\Atmel Studio 6.2
    ...
    		Invoking: AVR/GNU C Compiler : 4.8.1
    ...

    XMEGA128A1U EBI 4 portowy SRAM AS7C32096A-10TCN

    Mam dziwny problem z przekroczeniem 64KB

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


    Problem w tym że widzę na wyświetlaczu wyświetlane poprawnie wyniki ale tylko do adresu 0xFFFF tak jakby wskaźnik był 16bit a nie 24bit po przejściu adresu 0xFFFF na wyświetlaczu widzę adresy od 0.
    Próby zapisu i odczytu powyżej 0XFFFF kończą się niepowodzeniem.
    Zmiana zakresu "i" na __uint24 i wpisanie ręcznie adresu większego od 0xFFFF nic nie zmienia

    Gdzie robię błąd?
  • #2 14721879
    Jaca
    Poziom 31  
    Zmień i na uint32_t
  • #3 14721914
    karol75
    Poziom 16  
    ^^
    Spróbuję ale nie wróże postępów ponieważ wskaźniki w Xmega są maksymalnie 24bit.

    Poza tym ręczne wpisanie adresu wskaźnika nie pomaga.

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


    powoduje
    Warning 1 initialization makes pointer from integer without a cast [enabled by default] C:\Users\karol\Efektkompilacji.txt\FATFS\main.c 388 24 FATFS

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

    Warning 2 assignment makes pointer from integer without a cast [enabled by default] C:\Users\karol\Efektkompilacji.txt\FATFS\main.c 392 6 FATFS
  • #4 14721956
    Jaca
    Poziom 31  
    Coś pomieszałeś. ;-) Wskaźnik wskazuje adres zmiennej w pamięci RAM procka a nie jej wartość.
  • #5 14721975
    karol75
    Poziom 16  
    Ten drugi kod jest akurat nie istotny, ważne jest to że inicjalizacja wskaźnika powoduje ostrzeżenie.

    Kod podany na początku wątku ma mieć możliwość pracy z pamięcią powyżej 0XFFFF, a nie działa i to jest problem.
  • #6 14722041
    tmf
    VIP Zasłużony dla elektroda
    Podany kod działać nie może, bo jak zmiennej typu uint16_t chcesz przypisać coś więcej niż 0xffff? A ostrzeżenie kompilatora mówi tylko, że w sposób niejawny z wartości integer robisz wskaźnik. Wystarczy to zrobić w sposób jawny, czyli wykorzystać rzutowanie typów. A jeśli nadal będziesz miał problemy to pomaga rzut oka na plik lss, zawierający wygenerowany przez kompilator kod asemblerowy - od razu dojdziesz gdzie to co myśli kompilator zaczyna odbiegać od tego co myślisz ty.
  • #7 14722068
    Jaca
    Poziom 31  
    Zrób tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #8 14722135
    karol75
    Poziom 16  
    Ok będę testował.


    Tak jak pisałem na początku to nie jest problem licznika.
    Jeszcze raz zmieniłem typ licznika wpierw uint32_t następnie na __uint24 ten sam efekt.
    W zasadzie wczoraj do północy uruchomiłem całość "systemu" do 64KB i moje potrzeby na pamięć zostały pokryte z nawiązką. Szkoda że nie ma pamięci 64KB o dostępie 10-12 ns.
    Jesteśmy w trakcie konstruowania obudowy i pokażę efekty już nie długo.


    Ale na przyszłość, nie wiem co może być problemem że nie ma dostępu powyżej 64KB. Chyba czas przesiąść się na 32bit.
    Który z ARM Atmela lub STM ma wyprowadzoną szynę pamięci i jest w obudowie nie BGA, normalna nawet 144-208 pin nie jest problemem i super byłoby aby miał kontroler LCD. Potrzebuję go do szybkiej obróbki grafiki.

    Jeszcze jedno pytanie jak zmienić częstotliwość EBI na 64MHz, chcę zobaczyć czy będzie pracowało prawidłowo. Rdzeń pracuje z prędkością 32MHz.
  • #9 14724720
    Jaca
    Poziom 31  
    Możesz pokazać schemat połączenia tej pamięci do procka? XMEGA A1U nie ma ograniczenia do 64 kB dla EBI. ;-)

    ps. EBI pracuje z częstotliwością 2 x większą niż CPU (2 x peripheral clock).

    EDIT.

    Jeszcze jedno, początkowy (zmapowany) adres zewnętrznej pamięci to 0x3000 a nie 0x0000 ;-)
  • #10 14724940
    karol75
    Poziom 16  
    Jaca napisał:
    Możesz pokazać schemat połączenia tej pamięci do procka?

    Jutro
    ale jest taki sam jak w tym wątku
    https://www.elektroda.pl/rtvforum/topic2976374.html
    tylko zmienione CE pamięci z masy na połączenie z CS1 procesora
    Ale jutro pokażę dokładnie.

    Jaca napisał:

    ps. EBI pracuje z częstotliwością 2 x większą niż CPU (2 x peripheral clock).

    Domyślnie czy trzeba coś ustawiać?
    Nota zawiera informacje że może pracować do 64MHz a chyba normalnie to częstotliwość procka czyli moje 32MHz;

    Jaca napisał:

    Jeszcze jedno, początkowy (zmapowany) adres zewnętrznej pamięci to 0x3000 a nie 0x0000 ;-)


    Przy dostępie tylko 64KB to nie ma znaczenia.
    Po prostu procesor przykryje pierwsze adresy od 0 do 0x4000 i ta część nie będzie dostępna.
  • #11 14725089
    Jaca
    Poziom 31  
    Podaj fragment programu odpowiedzialny za konfigurację EBI.

    Co do taktowania to jest ona 2 x większa niż częstotliwość za preskalerem B, czyli jeśli włączysz RC32MHZ i preskaler'y ABC = 1 to CPU będzie taktowany 32MHz a EBI 64MHz.
  • #12 14725121
    karol75
    Poziom 16  
    OK jutro podam.
  • #13 14725217
    Jaca
    Poziom 31  
    Co do taktowania EBI 64MHz przy użyciu samego RC32MHZ to się trochę pogubiłem - przepraszam (jakoś nie do końca jest to opisane w nocie czy wartość jest mnożona x2 czy to jedynie wyjście za preskaler'em B).

    Powinno być tak:

    1. Włączamy RC32MHZ
    2. Ustawiamy PLL ze źródłem 32MHz/4 = 8 MHz i mnożnikiem 8 = 64MHz
    3. Preskaler'y: A = 1, B = 1, C = 2

    W takich ustawieniach CPU pracuje na 32MHz a EBI (ClkPer2) na 64MHz.
  • #14 14725302
    tmf
    VIP Zasłużony dla elektroda
    @karol75 Pokaż pełny kod dostępu do pamięci, łącznie z kodem funkcji odczytu/zapisu. Jeśli możesz to wklej wynikowy plik lss - zaoszczędzi to czasu na testowanie tego co wygenerował kompilator.
  • #15 14726993
    karol75
    Poziom 16  
    Ustawianie zegara
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    W asemblerze
    Kod: text
    Zaloguj się, aby zobaczyć kod




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


    Kod: text
    Zaloguj się, aby zobaczyć kod

    Funkcje zapisu i odczytu z pamięci skopiowane żywcem z ASF.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    tego nie ma sensu pokazywać fragmentu pliku lss

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


    I asembler
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Jeszcze schemat
    Xmega128A1U - Jak przekroczyć barierę 64KB w AtmelStudio z GCC 4.8.1?
  • #16 14727241
    Jaca
    Poziom 31  
    Pisałeś w poście #1, że posiadasz pamięć AS7C32096A-10TCN a to jest 256kB x 8 z liniami adresowymi od A0 do A17. Na Twoim schemacie zamiast A15 masz A18. Tylko dlaczego po przekroczeniu 64kB masz "dziurę" a nie po 32kB (A15 adresuje pin A18, którego ta pamięć nie posiada) ?
  • #17 14727299
    karol75
    Poziom 16  
    tak też to zauważyłem.
    Muszę jeszcze raz sprawdzić w domu schemat bo rzeczywiście może problem leży tutaj.
    A może problemem jest to że A16 i A17 są źle podłączone?
    Ale z drugiej strony powinno odczytać błędne wartości a nie odczytywać adresy od 0
  • #18 14727506
    Jaca
    Poziom 31  
    Z A15 nie będzie prawdziwej "dziury" tylko nadpisywanie bloków, np:

    0 - 32767 --> OK
    32768 - 65535 --> nadpisywanie adresów od 0 - 32737
    65536 - 98303 --> OK
    ...

    EDIT:

    A16 i A17 są zamienione miejscami ale dla ciągłości pamięci nie ma to znaczenia.
  • #19 14727613
    karol75
    Poziom 16  
    Jaca napisał:

    A16 i A17 są zamienione miejscami ale dla ciągłości pamięci nie ma to znaczenia.

    Miałem na myśli to że są połączone z ALE1 i ALE2

    nie mam dziur od 0 - 0xFFFF więc nie wiem co jest nie tak, ale sprawdzę płytkę w domu, poczekajmy aż się upewnię.

    Po sprawdzeniu A16,A17 są źle podpięte.
    Zrobiłem płytkę z prawidłowo podłączonymi liniami adresowymi i zobaczę co będzie dalej.
  • #20 14729794
    Jaca
    Poziom 31  
    Są jedynie zamienione miejscami. ;-) Dla trybu SRAM/4PORT/NOALE są tam A16 i A17 a nie ALE1 i ALE2. Dokumentacja, str. 327
  • #21 14729942
    karol75
    Poziom 16  
    To nie jest problem podłączenia
    zrobiłem układ według schematu
    Xmega128A1U - Jak przekroczyć barierę 64KB w AtmelStudio z GCC 4.8.1?

    efekt taki sam.
REKLAMA