Programowanie modulowe w C (AVR)...
Masz problem? Zapytaj na forum elektroda.pl
From: "ToR" <ToR_kulaWYTNIJTO_at_nospam_o2.pl>
Subject: Programowanie modulowe w C (AVR)...
Date: 18 Apr 2006 20:41:44 +0200
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.
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
From: "Slawek" <tnij.slawekg1.tnij_at_nospam_o2.tnij.pl>
Subject: Re: Programowanie modulowe w C (AVR)...
Date: Tue, 18 Apr 2006 21:36:11 +0200
Użytkownik "ToR" <ToR_kulaWYTNIJTO_at_nospam_o2.pl> napisał w wiadomości
news:55ea.0000014c.444532e8_at_nospam_newsgate.onet.pl...
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.
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.
From: "ToR" <ToR_kulaWYTNIJTO_at_nospam_o2.pl>
Subject: Re: Programowanie modulowe w C (AVR)...
Date: 18 Apr 2006 22:14:12 +0200
to taki tak sobie przykład.
Wielkie dzieki :D -dokladnie o to mi chodzilo, wszytko juz ladnie smiga ;)
Pozdrawiam,
Rafal k.
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
From: Adam Dybkowski <adybkows123_at_nospam_amwaw.edu.pl>
Subject: Re: Programowanie modulowe w C (AVR)...
Date: Tue, 18 Apr 2006 22:46:05 +0200
ToR napisał(a):
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.
-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.
--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/
Uwaga: przed wysłaniem do mnie maila usuń "123" z adresu.
From: "ToR" <ToR_kulaWYTNIJTO_at_nospam_o2.pl>
Subject: Re: Programowanie modulowe w C (AVR)...
Date: 19 Apr 2006 22:21:16 +0200
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.
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
From: Adam Dybkowski <adybkows123_at_nospam_amwaw.edu.pl>
Subject: Re: Programowanie modulowe w C (AVR)...
Date: Wed, 19 Apr 2006 22:45:10 +0200
ToR napisał(a):
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?
1. w pliku źródłowym (np. cos.c) wstawiasz zmienną tak aby była widoczna
na zewnątrz (nie statyczna):
int Licznik_sekund;
2. w pliku nagłówkowym wciąganym przez main.c (np. w cos.h) lub od razu
w main.c wstawiasz:
extern int Licznik_sekund;
3. 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.
--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/
Uwaga: przed wysłaniem do mnie maila usuń "123" z adresu.
From: "ToR" <ToR_kulaWYTNIJTO_at_nospam_o2.pl>
Subject: Re: Programowanie modulowe w C (AVR)...
Date: 20 Apr 2006 23:57:35 +0200
1. w pliku źródłowym (np. cos.c) wstawiasz zmienną tak aby była widoczna
na zewnątrz (nie statyczna):
int Licznik_sekund;
2. w pliku nagłówkowym wciąganym przez main.c (np. w cos.h) lub od razu
w main.c wstawiasz:
extern int Licznik_sekund;
3. korzystasz ze zmiennej Licznik_sekund w pliku main.c tak jakby leżała
lokalnie i już.
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.
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
From: "Jacek M." <tymkonto_at_nospam_poczta.onet.pl>
Subject: Re: Programowanie modulowe w C (AVR)...
Date: Fri, 21 Apr 2006 07:31:58 +0200
1. w pliku źródłowym (np. cos.c) wstawiasz zmienną tak aby była widoczna
na zewnątrz (nie statyczna):
int Licznik_sekund;
2. w pliku nagłówkowym wciąganym przez main.c (np. w cos.h) lub od razu
w main.c wstawiasz:
extern int Licznik_sekund;
3. korzystasz ze zmiennej Licznik_sekund w pliku main.c tak jakby leżała
lokalnie i już.
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".
To zdefiniuj ja tak:
volatile unsigned int Licznik_sekund;
Jesli ta zmienna jest obrabiana w przerwaniu to moze tak byc jak napisales.
Jacek M.