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



Teraz jest 19 kwi 2024, o 21:45


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 52 ]  Przejdź na stronę 1, 2  Następna strona
Autor Wiadomość
PostNapisane: 7 cze 2016, o 23:24 
Offline
Nowy

Dołączył(a): 31 mar 2014
Posty: 9
Lokalizacja: Warszawa
Pomógł: 0

Witam wszystkich.
Mam problem z wykorzystaniem pamięci FLASH. Napisałem program który po wystąpieniu pewnych "czynników" zewnętrznych powinien wysłać pewną ilość znaków przez UART ( a dokładniej na magistralę 485, ale z wykorzystaniem UARTU). Procesor jaki użyłem to ATTiny2313A. Ponieważ w trakcie pisania zwiększała się ilość różnych tekstów do wysyłki postanowiłem przenieść je do pamięci programu - mam tam trochę wolnego miejsca, a RAM malutki.
Używam środowiska Eclipse MARS zainstalowanego zgodnie z poradnikiem P. Mirka.
Kiedy wysyłałem dane umieszczone w tablicy w pamięci RAM program wykonywał się prawidłowo. Kiedy wpisałem go (a przynajmniej wydawało mi się, że go tam wpisałem) do pamięci programu przestał działać. Po prostu nic nie wysyła. Aby zminimalizować błędy których mogłem narobić dużo i nie zakopać się w poszukiwaniu błędu który może być w innej części programu napisałem coś bardzo prostego. I tu ciekawostka (dla mnie) to też działa źle. Poniżej listing

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


Na początku po dołączeniu bibliotek mam dwie deklaracje zmiennych poprzedzone volatile - wiem, że nie jest to potrzebne w tym programie, ale wstawiłem, aby się nie zastanawiać czy tu nie ma błędu. Potem tablica z poleceniem wpisania do pamięci - wydaje mi się, że jest ok. Wszystkie przykłady pokazują dokładnie taki sposób zapisu.
W pętli głównej programu najpierw wysyłam znaki klasycznie, najprościej (może nieoptymalnie, ale ...) i to działa, wysyła się.
Potem jest prosta pętla, która powinna wysyłać znaki na dwa sposoby - z wykorzystaniem dodatkowej zmiennej - jeden_znak i drugi sposób bezpośrednio odczytać i wysłać. Chciałem w ten sposób upewnić się , czy któraś z tych metod jest lepsza i zadziała. I nie działa żadna.
Co ciekawe - zajrzałem do pliku TEST.lss i ku mojemu zdziwieniu nigdzie nie znalazłem tekstu do wysłania?
Według mnie powinien być tam jawnie z podaniem adresu pod jaki się znajduje.
Spróbowałem też dodania drugiej tablicy z inną formą zapisu danych do wysłania - pod tablicą alarm_tekst wstawiłem drugą:
const char alarm_tekst2[] PROGMEM={"Marek test"};
po skompilowaniu (ani teraz ani za pierwszym razem kompilator nic nie mówił o błędach czy ostrzeżeniach)
ku mojemu zdziwieniu w pliku .lss pojawiła się pierwsza tablica:
32: 73 74 andi r23, 0x43 ; 67
...

00000035 <alarm_tekst>:
35: fe 00 07 41 01 01 00 00 03 01 00 4c 00 ...A.......L.


00000042 <__ctors_end>:
42: 11 24 eor r1, r1
Ale drugiej nie ma? Pomyślałem, że wyciął ją kompilator, bo nie ma do niej żadnego odwołania, więc zmieniłem trochę kod:
uart_putc (alarm_tekst2[i]);
I dalej nic nie ma w pliku .lss i nie działa. Dodatkowo nie bardzo mogę znaleźć w pliku .lss miejsce w którym program czyta z pamięci FLASH.
Czy ktoś ma jakieś doświadczenia? Wydaje mi się, że robię jakiś duży błąd, albo coś mam nie tak z instalacją Eclipsa, ale napisałem kilka prostych programów z wykorzystaniem wyświetlaczy LCD, Uartów i jakoś nic złego się nie działo.

Pozdrawiam
MarekB



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 cze 2016, o 02:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Żadne volatile nie jest tutaj potrzebne. Zobacz kiedy jest: http://mirekk36.blogspot.co.uk/2011/08/test.html
Nie za bardzo rozumiem, co znajduje się w twojej tablicy alarm_tekst[]? Jakie znaki ona zawiera? Piszesz coś o wyświetleniu napisu "Marek test", a znaki są zupełnie inne. Nie wiem po co używasz ASCII w hex (zobacz sposób pierwszy).
Masz przecież gotową funkcję uart_puts_P() do tego celu. ;) (sposób drugi - tablica musi zawierać na końcu znak null, czyli koniec stringa)
Sposób trzeci to chyba to co próbowałeś napisać. Sposób czwarty to to samo tylko wrzucone w funkcję, dzięki czemu możesz jako jej argumenty podać tablicę i podać ile znaków chcesz wyświetlić z tej tablicy.

Myślę, że kawałek kodu wytłumaczy wszystko: ;)

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


Sprawdź sobie rożne "sposoby" i w razie czego pytaj.
Nie wiem jakie masz wydanie książki, dlatego warto odwiedzić tą stronę:
http://atnel.pl/uaktualnienia-programow-do-dvd.html



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 cze 2016, o 20:43 
Offline
Nowy

Dołączył(a): 31 mar 2014
Posty: 9
Lokalizacja: Warszawa
Pomógł: 0

Bardzo dziękuję, za szybką i wyczerpującą reakcję. Sprawdziłem - działa.
Jedyne uwagi to:
1.wiem, że specyfikator volatile nie był tu potrzebny, ale w oryginalnym programie potrzebuję w przerwaniu ustawić od którego znaku mam wysyłać do bufora nadawczego. Potrzebuję też sprawdzić ostatni znak nadany (po pewnym czasie od zakończenia, przed ponownym nadawaniem) stąd volatile. Kopiowałem z programu tylko to co mi było potrzebne do krótkiego programu testowego i zostało.
2.Sposób pierwszy jak napisałem wykorzystuję i działa, ale w tym momencie potrzebuję trzy tablice po 120 znaków i na dokładkę będę wysyłał z każdej z nich paczki po 12 znaków (0-11, 12-23 itd) dlatego sposób z wysyłaniem z RAMu odpada
3. Sposób 2 nie działa, bo pomimo posiadania BB na płycie nie znalazłem biblioteki z funkcją uart_puts_P. Mój kompilator obraził się na mnie przy próbie jej wykorzystania
4.Znaki jakie wysyłam są w listingu. O znakach ASCII piszę później, dodałem drugą tablicę z czytelnym tekstem aby łatwiej znaleźć ją w kodzie programu - szukałem w wersji asemblerowej w pliku .lss. Wszystko co wysyłam to hex - zwróć uwagę, że wtedy nie mogę przy wysyłaniu kierować się ostatnim znakiem NULL, bo w moich tablicach do wysyłki to najczęściej spotykany znak :-(
5.Proszę również o informację dlaczego to co napisałem nie działa - gdzie popełniam błąd. Do tej pory nie używałem pamięci FLASH do przechowywania stałych (nie było potrzeby). Przeglądając internetowe przykłady znalazłem taką składnię i ją użyłem.

Ale ponieważ to co otrzymałem (szczególnie sposób 4) działa i dokładnie robi to co potrzebuję bardzo dziękuję. Przeanalizowałem sobie ten sposób - przeczytałem odpowiedni kawałek BB i przynajmniej wiem, dlaczego działa.

Pozdrawiam
MarekB



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 cze 2016, o 01:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

MarekB2010 napisał(a):
Proszę również o informację dlaczego to co napisałem nie działa - gdzie popełniam błąd.

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

Czyli to co napisałeś też będzie działało, ale powinno wyglądać np tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

MarekB2010 napisał(a):
potrzebuję trzy tablice po 120 znaków i na dokładkę będę wysyłał z każdej z nich paczki po 12 znaków (0-11, 12-23 itd)

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

MarekB2010 napisał(a):
Sposób 2 nie działa, bo pomimo posiadania BB na płycie nie znalazłem biblioteki z funkcją uart_puts_P.

A w GB patrzyłeś? ;)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 cze 2016, o 16:47 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Wiem, że problem już rozwiązany. Ja bym jednak gorąco namawiał, aby do umieszczania danych w pamięci flash używać kwalifikatora __flash, dostępnego już od dłuższego czasu w toolchain'ach Atmela (https://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Named-Address-Spaces.html). To naprawdę upraszcza kod, gdyż nie potrzeba używać funkcji pgm_read_xxx() do odczytu danych.

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


Przykładowo, powyższy problem można by rozwiązać mniej więcej tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Oczywiście to tylko przykład, w celu przedstawienia działania kwalifikatora __flash. W rzeczywistości można to rozwiązać na wiele różnych sposobów w zależności od potrzeb i ogólnej koncepcji programu.

Pozdrawiam i mam nadzieję, że kolega anshar nie poczuje się urażony, że się wtrąciłem.

Edytowano:
MarekB2010 napisał(a):
Wszystko co wysyłam to hex - zwróć uwagę, że wtedy nie mogę przy wysyłaniu kierować się ostatnim znakiem NULL, bo w moich tablicach do wysyłki to najczęściej spotykany znak

Jako że wcześniej nie doczytałem dokładnie, więc jeszcze jeden kod, aby można było przetestować przesyłanie danych binarnych:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Ostatnio edytowano 10 cze 2016, o 05:38 przez andrews, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 cze 2016, o 21:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

andrews napisał(a):
Pozdrawiam i mam nadzieję, że kolega anshar nie poczuje się urażony, że się wtrąciłem.

Urażony? Wręcz przeciwnie! Bardzo się cieszę, że się wtrąciłeś! ;) Wtrącaj się częściej! ;)
Przecież o to właśnie chodzi, by wzajemnie sobie pomagać, pokazywać inne rozwiązania i poprawiać błędy innych w sposób kulturalny i rzeczowy.
W taki właśnie sposób pokazałeś, jak można to rozwiązać używając kwalifikatora __flash. Sądzę, że przyda się to niejednemu forumowiczowi.
Wielkie dzięki i pozdrawiam serdecznie! ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 cze 2016, o 23:41 
Offline
Nowy

Dołączył(a): 31 mar 2014
Posty: 9
Lokalizacja: Warszawa
Pomógł: 0

Witam po przerwie,
Nie odpisywałem, bo musiałem powalczyć z hardware.
Ponieważ układ już szczęśliwie działa, to postanowiłem przestawić się na nowe możliwości i użyć kwalifikatora __flash.
I tu niestety problem. Otóż wykorzystałem przykład kolegi andrews i bezczelnie od niego ściągnąć :-).

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


I byłoby wszystko ok, gdyby nie to, że przy definicji tablicy alarm_tekst pojawia się błąd - syntax error, a przy definicji funkcji wyslij_znaki przy c=alarm_tekst pojawia się ostrzeżenie symbol 'alarm_tekst' could not be resolved.
No i wysyła, nawet w paczkach po 12 znaków, ale wszystkie znaki '0'.

Faktycznie ten sposób jest zdecydowanie bardziej przyjazny niż to co było wcześniej, ale jak zwalczyć ten 'Syntax error' ?
Pozdrawiam
MarekB



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 cze 2016, o 05:19 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

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

I byłoby wszystko ok, gdyby nie to, że przy definicji tablicy alarm_tekst pojawia się błąd - syntax error, a przy definicji funkcji wyslij_znaki przy c=alarm_tekst pojawia się ostrzeżenie symbol 'alarm_tekst' could not be resolved.

Po pierwsze - powinieneś usunąć te średniki spomiędzy nawiasów kwadratowych.
Po drugie jeśli ARRAYS_COUNT ma być równe jeden, to zrezygnuj w ogóle z tego wymiaru i stwórz tablicę dwuwymiarową.

Poniżej poprawiony kod:
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: 13 cze 2016, o 07:39 
Offline
Nowy

Dołączył(a): 31 mar 2014
Posty: 9
Lokalizacja: Warszawa
Pomógł: 0

Dokładnie tak zrobiłem (zaraz po wysłaniu poprzedniego postu). Niestety żadnego efektu. Wrzucałem na forum dość późno po kilku godzinach nierównej walki. Sprawdzałem różne warianty licząc na zmianę komunikatu na taki który naprowadzi mnie na rozwiązanie. W tej chwili mam dokładnie tak jak napisałeś, ale efekt jest bez zmian.
Pozdrawiam i dziękuję za zainteresowanie.
MarekB.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 cze 2016, o 08:49 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Poprzedni przykładowy kod, który zaprezentowałem był sprawdzony i na pewno działa.
Ten który podałem teraz też powinien zadziałać.

Napisz, jakim toolchain'em to kompilujesz. Może zbyt stara wersja i nie obsługuje kwalifikatora __flash.
Wprawdzie ja używam Atmel Studio, ale to nie ma znaczenia. Jak będziesz miał odpowiedni toolchain Atmela (najlepiej najnowszy, bo nie pamiętam, kiedy dokładnie ten kwalifikator __flash został wprowadzony), to musi zadziałać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 cze 2016, o 10:36 
Offline
Nowy

Dołączył(a): 31 mar 2014
Posty: 9
Lokalizacja: Warszawa
Pomógł: 0

No właśnie z tym mam problem. Nie bardzo wiem którą wersją gcc kompilują się moje programy. Czasem działają rzeczy które wystąpiły w nowym toolchainie, a czasem jest z tym problem. Jak popatrzę do katalogu na dysku gdzie według zapisów w Eclipsie powinien znajdować się gcc to mam tam trzy exe. Wersja 4.2, 4,7 i 4,8 oczywiście z jakimiś tam jeszcze cyferkami (nie jestem przy komputerze to nie moge podać dokładnie). Tym niemniej zawsze miałem nadzieję, że środowisko Eclipse działa z wersją najnowszą?
Nie wiem, czy nie powinienem wykasować katalogu z Program Files/Atmel i ponownie zainstalować toolchain.
Wszystkie próby które przyszły mi do głowy i które sprawdziłem były właściwie bez sensu, bo przy deklarowaniu tablicy niewiele się zmieniło - przecież to właściwie tylko zamiana kwalifikatora z PROGMEM na __flash i trochę inna kolejność zapisu. Prawdziwa różnica i wygoda to odczyt.
Ale mam jeszcze pytanie - czy PACK_SIZE to powinien uwzględniać dodatkowe '0' kończące pakiet, czy nie. Czy to '0' tam jest fizycznie, czy jest wirtualne. To znaczy jeżeli mam wysłać 12 znaków to PACK_SIZE to 12, czy 13 i czy następny PACK zaczyna się od adresu 12 czy 13. Gdy mi to ruszy to sprawdzę , ale może przyda się ta info komuś to ten wątek przeczyta. Tym bardziej, że dzięki Wam udało się zebrać różne wersje procy z pamięcią flash i to po "staremu" jak i "nowemu"
MarekB



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 cze 2016, o 11:12 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Tutaj zapewne znajdziesz informacje na temat konfiguracji Eclipse do pracy z toolchainem Atmela. Jest tam też do pobrania toolchain, który powinien obsługiwać kwalifikator __flash.

Ewentualnie najnowszy toolchain Atmela jest do pobrania tutaj (wymaga logowania lub darmowej rejestracji).

Edit:
No i co najważniejsze dobrze skonfigurować Eclipse, żeby używał właściwego toolchain'a, bo według mojej wiedzy wersja avr-gcc 4.8 powinna obsługiwać kwalifikator __flash (4.7 chyba zresztą też).


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 cze 2016, o 22:44 
Offline
Nowy

Dołączył(a): 31 mar 2014
Posty: 9
Lokalizacja: Warszawa
Pomógł: 0

Witam,
Odinstalowałem Javę, Atmel Toolchain, WINAVR. Oczywiście z restartami i czyszczeniem pozostałości tak na dysku jak i w rejestrach. I nic dalej syntax error. Zrobiłem to na drugim komputerze i ten sam efekt. Nic z tego nie rozumiem ???
Wszystkie potrzebne pliki miałem poprzednio pobrane ze stron P.Mirka. Teraz pobrałem ponownie.
Nie mam pojęcia o co chodzi. Jutro postaram się o następny komputer i spróbuję ostatni raz. Jak się nie uda to wracam do PROGMEMu.
A prawdę mówiąc pomimo problemów nowy sposób bardzo mi się podoba.

Pozdrawiam i jeszcze raz dziękuję
MarekB



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 cze 2016, o 22:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

@andrews
Z tego co się orientuję to na dzień dzisiejszy najnowszy Toolchain Atmel'a http://www.atmel.com/Images/avr8-gnu-toolchain-3.5.2.1680-readme.pdf to Atmel AVR 8-bit GNU Toolchain (3.5.2.1680) z GCC: 4.9.2, który nie pozwala na umieszczanie danych w pamięci flash używając kwalifikatora __flash.
Próbowałem GCC: 4.7 jak i z 4.8 pod Windowsem, niestety to samo co u kolegi MarekB2010.

@MarekB2010
Zobacz dlaczego nie działało, gdy zapisaleś :
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

jest równoważna zapisowi:

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

Tak na pocieszenie, może się przyda. ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 cze 2016, o 22:51 
Offline
Nowy

Dołączył(a): 31 mar 2014
Posty: 9
Lokalizacja: Warszawa
Pomógł: 0

Tak i mnie się wydaje - cóż wrócę do wersji z PROGMEM.
Z pętlą for to oczywisty błąd - Tam miało być zupełnie co innego (inne wyrażenie), ale nie działało i w trakcie nerwowych działań na rzecz uzdatnienia upartego programu w którymś momencie wpisałem nie zastanawiając się zbytnio, albo też jakieś CTRL-C, CTRL-V i poszła bzdura...
Dzięki.
MarekB



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2016, o 09:48 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

anshar napisał(a):
Z tego co się orientuję to na dzień dzisiejszy najnowszy Toolchain Atmel'a http://www.atmel.com/Images/avr8-gnu-to ... readme.pdf to Atmel AVR 8-bit GNU Toolchain (3.5.2.1680) z GCC: 4.9.2, który nie pozwala na umieszczanie danych w pamięci flash używając kwalifikatora __flash.
Próbowałem GCC: 4.7 jak i z 4.8 pod Windowsem, niestety to samo co u kolegi MarekB2010.

Wczoraj kompilowałem (pod Windowsem - Atmel Studio 6.2) przedstawiony przeze mnie kod zarówno wersją 4.8.1 jak i 4.9.2. Wersja 4.9.2 była zawarta w pobranym wczoraj bezpośrednio ze strony Atmela (zakładam, że najbardziej atualnym) toolchain'ie 3.5.2.89. Wszystko działało bez zarzutu, więc to raczej nie kwestia wersji avr-gcc.

Z tego co słyszałem, Eclipse może nie identyfikować prawidłowo słowa kluczowego '__flash' i informować o błędnej składni, ale to nie powinno przeszkodzić w prawidłowej kompilacji. Może któryś z kolegów skompilować ostatni kod z mojego postu (w osobnym projekcie), sprawdzić czy działa i pokazać logi z konsoli po kompilacji oraz pliki *.map i *.lss? Może jednak uda się rozwiązać problem :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2016, o 10:08 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27224
Lokalizacja: Szczecin
Pomógł: 1041

Ja próbowałem to skompilować nawet w specjalnie na tą okazję ściągniętym AtmelStudio 7 z mega najnowszym tolczajnem i nawet w AtmelStudio ten specyfikator __flash podkreślał mi się na czerwono - chociaż kompilacja przechodziła poprawnie

Dodam tylko że doczytałem, że trzeba uważać bo __flash działa tylko w ramach 64kb później trzeba stosować jakieś __xmem ...

Wziąwszy pod uwagę, że to na razie chyba jakaś nowość i jeszcze są kłopoty z działaniem - ja też na razie pozostaję przy starym kocim dobrym PROGMEM ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2016, o 10:34 
Offline
Nowy

Dołączył(a): 31 mar 2014
Posty: 9
Lokalizacja: Warszawa
Pomógł: 0

U mnie pomimo informacji "syntax error" kompilacja przebiega prawidłowo i w konsoli nie ma błędu - natomiast wysyłane są same '0', tak jakby tablica nie była zapisana prawidłowo. No i warning przy definicji funkcji wyślij_znaki przy c=alarm_tekst pojawia się ostrzeżenie "symbol 'alarm_tekst' could not be resolved".
Do tego to co pisałem - spodziewałem się w pliku .lss zobaczyć zawartość tablicy - a jej tam nie ma?
Postaram się skompilować ten przykładowy program i pobiorę pliki .map i .lss - zobaczymy co z tego wyniknie
MarekB



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2016, o 12:14 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

mirekk36 napisał(a):
Wziąwszy pod uwagę, że to na razie chyba jakaś nowość i jeszcze są kłopoty z działaniem

Chyba już nie taka nowość. Sądząc po tym dokumencie (https://gcc.gnu.org/gcc-4.7/changes.html, rozdział "New Targets and Target Specific Improvements->AVR"), "named address spaces" zostały wprowadzone do gcc już w wersji 4.7, czyli zdaje się w 2012 roku. Ja w sumie też zacząłem korzystać z nich stosunkowo niedawno (od niecałego roku - bo też czekałem, aż ewentualne poważniejsze bug'i zostaną poprawione), ale teraz korzystam chętnie, bo znacząco upraszczają kod, a nigdy nie miałem z nimi większych problemów.

mirekk36 napisał(a):
w AtmelStudio ten specyfikator __flash podkreślał mi się na czerwono - chociaż kompilacja przechodziła poprawnie

U mnie było tak samo i dodatkowo wygenerowany kod działał prawidłowo ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2016, o 13:22 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27224
Lokalizacja: Szczecin
Pomógł: 1041

andrews napisał(a):
U mnie było tak samo i dodatkowo wygenerowany kod działał prawidłowo

No więc za tą nowością nie nadążają edytory ;) nawet Atmelowski ... a jak mówię - trzeba pamiętać o kłopotach powyżej 64 kB

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2016, o 16:50 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

mirekk36 napisał(a):
No więc za tą nowością nie nadążają edytory ;) nawet Atmelowski ...

Może i tak, chociaż to podkreślenie to akurat sprawka rozszerzenia Visual Assist. Powiem szczerze, że mi akurat to podkreślenie zdecydowanie mniej przeszkadza niż te wszystkie pgm_read_xxx(), szczególnie gdy musimy odczytać dane z jakichś zagnieżdżonych struktur we flash zawierających wskaźniki do innych struktur lub tablic we flash... itd... itp... Nie dosyć, że trzeba się pilnować by użyć właściwego przyrostka _byte czy _word czy _dword czy co tam jeszcze, to w dodatku w niektórych sytuacjach trzeba jawnie rzutować na odpowiedni typ, bo kompilator generuje ostrzeżenia, a linijki kodu są coraz dłuższe i trzeba zwijać "w te sreberka" :) I robi się z tego coś w stylu "spaghetti code". Przyznasz chyba, że korzystanie z tych makr nie jest zbyt komfortowe. No ale to kwestia gustu, co komu bardziej przeszkadza :) Ja nikogo nie mam zamiaru na siłę przekonywać do swoich racji.

mirekk36 napisał(a):
a jak mówię - trzeba pamiętać o kłopotach powyżej 64 kB

No to akurat chyba nie jest dobry argument. W pliku <avr/pgmspace.h> jest coś takiego:
#define pgm_read_byte(address_short) pgm_read_byte_near(address_short)
a 'pgm_read_byte_near(address_short)' to nic innego jak odczyt z pierwszych 64k flash.
W celu odczytania z dalszych adresów należy użyć 'pgm_read_byte_far(address_long)'. Czyli podobnie jak w przypadku użycia __flash - powyżej 64k należy użyć __memx.
W sumie nie jest to bardzo znaczący problem, ponieważ linker i tak umieszcza dane na samym początku flash, zaraz po wektorach przerwań, a przed kodem wykonywalnym. Nie jest chyba częstym przypadkiem deklarowanie takiej ilości danych, by te 64k przekroczyć. A jeśli nie przekroczymy tych 64k, to spokojnie można korzystać z flash nawet w mikrokotrolerach, które mają powyżej 64k. A jeśli przekroczymy, to nie ma większej różnicy, czy używamy __flash czy PROGMEM.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2016, o 16:58 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27224
Lokalizacja: Szczecin
Pomógł: 1041

ale nie zrozum mnie źle ;) ja nie twierdzę że to zły pomysł albo żebym miał odradzać komuś korzystanie z __flash ;) Sama idea też mi się podoba i nie ma co tu dyskutować ...

Tylko jak mówię - ja wolę mieć mega czysty kod bez żadnych podkreśleń których nie da się wyłączyć - o to mi chodzi i nie jest dla mnie wyjaśnieniem jakby, że winę ponosi za to jakiś tam koci majkrosoftowy "Vizual Asist" ;) ... Zresztą Eclpse też jeszcze jakby tego nie zna ....

ale pewnie za jakiś czas ludziska to poprawią - szkoda tylko, że nie idzie to razem w parze - że tak powiem

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2016, o 20:59 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 11 kwi 2016
Posty: 3
Pomógł: 0

Na tym forum jest gdzieś opis jak w Eclipsie wyłączyć tego fałszywego syntaxa.

O, proszę, jest:
Cytuj:
mokrowski napisał(a):
Prawy myszy na projekcie -> Properties -> C/C++ General -> Preprocessor Include Path -> Languages: GNU C -> CDT User Setting Entries -> Add -> Preprocessor Macro w okienku #-> Name = __flash -> Value = /**/, zaznaczone Treat as built-in.


Oryginalny post został usunięty ale na szczęście było to cytowane w tym poście: topic10366-30.html#p121768



Ostatnio edytowano 15 cze 2016, o 14:21 przez o8OwHctc, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2016, o 21:04 
Offline
Nowy

Dołączył(a): 31 mar 2014
Posty: 9
Lokalizacja: Warszawa
Pomógł: 0

Tak, wszystko ładnie - sprawdziłem w plikach .lss i .map i tam w każdym przypadku toolchain jest 4.8. Czyli faktycznie on tego nie umie mimo zapowiedzi. Jak to robi Atmel Studio nie wiem.

A mój problem i tak nie rozwiązany - właśnie wróciłem do PROGMEM. Wstawiłem do kodu i zonk. Działa, ale nie koniecznie. Nie ma żadnych ostrzeżeń, czy błędów, ale tekst wysłany nie równa się zapisanemu w tablicy.
Założyłem nowy projekt, wyciąłem z kodu tylko to co dotyczy tablicy w pamięci FLASH, i też nie działa. Uzupełniłem o wysyłkę podobnych znaków z RAMu i to idzie ok. Z tego wynika, że kod z grubsza ok, hardware też, a nie działa.
Poniżej cały kod testu - są tam jakieś kawałki które nie są potrzebne, ale nie chciało mi się doczyszczać do końca:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Pierwszy ciąg znaków jest ok, co świadczy o prawidłowym zegarz, konfiguracji i hardware. Drugi z pamięci FLASH odczytuję (w hex) jako:
223,26,29,29,29,29,192,1,29,29,29,29

I tu prawdę powiedziawszy zgłupiałem.
I co Panowie na to?
Jakiś pomysł - co znowu udało mi się popsuć?
A kilka dni temu w takim samym testowym układzie zadziałało...

MarekB

------------------------ [ Dodano po: 2 minutach ]

@o8OwHctc
Problem w tym, że u mnie mimo tego syntaxa kompilacja przebiegła bez problemu, ale układ wysyłał ciąg 12 '0'.
Czyli wyłączenie nic nie powinno zmienić.
MarekB



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2016, o 22:19 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

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

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

Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2016, o 22:22 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27224
Lokalizacja: Szczecin
Pomógł: 1041

anshar napisał(a):
jeden_znak = pgm_read_byte(znak+j);


Ale może być też tak ;)

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


tylko właśnie nie można tu zapomnieć o operatorze pobierania adresu

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 cze 2016, o 00:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

mirekk36 napisał(a):
Ale może być też tak ;)
;)

@MarekB2010
Można to napisać na przykład tak:

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: 15 cze 2016, o 01:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Lub tak jak napisał kolega andrews, z tym, że kwalifikator __flash dałem na początku. ;)

@andrews
Wszystkie błędy zniknęły oprócz jednego przy słowie __flash ->syntax error. Kompiluje się bez problemu. Wszystko pięknie działa. ;)

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


------------------------ [ Dodano po: 36 minutach ]

mirekk36 napisał(a):
Tylko jak mówię - ja wolę mieć mega czysty kod bez żadnych podkreśleń których nie da się wyłączyć - o to mi chodzi i nie jest dla mnie wyjaśnieniem jakby, że winę ponosi za to jakiś tam koci majkrosoftowy "Vizual Asist" ;) ... Zresztą Eclpse też jeszcze jakby tego nie zna ....

ale pewnie za jakiś czas ludziska to poprawią - szkoda tylko, że nie idzie to razem w parze - że tak powiem


Prawy myszy na projekcie -> Properties -> C/C++ General -> Preprocessor Include Path -> Languages: GNU C -> CDT User Setting Entries -> Add -> Preprocessor Macro
W okienku #-> Name = __flash
Value = /**/
Zaznaczone Treat as built-in. ;)
Obrazek

No i od teraz już w kodzie, __flash wcale nie musi być na początku. ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 cze 2016, o 05:36 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

anshar napisał(a):
Prawy myszy na projekcie -> Properties -> C/C++ General -> Preprocessor Include Path -> Languages: GNU C -> CDT User Setting Entries -> Add -> Preprocessor Macro
W okienku #-> Name = __flash
Value = /**/

Ten sposób też gdzieś znalazłem, tylko że próbowałem i u mnie nie działało :( Pewnie dlatego, że pole value pozostawiałem puste. Być może dlatego (chociaż to mniej prawdopodobne), że nie mam zainstalowanego plugina AVR do Eclipse (wolę jednak Atmel Studio ze względu na stosunkowo dobry symulator).

W Atmel Studio można wyłączyć to podkreślenie w Visual Assist Options...->Underlines -> usunąć zaznaczenie przy "Underline mistyped symbols using >Red<". Rozwiązanie średnie, bo to wyłączy podkreślanie nie tylko kwalifikatora __flash. Z drugiej jednak strony kolorowanie składni pozostaje, więc ewentualne błędy - trudniej, ale - można wychwycić. Można w razie potrzeby we wyżej wymienionych opcjach zmienić kolory, jeśli są za mało wyraziste ;)
Jeśli chodzi o Atmel Studio, innego sposobu (na razie) nie znalazłem.

anshar napisał(a):
No i od teraz już w kodzie, __flash wcale nie musi być na początku.

To dobrze, bo czasami musi być w środku, choćby przy zapisywaniu we flash wskaźników do danych we flash.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 cze 2016, o 07:33 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27224
Lokalizacja: Szczecin
Pomógł: 1041

anshar napisał(a):
Prawy myszy na projekcie -> Properties -> C/C++ General -> Preprocessor Include Path -> Languages: GNU C -> CDT User Setting Entries -> Add -> Preprocessor Macro
W okienku #-> Name = __flash
Value = /**/
Zaznaczone Treat as built-in.

No ładnie ładnie panie kolego ;) ... trzeba będzie z tym troszkę popracować

------------------------ [ Dodano po: 52 minutyach ]

Już myślę o tym jak to dodawać jednym klawiszem za pomocą "ECLIPSE GADGET'a" ;) bo kłopotliwe jest troszkę z każdym nowym projektem ręcznie wchodzić i się przeklikiwać przez te opcje - skoro nie można globalnie tego dodać do całego workspace

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



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: 52 ]  Przejdź na stronę 1, 2  Następna strona

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 7 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