Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 2 gru 2024, o 14:35


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 14 lut 2016, o 22:43 
Offline
Nowy

Dołączył(a): 26 maja 2015
Posty: 8
Pomógł: 0

Witajcie,

To mój pierwszy "poważny" post na forum. Napotkałem na problem, który niby rozwiązałem, ale nie daje mi to spokoju bo coś mam wrażenie, że cytując klasyka "Oj nie tak panowie, nie tak".

Przesiadłem się z ASM (PIC) na C (AVR) i uczę się od "0" korzystając z książek (niebieska, zielona [i czarna i biała]) ale wciąż jestem na początku przygody z C.

Stworzyłem kilka prostych bibliotek (libxxx.a), którymi obsługuję standardowe interface (SPI, RS, I2C).
Wykorzystuję je w swoich projektach przez dodanie odpowiednich wpisów we właściwościach projektu - tak żeby Eclipse wygenerowało wywołanie avr-gcc z odpowiednimi wpisami po "-L" i "-l"

Teraz napisałem bibliotekę do współpracy z kartą SD i jestem w kropce. Biblioteka SD wykorzystuje bibliotekę SPI.

Przy testach, gdzie przyszła biblioteka SD była programem czyli miała funkcję main() wszystko działało i zostało przetestowane.

Ale gdy stworzyłem kolejny program, który wykorzystuje skompilowaną już bibliotekę SD pojawiają się błędy, mówiące o braku referencji do procedur z biblioteki SPI - czyli tej "głębszej".

Jak dobrze rozumiem działanie linkera, powinien on poszukać sobie we wskazanych bibliotekach tego, czego nie znalazł w programie głównym.

Czy źródłem moich kłopotów jest to, że linker skanuje wskazane biblioteki tylko raz? Czyli dodaje procedury z biblioteki SD, ale tych "głębszych" z biblioteki SPI już nie?

We właściwościach projektu wskazane są wszystkie potrzebne biblioteki czyli SPI i SD. Gdyby linker sprawdzał w kilku przebiegach, to wszystko zostałoby znalezione.

Rozwiązanie jakie zadziałało, to dodanie we właściwościach projektu wpisów, o innych plikach z obiektami (SPI.o) jakie mają być dodane do projektu.
(C/C++ Build/Settings/Tool Setings/AVR Linker/Objects)

Tylko że przecież plik libxxx.a to zbiór zawartości jednego czy kilku plików xxx.o
Chyba że linker najpierw szuka w bibliotekach a w drugim skanowaniu w plikach z obiektami.
Albo najpierw dodaje wszystko z plików wskazanych w obiektach i potem zabiera się za mój program i wie już wszystko o procedurach SPI z tego pliku.

I teraz pytanie z tematu - czy pisanie biblioteki odwołującej się do innej biblioteki jest prawidłowe czy nie?

Może są "jakieś" ustawienia które pozwolą wskazać, że podczas kompilacji do mojej biblioteki SD mają być dodane wykorzystane obiekty z biblioteki SPI?

To rozwiązanie wydaje mi się najbardziej poprawne i przejrzyste bo wtedy we właściwościach wskazywałbym tylko bibliotekę SD już bez SPI. Pytanie tylko jak?
Czy Eclipse to umożliwia automatycznie, a może trzeba przepisać wykorzystywany fragment SPI do SD a może trzeba z palca: "avr-ar rcs <library name> <list of object modules>"

Pozdrawiam
Andrzej



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2016, o 22:56 
Offline
Użytkownik

Dołączył(a): 13 lut 2015
Posty: 99
Pomógł: 6

Wszelkie prekompilowane biblioteki powinny posiadać pliki nagłówkowe (libxxx.h) z referencjami do poszczególnych funkcji w pliku obiektowym.
A najczęściej spotyka się biblioteki jako pełny kod źródłowy - kompilator i tak będzie tworzył sobie pliki pośrednie.

W BB możesz znaleźć przykładowe biblioteki. (a tu szybki przykład)

_________________
AVR-UART-lib
AVR-FAST-ENCODER
RFM7x-lib



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2016, o 23:45 
Offline
Nowy

Dołączył(a): 26 maja 2015
Posty: 8
Pomógł: 0

Plik nagłówkowy (SPI.h i SD.h) zawierający deklaracje funkcji/procedur z bibliotek SPI i SD jest dołączony w programie.
Nie kojarzę, żeby w BB był przykład tworzenia biblioteki libxxx.a
"Biblioteki" tworzone jako podfolder w folderze projektu - tak. Ale to nie o to chodzi.

Andrzej



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 lut 2016, o 13:33 
Offline
Użytkownik

Dołączył(a): 13 lut 2015
Posty: 99
Pomógł: 6

Próbowałeś deklarować funkcje jako 'extern' ?

_________________
AVR-UART-lib
AVR-FAST-ENCODER
RFM7x-lib



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 lut 2016, o 14:33 
Offline
Nowy

Dołączył(a): 26 maja 2015
Posty: 8
Pomógł: 0

Tak próbowałem i bez zmian.
W "czarnej" książce jest informacja, że "extern" jest ważne dla C++. w C z definicji wszystkie definicje są "extern" niezależnie czy dopiszesz czy nie.

Andrzej



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 mar 2016, o 14:16 
Offline
Użytkownik

Dołączył(a): 02 gru 2015
Posty: 63
Pomógł: 1

jedrunia napisał(a):
Tak próbowałem i bez zmian.


Witam,

od wczoraj próbuję napisać dwie biblioteki (na cele edukacyjne) jedną do obsługi komunikacji USART a drugą do formatowania terminala VT100. Obydwa projekty są stworzone w eclipse "AVR Cross Target Static Library".

Biblioteka do transmisji USART skompilowała się poprawnie; Vt100 która bazuje na UART, też skompilowała się poprawnie. Ale w trzecim projekcie testowym który bazuje na VT100 (podlinkowany plik libVT100_TERMINAL.a, oczywiści bez lib i .a) i kompilacja utyka na funkcji która jest zawarta w bibliotece USART
Kod:
warning: implicit declaration of function ‘USART_Transmit_String’ [-Wimplicit-function-declaration]


ale deklaracja tej funkcji istniej w pliku nagłówkowym projektu USART.

Ma ktoś doświadczenie w tym temacie?

Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 mar 2016, o 15:35 
Offline
Nowy

Dołączył(a): 26 maja 2015
Posty: 8
Pomógł: 0

"Witaj w klubie" zobacz jak ja to zrobiłem w pierwszym poście. Zadziałało, ale czuję że nie tak to powinno działać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 mar 2016, o 18:31 
Offline
Użytkownik

Dołączył(a): 02 gru 2015
Posty: 63
Pomógł: 1

Nie wiem czy we właściwym miejscu dodałem te biblioteki

Obrazek

Ale niestety nic mim to nie dało. Nie mam, żadnych błędów w "Problems" ale zato w "Console"
Kod:
18:24:12 **** Incremental Build of configuration Release for project vt100_test ****
make all
Building target: vt100_test.elf
Invoking: AVR C Linker
avr-gcc -Wl,-Map,vt100_test.map -L"/home/tomek/workspace_avr/VT100_TERMINAL/Release" -L"/home/tomek/workspace_avr/USART_LIB/Release" -mmcu=atmega32 -o "vt100_test.elf"  ./main.o   -lVT100_TERMINAL -lUSART_LIB
/home/tomek/workspace_avr/VT100_TERMINAL/Release/libVT100_TERMINAL.a(vt100_terminal.o): In function `uart_clear_screen':
vt100_terminal.c:(.text.uart_clear_screen+0x4): undefined reference to `USART_Transmit_String'
vt100_terminal.c:(.text.uart_clear_screen+0xc): undefined reference to `USART_Transmit_String'
collect2: error: ld returned 1 exit status
make: *** [vt100_test.elf] Błąd 1


Nie jestem dobry w te klocki :)

Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 mar 2016, o 23:54 
Offline
Nowy

Dołączył(a): 26 maja 2015
Posty: 8
Pomógł: 0

do Tomek86

Miejsce dodania bibliotek dobre, tylko ja mam tam pełną ścieżkę w "", bez $ i {} - ale nie jestem znawcą co do możliwych formatów jakie tam występują.

Dodaj jeszcze do zakładki poniżej "Objects"

Obrazek

Jak zadziała jesteś w tym samym punkcie co ja :lol:

------------------------ [ Dodano po: 20 minutach ]

do ttlseek

Muszę przetrawić to co napisałeś. Z przykładem nie ma problemu oprócz czasu.

Co do "extern" -> teraz widzę, że moja wypowiedź poszła "o jeden most za daleko".



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 mar 2016, o 07:51 
Offline
Użytkownik

Dołączył(a): 02 gru 2015
Posty: 63
Pomógł: 1

Dzięki za pomoc.

W moim przypadku nie wiedzieć dlaczego musiałem dodać jeszcze wpisy do "AVR Compiler -> Directories"

Obrazek

Jednak nie do końca "czuję temat".



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO