Programowanie modulowe w C (AVR)...

Apr 18, 2006 7 Replies

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.


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.

Wielkie dzieki :D -dokladnie o to mi chodzilo, wszytko juz ladnie smiga ;)

Pozdrawiam, Rafal k.

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.

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.

ToR napisał(a):

  1. w pliku źródłowym (np. cos.c) wstawiasz zmienną tak aby była widoczna na zewnątrz (nie statyczna):

int Licznik_sekund;

  1. w pliku nagłówkowym wciąganym przez main.c (np. w cos.h) lub od razu w main.c wstawiasz:

extern int Licznik_sekund;

  1. 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.

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.

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