Fórum témák

» Több friss téma
Fórum » ARM - Miértek hogyanok
 
Témaindító: gtk, idő: Jún 26, 2007
Lapozás: OK   128 / 128
(#) rascal válasza Ivan93 hozzászólására (») Szo, 18:43 /
 
C-ben én is keveset és kényszerűségből programoztam, c++ pedig semmit, így az arra vonatkozó definíció működését nem ismerem.
A __gpio_H-t jól gondolod, és ezt a saját .h fájljaidban is használd, hogy az azokban lévő definíciók is csak egyszer forduljanak le.
A extern arra való, hogy azok a modulok is tudjanak egy-egy közösen használt változóról, vagy függvényről, amit nem bennük definiáltál, de használniuk kell. Próbáltam egy picit szemléletesebbé tenni.

disp5x7_stm.h:
  1. #ifndef DISP5X7_STM_H_  // amit ebbe a blokkba írtam, azt a fordító egyetlen egyszer fogja értelmezni, bár hány helyről is hivatkoznak rá.
  2.     #define DISP5X7_STM_H_
  3.     #define DISP_UNIT_HOR       10     // karakterek száma vízszintesen
  4. #endif /* DISP5X7_STM_H_ */
  5. #ifdef DISP5X7_STM_C_ // amit ide írok, az csak a disp5x7_stm.c számára fordítódik le.
  6.     void disp_clear(void); // ez a függvény a disp5x7_stm.c-ben van létrehozva, de azt szeretném, hogy ezen belül ne csak az utána bepötyögött függvények érjék el, hanem az előtte levők is.
  7. #else
  8.   // amit innen írok mindenki számára látszik, kivéve a "disp5x7_stm.c"-t. Ide csak externeket írok, mert azokról a disp5x7_stm.c-ben lévő változókról és függvényekről akarok hírt adni, amit más moduloknak is el kell érniük.
  9.     extern void disp_display(void); // Kijelző kezelése, IRQ-ból hívogatni
  10.     extern void disp_clear(void);
  11. #endif /* DISP5X7_STM_C_ */


disp5x7_stm.c:
  1. #define DISP5X7_STM_C_ // disp5x7_stm.h innen tudja, hogy most disp5x7_stm.c hivatkozik rá
  2.     #include"disp5x7_stm.h"
  3. #undef DISP5X7_STM_C_ // töröljük a definíciót, hogy a későbbi hivatkozásokról tudja disp5x7_stm.h, hogy nem a disp5x7_stm.c-ből jövő hivatkozás, így másképp kell reagálnia.
  4.  
  5. void disp_display(void) // display irq függvénye
  6. {
  7.   bla bla bla;
  8. } //fv
  9.  
  10. void disp_clear(void) // 0 beírása az összes latch-be
  11. {
  12.     disp_data_clr;
  13.     disp_delay_1us;
  14.     disp_latch_toggle(ODR_DISP_L0 | ODR_DISP_L1 | ODR_DISP_L2 | ODR_DISP_L3 | ODR_DISP_L4 | ODR_DISP_L5 | ODR_DISP_L6 | ODR_DISP_L7 | ODR_DISP_L8 | ODR_DISP_L9);
  15. }
A hozzászólás módosítva: Szo, 18:44
(#) Ivan93 válasza rascal hozzászólására (») Szo, 21:12 /
 
A .h fájlokat kiegészítettem a gpio-h mintájára, de valami nem jó. A következő fájljaim vannak a main-en (és a többi gyárin) kívül: myVariables.h, myFunctions.h és myFunctions.c.
A myVariables.h és myFunctions.h meghívom a main.c-ben. A myFunctions.h-ban meghívom a myVariables.h-t, a myFunctions.c-ben pedig a myVariables.h-t és myFunctions.h-t is. Eleinte működött, amíg csak define volt a myVariables.h-ban. Aztán tettem bele egy változó deklarálást (double batteryVoltage=12; ) amit a myFunctions.c-ben használtam volna. Illetve ezt az értéket később felülírnám majd, de erre még nem került sor. Ekkor a fordítás végén panaszkodik, hogy batteryVoltage-t többször definiáltam. Erre mi lenne a megoldás, vagyis hol rontottam el?
Mellékeltem a source és include mappákat, a benne lévő fájlokkal talán jobban érthető amit leírtam.
A szemléltetést köszönöm, így már érthetőbb, de használni nem tudnám még magamtól.

src-inc.zip
    
(#) rolandgw válasza Ivan93 hozzászólására (») Szo, 21:48 /
 
A myFunctions.h-ba belevetted (nem meghívtad) a myVariables.h-t ezért a main.c-be csak az előbbi kell.
(#) Ivan93 válasza rolandgw hozzászólására (») Szo, 21:53 /
 
Kivettem a main-ből a myVariables.h-t, de ugyan azt írja:
Idézet:
„...
Src\myFunctions.o: (.data.batteryVoltage+0x0): multiple definition of `batteryVoltage'
Src\main.o: (.data.batteryVoltage+0x0): first defined here
collect2.exe: error: ld returned 1 exit status”
(#) rolandgw válasza Ivan93 hozzászólására (») Szo, 22:19 /
 
A batteryVoltage-t nem deklaráltad hanem definiáltad. H-ban deklarálunk .c-ben definiálunk.
(#) Ivan93 válasza rolandgw hozzászólására (») Szo, 22:57 /
 
Köszi! A myVariables-h-ból kivettem az értékadást (double batteryVoltage; ). Létrehoztam egy myVariables.c-t amibe belevettem a .h-t, és ebbe tettem az értékadást (double batteryVoltage=12.0; ) Nem tudom erre gondolták-e, de így működik.
(#) rolandgw válasza Ivan93 hozzászólására (») Szo, 23:12 /
 
Nem néztem bele a programodba, a leírás alapján egy header is elég lenne, változók és függvények deklarációja együtt. A batteryVoltage definíció pedig a myFunctions.c-be,ahol használod.
(#) rascal válasza Ivan93 hozzászólására (») Vas, 2:29 /
 
Bocs, hogy a programodat nem bogozom ki, de vagy egy éve nem programoztam egy sort sem. Én a helyedben valami egészen pici programot csinálnék csak ahhoz, hogy rájöjjek hogyan működik több .h és .c fájl együtt. Lehetne egy main.c, kozos.c, egy.c, ketto.c és hozzájuk .h-k. Fájlonként 1-2 függvényt készítenék, és azok hívogatnák egymást oda vissza. Ha minden egyes függvény csak annyit csinál, hogy kap egy int-et, változtat rajta és ezt adja vissza, az már kísérletezni elég.
Következő: »»   128 / 128
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu