RTV forum PL | NewsGroups PL

Znikająca zmienna globalna w programie na ATmega128 przy obsłudze przerwań

Dlaczego ATmega128 przekłamuje?

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Znikająca zmienna globalna w programie na ATmega128 przy obsłudze przerwań

Goto page Previous  1, 2, 3, 4, 5, 6, 7  Next

Ghost
Guest

Thu Oct 15, 2009 2:44 pm   



Użytkownik "T.M.F." <tmf@nospam.mp.pl> napisał w wiadomości
news:hb790t$bbg$1@nemesis.news.neostrada.pl...

Quote:
jak pisze aplikacje na PC to rzadko kiedy mam 2 breakpointy, jesli mam to
tylko dlatego, ze ktoregos zapomnialem skasowac Smile

Dokladnie, a warunkowego uzylem moze trzy razy w zyciu - kwestia wprawy.

John Smith
Guest

Thu Oct 15, 2009 2:45 pm   



Quote:
Ale jakie konkretnie warunki mozna zapodac oprocz tych, ktore potrafi
ATMega z JTAG?

Typowo jak piszę program naraz używam 4 do 6 pułapek. Jest do 8.


Zdarzylo mi sie ustawic 4 pulapki, ale juz naprawde nie widze potrzeby,
zeby ustawiac wiecej. W koncu jak szukam bledu to mam jakies
podejrzenia, a nie ustawiam pulapek w calym kodzie. Wlasciwie to 1-2 mi
w zupelnosci wystarczaja. Zeby nie bylo, ze sprzet mi wymusza takie
zachowania - jak pisze aplikacje na PC to rzadko kiedy mam 2
breakpointy, jesli mam to tylko dlatego, ze ktoregos zapomnialem
skasowac Smile

To pisz tak dalej, przeciwskazań nie ma.
K.

Konop
Guest

Thu Oct 15, 2009 3:25 pm   



T.M.F. pisze:
Quote:
W dniu 15.10.2009 11:25, Konop pisze:
Oj, jednak pola bitowe sa czytelniejsze. No i jesli zmienisz ich
kolejnosc to nie pociaga to potem zazwyczaj uperdliwej zmiany we
wszytkich plikach.

Z kolejnością się nie zgodzę!! Tworzę jeden plik nagłówkowy i tam
umieszczam wszystkie definicje - nie ma problemu ze zmianą kolejności
;D...
Jest jedno "za" tą metodą (i z tego względu tego też używałem). Z tego,
co gdzieś kiedyś czytałem [potrzebne źródło Wink] to kompilator ma prawo
dowolnie rozmieścić pola bitowe w bajcie. Niekoniecznie będą więc one
umieszczone w kolejności wpisywania... w momencie, w którym chce się
potem taki bajt gdzieś "wyświetlić", to koniecznie trzeba wiedzieć który
bit co oznacza, a używając pól bitowych (dwukropka Wink), możemy tego nie
wiedzieć...

Cos sie zapetliles, to w koncu te pola bitowe sa rozmieszczane dowolnie
czy nie?

Nie no, w MOIM Wink rozwiązaniu kolejność łatwo zmienić i jest ona
"pewna", a w polach bitowych też łatwo zmienić, ale jest ona niepewna...

Quote:
IMHO kompilator rozmieszcza je w kolejnosci w jakiej sa zdefiniowane - w
koncu to struktura, a elementy struktury wystepuja w kolejnosci zgodnej
z definicja.

Poszukam gdzieś informacji, bo na pewno gdzieś to czytałem... ale czy to
było wiarygodne źródło, to nie wiem... ale tak swoją drogą, robisz
strukturę (zapis skrócony):
Pole1 : 3
Pole2 : 4
Pole3 : 6
Pole4 : 1
Pole5 : 2

Proc o dostępie do pamięci bajtowym... jak pamięć przydzieli
kompilator?? Jak wrzuci jak leci, to Pole3 będzie podzielone pomiędzy
dwa bajty?? Czy może najstarszy bit zostanie "pusty" i Pole3 zacznie się
od drugiego bajtu - wówczas całość zajmie 3 bajty... a może kompilator w
ten 1 wolny bit pierwszego bajtu wrzuci Pole4??

Pozdrawiam
Konop

DJ
Guest

Thu Oct 15, 2009 3:52 pm   



On 2009-10-15 16:25:30 +0200, Konop <konoppo@gazeta.pl> said:

Quote:

Proc o dostępie do pamięci bajtowym... jak pamięć przydzieli kompilator??

man gcc

-mbit-align

--
DJ

PS. przy odpisywaniu na priv usun antyspamowy wpis z adresu

cepu69
Guest

Thu Oct 15, 2009 4:21 pm   



Adam Dybkowski wrote:

Quote:
Darkac pisze:

Kompilator robi miliony różnych automatycznych operacji, mógłby robić
również i to. Wszystko powinno być podporządkowane wygodzie człowieka.
Po co zaśmiecać głowę i treść programu operacjami które może zrobić
maszyna.
Szybkość, łatwość i wygoda, to powinny być priorytety w pracy
programisty.

Pomyliłeś języki, zacznij pisać raczej w Javie.


Raczej orginalny pytacz pomylil sie z wyborem zawodu.
Moja rada brzmi :
1. Albo pogodz sie z tematem i zwiaznymi z nim problemami czyli wez sie do
nauki
2. Albo daj sobie spokoj to jest nie dla Ciebie i mam to na mysli tworzenie
kodu jako takiego (bez wzgledu na jezyk) bo zawsze bedzi pod gorke i wiatr
w oczy Wink

MiSTER
Guest

Thu Oct 15, 2009 7:11 pm   



Quote:
Cos sie zapetliles, to w koncu te pola bitowe sa rozmieszczane dowolnie
czy nie?
IMHO kompilator rozmieszcza je w kolejnosci w jakiej sa zdefiniowane - w
koncu to struktura, a elementy struktury wystepuja w kolejnosci zgodnej z
definicja.

Nie zaleca się korzystać z pól bitowych jeżeli soft ma być kompilowany pod
różnymi platformami gdyż standard NIE DEFINIUJE kolejności przypisania
bitów.

W niektórych sytuacjach jest to bardzo istotna przeszkoda.


Pozdrawiam
MiSter

Artur M. Piwko
Guest

Thu Oct 15, 2009 7:13 pm   



In the darkest hour on Thu, 15 Oct 2009 14:47:53 +0200,
T.M.F. <tmf@nospam.mp.pl> screamed:
Quote:
Jest jedno "za" tą metodą (i z tego względu tego też używałem). Z tego,
co gdzieś kiedyś czytałem [potrzebne źródło Wink] to kompilator ma prawo
dowolnie rozmieścić pola bitowe w bajcie. Niekoniecznie będą więc one
umieszczone w kolejności wpisywania... w momencie, w którym chce się
potem taki bajt gdzieś "wyświetlić", to koniecznie trzeba wiedzieć który
bit co oznacza, a używając pól bitowych (dwukropka Wink), możemy tego nie
wiedzieć...

Cos sie zapetliles, to w koncu te pola bitowe sa rozmieszczane dowolnie
czy nie?

Zależnie od architektury CPU i od kompilatora. Jeśli zapiszesz strukturę
z polem bitowym do pliku, taki plik nie będzie przenośny.

--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:214B ]
[ 20:12:08 user up 12226 days, 8:07, 1 user, load average: 0.30, 0.10, 0.54 ]

God: Darwin's chief rival.

Artur M. Piwko
Guest

Thu Oct 15, 2009 7:16 pm   



In the darkest hour on Wed, 14 Oct 2009 23:49:13 +0200,
Adam Dybkowski <adybkows12@45wp.pl> screamed:
Quote:
Tam kod wynikowy wykonywany przez procesor jest znacząco oddalony od
tego, co napisał programista (oprócz kompilatora po drodze jest maszyna
wirtualna tłumacząca bytecode na asembler danego procka). Nawet
skomplikowane akcje pisze się szybciej i krócej niż w C, ale wynikiem
tego jest kod działający znacznie wolniej niż napisany od razu w języku
C no i przy tym znacznie dłuższy (po kompilacji w JRE, bytecode może być
nawet krótszy). No ale jeżeli przedkładasz koszt developmentu nad
wydajność aplikacji to Java będzie w sam raz dla Ciebie.


Bez przesady znowu z tą wydajnością. Różnice nieistotne zwłaszcza
w przypadku programów z GUI. Dużo programów napisałem w Pythonie, dla
Ciebie pewnie taki program stoi w miejscu i ani piśnie... Wink
A dlaczego w nim? Szybciej, zwięźlej, czytelniej, przenośniej.
Ale to już na jakieś advocacy.

--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:233B ]
[ 20:14:39 user up 12226 days, 8:09, 1 user, load average: 0.30, 0.10, 0.54 ]

It's here at last: We've released a 26-week project in 48 weeks.

Artur M. Piwko
Guest

Thu Oct 15, 2009 8:56 pm   



In the darkest hour on Wed, 14 Oct 2009 15:17:47 +0200,
Konop <konoppo@gazeta.pl> screamed:
Quote:
jak do pamięci RAM. Uważam, że dobrze, że pamięć Flash w AVRze obsługuje
się nie jak zwykłe zmienne, bo wymusza to na programiście odpowiednie
podejście do tego typu zmiennych.

Z punktu widzenia programisty piszącego program w C jest to jedynie
upierdliwe (mam tu na myśli tablice z const char *).

Quote:
jest jak zwykła zmienna. W komputerach klasy PC stałe (const) trzymane
są w pamięci RAM, bo nie ma innego wyjścia. W ARMach trafiają do pamięci
Flash z reguły, bo jest jedna przestrzeń adresowa. Czemu dla AVRów
miałby być wyjątek??


Zużywa na ARV niepotrzebnie RAM dla vtable w przypadku C++.

--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:227B ]
[ 21:54:16 user up 12226 days, 9:49, 1 user, load average: 0.30, 0.10, 0.54 ]

Death is life's way of telling you you've been fired.

Ghost
Guest

Thu Oct 15, 2009 9:36 pm   



Użytkownik "Artur M. Piwko" <milusi.pysiaczek@buziaczek.pl> napisał w
wiadomości news:slrnhdepht.6fu.milusi.pysiaczek@buziaczek.pl...
Quote:
In the darkest hour on Thu, 15 Oct 2009 14:47:53 +0200,
T.M.F. <tmf@nospam.mp.pl> screamed:
Jest jedno "za" tą metodą (i z tego względu tego też używałem). Z tego,
co gdzieś kiedyś czytałem [potrzebne źródło Wink] to kompilator ma prawo
dowolnie rozmieścić pola bitowe w bajcie. Niekoniecznie będą więc one
umieszczone w kolejności wpisywania... w momencie, w którym chce się
potem taki bajt gdzieś "wyświetlić", to koniecznie trzeba wiedzieć który
bit co oznacza, a używając pól bitowych (dwukropka Wink), możemy tego nie
wiedzieć...

Cos sie zapetliles, to w koncu te pola bitowe sa rozmieszczane dowolnie
czy nie?

Zależnie od architektury CPU i od kompilatora. Jeśli zapiszesz strukturę
z polem bitowym do pliku, taki plik nie będzie przenośny.

Podobnie jak swobodny strumien swiadomosci jest slabo przenosny, ale
przeciez zdajemy sobie z tego sprawe, wiec bez przesady.

T.M.F.
Guest

Thu Oct 15, 2009 9:41 pm   



W dniu 15.10.2009 20:11, MiSTER pisze:
Quote:
Cos sie zapetliles, to w koncu te pola bitowe sa rozmieszczane dowolnie
czy nie?
IMHO kompilator rozmieszcza je w kolejnosci w jakiej sa zdefiniowane - w
koncu to struktura, a elementy struktury wystepuja w kolejnosci zgodnej z
definicja.

Nie zaleca si korzysta z pl bitowych jeeli soft ma by kompilowany pod
rnymi platformami gdy standard NIE DEFINIUJE kolejnoci przypisania
bitw.

W niektrych sytuacjach jest to bardzo istotna przeszkoda.

Ale to jak sadze jest raczej kwestia big/little-endian.
Dla programu nie ma to znaczenia - o ile wlasnie nie przenosze pomiedzy
architekturami danych wygenerowanych na innej. Bo w samym programie
odwolanie do pola struktury zawsze bedzie jednoznaczne.

--
Inteligentny dom - http://idom.wizzard.one.pl
http://idom.sourceforge.net/
Teraz takze forum dyskusyjne
Zobacz, wyslij uwagi, dolacz do projektu.

T.M.F.
Guest

Thu Oct 15, 2009 10:04 pm   



Quote:
jest jak zwykła zmienna. W komputerach klasy PC stałe (const) trzymane
są w pamięci RAM, bo nie ma innego wyjścia. W ARMach trafiają do pamięci
Flash z reguły, bo jest jedna przestrzeń adresowa. Czemu dla AVRów
miałby być wyjątek??

Zużywa na ARV niepotrzebnie RAM dla vtable w przypadku C++.

To akurat jest wada implementacji AVR w gcc i nie ma nic wspolnego z
typami - implementacja funkcji wirtualnych i pokrewnych tematow jest
calkowicie w gestii kompilatora. Nawet w jakims akcie desperacji
probowalem wygenerowac stosowny patch dla gcc ale ciagle umieram w
gaszczu kodu zrodlowego, poza tym w przyszlych wersjach ma to byc
poprawione.

--
Inteligentny dom - http://idom.wizzard.one.pl
http://idom.sourceforge.net/
Teraz takze forum dyskusyjne
Zobacz, wyslij uwagi, dolacz do projektu.

Artur M. Piwko
Guest

Fri Oct 16, 2009 7:31 am   



In the darkest hour on Thu, 15 Oct 2009 22:36:27 +0200,
Ghost <ghost@everywhere.pl> screamed:
Quote:
Cos sie zapetliles, to w koncu te pola bitowe sa rozmieszczane dowolnie
czy nie?

Zależnie od architektury CPU i od kompilatora. Jeśli zapiszesz strukturę
z polem bitowym do pliku, taki plik nie będzie przenośny.

Podobnie jak swobodny strumien swiadomosci jest slabo przenosny, ale
przeciez zdajemy sobie z tego sprawe, wiec bez przesady.


Nie wszyscy sobie z tego zdają sprawę. Usenet to nie tylko Ty i ja.

--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:237B ]
[ 08:31:25 user up 12227 days, 20:26, 1 user, load average: 0.18, 0.04, 0.45 ]

Bigamy is having one wife too many. Monogamy is the same. -- Oscar Wilde

Piotr Gałka
Guest

Fri Oct 16, 2009 10:49 am   



Użytkownik "T.M.F." <tmf@nospam.mp.pl> napisał w wiadomości
news:hb4gsl$bd$1@atlantis.news.neostrada.pl...
Quote:
A za to jest bardzo fajna właściwość, bo można zadeklarować zmienne
pełniące rolę dwustanowych flag jako "bool". Podejrzewam, że nie zajmują
wtedy całego bajtu. Jeśli tak , to przydało by się coś takiego w
programowaniu ATmegi. Kupę RAM-u zajmują flagi. Duże marnotrawstwo.
Bawienie się w maski, to znów przystosowywanie się do kaprysów komputera.

Przejrzyj liste instrukcji AVR i nie bedziesz mial zludzen. Mozesz
zadeklarowac zmienna bool, mozesz wykorzystac pola bitowe, ale to ciagle
bedzie tlumaczone na operacje na bitach typu ustawianie, zerowanie itd.

Przepraszam, że się odzywam w temacie na którym się kompletnie nie znam. Na

temat flag w postaci bitów w bajtach w AVR omawianych w kursie C na AVR w EP
usłyszałem przed kilku laty mniej więcej taką wypowiedź:
"Jak można podawać takie przykłady! Przecież trzeba znać maszynę, na której
program będzie chodził. Widać, że ktoś bezmyślnie przepisał przykład z 51 na
AVR. Potem ludzie tak napiszą i mamy to co mamy."
Z tego co pamiętam to chodziło o to, że przestawienie bitu w bajcie na AVR
wymaga więcej niż jednego rozkazu. No i w przykładzie przyjście przerwania
miedzy tymi rozkazami prowadziło do błędu.
Liczę na to, że ktoś piszący na AVR wypowie się na ten temat (bo nawet nie
jestem pewien, czy te pretensje były uzasadnione).
Z przebiegu wątku wygląda, że jego autor być może powstawia flagi do bajtów
co być może doprowadzi do nowych błędów.
No i chęć zapobiegnięcia temu skłoniła mnie do tej dość mętnej wypowiedzi.
P.G.

cepu69
Guest

Fri Oct 16, 2009 12:24 pm   



T.M.F. wrote:

Quote:
W dniu 15.10.2009 20:11, MiSTER pisze:
Cos sie zapetliles, to w koncu te pola bitowe sa rozmieszczane dowolnie
czy nie?
IMHO kompilator rozmieszcza je w kolejnosci w jakiej sa zdefiniowane - w
koncu to struktura, a elementy struktury wystepuja w kolejnosci zgodnej
z definicja.

Nie zaleca si? korzysta? z p?l bitowych je?eli soft ma by? kompilowany
pod
r?nymi platformami gdy? standard NIE DEFINIUJE kolejno?ci przypisania
bit?w.

To kompilator ustala kolejnosc bitwo we bajcie, np GCC vs propriety

compiler:
typedef union {
unsigned short word;
#ifndef __GNUC__
struct
{
unsigned short :1; /* reserved */
unsigned short CodeAssertLine :13;
unsigned short EventOverflowTrigger :1;
unsigned short EventCodeAssertTrigger :1;
} bit;
#else
struct
{
unsigned short EventCodeAssertTrigger :1;
unsigned short EventOverflowTrigger :1;
unsigned short CodeAssertLine :13;
unsigned short :1; /* reserved */
} bit;
#endif

aczkolwiek GCC dostarcza makra __BIG_ENDIAN_BITFIELD oraz
__LITTLE_ENDIAN_BITFIELD informujace o ukladzie bitow w slowie

struct atapi_mechstat_header {
#if defined(__BIG_ENDIAN_BITFIELD)
__u8 fault : 1;
__u8 changer_state : 2;
__u8 curslot : 5;
#elif defined(__LITTLE_ENDIAN_BITFIELD)
__u8 curslot : 5;
__u8 changer_state : 2;
__u8 fault : 1;
#else
#error "Please fix <asm/byteorder.h>"
#endif

#if defined(__BIG_ENDIAN_BITFIELD)
__u8 mech_state : 3;
__u8 door_open : 1;
__u8 reserved1 : 4;
#elif defined(__LITTLE_ENDIAN_BITFIELD)
__u8 reserved1 : 4;
__u8 door_open : 1;
__u8 mech_state : 3;
#else
#error "Please fix <asm/byteorder.h>"
#endif

byte curlba[3];
byte nslots;
__u8 short slot_tablelen;
};

Quote:

Ale to jak sadze jest raczej kwestia big/little-endian.
Nie endian mowi o kolejnosi bajtow w slowie :

http://pl.wikipedia.org/wiki/Kolejność_bajtów

Quote:
Dla programu nie ma to znaczenia - o ile wlasnie nie przenosze pomiedzy
architekturami danych wygenerowanych na innej. Bo w samym programie
odwolanie do pola struktury zawsze bedzie jednoznaczne.
Oczywiscie dopoki nie jest to unia i odwolujesz sie do niej zarowno przez

pola bitowe jak i slowa Wink

Goto page Previous  1, 2, 3, 4, 5, 6, 7  Next

elektroda NewsGroups Forum Index - Elektronika Polska - Znikająca zmienna globalna w programie na ATmega128 przy obsłudze przerwań

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map