Popularny post GAndaLF Napisano Lipiec 2, 2011 Popularny post Udostępnij Napisano Lipiec 2, 2011 Przeglądając nasze forum można dojść do wniosku, że jednym z największych problemów początkujących robotyków jest pisanie programów. Moim zdaniem dzieje się tak dlatego, że z tutoriali można bardzo szybko nauczyć się podstaw programowania, natomiast pominięte są tam takie aspekty jak korzystanie z noty katalogowej naszego układu, budowa, sposób działania mikrokontrolera i inne tego typu sprawy. Nie mówię, że te szybkie kursy od zera są złe. Wręcz przeciwnie, są bardzo dobre. Dzięki nim można zbudować swoją pierwszą konstrukcje i sprawdzić, czy wciągnie cię robotyka. Jeżeli już wiesz, że chcesz w przyszłości wziąć się za bardziej skomplikowane projekty, warto poznać również teorię. UWAGA, to tylko wstęp! Dalsza część artykułu dostępna jest na blogu.Przeczytaj całość »Poniżej znajdują się komentarze powiązane z tym wpisem. 5 Cytuj Link do komentarza Share on other sites More sharing options...
chudek Lipiec 22, 2016 Udostępnij Lipiec 22, 2016 Witam,int zajmuję 4 bajty w pamięci procesora, proszę poprawić ten rażący błąd. Pozdrawiam Chudek Cytuj Link do komentarza Share on other sites More sharing options...
Chumanista Lipiec 22, 2016 Udostępnij Lipiec 22, 2016 chudek, może tak, może nie. Wszystko zależy od platformy. Faktycznie na systemach 32bit int ma 32 bity. Jednakże w AVR-GCC które jest de facto standardem jeśli chodzi o kompilowanie pod AVR ma on dwa bajty: https://gcc.gnu.org/wiki/avr-gcc Najlepiej oczywiście używać uintXY_t. Cytuj Link do komentarza Share on other sites More sharing options...
chudek Lipiec 22, 2016 Udostępnij Lipiec 22, 2016 Skąd się bierze ta różnica, dlaczego tak jest, po co ta "komplikacja"? Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
Harnas Lipiec 22, 2016 Udostępnij Lipiec 22, 2016 Int ma być najbardziej naturalnym typem zmiennej dla danej platformy. Dla AVR powinna mieć 8 bitów, jednak że jest to dość mało, i dokładnie to samo co unsigned char. Cała reszta świata (zwłaszcza w momencie tworzenia AVR-GCC) używała x86 gdzie ten typ ma 32 bity więc ktoś postanowił zrobić w AVR ten typ 16 bitowy. Poza tym AVR niby jest 8 bitowy, ale adresacja Flasha, i słowa rozkazów są już 16 bitowe. Cytuj Link do komentarza Share on other sites More sharing options...
MirekCz Lipiec 23, 2016 Udostępnij Lipiec 23, 2016 int jest w zamyśle natywnym typem dla procesora, ale ma minimum 16bitów. Stąd w AVR ma 16bitów, na procesorach 32bitowych ma 32bity i na 64bitowych ma 64bity... Cytuj Link do komentarza Share on other sites More sharing options...
PiotrLenarczyk Styczeń 31, 2018 Udostępnij Styczeń 31, 2018 Wartości podstawowych typów całkowitoliczbowych ( int, unsigned int, long, et cetera ), są w pełni zależne od użytego urządzenia i np. rozmiar int może typowo wynosić 8, 12, czy 16 bitów ( każdy procesor Intela posiada prymitywny, 16 bitowy tryb pracy - czasami jest on bardzo przydatny ). Przetwarzanie danych przez MPU ( Microprocessor Unit - nie mylić z ochroną zakresu dostępu do pamięci przez kontroler pamięci: Memory Protection Unit ) jest niezależne od kompilatora języka programowania - typowo najniższym jest język C, pozostałe ( Assembler i wirtualne, sprzętowe maszyny interpretujące Assemblera ) nie są używane poza pracownikami producentów sprzętu elektronicznego - czasami programista stosuje wstawki Assemblerowe, w celu osiągnięcia efektu nietłumaczonego ( zbyt kosztownie tłumaczonego ) przez dany kompilator. Proste operacje ułamkowe na mikrokontrolerze bez FPU opłaca się wykonać z użyciem arytmetyki stałoprzecinkowej - są biblioteki do podstawowych operacji ułamkowych. Opłaca się stosować przeliczone wartości, zapisane w postaci tablicy ( zapomniane tablice przeglądowe - LUT Look up Table; ich użycie to najszybszy możliwy sposób prowadzenia operacji logicznych ), dzięki czemu w ogóle nie trzeba przeprowadzać powtarzalnych obliczeń na energooszczędnym ( zasilanym baterią ), niewydajnym procesorze, ale użyć gotowych ( wcześniej przeliczonych ) wartości. Dziękuję za artykuł - bardzo rzeczowy i świetnie wprowadzający do tematyki. 1 Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Luty 26, 2018 Udostępnij Luty 26, 2018 Świetny artykuł, choć po pierwszym przeczytaniu zrozumiałem może z 30%🙂. Zaciekawił mnie ten akapit: "Zasada działania stosu jest prosta - można na niego wrzucać kolejne rzeczy (w tym wypadku bajty danych), a następnie zdejmować. Ostatni wrzucony bajt znajduje się na samym szczycie stosu, więc jest pierwszy do zdjęcia. Jeżeli wrzucimy na stos kolejny bajt, to przygniecie poprzedni i to on będzie pierwszy. Stos zwykle jest umieszczony na końcu pamięci i rośnie w stronę początku. Dlatego jeśli źle napiszemy program, to wartości odkładane na stosie w końcu nadpiszą nam inne dane, znajdujące się w pamięci". Szczególnie zaznaczone zdanie. Proszę o bliższe wyjaśnienie czym jest ten stos. Po co nadpisywać dane jedne na drugich, a później zdejmować(odczytywać?) w odwrotnej kolejności do zapisywania? Jak można spieprzyć program tak, że nadpiszemy całą pamięć RAM? Cytuj Link do komentarza Share on other sites More sharing options...
Lukaszm Luty 26, 2018 Udostępnij Luty 26, 2018 Tutaj masz to całkiem ładnie opisane: https://www.nongnu.org/avr-libc/user-manual/malloc.html Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Luty 26, 2018 Udostępnij Luty 26, 2018 Dzięki ale w szkole to ja się jeszcze rosyjskiego uczyłem 😋 . Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Luty 26, 2018 Udostępnij Luty 26, 2018 Nie rozumiem w czym nauka rosyjskiego przeszkadza w rozumieniu tekstów w innych językach... No ale Wy młodzi mieliście pewnie inny system edukacji... Cytuj Link do komentarza Share on other sites More sharing options...
Lukaszm Luty 26, 2018 Udostępnij Luty 26, 2018 SOYER, w sensie że nie chcesz się nauczyć angielskiego? Bardzo słabe podejście, zamykasz sobie w ten sposób dostęp do 95% (strzelam) materiałów dostępnych w internecie na tematy elektroniki/programowania/robotyki itd. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Luty 26, 2018 Udostępnij Luty 26, 2018 Poza tym większość materiału angielskojęzycznego jest dostępna po rosyjsku i po chińsku. Wystarczy poszukać... Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Luty 26, 2018 Udostępnij Luty 26, 2018 Ale żeście się rozpisali 😅 każdy lepiej wie który język umie, nawet wiecie co ja umiem, a czego nie 😅😅 Znam angielski komunikatywnie, porozmawiam i poczytam co łatwiejsze teksty, niestety techniczny angielski jest mi nieznany. Liczyłem raczej na odpowiedź w stylu Marka1707 albo Elvisa, merytorycznie 😅🤣😅 Wiem, że nie wiem i dlatego pytam na polskim forum, dziękuję za linki do angielskich stron, często korzystam i czytam, ale dla lamera lepiej jak ktoś wytłumaczy po chłopsku i w ojczystym języku 😉 Może kiedyś weźmie mnie na naukę branżowego angielskiego, ale niestety nie czuję żeby ta chwila była blisko... Cytuj Link do komentarza Share on other sites More sharing options...
Lukaszm Luty 26, 2018 Udostępnij Luty 26, 2018 Ok, to odpowiem krótko. Jak można spieprzyć program tak, że nadpiszemy całą pamięć RAM? Kolizja danych w pamięci będzie, gdy sterta (heap) 'zderzy się' ze stosem (stack). Na stosie są odkładane zmienne lokalne oraz np. wskaźniki powrotu z funkcji (dokładnie tego nie wiem, trzeba by skonsultować z kimś mądrzejszym/literaturą). Czyli jak wywołujesz funkcję X, w której masz zmienne lokalne, to na stosie robione jest miejsce dla tych zmiennych (oraz wskaźnik powrotu). Więc jeżeli będziesz miał rekurencję (X wywołuje wewnątrz siebie X) lub kod będzie miał wystarczająco długi 'łańcuch' wywołań, to stos mocno urośnie. Z drugiej strony masz stertę, która wykorzystana jest przez zmienne alokowane dynamicznie (malloc / new). Jak zaalokujesz bardzo dużo takich danych (bez zwalniania ich), to sterta mocno urośnie. Może się też zdarzyć, że alokując obszary pamięci o różnej ilości bajtów i zwalniając je w różnej kolejności, powstaną niewykorzystane obszary w środku sterty (3 bajty tu, 7 bajtów tam, itd), których alokator nie będzie w stanie ponownie wykorzystać. Podsumowując: kolizja może nastąpić od: rekurencyjnych wywołań funkcji, dużej liczby zmiennych lokalnych, długich łańcuchów wywołań funkcji, fragmentacji pamięci (od alokacji dynamicznej) lub połączenia tych czynników. 2 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!