Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Projekt

wojteq07
-
-
Posty: 20
Rejestracja: 5 lis 2010, o 21:42
Lokalizacja: Kraków

Postautor: wojteq07 » 7 lis 2010, o 20:23

tab jest tablicą globalną:
int tab[4]={0xc9,0xde,0xe5,0x6f};

Występują:
w main:

Kod: Zaznacz cały

for(i=0; i<4; i++) tab[i]=eeprom_read_byte(i+96);
Inny fragment z nią związany:

Kod: Zaznacz cały

liczas(temp2, wynik); for(i=0;i<4;i++) tab[i]=temp2[i];

Kod: Zaznacz cały

tabeprom() { for(i=0; i<4; i++) eeprom_write_byte(i+96,tab[i]); for(i=0; i<12; i+=2) eeprom_write_word(i+112, w[i/2]); }
Potem występuje taki fragment gdzie ta tablica jest przesyłana do funkcji:

Kod: Zaznacz cały

//Suma kontrolna uzywana do genaracji prawidłowych pakietów ntp. Odpowiednie pola sa modyfikowane na podstawie //juz wczesniej wypełnionych. Suma ta jest oblczana anologicznie jak dla pakietów UDP void checksum(unsigned char *tab) { int j; unsigned long int suma=0,poprzednia=0; for(j=14; j<33; j=j+2){ if(suma<poprzednia) suma=suma+1; poprzednia=suma; suma=suma+(tab[j]<<8)+tab[j+1];} suma=~suma; suma=suma+0; //o lub 1 tab[25]=suma; tab[24]=(suma>>8); }
Nie wiem czy te fragmenty cokolwiek Ci powiedzą, bo wkleiłem jedynie wszystkie fragmenty kodu z wystąpieniem słowa "tab".
Dalej obstawiam by Ci przesłać kod na maila.
Z wyrywków i wycinków pewnie wciąż nie wytłumaczyłem...

wojteq07
-
-
Posty: 20
Rejestracja: 5 lis 2010, o 21:42
Lokalizacja: Kraków

Postautor: wojteq07 » 7 lis 2010, o 20:33

Przeczytaj sobie jakąś definicję, to się dowiesz jak działa kompilator. Przy okazji poszukaj definicji optymalizacji. Zrozum że ja wciąż mam coraz mniejszą ochotę na tłumaczenie Ci czegokolwiek. Ja się odnoszę do konkretnych cytatów, Ty wysuwasz swoje idee. Ja zwracam uwagę, że zbyt lekko podchodzisz do tego co wypisujesz, czy mieszasz różne rzeczy. Ty się obrażasz, dodatkowo dostało mi się za to personalnymi atakami.
Dyskusja z Tobą skończona, bo nie nadajesz się do rozmowy. Jeśli cokolwiek krytykujesz to powinieneś podać kontrargumentacje, w jakiś sposób wytłumaczyć swoją pozycję, a nie kazać mi się odwoływać do literatury...
Wiem doskonale jak działa kompilator bo od tego mam studia, szkolenia w pracy i za to mi płacą...

Proszę abyś nie cytował więcej moich słów w formie podważania mojej wiedzy, jeśli w taki sposób masz zamiar dyskutować...
Jak tylko uzyskam pomoc związaną z projektem, to przestanę odwiedzać forum i będziesz miał ode mnie spokój...

Awatar użytkownika
Darlington
-
-
Posty: 574
Rejestracja: 12 lis 2007, o 18:18
Lokalizacja: stąd!

Postautor: Darlington » 7 lis 2010, o 20:35

Człowieku wykaż trochę pokory, na Elektrodzie byś miał taki temat po 2 minutach w koszu bez żadnego ale, tu jest forum dla ludzi ale trzeba też coś od siebie dać a nie tylko wymagać i jeszcze mieć pretensje...

Pozdrawiam.

Awatar użytkownika
Tomasz Gumny
-
-
Posty: 685
Rejestracja: 4 lut 2004, o 23:31
Lokalizacja: Trzcianka/Poznań

Postautor: Tomasz Gumny » 7 lis 2010, o 20:38

Autor dość swobodnie miesza różne typy danych: tab[] jest zadeklarowana jako int, ale zapisywana i odczytywana jako char, do tego porównywana z 256, co wskazuje jednak na int. Program możesz przysłać, ale tak jak pisałem nie mam czasu na dłuższą analizę. Chyba, że potniesz za mnie 150m kabla na 2..4-metrowe odcinki i zarobisz końce a potem zmontujesz 12 niedużych płytek...

Awatar użytkownika
Darlington
-
-
Posty: 574
Rejestracja: 12 lis 2007, o 18:18
Lokalizacja: stąd!

Postautor: Darlington » 7 lis 2010, o 20:39

Tomasz Gumny, char jest typem całkowitym przecież. Więc można traktować go jak liczbę i przeprowadzać na zmiennych char-owskich operacje jak na liczbach. Przecież kod ASCII to też liczby.

wojteq07
-
-
Posty: 20
Rejestracja: 5 lis 2010, o 21:42
Lokalizacja: Kraków

Postautor: wojteq07 » 7 lis 2010, o 21:01

Coś nie coś zaczyna świtać.

Praca nagli i czas odłożyć projekt do wtorku...

Dziękuje Panowie za dotychczasową pomoc i wyrozumiałość. Muszę przyznać, że dość specyficzną mają pracę ludzie, którzy programują elektronikę... Zajęcie kompletnie nie dla mnie...

Awatar użytkownika
Tomasz Gumny
-
-
Posty: 685
Rejestracja: 4 lut 2004, o 23:31
Lokalizacja: Trzcianka/Poznań

Postautor: Tomasz Gumny » 7 lis 2010, o 21:06

Więc można traktować go jak liczbę i przeprowadzać na zmiennych char-owskich operacje jak na liczbach.
Czy ja gdzieś napisałem, że nie można? Pisałem wyłącznie o mieszaniu danych o różnej długości. O ile w prostych działaniach kompilator powinien sobie poradzić z konwersją typów (char) na (int) i odwrotnie, to już wywołanie funkcji z argumentem o innej długości niż wskazana przy deklaracji, może wywołać nieoczekiwane skutki.

Awatar użytkownika
Darlington
-
-
Posty: 574
Rejestracja: 12 lis 2007, o 18:18
Lokalizacja: stąd!

Postautor: Darlington » 7 lis 2010, o 21:11

Jest coś takiego jak niejawne rzutowanie i kompilator to automatycznie wykona, ewentualnie wyrzuci warninga ale skompilować skompiluje. I tak można niejawnie rzutować double na int i skutkuje to ucięciem części ułamkowej, w innych przypadkach też się ewentualnie coś traci.

Awatar użytkownika
Tomasz Gumny
-
-
Posty: 685
Rejestracja: 4 lut 2004, o 23:31
Lokalizacja: Trzcianka/Poznań

Postautor: Tomasz Gumny » 7 lis 2010, o 21:32

Napiszę tylko: dobrze masz, że możesz ufać niejawnemu rzutowaniu typów i matematyce zmiennoprzecinkowej.

Awatar użytkownika
r-mik
-
-
Posty: 351
Rejestracja: 14 cze 2005, o 19:18
Lokalizacja: Wawa
Kontaktowanie:

Postautor: r-mik » 9 lis 2010, o 08:11

W przypadku zdań logicznych nawiasy są istotne, podczas gdy w matematyce występuje kolejność wykonywania działań z listy priorytetów operatorów. To całkiem inna rzecz człowieku. Mówisz o kompletnie innych rzeczach...

Wciąż mam rację... doczytaj dodane obliczenia...
A jednak nie wiesz jak działa optymalizacja. Sprawdziłem i czy w wyrażeniach logicznych dasz ZBĘDNE nawisy czy nie, kod zostanie skompilowany tak samo! Ewentualnie można otrzymać ostrzeżenie, że wynik może być niezgodny z oczekiwanym, ale to zależy od kompilatora.

Analizowałeś kiedyś rozwinięcie asemblerowe? Wydaje mi się, że nie, więc dobrze ci radzę sprawdź jak różna składnia rozkazów kompiluje się do kodu wynikowego, przy różnych optymalizacjach, a dopiero wtedy się wymądrzaj.

Wyłącz optymalizacje, a zobaczysz, że w przypadku AVR przestanie działać zapis do eeprom, obsługa WDG i przejście w stan uśpienia i obniżonego poboru mocy. Domyślasz się dlaczego tak się dzieje?

Włączasz optymalizacje i przestaje działać pętla opóźniająca w stylu:
for (x=0; x<1000000; x++){}
Wiesz dlaczego?

Jak nie wiesz, to zobacz jak jest zrobiona funkcja _delay_ms(), że optymalizacja "jej nie rusza".

Duzo jeszcze wody w Wiśle upłynie, zanim będziesz mógł pracować u mnie.

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 20 gości