Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 25 lut 2025, o 04:40


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 13 gru 2014, o 02:40 
Offline
Użytkownik

Dołączył(a): 09 gru 2013
Posty: 103
Pomógł: 3

Witajcie :)

W pamięci RAM zdefiniowany mam bufor:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


w pamięci flash, zdefiniowanych mam pełno tablic typu:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


i podczas działania programu, kopiuję z pamięci flash do naszego buffora w RAMie tablicę w sposób:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Wszystko działa bardzo dobrze, tak jak tego chcę. Problem pojawia się, gdy zajęta pamięć flash przez tablice przekroczy 64KB - do buffora kopiowane są wtedy śmieci.

Wiem, że problem wynika z tego, że wskaźnik na tablicę jest tylko dwubajtowy i nie może wskazywać dalej niż 64KB (0xFFFF).
Poszukuję możliwie prostego i skutecznego sposobu, na ominięcie tego problemu, może ktoś z Was się z tym kiedyś zetknął i mógłby poraczyć cenną wskazówką.

Mikrokontroler to ATmega2561

Pozdrawiam i dziękuję za wszelką pomoc :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2014, o 23:09 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Użyj memcpy_PF (F od far)


Autor postu otrzymał pochwałę

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 gru 2014, o 18:32 
Offline
Użytkownik

Dołączył(a): 09 gru 2013
Posty: 103
Pomógł: 3

Dzięki, właśnie coś o tym słyszałem. Będę musiał więcej poczytać, bo moja biblioteka pgmspace nie udostępnia tej funkcji.
Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 gru 2014, o 18:40 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Zainstaluj atmel toolchain do znalezienia na przykład tutaj:
http://www.mirekk36.blogspot.com/2014/1 ... -luna.html

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 gru 2014, o 22:31 
Offline
Użytkownik

Dołączył(a): 09 gru 2013
Posty: 103
Pomógł: 3

Dzięki, właśnie przymierzam się do przesiadki na Lunę w najbliższym czasie, więc tak myślałem, że to rozwiąże problem.
Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lut 2015, o 16:27 
Offline
Użytkownik

Dołączył(a): 09 gru 2013
Posty: 103
Pomógł: 3

Witajcie,

Nadarzyła się okazja, by zainstalować Eclipsa Lunę i powrócić do starego problemu :)

W ramach przypomnienia:
W pamięci Flash trzymam 45 tablic typu:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Tablice ważą po 3KB każda.

w pamięci RAM mam zdefiniowany bufor:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Problem polega na kopiowaniu z pamięci Flash określonej tablicy do bufora w pamięci RAM.
O ile przy zadeklarowanych tylko około 20 tablicach, realizuję to w sposób następujący:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


o tyle, kiedy zadeklaruję więcej tablic, wyczerpuję zakres wskaźnika 16 bitowego.

Zgodnie z sugestią kolegi Krauser, zamieniłem wszystkie wystąpienia funkcji
Kod:
memcpy_P
na
Kod:
memcpy_PF
w sposób następujący:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Niestety w tym przypadku dostaję warningi typu:

Kod:
./config.o:(.progmem.gcc_sw_table.load_bitmap+0x0): warning: internal error: out of range error


albo podczas wgrywania wsadu dostaję:

Kod:
avrdude: verifying ...
avrdude: verification error, first mismatch at byte 0x0000
         0x0c != 0x00
avrdude: verification error; content mismatch


i program się zawiesza.
(gdy zmniejszę liczbę tablic do 64KB jest ok)

Proszę o pomoc.
Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO