Jak rozwiązać błąd overrun w protokole Profibus na AT91SAM7 przy 48MHz?

AT91SAM7 i US0





Poprzedni Następny
Wiadomość
Spis treści
From: "artur" <asdfg2_at_nospam_poczta.onet.pl>
Subject: AT91SAM7 i US0
Date: Thu, 3 Nov 2005 13:23:26 +0100


Witam.
Właśnie zaimplementowałem sobie protokół zwany profibusem na AT91SAM7_at_nospam_48MHz.
Z założenia miało to pracować do 6Mb/s i pracuje dopóki program ładuję do
ramu (używam Crossstudio).
Po załadowaniu wszystkiego do flasha(czyli tak, jak ma być docelowo) pojawia
się błąd overrun, czyli wygląda jakby program nie nadążał z odczytywaniem
US0_RHR. Z prostego rachunku wynika, że odebranie 1 bajtu to 88 taktów
zegara, a obsługa przerwania rx zajmuje max ze 40 taktów. Jeśli nie da rady
problemu rozwiązać będę musiał użyć flasha jako loadera i ładować wszystko
do ramu przy starcie. Byłbym wdzięczyny za jakąś podpowiedź.

Artur



Poprzedni Następny
Wiadomość
Spis treści
From: Artur <arcio25_wawa_at_nospam_poczta.onet.pl>
Subject: Re: AT91SAM7 i US0
Date: Thu, 03 Nov 2005 19:08:03 +0100


artur napisał(a):
Po załadowaniu wszystkiego do flasha(czyli tak, jak ma być docelowo) pojawia
się błąd overrun, czyli wygląda jakby program nie nadążał z odczytywaniem
US0_RHR. Z prostego rachunku wynika, Ĺźe odebranie 1 bajtu to 88 taktĂłw
zegara, a obsługa przerwania rx zajmuje max ze 40 taktów.

Nie znam się na ARMach Atmela, ale od razu nasunęła mi się odpowiedź.
Aby się upewnić ściągnąłem sobie 42 stronicowy dokument
,,AT91SAM7S256/128/64/321/32 Preliminary Summary''.

Na pierwszej stronie napisane jest:
,,Single Cycle Access at Up to 30 MHz in Worst Case Conditions'',
ale napisane jest teĹź (linijka niĹźej):
,,Prefetch Buffer Optimizing Thumb Instruction Execution at Maximum Speed''

Z powyższych wnioskuję że wprowadzane są waitstate-y podczas dostępu
do pamięci flash. Jako że twój procek taktowany jest 48MHz, to przy
założeniu że dostęp do flash'a trwa dwa cykle, twój program wykonuje
się tak samo szybko jak gdybyś taktował procesor zegarem 24MHz.

Jeśli dobrze kombinuję, czyli wszystko to co napisałem jest prawdą,
widzę trzy rozwiązania:
1. To które zaproponowałeś, tj. załadowanie kodu do ramu i uruchamiane
go z tamtąd.
2. Uruchomić kod w trybie Thumb (patrz ,,Prefetch Buffer Optimizing
Thumb....'')
3. Zmień procesor na LPC2xxx Philipsa - tam program może pracować
z flasha bez waitstate-Ăłw do 55MHz.

--
Pozdrawiam,
Artur Płatek

Poprzedni Następny
Wiadomość
Spis treści
From: "CodiJack" <jurek_k__at_nospam_poczta.onet.pl>
Subject: Re: AT91SAM7 i US0
Date: Fri, 4 Nov 2005 08:50:22 +0100


Użytkownik "Artur" <arcio25_wawa_at_nospam_poczta.onet.pl> napisał w wiadomości
news:dkdg1v$2j0g$1_at_nospam_node1.news.atman.pl...
...
3. Zmień procesor na LPC2xxx Philipsa - tam program może pracować
z flasha bez waitstate-ów do 55MHz.

Hmm, chyba nie do końca tak jest:

Q: Why does the code run slowly from flash when Philips claims that the chip
runs with nearly zero wait states from flash?

A: On reset, the Memory Accelerator Module (MAM) is disabled but the MAM
Timing register has a reset value of 0x7, which means that 6 wait states are
inserted for every flash access. You need to set it depending upon the
frequency at which you are running. If you are running your application
below or at 20 MHz you can set this register to 0x1, which implies no wait
states.

Pozdrawiam,
CodiJack.



Poprzedni Następny
Wiadomość
Spis treści
From: Adam Dybkowski <adybkows123_at_nospam_amwaw.edu.pl>
Subject: Re: AT91SAM7 i US0
Date: Mon, 14 Nov 2005 22:56:54 +0100


artur wrote:

Właśnie zaimplementowałem sobie protokół zwany profibusem na AT91SAM7_at_nospam_48MHz.
Z założenia miało to pracować do 6Mb/s i pracuje dopóki program ładuję do
ramu (używam Crossstudio).
Po załadowaniu wszystkiego do flasha(czyli tak, jak ma być docelowo) pojawia
się błąd overrun, czyli wygląda jakby program nie nadążał z odczytywaniem

Skompiluj program w trybie Thumb (-mthumb, ew. takze -mthumb-interwork),
ustaw 1ws dla pamięci Flash jak obecnie, a program bez problemu pójdzie
na 48 MHz bez opóźnień (wykorzystany zostanie 1-słowowy "cache"
działający w trybie Thumb). Po szczegóły odsyłam do PDFa, rozdział o
kontrolerze pamięci. Jako miły efekt uboczny binaria programu dodatkowo
się zmniejszą.

--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/

Uwaga: przed wysłaniem do mnie maila usuń "123" z adresu.

Poprzedni Następny
Wiadomość
Spis treści
From: "artur" <asdfg2_at_nospam_poczta.onet.pl>
Subject: Re: AT91SAM7 i US0
Date: Wed, 16 Nov 2005 08:43:16 +0100


Właśnie zaimplementowałem sobie protokół zwany profibusem na
AT91SAM7_at_nospam_48MHz.
Z założenia miało to pracować do 6Mb/s i pracuje dopóki program ładuję
do
ramu (używam Crossstudio).
Po załadowaniu wszystkiego do flasha(czyli tak, jak ma być docelowo)
pojawia
się błąd overrun, czyli wygląda jakby program nie nadążał z
odczytywaniem

Skompiluj program w trybie Thumb (-mthumb, ew. takze -mthumb-interwork),
ustaw 1ws dla pamięci Flash jak obecnie, a program bez problemu pójdzie
na 48 MHz bez opóźnień (wykorzystany zostanie 1-słowowy "cache"
działający w trybie Thumb). Po szczegóły odsyłam do PDFa, rozdział o
kontrolerze pamięci. Jako miły efekt uboczny binaria programu dodatkowo
się zmniejszą.
Dzięki za zainteresowanie.
Wkrótce sprawdzę.
Artur