Jak rozwiązać błąd overrun w protokole Profibus na AT91SAM7 przy 48MHz?
AT91SAM7 i US0
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
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
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.
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.
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