Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

Gość Qn`ik

Programowanie

Polecane posty

Sa dwie mozliwosci:

1) "Dane BIOSu - Bios Data Area

Bios trzyma swoje zmienne w specjalnym obszarze pamięci od adresu 0040:0000. Zmienne te można zarówno odczytywać jak i modyfikować."

Literatura:

http://frankosio.neostrada.pl/bios11.htm

Niestety nie udalo mi sie znalezc pod jakim przesunieciem moglyby znalezc sie interesujace Cie wartosci, ale nie szukalem za dlugo.

2) Przerwanie.

Termometr najprawdopodobniej wysyla raz na jakis czas sygnal ze swojim aktualnym stanem, czyli generuje przerwanie. Wartosc ta jest wtedy odczytywana przez funkcje obslugi przerwania i zapisywana najpewniej w Bios Data Area. Wystarczy znalezc numer przerwania, podlaczyc do funkcji troche wlasnego kodu :) i gotowe.

Niestety tu tez Ci nie pomoge z numerem.

Link do komentarza
Udostępnij na innych stronach

No coz, pisanie obslugi przerwan to bardzo przyjemna sprawa. I to wcale nie jest tak skomplikowane jak sie wydaje.

Plan dzialania jest taki:

1) znalezc numer przerwania, bez tego ani rusz

2) piszemy nasza funkcje obslugi

3) pobieramy zawartosc 4 bajtow, spod adresu rownego numer przerwania razy 4, ta wartosc to adres oryginalnej funkcji

4) na koniec naszej funckji dodajemy instrukcje skoku do oryginalnej funkcji

5) pod adres numer przerwania razy 4 zapisujemy adres naszej funkcji obslugi przerwania

Finito ;)

Ad 1: no sprawa jest dosyc oczywista, choc trudna, nie mam pojecia skad ten numer wytrzasnac. Proponuje zaczac od strony producenta plyty glownej, oraz intel'a.

Ad 2: void JakaTemp()

No tu trzeba pobrac wartosc temperatury i zapisac ja w jakiejs globalenj zmiennej.

Problemem jest koniecznosc poznania adresu portu pod jakim procesor widzi termometr. Mysle ze warto sprobowac strony producenta plyty glownej, oraz strony Intel'a.

Ad 3: adres oryginalnej funkcji jest nam niezbedny aby moc po zakonczeniu naszej procedury rozpoczac oryginalna procedure. Bez jej wykonania system moze przestac dzialac poprawnie.

Ad 4: wstawka asemblerowa z instrukcja jmp adres

Ad 5: jest to wlasciwa inicjalizacja naszej funkcji, po tym kroku procesor bedzie wykonywal skok do naszej procedury za kazdym razem gdy pojawi sie przerwanie. Jest to proste zapisanie do pamieci i mozna je wykonac przy uzyciu wskaznika, ew. instrukcja mov adres wartosc w postaci wstawki asemblerowej. Pamietaj tylko ze adres pod ktory zapisujesz jest czterokrotnoscia numeru przerwania.

Mysle, ze wersja z bios data area jest prostsza i pewniejsza, o ile ta wartosc wogole sie tam znajduje. Mozesz miec powazny problem z odczytem portu termometru. No ale jak nie sprobujesz to sie nie dowiesz :)

Link do komentarza
Udostępnij na innych stronach

No ja właśnie mam z tym problem...

ja to napisałem tak :

int *temp = reinterpret_cast< int*> (00400000 + 0x0001);

Wypisuje coś co na pewno nie jest tym co chcę...

Podejrzewam, że ustawiłem wskaźnik na inny adres niż potrzeba...

Nie zastanawiałem się nad innym sposobem ustawienia wskaźnika po prostu wykorzystałem znany mi i prosty sposób.

Link do komentarza
Udostępnij na innych stronach

Wpisujesz adres w formacie osemkowym ;) W C++ Liczby zaczynajace sie od 0 sa traktowane jako osemkowe, a 0x jako szesnastkowe. Jezeli chcesz podac dziesietnie to pierwsza cyfra musi byc znaczaca. 0b to chyba binarne, ale tu glowy nie dam.

STOP dzieciom neostrady:

"BASIC jest był i będzie najlepszy ;P oczywiście w wersji Atari BASIC"

i po co piszesz takie posty :?: Ze niby chcesz kogos do dyskusji na ten temat sprowokowac :?: Smietnik robisz i tyle.

Link do komentarza
Udostępnij na innych stronach

Jestem bardzo młodym programistą. Swoją przygodę z programowaniem zaczęłem od PASCALA, a teraz bawię się w C i w C++. Liznęłem już trochę oba języki i mam problem. Chciałbym napisać program okienkowy, z interfejsem itd, ale nie bardzo wiem jak. Będe bardzo wdzięczny za pomoc.

Link do komentarza
Udostępnij na innych stronach

Pod Windowsa :?: Czy moze pod Linuks'a :?: Istotna roznica ;)

Pod Winde dobrze by bylo przeczytac cos na temat API, zebys wiedzial jak system dziala i jak sie z nim komunikowac, niestety jest to w zasadzie niezbedne.

Z grubsza okienka robi sie tak:

- rejestrujesz w systemie klase okna

- tworzysz instancje okna

Z X'ami jest troche latwiej, ale nie pytaj mnie o nic, bo ja na tym wykladzie nie bylem. Chlalem browara :(

Link do komentarza
Udostępnij na innych stronach

Pod Windowsa :?: Czy moze pod Linuks'a :?: Istotna roznica ;)

Pod Winde dobrze by bylo przeczytac cos na temat API, zebys wiedzial jak system dziala i jak sie z nim komunikowac, niestety jest to w zasadzie niezbedne.

Z grubsza okienka robi sie tak:

- rejestrujesz w systemie klase okna

- tworzysz instancje okna

Z X'ami jest troche latwiej, ale nie pytaj mnie o nic, bo ja na tym wykladzie nie bylem. Chlalem browara :(

Pod Windowsa. Byłbym wdzięczny gdybyś wytłumaczył mi to językiem bardziej zrozumiałym dla kogoś kto jeszcze nie studiuje programowania.

Link do komentarza
Udostępnij na innych stronach

wybór kompilatora zależy od języka, w którym chcesz programować.

do pascala polecam free pascala www.freepascal.org lub borland delphi personal. do c / c++ polecam ms visual studio (nie jest darmowy, chyba że się studiuje - wtedy licencja MSDNAA), albo darmowy borland c++ builder personal www.borland.pl (lub .com).

w zasadzie wszystkie są łatwe w obsłudze, bo jedyne co musisz wiedzieć to jak tworzyć nowy projekt, gdzie włączać kompilację projektu i później debugowanie. reszta t kwestia znajomości języka.

Link do komentarza
Udostępnij na innych stronach

A ja odradzam VS 2005 oraz 2003 do c++. Ta wersja jezyka jest przystosowana do platformy .Net.

Ja tam aktualnie uzywam kompilatora g++. Niestety trzeba sobie jakis debugger znalezc, bo gdb jest okropny w obsludze. Naszczescie Knoppix ma zainstalowany graficzny debugger.

Link do komentarza
Udostępnij na innych stronach

Próbuję napisać (w C++) algorytm maksymalnego przepływu w sieci. Nie mogę doszukać się żadnego błędu, a wynik działania jest niestety nieprawidłowy. Może ktoś z Was mógłby rzucić okiem i stwierdzić co tu jest nie tak?

http://cyberball.cenega.pl/cm/usr/rothman/cpp/przeplyw.cpp

Edit: problem rozwiazany. Dla ciekawych: http://phpfi.com/166454

Link do komentarza
Udostępnij na innych stronach

Gość @!kupazdupy!@

Jestem begginerem w zakresie programowania w języku C++ i bardzo interesuje mnie znajomość kodu, który odpowiada za to, żeby przy jakimś działaniu otwierał jakiś plik. Np. Jeżeli chcę zrobić grę i po otworzeniu exeka pokazywało się intro albo coś takiego.

Link do komentarza
Udostępnij na innych stronach

No coz, pisanie obslugi przerwan to bardzo przyjemna sprawa. I to wcale nie jest tak skomplikowane jak sie wydaje.

Plan dzialania jest taki:

1) znalezc numer przerwania, bez tego ani rusz

2) piszemy nasza funkcje obslugi

3) pobieramy zawartosc 4 bajtow, spod adresu rownego numer przerwania razy 4, ta wartosc to adres oryginalnej funkcji

4) na koniec naszej funckji dodajemy instrukcje skoku do oryginalnej funkcji

5) pod adres numer przerwania razy 4 zapisujemy adres naszej funkcji obslugi przerwania

Finito ;)

Ad 1: no sprawa jest dosyc oczywista, choc trudna, nie mam pojecia skad ten numer wytrzasnac. Proponuje zaczac od strony producenta plyty glownej, oraz intel'a.

Ad 2: void JakaTemp()

No tu trzeba pobrac wartosc temperatury i zapisac ja w jakiejs globalenj zmiennej.

Problemem jest koniecznosc poznania adresu portu pod jakim procesor widzi termometr. Mysle ze warto sprobowac strony producenta plyty glownej, oraz strony Intel'a.

Ad 3: adres oryginalnej funkcji jest nam niezbedny aby moc po zakonczeniu naszej procedury rozpoczac oryginalna procedure. Bez jej wykonania system moze przestac dzialac poprawnie.

Ad 4: wstawka asemblerowa z instrukcja jmp adres

Ad 5: jest to wlasciwa inicjalizacja naszej funkcji, po tym kroku procesor bedzie wykonywal skok do naszej procedury za kazdym razem gdy pojawi sie przerwanie. Jest to proste zapisanie do pamieci i mozna je wykonac przy uzyciu wskaznika, ew. instrukcja mov adres wartosc w postaci wstawki asemblerowej. Pamietaj tylko ze adres pod ktory zapisujesz jest czterokrotnoscia numeru przerwania.

Mysle, ze wersja z bios data area jest prostsza i pewniejsza, o ile ta wartosc wogole sie tam znajduje. Mozesz miec powazny problem z odczytem portu termometru. No ale jak nie sprobujesz to sie nie dowiesz :)

Hmm

Nalezalo by dodac: jesli przerwanie to 0-7, to po prostu 0000:numer*2 (!). Jesli 8-15, to afair 32?

W kazdym razie, takie cos nie ma sensu - to sie odnosi tylko do real mode...

Musisz przeprogramowac (a)pic. Jesli piszesz pod jakis system, uzyj funkcji tego systemu aby 'zawlaszczyc' sobie irq.

Zobacz manual intela, System architecture, chyba volume 2, tam powinno byc o temperaturze.

Link do komentarza
Udostępnij na innych stronach

Gość
Temat jest zablokowany i nie można w nim pisać.


  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.

×
×
  • Utwórz nowe...