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



Teraz jest 25 mar 2026, o 12:17


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 25 ] 
Autor Wiadomość
PostNapisane: 17 lut 2015, o 10:33 
Offline
Użytkownik

Dołączył(a): 01 mar 2014
Posty: 117
Lokalizacja: Kraków
Zbananowany użytkownik

Pomógł: 1

Witam,
chcę wykorzystać wspomniane biblioteki do obsługi czcionek dla ekranu LCD (640x480 1 bit). Mam już swoje funkcje realizujące zapalanie i gaszenie pojedynczych pikseli (rysowanie figur geometrycznych to już formalność).

Na razie mam jednak problem z kompilacją czystego przykładu z płyty, ponieważ pracuję na Atmel Toolchain i pojawiają się pewne niezgodności w kodzie. Rozumiem, że gdzieniegdzie powinienem zamienić "extern" na "const", ale jeżeli zrobię to wszędzie, to pojawia mi się pełno warningów;) Jak to ugryźć?

Cytuj:
'Building file: ../PetitFS/pff.c'
'Invoking: AVR Compiler'
avr-gcc -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega32 -DF_CPU=18432000UL -MMD -MP -MF"PetitFS/pff.d" -MT"PetitFS/pff.d" -c -o "PetitFS/pff.o" "../PetitFS/pff.c"
../PetitFS/pff.c: In function 'get_fat':
../PetitFS/pff.c:87:3: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
../PetitFS/pff.c:92:3: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
../PetitFS/pff.c:96:3: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
../PetitFS/pff.c: In function 'pf_mount':
../PetitFS/pff.c:479:5: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
'Finished building: ../PetitFS/pff.c'
' '
'Building file: ../MK_SSD1963/TFT_TEXT/mk_text.c'
'Invoking: AVR Compiler'
avr-gcc -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega32 -DF_CPU=18432000UL -MMD -MP -MF"MK_SSD1963/TFT_TEXT/mk_text.d" -MT"MK_SSD1963/TFT_TEXT/mk_text.d" -c -o "MK_SSD1963/TFT_TEXT/mk_text.o" "../MK_SSD1963/TFT_TEXT/mk_text.c"
In file included from ../MK_SSD1963/TFT_TEXT/../TFT_GRAPH/tft_graph.h:8:0,
from ../MK_SSD1963/TFT_TEXT/../MK_SSD1963.h:8,
from ../MK_SSD1963/TFT_TEXT/mk_text.c:13:
../MK_SSD1963/TFT_TEXT/../TFT_GRAPH/../TFT_FONT/mk_fonts.h:39:13: error: variable 'FontNames' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
../MK_SSD1963/TFT_TEXT/mk_text.c: In function 'text_len':
../MK_SSD1963/TFT_TEXT/mk_text.c:251:10: warning: variable 'gH' set but not used [-Wunused-but-set-variable]
../MK_SSD1963/TFT_TEXT/mk_text.c: In function 'text_len_P':
../MK_SSD1963/TFT_TEXT/mk_text.c:273:10: warning: variable 'gH' set but not used [-Wunused-but-set-variable]
make: *** [MK_SSD1963/TFT_TEXT/mk_text.o] Błąd 1


Jeżeli uda mi się skompilować standardowy przykład dla SSD1963, to będę miał prośbę o pomoc w dostosowaniu bibliotek do mojego ekranu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lut 2015, o 16:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 kwi 2014
Posty: 438
Lokalizacja: Zambrów
Pomógł: 22

kudzu napisał(a):
Rozumiem, że gdzieniegdzie powinienem zamienić "extern" na "const", ale jeżeli zrobię to wszędzie, to pojawia mi się pełno warningów;)

Ja to specjalistą nie jestem, ale extern z const nie ma nic wspólnego i nie powinno się ich zamieniać. Extern według mnie powinien zostać, a const trzeba dostawić do zmiennych, tablic itp, które są umieszczanie we FLASHu.

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lut 2015, o 19:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 sty 2013
Posty: 426
Pomógł: 36

Extern zezwala na wykorzystanie zmiennej poza plikiem, w którym się znajduje.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lut 2015, o 21:54 
Offline
Użytkownik

Dołączył(a): 01 mar 2014
Posty: 117
Lokalizacja: Kraków
Zbananowany użytkownik

Pomógł: 1

misiulu napisał(a):
Ja to specjalistą nie jestem, ale...

Heh, cwany jesteś;) Zaczynasz tak każdy post, a potem okazuje się, że masz rację:P

Fakt, pomyliłem pojęcia. Skompilowało się, choć teraz mam mnóstwo ostrzeżeń typu:

Cytuj:
../main.c:500:2: warning: passing argument 4 of 'tft_bitmap_from_file' discards 'const' qualifier from pointer target type [enabled by default]


Generalnie tak to jest, jak człowiek zajmuje się tym, na co tak na prawdę nie ma czasu:/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lut 2015, o 15:23 
Offline
Użytkownik

Dołączył(a): 01 mar 2014
Posty: 117
Lokalizacja: Kraków
Zbananowany użytkownik

Pomógł: 1

Pierwsze sukcesy z moim LCD za mną, z czego jestem mega zadowolony:D
ObrazekObrazek

Zdjęcia podłej jakości, ale w tej chwili słońce świeci, nie mam podświetlenia ekranu i stoi w niedogodnym miejscu nie wadzącym żonie i nie kuszącym córki:>
Widoczne ramki szerokości 1pix rysowane są funkcjami graficznymi, a wzór ADC wgrany jest z bitmapy.

Ale mam teraz prośbę o pomoc w pozbyciu się mnóstwa ostrzeżeń;)
Cytuj:
passing argument 1 of 'get_from_flash' makes integer from pointer without a cast [enabled by default]

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

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

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

co opatrzone jest ostrzeżeniem:
Cytuj:
passing argument 3 of 'lcd_draw_bitmap' discards 'const' qualifier from pointer target type [enabled by default]

a użyta bitmapa zdefiniowana jest tak (fragment oczywiście):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jest jeszcze wiele innych "łornów", ale lepiej po kolei...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lut 2015, o 16:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 kwi 2014
Posty: 438
Lokalizacja: Zambrów
Pomógł: 22

W pierwszym przypadku jest to ostrzeżenie kompilatora, że ze wskaźnika (adres w pamięci) jest robione niejawne rzutowanie do liczby unsigned long. Kompilator chce wiedzieć, że ta czynność jest zamierzona a nie przypadkowa więc można to rozwiązać na dwa sposoby.

1. W miejscu gdzie masz funkcję get_from_flash i przekazujesz tam argument w postaci adresu do tablicy &glyph[idx++] zrobić jawne rzutowanie do unsigned long, czyli tak
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


2. Zmienić argument funkcji get_from_flash na wskaźnik zamiast liczby czyli
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W tym przypadku trzeba by sprawdzić czy funkcja będzie prawidłowo działać.

Drugie ostrzeżenie jest związane z brakiem "const". Ponieważ do tablicy przetrzymywanej we FLASHu dodałeś je, a zapomniałeś o funkcji gdzie ta tablica jest przekazywana dlatego do "unsigned char * glyph" trzeba dodać const.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Autor postu otrzymał pochwałę

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lut 2015, o 22:19 
Offline
Użytkownik

Dołączył(a): 01 mar 2014
Posty: 117
Lokalizacja: Kraków
Zbananowany użytkownik

Pomógł: 1

misiulu napisał(a):
Drugie ostrzeżenie jest związane z brakiem "const". Ponieważ do tablicy przetrzymywanej we FLASHu dodałeś je, a zapomniałeś o funkcji gdzie ta tablica jest przekazywana dlatego do "unsigned char * glyph" trzeba dodać const.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Miałeś rację. Tutaj sprawa załatwiona.

misiulu napisał(a):
1. W miejscu gdzie masz funkcję get_from_flash i przekazujesz tam argument w postaci adresu do tablicy &glyph[idx++] zrobić jawne rzutowanie do unsigned long, czyli tak
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Niestety to nie załatwia sprawy:
Cytuj:
cast from pointer to integer of different size [-Wpointer-to-int-cast]


misiulu napisał(a):
2. Zmienić argument funkcji get_from_flash na wskaźnik zamiast liczby czyli
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W tym przypadku trzeba by sprawdzić czy funkcja będzie prawidłowo działać.

A tu jeszcze gorzej:
Cytuj:
conflicting types for 'get_from_flash'

Cytuj:
comparison between pointer and integer [enabled by default]

Cytuj:
overflow in implicit constant conversion [-Woverflow]


Ale wiem już w czym rzecz - będę szukał rozwiązania i czytał:) Dziękuję za pomoc!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lut 2015, o 22:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 kwi 2014
Posty: 438
Lokalizacja: Zambrów
Pomógł: 22

Spróbuj wstawić tylko tak i zobaczy czy będzie działało poprawnie
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lut 2015, o 22:59 
Offline
Użytkownik

Dołączył(a): 01 mar 2014
Posty: 117
Lokalizacja: Kraków
Zbananowany użytkownik

Pomógł: 1

misiulu napisał(a):
Spróbuj wstawić tylko tak i zobaczy czy będzie działało poprawnie
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Sieczka.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lut 2015, o 23:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 kwi 2014
Posty: 438
Lokalizacja: Zambrów
Pomógł: 22

ehhh to trzeba szukać dalej :P niestety jestem poza domem i z głowy strzelam (a dokładniej jakiś kompilator w c online znalazłem przed chwilą i tam przeszło ładnie i wypisało wartość tablicy). No nic w poniedziałek będę w domu to sprawdzę w eclipsiku to dojdzie się w czym problem :)

------------------------ [ Dodano po: 39 minutach ]

Jeszcze raz sprawdziłem i w tym online kompilatorze działa taki kod, który powoduje taki sam warning jak u Ciebie
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

warning: passing argument 1 of 'get_from_flash' makes integer from pointer without a cast get_from_flash( &glyph[1] );

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

ostrzeżenie znika i program wypisuje ładnie adres w pamięci.

Działa też drugi 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.

Tylko zapomniałem wtedy dodać, że jawne rzutowanie jest na tryb wskaźnikowy
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Ale to działa w tym kompilatorze online.

Także zobacz na ten kod powyżej i powstawiaj const bo niby ten adres jest używany później w do odczytu danych z FLASHa za pomocą pgm_read_byte... i może coś uda się sklecić :>

Jak dalej to samo będzie, czyli sieczka to trzeba pokombinować będzie już w konkretnym środowisku w eclispie :)

------------------------ [ Dodano po: 49 minutach ]

kudzu napisał(a):
Niestety to nie załatwia sprawy:
Cytuj:
cast from pointer to integer of different size [-Wpointer-to-int-cast]

Teraz tak mi przyszło do głowy, że mogą być inne długości adresów pamięci. Normalnie w AVR 8 bitowych chyba wskaźnik jest 16 bitowy, a powyżej 64kB FLASH dokładany jest jeden BAJT i wtedy jest 24 bity. Dlatego ten pierwszy jest odczytywany za pomocą funkcji pgm_read_byte, a ten dłuższy pgm_read_byte_far. Typ unsigned long jest 32 bitowy więc dlatego kompilator ostrzega o różnej długości. Na kompie PC w tym kompilatorze online wszystkie wskaźniki mogą być 32 bitowe lub więcej więc może dlatego nie ma ostrzeżenia.

No ale mogę zupełnie gadać głupoty hehe. No ale może przynajmniej do czegoś dojdziemy i się nauczymy jak jest poprawnie :P
Dobra idę spać bo na oczy ledwo widzę :D

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 08:33 
Offline
Użytkownik

Dołączył(a): 01 mar 2014
Posty: 117
Lokalizacja: Kraków
Zbananowany użytkownik

Pomógł: 1

Dzięki Ci bardzo za tak duże zaangażowanie! Też się wcześniej położyłem, bo mamy z żoną ciężkie noce ostatnio przez górne czwórki młodej;) Usiądę wieczorem (bo czas na kompa mam dopiero po dobranocce) i przeanalizuję, co napissłeś.
Najgorsze jest to, że po każdej zmianie muszę pamiętać o wyczyszczeniu projektu, bo jeśli tego nie zrobię, to Eclipse zaponina o błędach, kiedy ja wiem, że nawet nie powinien poprawnie skompilować.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 10:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 kwi 2014
Posty: 438
Lokalizacja: Zambrów
Pomógł: 22

Się zagalopowałem :) W funkcji get_from_flash nie potrzeba tych constów bo przecież to jest już adres do zmiennej :)

kudzu napisał(a):
Dzięki Ci bardzo za tak duże zaangażowanie!

A nie ma problemu :) Mi tu na forum też pomagają i to tak jak umieją ( nie każdy jest niemylącym się śpecem :P ). Najważniejsze, że przy okazji się wszyscy uczymy, czy to pomagający, czy Ci pomagani hehe.

kudzu napisał(a):
Usiądę wieczorem (bo czas na kompa mam dopiero po dobranocce)

Z jednej strony współczuję, ale z drugiej zazdroszczę bo już z moją kobietą też chcielibyśmy założyć rodzinkę, a nie mamy na razie gdzie :(

Cytuj:
Najgorsze jest to, że po każdej zmianie muszę pamiętać o wyczyszczeniu projektu, bo jeśli tego nie zrobię, to Eclipse zaponina o błędach, kiedy ja wiem, że nawet nie powinien poprawnie skompilować.

Czasem też mi się tak działo, ale w Lunie już bardzo rzadko. Nie masz czasem jakiejś starszej wersji eclipsa?

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 11:19 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

kudzu napisał(a):
cast from pointer to integer of different size [-Wpointer-to-int-cast]

Makro pgm_get_far_address powinno załatwić sprawę. Tu więcej na ten temat: http://forum.atnel.pl/topic9810.html


Autor postu otrzymał pochwałę

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 12:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 kwi 2014
Posty: 438
Lokalizacja: Zambrów
Pomógł: 22

xor napisał(a):
Makro pgm_get_far_address powinno załatwić sprawę. Tu więcej na ten temat: topic9810.html

O matko ale z nas kudzu ..... Sami w tym wątku co podał xor dochodziliśmy co i jak i właśnie wykorzystaliśmy te makro do pobierania adresu bo mieliśmy te same problemy co teraz mamy z tym przekazaniem adresu do tej funkcji get_from_flash() :P

Ehh pamięć jest zawodna hehe, dzięki xor za pomoc i przypomnienie :)

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


Aż zainstalowałem eclipsa na tym kompie, aby sprawdzić czy nie będzie warningów hehe
Wygląda na to, że powinno śmigać...

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 22:52 
Offline
Użytkownik

Dołączył(a): 01 mar 2014
Posty: 117
Lokalizacja: Kraków
Zbananowany użytkownik

Pomógł: 1

misiulu napisał(a):
O matko ale z nas kudzu ..... Sami w tym wątku co podał xor dochodziliśmy co i jak i właśnie wykorzystaliśmy te makro do pobierania adresu bo mieliśmy te same problemy co teraz mamy z tym przekazaniem adresu do tej funkcji get_from_flash() :P

Nie dziwię się sobie, że nie powiązałem tych wątków;) Treści ostrzeżeń są dla mnie kosmiczne.
misiulu napisał(a):
dzięki xor za pomoc i przypomnienie :)

Otóż to!
misiulu napisał(a):
Wygląda na to, że powinno śmigać...

I śmiga:) DZIĘKUJĘ ZA POMOC! Muszę na spokojnie przeanalizować nasze działania, bo nie wszystko do końca rozumiem. Będę chciał też wrzucić "pgm_get_far_address()" do ciała funkcji "get_from_flash()", żebym nie musiał pamiętać o dopisywaniu tego za każdym razem przed argumentem.

misiulu napisał(a):
kudzu napisał(a):
Usiądę wieczorem (bo czas na kompa mam dopiero po dobranocce)

Z jednej strony współczuję, ale z drugiej zazdroszczę bo już z moją kobietą też chcielibyśmy założyć rodzinkę, a nie mamy na razie gdzie :(

Wynajmuję 40m2 (jedna izba z sienią i wychodkiem;) ) i bardzo sobie chwalę - zbliża rodzinę:]
misiulu napisał(a):
kudzu napisał(a):
Najgorsze jest to, że po każdej zmianie muszę pamiętać o wyczyszczeniu projektu, bo jeśli tego nie zrobię, to Eclipse zaponina o błędach, kiedy ja wiem, że nawet nie powinien poprawnie skompilować.

Czasem też mi się tak działo, ale w Lunie już bardzo rzadko. Nie masz czasem jakiejś starszej wersji eclipsa?

Lunę.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lut 2015, o 09:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 kwi 2014
Posty: 438
Lokalizacja: Zambrów
Pomógł: 22

kudzu napisał(a):
Będę chciał też wrzucić "pgm_get_far_address()" do ciała funkcji "get_from_flash()", żebym nie musiał pamiętać o dopisywaniu tego za każdym razem przed argumentem.

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

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

Daj znać czy będzie działać :)
kudzu napisał(a):
Wynajmuję 40m2 (jedna izba z sienią i wychodkiem;) ) i bardzo sobie chwalę - zbliża rodzinę:]

Muszę spróbować, zawsze to krok naprzód :>

_________________
.



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

Dołączył(a): 01 mar 2014
Posty: 117
Lokalizacja: Kraków
Zbananowany użytkownik

Pomógł: 1

kudzu napisał(a):
misiulu napisał(a):
Wygląda na to, że powinno śmigać...

I śmiga:) DZIĘKUJĘ ZA POMOC! Muszę na spokojnie przeanalizować nasze działania, bo nie wszystko do końca rozumiem. Będę chciał też wrzucić "pgm_get_far_address()" do ciała funkcji "get_from_flash()", żebym nie musiał pamiętać o dopisywaniu tego za każdym razem przed argumentem.


Nie wiem dlaczego wcześniej wydawało mi się, że działało, bo teraz nie działa ta metoda:

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

dostaję w konsoli coś takiego:

Cytuj:
lcd_graph.c:(.text.lcd_draw_bitmap+0x34): undefined reference to `r30'
lcd_graph.c:(.text.lcd_draw_bitmap+0x36): undefined reference to `r30'
lcd_graph.c:(.text.lcd_draw_bitmap+0x38): undefined reference to `r30'
collect2.exe: error: ld returned 1 exit status

Ale oczywiście znowu męczymy się z tym samym problemem, który zadzióbaliśmy już we wspomnianym wcześniej wątku, ponieważ przecież:
GET_FAR_ADDRESS macro has many limitations. It requires a compile-time known constant address (that's the reason to fail when the array element is accesed using a variable index) and operates at run-time (that's the reason why GET_FAR_ADDRESS it's not allowed to be used in variable initializations for const, flash, and generally for any static storage).

Takie rozwiązanie nie ma prawa działać;) Ale wpadłem na to dopiero teraz, więc zaraz spróbuję pomęczyć Twoją ostatnią propozycję, która w obecnej formie zgłasza podobny problem, ale w odniesieniu do 'r26'. Akurat mam 2 godziny na myślenie, bo jadę z Opola do Krakowa, a mam kierowcę:>



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lut 2015, o 14:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 kwi 2014
Posty: 438
Lokalizacja: Zambrów
Pomógł: 22

Masz racje jak mam te makro wewnątrz funkcji to pojawiają się błędy w konsoli.

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


Więc chyba trzeba będzie pamiętać o dopisywaniu tego makra :P

Co do limitacji to wiem, ale jakby to co napisali sprawdzało się w 100% to ten przykład w innym wątku co próbowałeś wyświetlić bitmapę by nie działał, a jednak wyświetla je poprawnie, a te makro w kodzie jest przez Ciebie użyte.

------------------------ [ Dodano po: 18 minutach ]

Same tylko umieszczenie tego marka pgm_get_far_address w funkcji get_from_flash i pewnie każdej innej oprócz main powoduje wypisanie błędów w konsoli podobnych do tych które przytoczyłeś. Także wychodzi na to, że poza main nie można tego stosować.

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lut 2015, o 14:56 
Offline
Użytkownik

Dołączył(a): 01 mar 2014
Posty: 117
Lokalizacja: Kraków
Zbananowany użytkownik

Pomógł: 1

misiulu napisał(a):
Co do limitacji to wiem, ale jakby to co napisali sprawdzało się w 100% to ten przykład w innym wątku co próbowałeś wyświetlić bitmapę by nie działał, a jednak wyświetla je poprawnie, a te makro w kodzie jest przez Ciebie użyte.

Mhmmmm, tylko zauważ, że wcześniej sprawdziłem adres konkretnego, pierwszego elementu tablicy:

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

a dopiero potem sprawdzałem czy każdy następny element przypadkiem nie przekracza magicznej granicy adresów:

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

Niestety dojeżdżam już do Krakowa i choć mam jeszcze 3 godziny baterii, to muszę odłożyć analizę Twojego kodu na wieczór.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lut 2015, o 20:09 
Offline
Użytkownik

Dołączył(a): 01 mar 2014
Posty: 117
Lokalizacja: Kraków
Zbananowany użytkownik

Pomógł: 1

misiulu napisał(a):
Same tylko umieszczenie tego marka pgm_get_far_address w funkcji get_from_flash i pewnie każdej innej oprócz main powoduje wypisanie błędów w konsoli podobnych do tych które przytoczyłeś. Także wychodzi na to, że poza main nie można tego stosować.


Ja myślę, że wynika to bezpośrednio z tego:

Cytuj:
It requires a compile-time known constant address (that's the reason to fail when the array element is accesed using a variable index)

Zauważ, że w Twoim przykładzie:

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


czyli makro pgm_get_far_address dostaje mimo funkcji for i zmiennej index konkretne dane, bo wcześniej przypisałeś do zmiennej glyph tablicę z danymi. Tak to sobie tłumaczę;)
Ja cały czas próbuję zrobić uniwersalną funkcję, do której będę mógł podstawić różne obrazki z pamięci flash.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lut 2015, o 22:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 kwi 2014
Posty: 438
Lokalizacja: Zambrów
Pomógł: 22

kudzu napisał(a):
Ja cały czas próbuję zrobić uniwersalną funkcję, do której będę mógł podstawić różne obrazki z pamięci flash.

No raczej nie da się tego zrobić w "standardowy" sposób, aby kompilator nie krzyczał przynajmniej warninga, bo nie można jak widać umieścić tego makra w funkcji. Jednak jak bardzo chcesz nie pisać go za każdym wywołaniem to można do tego podejść troszkę inaczej i wspomóc się po prostu innym makrem :D

Do wcześniejszego kodu dodajesz po prostu definicję:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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


Takie coś rozwiązałoby chyba nasze wszystkie problemy :D

Oczywiście cała ta zabawa z tą funkcją ma sens jeżeli używasz procka z >64k FLASH. Poniżej tej wartości można by było zmienić samo makro na funkcję odczytująca bezpośrednio z pamięci FLASH:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Wtedy w kodzie wywołanie samego makra wyglądałoby tak samo jak wcześniej. A można by usunąć funkcję i poprzednie makro co by trochę FLASH zaoszczędziło. Ewentualnie można sobie w tej biblioteczce gdzie tę funkcję umieszczasz zrobić warunkowe kompilowanie i tylko wybierać czy masz procka >64k czy nie i odpowiednio skompiluje się albo jedna wersja albo druga :D

Daj znać czy działa :)

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lut 2015, o 00:00 
Offline
Użytkownik

Dołączył(a): 01 mar 2014
Posty: 117
Lokalizacja: Kraków
Zbananowany użytkownik

Pomógł: 1

misiulu napisał(a):
Oczywiście cała ta zabawa z tą funkcją ma sens jeżeli używasz procka z >64k FLASH. Poniżej tej wartości można by było zmienić samo makro na funkcję odczytująca bezpośrednio z pamięci FLASH:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Używam, ale ponieważ w tej chwili zapełniłem flash w 25%, a chciałbym pobawić się też innymi elementami, zrezygnowałem z funkcji get_from_flash() i drę bezpośrednio przez pgm_read_byte() :>

Efekty mojej zabawy:

Obrazek

Duża czcionka to 150pt :> Pierwszy napis z efektem przezroczystości, drugi bez tego efektu; na samej górze malutki tekst 14ką. Tło złożone z obrazków 128x96.
Ten zegarek to oczywiście symulacja w ramach testowania fontów. Ale już jedzie do mnie DS3231 :D

Jak tylko znajdę chwilę na sekcję zdjęciową, to pokuszę się o wątek w DIY. Najpewniej w formie bloga, bo całość jest mocno prototypowa.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lut 2015, o 00:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 kwi 2014
Posty: 438
Lokalizacja: Zambrów
Pomógł: 22

kudzu napisał(a):
Efekty mojej zabawy:

No ładnie ładnie :) Może ja kiedyś też coś z graficznymi se porobię, szczególnie po przeczytaniu twego DIY o tym jak to się robi :D

No, a mógłbyś wgrać dla testu kilka bitmap i sprawdzić, czy dzięki temu makru ta funkcja będzie działać dobrze? Tak na przyszłość byłoby wiadomo :)

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lut 2015, o 07:20 
Offline
Użytkownik

Dołączył(a): 01 mar 2014
Posty: 117
Lokalizacja: Kraków
Zbananowany użytkownik

Pomógł: 1

misiulu napisał(a):
Może ja kiedyś też coś z graficznymi se porobię, szczególnie po przeczytaniu twego DIY o tym jak to się robi :D


Nie kpij;P
misiulu napisał(a):
No, a mógłbyś wgrać dla testu kilka bitmap i sprawdzić, czy dzięki temu makru ta funkcja będzie działać dobrze?


Si, mógłbym. Chętnie się z tym jeszcze pomęczę:)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lut 2015, o 11:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 kwi 2014
Posty: 438
Lokalizacja: Zambrów
Pomógł: 22

kudzu napisał(a):
Nie kpij;P

Poważnie :D Jedyny wyświetlacz jaki na razie obsługiwałem to 2x16 na hd44789 :D Mam jakiś COG i od nokii 3310, ale jeszcze nie miałem czasu i okazji za nie się zabrać. Mam w planach :D

Również, nie programowałem AVRka żadnego powyżej 64k FLASHu. Nie mam nawet takiego hehe. Ale w przyszłości może będę miał więc to co robimy tutaj przyda się na pewno później jak nie komuś to nam ;P

kudzu napisał(a):
Si, mógłbym. Chętnie się z tym jeszcze pomęczę:)

Ślicznie dziękuję. Nie pali się również z tym. Jestem po prostu ciekawy czy zbudowaliśmy razem coś funkcjonującego poprawnie :D

_________________
.



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: 25 ] 

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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO