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



Teraz jest 14 lis 2024, o 04:17


Strefa czasowa: UTC + 1





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

Dołączył(a): 05 gru 2013
Posty: 246
Pomógł: 0

Projekt o którym mowa co prawda nie jest pisany w Arduino, ale pod zwykłe AVR-y w C++ (próba przesiadki ze zwykłego C).
Na jego potrzeby pożyczyłem jednak trochę plików źródłowych z Arduino - głównie bibliotekę Arduino Ethernet, którą udało mi się pozbawić nawiązań do "jądra" Arduino.

Mam teraz jednak pewien dylemat. Chciałem sobie utworzyć typ strukturalny, w którym byłyby zapisane wszystkie dane konfiguracyjne powstającego systemu. Potem utworzyłbym trzy zmienne tego typu: w pamięci RAM, EEPROM, oraz FLASH (ok, ta ostatnia to raczej stała). Takie podejście umożliwia wygodne zarządzanie ustawieniami - z kopii umieszczonej w RAM-ie korzystamy podczas normalnej pracy, w EEPROM-ie znajduje się bieżąca konfiguracja wczytywana przy starcie, natomiast FLASH przechowuje wartości domyślne, które można w razie czego przywrócić.

W C wszystko było jasne. Tworzyłem sobie typ strukturalny, np.:

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


A potem inicjowałem kolejne zmienne:

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


Dla PROGMEM musiałem oczywiście podać wartości.

Teraz próbuję to samo zrobić pod C++, korzystając z arduinowego typu zmiennej IPAddress:

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


Niestety próba podania wartości w klamrach, jak powyżej skutkuje warningiem:

Kod:
extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]


Ktoś może mi powiedzieć co jest tego powodem i jak prawidłowo umieścić wartości we flashu?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2014, o 01:16 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

"IPAddress" jest zapewne klasą, której konstruktor wymaga podania kilku parametrów na wzór: http://arduino.cc/en/Reference/EthernetIPAddress

Umieszczenie zawartości obiektu w pamięci FLASH/EEPROM wymaga tzw. procesu serializacji tzn. "rozbiciu" poszczególnych składowych obiektu, aby możliwe było późniejsze ich zapisanie. Najlepiej w tym celu dodać metodę do klasy "IPAddress" dokonującą takowego zapisu/odczytu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2014, o 08:30 
Offline
Nowy

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

mokrowski nie rozumiem dlaczego doradzasz użycie struktury zamiast klasy. Nie wiem jaki miałby być zysk korzystania w c++ ze struktury zamiast z klasy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2014, o 09:22 
Offline
Moderator
Avatar użytkownika

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

to mniej więcej tak samo jak do byle przykładu w arduino do pętli for ... ludziska dają typ int dla zmiennej iteracyjnej i nie ważne, że zmienia się ona w zakresie np 0-10 ..... No można oczywiście dać int, można nawet long int albo i long long int - tylko po co ?

_________________
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: 29 gru 2014, o 10:22 
Offline
Użytkownik

Dołączył(a): 05 gru 2013
Posty: 246
Pomógł: 0

Ja też nie przepadam za "czystym" Arduino. Niemniej istnieje sporo peryferiów, które nie mają bibliotek np. pod AVR-y, ale bez problemu można znaleźć dla nich kod pod Arduino. Tak właśnie wyglądała sytuacja w moim przypadku. Jakiś czas temu skleciłem sobie płytkę z Atmegą644 i układem Wiznet W5100 (ten sam, który stosuje się w popularnych Ethernet Shieldach) i powoli zabrałem się za pisanie biblioteki, w oparciu o przykłady z Internetu. Po drodze jednak zajrzałem do kodu biblioteki Arduino Ethernet. Okazało się, że jest tam już praktycznie gotowy cały sterownik (trzeba było tylko pozbyć się nawiązań do wiring i pozmieniać kilka niskopoziomowych funkcji) oraz obsługa socketów. Po przeportowaniu tej części przyjrzałem się najwyższej warstwie (klasy takie jak Ethernet, EthernetServer, EthernetClient i EthernetUDP) stwierdzając, że usunięcie nawiązań do Arduino nie powinno być zbyt trudne, a dzięki nim zyskałem np. możliwość automatycznego przydzielania socketu, nie musiałem też od nowa implementować obsługi DNS albo DHCP.
Postanowiłem nie pozbywać się funkcjonalności tej biblioteki, stąd np. zostawiłem IPAddress i nie przerabiałem kodu pod obsługę zwykłych, czteroelementowych tablic z adresami IP. Na razie wszystko działa, chociaż przerobiona biblioteka znajduje się w fazie testów.

Jednak w porządku - w strukturze w pamięci flash/EEPROM będę trzymał zwykłe tablice, później inicjując nimi obiekty klasy IPAddress.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2014, o 19:46 
Offline
Nowy

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

Chyba jest małe nieporozumienie. Bo raz zalecasz żeby używać struktury zamiast klasy, a potem odnosisz się do implementacji z Arduino Ethernet. Jeżeli autor będzie korzystał z tej biblioteki to nie ma możliwości zmiany. Natomiast jeżeli tworzy swoje rozwiązanie to może napisać swoją klasę, która w najprostszej postaci nie różni się niczym od struktury.
Obiekty nad strukturami mają tą przewagę, że pozwalają wystawić interfejs, który nie pozwala na przypadkowe niepożądane modyfikacje (nie rozumiem dlaczego tak Ci przeszkadzają prywatne atrybuty).
Obiekt też możesz serializować tak jak strukturę (chyba, że nie zrozumiałem problemu), a dodatkowo możesz dorzucić specjalizowane metody - wcale nie wymagające dziedziczenia.
Równie dobrze mógłbym zapytać dlaczego struktura a nie typedef dla czteroelementowej tablicy (w obiekcie da się uzyskać dostęp jak do tablicy, a w strukturze nie).

mirekk36 - tylko, że pomieszałeś teraz dwa problemy. To co przedstawiłeś można rozważać pod kątem zajętości pamięci i wybrać rozwiązanie optymalne. Problem struktura/klasa nie daje się już tak prosto sprowadzić.



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