ARM9 z zewnetrzna wspolna pamiecia programu i danych
Aug 07, 2008 8 Replies
T
tomny
Witam
Mam pytanie do osob, ktore maja doswiadczenie z ARMami 9 z zewnetrzna pamiecia programu. Z powodu duzych f cpu podczas resetu program z zewnetrznego flasha laduje sie do zewnetrznego RAMu i stamtad wykonuje sie program. No i tutaj moje pytanie: czy program bedzie sie wykonywal z pelna predkoscia i odczyt danych nie spowolni wykonywania programu (dodam, ze f cpu = 190MHz, ARM9 ATMELa)? Konkretnie, z jaka f bedzie sie wykonywa³ taki kod:
Didn't find your answer? Ask the community — no account required.
A
Adam Dybkowski
tomny pisze:
Jeżeli takiego kodu nie jest bardzo dużo w jednym kawałku (np. tylko kilka KB albo ciasna pętla, potem skok gdzie indziej) - to jeżeli masz właściwie skonfigurowaną pamięć cache programu - kod powyższy zostanie załadowany z SDRAMu do pamięci cache i wykonany z niej z pełną prędkością procesora. Skompiluj powyższy kawałek i sprawdź, na jakie rozkazy asemblera składa się każda z tych linii. Potem PDF do ręki (o instrukcjach asemblera ARM) i wyczytaj, ile cykli zajmuje każda z tych instrukcji. A jak nie masz tyle zapału to po prostu sprawdź doświadczalnie oscyloskopem.
T
tomny
Jako¶ nie mogê znale¼æ dobrej dokumentacji, w której by³aby informacja o ilo¶ci cykli dla ka¿dej instrukcji.
Jestem na etapie wyboru procka dopiero. A czy wewnêtrzy flash by³by rozwi±zaniem problemu? Co¶ mi sie wydaje, ¿e nie - w koñcu by³by tak samo wolny jak zewnêtrzny i pewnie i tak trzeba by kopiowaæ do RAMu program. Dobrze my¶le?
pozdrawiam tn
T
tomny
No i wystarczy³o napisaæ, ¿e nie mogê znale¼æ i od razu znalaz³em ;)
A
Adam Dybkowski
tomny pisze:
ARM9 z wewnętrznym Flashem? Raczej mało takich jest do wyboru. Ja siedzę tylko w prockach od Atmela więc może u innych producentów jest coś do wyboru. W ARM9 jest wewnętrzna pamięć cache programu i właściwie to nie ma znaczenia, czy coś idzie z RAMu czy z Flasha (opóźniają wykonanie tylko bardzo długie kawałki kodu i skoki poza skeszowany obszar).
T
tomny
atmel ma rodzine SAM9XE, która zapowiada siê bardzo ciekawie i niby jest ju¿ dostêpna, ale chyba jeszcze nie na du¿± skalê. A jak wygl±da sprawa z dataflash? Czy po przeniesieniu programu do RAMu (tutaj chyba nie mo¿na inaczej) mogê wykorzystaæ t± pamiêæ jako pamiêæ danych pod³±czon± poprzez SPI? Oczywi¶cie nie nadpisuj±c programu.
pozdrawiam tn
A
Adam Dybkowski
tomny pisze:
Oczywiście. Bootloader ROMowy szuka twojego softu na początku DataFlasha, jeżeli znajdzie to ładuje do wewn. RAMu od adresu 0 tyle kodu ile trzeba (to się wpisuje linkerem w nieużywanym wektorze przerwań
- patrz opis bootloadera np. AT91SAM9261) i do niego skacze. Nic nie stoi na przeszkodzie, abyś resztę pamięci DF przeznaczył na dowolne inne dane i korzystał z niej normalnie przez SPI.
T
tomny
A da siê za³adowaæ program od razu do zewnêtrznego RAMu je¿eli jest za du¿y czy trzeba samemu napisaæ bootloader, który to zrobi? Jak ju¿ program jest w dataflash to jego zmiana jest mo¿liwa tylko przez JTAG? SAMBA ju¿ przecie¿ siê nie uruchomi.
pozdrawiam tn
A
Adam Dybkowski
tomny pisze:
Bootloader zaszyty w ROMie procesora z założenia ładuje dane do wewnętrznej pamięci SRAM. Przecież nawet nie ma pojęcia co tam na zewnątrz podłączyłeś: czy SRAM, czy SDRAM. Jeżeli masz inne potrzeby to po prostu napisz "mini loader", który trafi po resecie z DataFlasha do wewnętrznego RAMu a potem skonfiguruje odpowiednio pamięć zewnętrzną (czego nie może oczywiście automatycznie zrobić ROMowy bootloader) i doładuje już z pamięci DF co chce i tam gdzie chce. Przy okazji możesz na tym etapie dużo zyskać stosując kompresję ZIP (biblioteka zlib jest całkiem darmowa nawet dla zastosowań komercyjnych - nie jest na GPLu). Zlib zlinkowana z bootloaderem powoduje jego spuchnięcie zaledwie o kilka KB a za to ładowanie reszty z DF może pójść Ci średnio 2x szybciej.
Jeżeli ROMowy bootloader nie znajdzie podłączonej pamięci DF lub stwierdzi, że nie ma tam nic ciekawego (czyta najpierw 32 pierwsze oktety i sprawdza poprawność słowa z długością obrazu do załadowania) - to przechodzi w tryb "terminalowy", umożliwiający wydawanie z peceta komend przez UART na 115200 bps, 8N1 oraz przez USB. Wystarczy, że w swoim projekcie dodasz zworkę/pad/jumper załączający reset pamięci DF a już program sam nie wystartuje. JTAG nie jest konieczny, choć na pewno Ci się przyda prędzej czy później do debugowania.
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.