morthan Opublikowano 2 Kwietnia 2009 Zgłoś Opublikowano 2 Kwietnia 2009 (edytowane) Witam Mam napisać prosty symulator dowolnego procesora AVR w C++ z obsługa wyjść i wejść (np ma zapalić jakąś wirtualną diodę). C++ opanowałem na poziomie Symfonii. Powiem szczerze, nie mam pojęcia jak się do tego zabrać. Jeśli ktoś może dać mi wskazówki, linki jak to napisać to będę wdzięczny. P.S. Edycja ort-ów. Edytowane 8 Kwietnia 2009 przez morthan Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 5 Kwietnia 2009 Zgłoś Opublikowano 5 Kwietnia 2009 ale słownik polski to chyba na poziomie podstawówki ;) Ale co właściwie masz napisać? To ma mieć możliwość programowania w jakimś języku (pewnie asm)? Czy narysować prostokącik i zapalić diodę :) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
morthan Opublikowano 7 Kwietnia 2009 Zgłoś Opublikowano 7 Kwietnia 2009 Przepraszam za orty. Temat jest bardzo ogólny. Mam napisać w języku C++ symulator mikrokontrolera AVR z wejściami i wyjściami. Dozwolona konsola jak i WINAPI. Kompilator jakikolwiek pod windę. Na początek wystarczy zapalić diodę. Problem w tym, że naprawdę nie mam pojęcia jak do tego zabrać się. Z góry dzięki. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
p3dzi0r Opublikowano 9 Kwietnia 2009 Zgłoś Opublikowano 9 Kwietnia 2009 bajer polega na tym ze zeby zapalic diode nie potrzebujesz wielkiej filozofii tylko reakcji na jedna komende ustawienia wyjscia tego mikrokontrolera. a jezeli chcesz miec dowolna mozliwosc programowania twojego wirtualnego tworu to musisz znac cala strukture avr'a , albo przynajmniej jej czesc . Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
morthan Opublikowano 16 Kwietnia 2009 Zgłoś Opublikowano 16 Kwietnia 2009 bajer polega na tym ze zeby zapalic diode nie potrzebujesz wielkiej filozofii tylko reakcji na jedna komende ustawienia wyjscia tego mikrokontrolera. a jezeli chcesz miec dowolna mozliwosc programowania twojego wirtualnego tworu to musisz znac cala strukture avr'a , albo przynajmniej jej czesc . O avr'ach właśnie kończę czytać druga książkę więc ich budowę znam , przynajmniej pobieżnie. I myślę, że ta wiedza będzie wystarczająca. Bardziej interesowały mnie techniczne aspekty budowy samego symulatora. I coś wymyśliłem w ciągu tych kilku dni. Mianowicie: a) program na kontroler jest zapisany w pliku TXT w postaci mnemoników, b) wczytujemy go, c) interpretacja poszczególnych komend /ot problem - postanowiłem użyć istringstream - którym, notabene jeszcze nie posługiwałem się/, d) jakimś sposobem mnemoniki zapakować do funkcji: do... switch while a resztę czyli argumenty jako parametry tych funkcji. Jak myślicie ma to ręce i nogi. Jakieś sugestie? Robił już ktoś coś takiego? Są na to łatwiejsze sposoby? Na tarczy czy z tarczą?? he he he he Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Gość <account_deleted> Opublikowano 16 Kwietnia 2009 Zgłoś Opublikowano 16 Kwietnia 2009 Najprostszym rozwiązaniem jest napisanie interpretera opcode (składnia w przypadku avr jest jawna). Jeśli pominąć symulację zależności czasowych i przerwań to jest to banalne zadanie (więcej zajmie pisanie niż myślenie ;) ). Przy takim podejściu można symulować pliki skompilowane np. w avr studio. switch pewnie da się użyć, ale jest to rozwiązanie dobre do zaiplementowania obsługi 5 a nie 5000 kombinacji. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
morthan Opublikowano 17 Kwietnia 2009 Zgłoś Opublikowano 17 Kwietnia 2009 Najprostszym rozwiązaniem jest napisanie interpretera opcode (składnia w przypadku avr jest jawna). Jeśli pominąć symulację zależności czasowych i przerwań to jest to banalne zadanie (więcej zajmie pisanie niż myślenie ;) ). Przy takim podejściu można symulować pliki skompilowane np. w avr studio. switch pewnie da się użyć, ale jest to rozwiązanie dobre do zaiplementowania obsługi 5 a nie 5000 kombinacji. To może jakaś mała podpowiedź jak napisać taki interpreter. Liczę bardziej na merytoryczne wsparcie, czyli jakiś opis jak to zrobić. Z góry dzięki. P.S. W necie szukałem, ale znajduje tylko skompilowane pliki lub odnośniki do książek. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Gość <account_deleted> Opublikowano 17 Kwietnia 2009 Zgłoś Opublikowano 17 Kwietnia 2009 (edytowane) Dobra, ale nie licz na to że napiszę książkę ;) - emulator pamięci, czyli 3 obszarów adresowych: code, data i eeprom Najciekawszy obszar to data, ponieważ avr mapuje tutaj wszystkie rejestry, obszar IO oraz "normalną" pamięć operacyjną. Tak też należy symulować rejestry i obszar IO - czyli może to być w ostateczności jednowymiarowa tablica, przy czym najwygodniej będzie użyć wskaźników. Dlaczego jest to ważne: do całego obszaru IO oraz rejestrów asm może się odwołać jak do normalnego RAMu - jeśli użyjesz jakichś Ifów, switchów itp do identyfikacji rejestrów to symulacja takiego programu stała by się masakrycznie skomplikowana lub niemożliwa. - interpreter opcode: dlaczego opcode a nie mnemoniki? Mnemoniki musisz sprawdzać pod kątem błędu składni, wielkości liter, niechcianych spacji, przecinka zamiast kropki itp. Sprawa staje się jeszcze bardziej skomplikowana przy instrukcjach nietypowych jak movw - rozwalenie tego tematu da ci zabawę na spory okres czasu ;)Opcode składa się generalnie z 3 liczb: kod instrukcji, adres lub rejestr docelowy, wartość lub rejestr źródłowy. Oznacza to że wszystko masz "na talerzu". (np. numer rejestru pokrywa się z jego adresem (offsetem) w tablicy - nic nie musisz z nim robić). Interpreter opcode nie musi sprawdzać błędu składni (a w każdym bądź razie stwierdzenie błędu w opcode jest 100x prostsze) Żeby wyciągnąć poszczególne liczby z opcode wystarczy użyć masek bitowych. Maski będą się jednak zmieniać w zależności od kodu instrukcji (nie ma tego wiele ale jednak). Profesjonalne rozwiązanie tego problemu polega na stworzeniu lookup table, w której zapisuje się gotowe maski na offsecie równym liczbie będącej kodem instrukcji - w ten sposób unika się stosowania stada switchy albo co gorsza ifów. W tej samej tablicy powinny znaleźć się też adresy modułów symulujących poszczególne instrukcje - ale to już jest jazda. W prostej symulacji potrzeba zaledwie kilku banalnych funkcji: dodawanie, odejmowanie, mnożenie oraz transfer bajtu, który jednocześnie obsługuje IN,OUT,MOV,LDI,... . Do tego dochodzi kilka specjalnych sytuacji jak IJMP, MOVW, ADIW, itp - jest tego stosunkowo mało więc równie dobrze można się tutaj pobawić w jakiś switch. Każda z tych funkcji musi odpowiednio modyfikować rejestr SR, a program pobierający kolejne instrukcje - PC, żeby umożliwić symulację skoków (w tym warunkowych) oraz prawidłowe działanie SBC, ADC, ROR, ROL, ... Najlepiej zacząć od końca, czyli od napisania funkcji symulujących poszczególne grupy instrukcji. Edytowane 17 Kwietnia 2009 przez tomazzi Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
morthan Opublikowano 20 Kwietnia 2009 Zgłoś Opublikowano 20 Kwietnia 2009 To normalnie jakaś masakra jest. Nie wiem czy podołam temu. Dzięki za podpowiedź. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Gość <account_deleted> Opublikowano 20 Kwietnia 2009 Zgłoś Opublikowano 20 Kwietnia 2009 Daj swojemu wykładowcy linka do tego działu, a następnie zadaj mu pytanie: czy rozumie znaczenie słowa symulator? - widać nie - chyba, że 'prosty' symulator to program w stylu "if instrukcja='out portB,r16' then zapal_diode" :lol: W każdym bądź razie jak już będziesz miał zarys, to się pochwal ;) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...