Mam do napisania duzy projekt (3-4 uC) i z tad zdecydowalem sie na strukture modulowa kodu. Czyli pisze oprogramowanie w plikach (.c i h.)i dodaje je do programu glownego.
Ale mam pytanie czy moze mi ktos powiedziec jak zrobic aby zmienna lokalna (nalezaca do jednego z plikow) stala sie zmienna globalna? Poprzez wskaznik? Jesli tak to jak to zrealizowac?
Pozdarwiam, Rafal k.
Didn't find your answer? Ask the community — no account required.
S
Slawek
U¿ytkownik "ToR" <ToR snipped-for-privacy@o2.pl napisa³ w wiadomo¶ci news: snipped-for-privacy@newsgate.onet.pl...
Witam hmm, nie wiem czy oto ci chodzi, ale jak zadeklarujesz zmienn± jako globaln± dla danego pliku *.c to jest ona globalna dla ca³ego projektu, aby mieæ do niej dostêp w innych plikach *.c to wystarczy ¿e w pliku *.h (odpowiedniku *.c w których zmienna jest zadeklarowana) dopiszesz:
extern zmienna., i w kolejnych plikach *.c do³aczych *.h
przyk³ad
plik modul1.c
unsigned char zmienna1 = 0;
void main(void) {
}
plik modul1.h
#ifndef __MODUL1_H__ #define __MODUL1_H__
extern zmienna1;
#endif
plik modul2.c
#include "modul1.h"
unsigned char func1(void) { if (zmienna1 & 0x07) return 1;
return 0; }
to taki tak sobie przyk³ad.
pzdr S³awek.
T
ToR
Wielkie dzieki :D -dokladnie o to mi chodzilo, wszytko juz ladnie smiga ;)
Pozdrawiam, Rafal k.
A
Adam Dybkowski
ToR napisał(a):
:-o To chyba standard programowania na czymkolwiek, niezależnie od liczby procesorów. Jak niby inaczej miałby wyglądać program? 10k linii w jednym pliku źródłowym?
Gdy spuchnie Ci trochę kod, dojdziesz że warto z oddzielnych modułów (zestawu plików .c i jednego lub więcej .h) robić biblioteki (.a), z których linker sobie bardzo wygodnie wybiera tylko te funkcje, które są potrzebne. Dlatego od razu myśl nad maksymalnym rozszczepieniem dużych plików .c na wiele drobnych, zawierających funkcje mogące działać niezależnie.
T
ToR
A wydawalo mi sie ze jest "tak pieknie" :P.
Program kompiluje sie ze zmienna (Licznik_sekund) zainicjonowana w pliku modulowym cos.c i jest widoczna w main.c lecz nie moge odczytac jej wartosc innymi slowy :
plik main.c
...
while(1) { if (Licznik_sekund==2) TCCR2=0; }
nie chce mi wejsc do powyzszej petli...Jak zrobic aby umozliwic realny odczyt wartosc zmiennej zainicjonowanej w plikach modulowych?
Pozdrawiam, Rafal k.
A
Adam Dybkowski
ToR napisał(a):
w pliku źródłowym (np. cos.c) wstawiasz zmienną tak aby była widoczna na zewnątrz (nie statyczna):
int Licznik_sekund;
w pliku nagłówkowym wciąganym przez main.c (np. w cos.h) lub od razu w main.c wstawiasz:
extern int Licznik_sekund;
korzystasz ze zmiennej Licznik_sekund w pliku main.c tak jakby leżała lokalnie i już.
Napisz, w czym dokładnie jest problem. Program się nie kompiluje? Jak wygląda zrzut w asemblerze okolic wykorzystania zmiennej Licznik_sekund w module main?
BTW: Jest zalecane wykorzystywanie for (;;) { ... } zamiast while (1). Co lepsze kompilatory burzą się, że przy while podano stały warunek. Poza tym polecam przeczytanie zaleceń formatowania kodu źródłowego np. z dokumentacji jądra Linuxa. Dowiesz się m.in., że w zmiennych nie używa się wielkich liter.
T
ToR
Robie dokladnie jak napisales i dalej jest ten sam problem czyli w main.c nie mam wartosci Licznik_sekund tylko jakies smieci totez nie wchodzi mi do wspomnanego warunku while(1) .W AVR-Studio widze ze wartosc tej zmiennej jest w SRAM...Moze to kogos naprowadzi..
PS: Zmienna Licznik_sekund jest typu "unsigned int".
Pozdarwiam, Rafal k.
J
Jacek M.
To zdefiniuj ja tak: volatile unsigned int Licznik_sekund; Jesli ta zmienna jest obrabiana w przerwaniu to moze tak byc jak napisales.
Jacek M.
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.