piszesz funkcje w ASM pamietajac o tym ktore rejestry uzywane sa do przekazywania parametrow, ktore mozesz zmienic, a ktore musisz zachowac (instrukcja do kompilatora gcc wyjasnia ta kwestie, jest to rowniez poruszone w FAQ dla AVR-GCC). dolaczasz do projektu plik naglowkowy, w ktorym podajesz prototyp funkcji: extern uint8_t funkcja(uint8_t parametr);...
W pliku Platforms/include/AVR_platf_spec.h deklaracje __inline__ są bez sensu - jeśli miałyby być inline, to musiałyby istnieć definicje funkcji w nagłówku, a nie tylko deklaracje. Na szybko: usuń w w/w pliku wszystkie wystąpienia "__inline__" i dodaj na początek każdej deklaracji funkcji słowo "extern". Pozdrawiam, Dr.Vee
Chodzi o to, że wszystkie definicje/deklaracje w języku C nie są równoważne jak w obiektowych i jeżeli masz tak: [syntax=c]int main() { spal_diode(); } void spal_diode(void) { PORTB = 0; }[/syntax] To kompilator będzie marudził, że nie napotkał wcześniej takiej deklaracji (extern). Żeby zapewnić go, że ona jest trzeba mu o tym powiedzieć tak: [syntax=c]int...
Tak poprzez extern.
Cześć Spróbuj takiego modyfikatora konsolidowania: extern "C" prototyp_funcji lub dla wielu funkcji extern "C" { prototypy_funkcji }
Gdzie masz funkcję write_text(); ? Tworzysz w ogóle jakieś pliki nagłówkowe? extern możesz też zastosować do tej funkcji syscalls.c który współgra ze skryptem linkera a o tym poczytaj na stronie Freddiego http://www.freddiechopin.info/
Wystarczy ująć eksportowane funkcje w klauzulę extern "C" ... i będzie ok. BTW, po co piszesz własne makefile? Nie prościej użyć np. Atmel Studio, który stworzy go za ciebie i w dodatku obsługuje C++? Przy okazji - powszechny pogląd, że niby programowanie obiektowe generuje mniej optymalny kod, jest z palca wyssany :) Pochwal się co tworzysz.
Chodzi o konwencję nadawania nazw. W tej chwili nie pamiętam ale kompilator C zawsze nazywa funkcje wprost czyli funkcja "abc" otrzyma symbol "abc". Kompilatory C++ nie są takie dobre i stosują różne prefiksy np. "_" czy "(at)". Każdy kompilator robi to praktycznie inaczej. Spróbuj czegoś takiego: #if defined(__cplusplus) extern "C"...
Musisz rozróżniać pomiędzy interfejsem C a C++ oraz pomiędzy funkcją a metodą. Metoda ma dodakowo niejawny argument w postaci wskaźnika this na odpowiedni obiekt. Jeżeli taka fukcjonalność nie jest Ci potrzebna, to zadeklaruj metodę jako statyczną. Być może to wystarczy. Nie jestem pewien, czy i tak nie będzie potrzebna funkcja-owijka zadeklarowana...
W pliku c gdzie masz funkcje obsugi dajesz deklaracje a w pliku .h extern ..... i już. Nie rozumiem w czym problem
Tylko po co deklarować funkcje z "extern"? Przecież to jest całkowicie zbędne w przypadku funkcji dostępnych w postaci kodu... 4\/3!!
Witam!! Oto moje pytania: 1. Jak sie dolacza kod programu napisany w asemblerze?? Nie chodzi mi o jedna linijke tylko raczej o plik? 2. Jesli przed deklaracja zmiennej badz funkcji jest slowko extern np: extern void funkcja(void){} extern char zmienna; to jak to interpretowac?? 3. Co oznacza #pragma ... Z gory dziekuje za pomoc/smalski
Zamiast dołączać całą bibliotekę C do projektu (do linkowania). deklarujesz sobie funkcje poprzez extern która znajduje się w innym module.
Freddie Chopin właśnie przeglądam ten projekt. Funkcja do konfiguracji sygnałów zegarowych jest dla mnie jasna. W pliku system_stm32f10x.h jest deklaracja funkcji: extern void SystemInit(void); A gdzie jest definicja? Czy definicji nie ma i zastępujesz to Twoją własną funkcją system_init(); Pytam, ponieważ też chciałbym sobie taki wzorcowy projekt...
"extern" nie musisz dopisywać przy każdej funkcji. Możesz dopisać raz dla pliku nagłówkowego: 1 Na początku: #ifdef __cplusplus extern "C" { #endif I na końcu: #ifdef __cplusplus } #endif lub możesz dopisać to w twoim kodzie przy włączaniu nagłówka: extern "C" { #include "my-C-code.h" } Albert
kombinuję też, że może za późno wywołuję funkcję fpu_enable()? W sumie to przed nią tworzy się obiekt IMU. To mogłoby mieć znaczenie tylko jeśli konstruktor tego obiektu w jakiś sposób robi coś "zmiennoprzecinkowego". Jeśli tylko zeruje zmienne w pamięci, to raczej bez znaczenia. Jednak gdy robię to tak: W pliku .cpp ta funkcja musi być zdefiniowana...
robisz w main: volatile int i=0; w stm32f4xx_it.h (czy jak tam się nazywa ten header z funkcjami przerwań): extern volatile int i;
Skoro plik main.cpp jest plikiem C++, a wektory są funkcjami z C, to handler obsługi przerwania musi mieć ozdobnik `extern "C"`. Wstawiaj kod i logi w odpowiednich znacznikach (code/syntax), bo nie da się tego czytać.
Deklaracja jako extern "C" zmienia tylko specyfikację interfejsu binarnego funkcji, a konkretnie sposób wywołania i przekazywania argumentów oraz sposób generowania nazw symbolicznych dla linkera (po polsku: konsolidatora :) ). Ale nie zmienia to języka źródłowego, tzn. jest to dalej C++.
W przypadku zmiennych extern oznacza deklarację, czyli mówisz kompilatorowi tylko tyle ze ta zmienna istnieje nie tworząc jej. Definicja czyli bez extern Tworzy tą zmienną. Podobnie jest z funkcjami ale tam extern ma trochę inne zastosowanie. Deklaracja - mówisz kompilatorowi jak dany twór wygląda. Definicja - kompilator stworzy ten twór.
zmienna zadklarowana jest jako char zaraz na początku programu zaraz po załączeniu potrzebnych bibliotek deklaracja funkcji jako extern void send(char data) nic nie wniosła :(
zależy czy tego DLLa ty utworzyłeś czy kto inny i czy znasz funkcje jakie tam są i ich argumenty czy nie? jeśli nie to możesz a nawet powinieneś się posłużyć programem IMPLIB dzięki któremu utworzysz plik typu *.lib dla danego DLLa. Taki plik dodajesz sobie do projektu a następnie możesz sobie w pliku nagłówkowym projektu lub samym projekcie zdefiniować...
Masz zaimplementowane wektory przerwan ? [syntax=c] void SVC_Handler(void) { extern void vPortSVCHandler(void); vPortSVCHandler(); } void PendSV_Handler(void) { extern void xPortPendSVHandler(void); xPortPendSVHandler(); } [/syntax]
W plikach ".cpp" extern "C" [syntax=c]extern "C" void SysTick_Handler(void) { GPIOA->MODER = 0; }[/syntax]
Gdy dodam, zaraz po include dostaje cos takiego: Zaraz dokladniej poczytam o linkowaniu dll, bo teraz przegladalem w poszukiwaniu uzycia funkcji extern. Zdaje sobie sprawe ze to nie jedyny sposob na fft, ale tylko ta biblioteke znalazlem i wyczytalem ze jest najszybsza:) Niestety nie mam pomyslu jak moge ta funkcje zaimportowac:/ Poza TForm dostaje...
nie rozumiem dlaczego kompilator drugi raz ładuje plik secondFile.c chociaż ja tego nie zleciłem? Jak to nie?: [syntax=c]#include "secondFile.c"[/syntax] Inkludujemy tylko pliki nagłówkowe .h W plikach nagłówkowych funkcje używane w innych plikach .c należy zaznaczyć jako extern. Podobnie ze zmiennymi, itd. Przykład: http://mikrokontrolery.blogspot.com/2011...
Jeśli ten plik jest na pewno kompilowany, to pamiętaj że jeśli jest w pliku C++ to funkcja musi mieć: extern "C" 4\/3!!
W C++ jest coś takiego jak "name mangling" - w pliku C++ może masz funkcje o nazwie "costam", ale dla linkera widoczna jest ona jako "costam_z_parametrem_int_oraz_double_zwr... - jak więc przypuszczasz celem tej funkcjonalności jest umożliwienie przeciążania funkcji (bo gdy maja inne parametry, to faktycznie dla linkera są to dwie różne funkcje...
Widzę, że zadałem trudne albo głupie pytanie. Pewnie GCC jest tak toporne, że nie podoła zadaniu. Akurat GCC nie jest tak toporne jak narzedzia komercyjne ;). Wiec: Na czym polega mój problem? Jak zmusić gcc, aby w module: - program zaczynał się od zdefiniowanego adresu Ustawiasz to w skrypcie linkera: MEMORY { CODE (rx) : ORIGIN =...
W pgmspace są zawarte definicje chyba wszystkich funkcji (jako inline) więc raczej nie ma nic więcej. W eeprom funkcje są zadeklarowane jako extern, więc źródła funkcji będą w źródłach biblioteki (avr-libc), do pobrania z internetu. Nie ma ani wymagania, ani praktyki, aby jednemu plikowi .h odpowiadał jeden plik .c.
W c++ przed funkcjami obsługi przerwań dodaj extern "C" np.: extern "C" void DMA2_Stream0_IRQHandler(void) { ... } Inaczej nie będą wywoływane.
Naprawdę kopiowane są wszystkie funkcje a nie tylko to, które są wykorzystywane? Może to kwestia włączenia optymalizacji? Trochę OT, ale wyjaśnię. W uproszczeniu, w standardowym kompilatorze (np. gcc :wink:), wytworzenie programu wykonywalnego składa sie z dwóch faz: 1. fazy kompilacji .c --> .o (albo np. .s ->> .o) 2. fazy łączenia .o (razy N) -->...
Proponowałbym raczej plik vectors jednak mieć w C, a nie C++ (nic to nie zmienia, poza właśnie problemem z manglowaniem nazw funkcji) (; Ewentualnie właśnie "extern" umieścić w pliku z tablicą wektorów. 4\/3!!
Witam! Są następujące przypadki: - Jeśli np zmienna zewnętrzna została zadeklarowana w innym pliku, wówczas w bieżącym pliku musi wystąpić potwierdzenie tejże deklaracji poprzedzone klasą pamięci extern. - dotyczy funkcji w starszych wersjach języka C (K&R). Jeśli definicja funkcji nie jest poprzedzona typem to kompilator przyjmuje domyślnie, że typem...
Słowo kluczowe extern się stosuje wyłącznie do zmiennych które są zdefiniowane W INNYM MODULE tzn, będą połączone dopiero na etapie linkowania a nie na etapie kompilacji. Czytaj są w zupełnie innym pliku źródłowym. Pliki nagłówkowe (.h) możliwość zapowiedź zadeklarowania danej struktury zanim ona zostanie zdefiniowana w danym module (deklaracja wyprzedzająca)...
Witam. Ostatnio zacząłem uczyć się języka C++ z książki Jerzego Grębosza "Symfonia C++ standard". Wszystko idzie całkiem dobrze, aż do momentu kiedy muszę skompilować program składający się z dwóch modułów i pliku nagłówkowego. Pracuję na Linuxie, Ubuntu, a kompiluję g++. Wszystkie operacje w terminalu. Próbowałem robić tak: g++ -c modul1.cpp Tak też...
Jeśli plik syscalls.c jest kompilowany przez g++ to linker nie potrafi znaleźć funkcji do których odwołuje się lib.c. g++ dodaje do nazw funkcji dodatkowe oznaczenia służące do rozróżniania funkcji przeciążonych. Definicja extern "C" informuje g++, że dla tych funkcji nazwa nie ma być zmieniona. W gcc taka definicja jest nieprawidłowa dlatego warunek...
Bo może wektor przerwań dla tego akurat kanału DMA się nazywa inaczej? Porównaj nazwę Twojej funkcji z zawartością tablicy wektorów. Jeśli masz w projekcie pliki C++, to trzeba przerwania deklarować jako extern "C". 4\/3!!
Najbardziej poprawne byłoby chyba przeciążanie operatora new, ale jeżeli jest to "nie na rękę" to można podmienić funkcję z biblioteki. Biblioteka nie jest monolitem - malloc będzie w oddzielnym module, co najwyżej ten moduł może definiować jeszcze inne symbole, które też (być może) będziesz musiał zdefiniować po swojemu. Przede wszystkim - jaki kompilator...
Zamiast wstawek, spróbuj gotowej funkcji _outp: [syntax=cpp]extern "C" void __declspec(dllimport) _outp(short,char); extern "C" char __declspec(dllimport) _inp(short); int main() { _outp(0x378, 0xFF); return _inp(0x378); }[/syntax] Dodałem brakujący średnik.
Dla funkcji ISR nie deklarujesz prototypu - prototypy tych funkcji są zadeklarowane w AVR-libc, w skryptach startowych, które są dostarczane w postaci prekompilowanej. Zauważ, że deklaracja prototypu funkcji ma na celu wyłącznie poinformowanie kompilatora jak dana funkcja wygląda. W przypadku ISR informacje te są dokładnie znane więc nie ma potrzeby...
W jaki sposób "dokładasz" plik z rozszerzeniem .a do kompilacji? Czy w nagłówku masz funkcję zdefiniowaną ze słówkiem kluczowym extern? 4\/3!!
No masz błąd - bo np w pliku nagłówkowym *.h DEFINIUJESZ zmienną strukturalną :( a tak się nie robi, w nagłówkowych powinny być SAME DEKLARACJE a nie definicje (no może poza funkcjami inline - ale to inna sprawa) Zrób sobie tak w *.h Dodano po 1 zresztą jeśli to jest prosty projekt i tylko te dwa pliki to nawet w *.h nie musisz dawać DEKLARACJI [syntax=c]extern...
Doszedłem już do rozwiązania, jeśli kogoś interesuje to zagadnienie, to idzie to tak: (przykład trochę łopatologiczny) ;assemblerowy moduł: .586 .model flat, stdcall .code public _A ;funkcja, którą wywołam spod Buildera extrn _k : WORD; builderowa zmienna w której będę grzebał _A proc mov _k, 100 ret _A endp end całość asembuję: tasm32 moduł_asm.asm...
Plik naglowkowy z prototypamima funkcji jest obecny - lcd.h. Zwrociles jednak uwage na deklaracje zmiennych w owym pliku. Nie ma tam wyrazenia extern. Zalaczam pliki ktore uzywam: lcd.h - plik naglowkowy lcd.c - kod funkcji main.c - plik z funkcja main() main-dziala.c - plik z funkcja main() oraz z zawartoscia pliku lcd.c Moglbys wskazac gdzie extern...
grko: Czy Ty sam definiujesz funkcje poprzedzając je słowem extern? Zatem wesprzyj zdanie Autora wątku, że jest to wlaściwa technika pisania programów. Błędem w kodzie powyżej było deklarowanie argumentów funkcji typu uint16_t* i przekazywanie w wywołaniu wskaźników na uint8_t. ... więc jak zwykle się czepiasz ...
Wskazuje na funkcje które dostępne są w bibliotekach (nie mylić z "bibliotekami" czyli modułami kodu). W sumie to nawet tam jest to chyba zbędne. 4\/3!! Jest zbędne, linker połączy symbole. extern jest niezbędne dla funkcji chyba tylko w przypadku kiedy korzystamy z tego samego pliku nagłówkowego w C i C++ - jako extern "C" - zapewnia właściwe manglowanie...
Witam, Czy któryś kolegów używał biblioteki glcd ze strony Kranca i wykorzystywał funkcję extern void glcdSetOrientation(uint8_t orientation)? Ja staram się zmienić tą funkcją orientację wyświetlacza i nic się nie dzieje. Test testOrientation(void) też mi niestety nie działa. Chciałbym mieć poziomy wyświetlacz, czy ktoś może udzieli mi podpowiedzi i/lub...
Nie widzą bo nie ma w innych plikach extern a w pliku gdzie się znajdują jest static przy deklaracji. Generalnie ostatnio się dowiedziałem że używanie extern przy rozbudowanym projekcie w C jest błędem. Powinno się właśnie utworzyć prosty interfejs czyli funkcje robiące get i set dla konkretnych danych w strukturach, żeby nie było bałaganu jaki powstaje...
Skoro zakupiłeś pozycję Pana Francuza to polecam się zapoznać z podrozdziałem traktującym o extern, strona 130. Która funkcja jest rekurencyjna ?
Proponuję NIE umieszczać NIGDY kodu czy zmiennych w nagłówkach .h - miejsce na nie jest w plikach z kodem, czyli .c, .cpp, itd. W nagłówku powinno być jedynie wyexportowanie zmiennych poprzez "extern" i prototypy funkcji. W pliku c: const unsigned short name[] = { ... }; w pliku h: extern const unsigned short name[]; 4\/3!!
No ale dalej jest źle [; Masz zmienne w nagłówku (w pliku flash.h). Jeśli dołączysz ten plik do kilku plików źródłowych, to KAŻDY będzie miał swój zestaw zmiennych. Linker powinien się czepiać tego, że masz multiple definitions. Po co KEY1 i KEY2 są zmiennymi? Przecież to jest całkowicie bezcelowe... Tak BTW to przed funkcjami nie trzeba pisać "extern"....
Wydaje się że powinno działać, szczególnie że przy innych deklaracjach struktury działa. Przy okazji spytam do czego w deklaracji funkcji w pliku nagłówkowym służy extern ?
//Nie ... nie dam sobie rady ... co chwilę wyrzuca, że czegoś niema :( Jak mam sobie z tym poradzić? Wszystko jest tylko w innym pliku :| Do tego są pliki .h :wink:. Nie dołączaj plików .c przez "include" tylko pliki .h ze zmiennymi które mają być "użyte" również w innym miejscu, z atrybutem "extern" oraz funkcje które są wykorzystywane w innych miejscach....
Witajcie, chciałbym połączyć unię i strukturę aby mieć możliwość odwoływania się do niej zarówno po nazwie oraz poprzez konkretne pole tablicy. Posiłkuje się książką Pana mirekk36 . plik nagłówkowy pcf8563.h zawiera m. in. to: stderr> main.c:280: error: 'typ_czasowy' has no member named 'bcdYear' czy wiecie w czym może leżeć przyczyna...
Freddie masz na myśli to, że w np w pliku zmienne.c mam te same zmienne co w pliku z funkcją main() ale poprzedzone "extern" i to dodaję na początku każdego pliku projektu innego niż ten zawierajacy main() jako include ? czyli np . zmienną int a=0, będąca w pliku z funkcją main , przepisuję do pliku który nazwę np zmienne.c ale zadelkaruję ją jako extern...
jeśli mam dwa pliki *.c to obojętnie gdzie daję pętlę main() ? Tak, byle by gdzieś była, tylko przy kompilacji trzeba uważać. Plik bez main() można skompilować tylko do postaci pliku linkowalnego (.o), czyli w wiekszosci kompilatorow z opcją -c. Potem oczywiście poskładać wszystko za pomocą linkera. Można też kompilować wszystkie pliki za jednym zamachem,...
No to radziłbym się zaznajomić z tego typu pojęciami bo są to podstawy. Otóż w języku C mamy cztery klasy pamięci. Określają one widoczność zmiennych oraz czas ich życia. Są to: auto , register , static oraz extern . Wszystkie zmienne deklarowane w funkcji (bez słowa kluczowego static) należą do klasy auto . Zakres ich widoczności oraz czasu życia określa...
W AS6 możesz wskazać, które pliki jaki kompilator ma kompilować. Jeśli tak jak kolega powyżej radził, ujmiesz eksportowane funkcję w blok extern "C" to nawet linker to razem połączy. Z drugiej strony avr-gcc rozpoznaje język po rozszerzeniu, jeśli twoje pliki mają rozszerzenie .c to powinien je traktować jak pliki w c. Pokaż fragment kodu z błędem,...
To po kolei: EM_A_power to jak widać zmienna float (tu przywołana jako extern), która przyjmuje wynik funkcji IntToFloat. Funkcja umieszczona w szkicu działa od dłuższego czasu, nie działała w wydzielonym pliku; dzięki uwagom kolegi z innego forum okazało się przy okazji, iż w tej formie jest UB, ale o dziwo działała. Tak jak przypuszczałem - "głupi...
No coz warto zwracac uwage na to co funkcja zwraca ;-). A tak nawiasem mowiac to extern "C" jest uzywane po to aby funkcje kompilowane jako C++ mogly byc wywolywane z kodu C (lub innego) wiec w twoim wypadku jesli wszystko kompilujesz jako C++ nie ma to zadnego znaczenia. Wydaje mi sie ze mimo wszystko mylisz C++ z C a z obiektowosci i tak nie korzystasz.
Pokaż pełny komunikat z konsoli - undefined reference to.... i właśnie dalej masz kluczową informację czego brakuje. Błąd linkera (ld returned...) wynika z tego, że nie masz zdefiniowanego ciała funkcji lub zmiennej zadeklarowanej przez extern.
Uzywam CC5X i niestety tak sie rozpisalem ze kod przekroczyl mi 1K, wiec musialem go podzieli na dwa moduly. Podczas linkowania dostaje taki blad: MPLINK 3.92, Linker Copyright (c) 2005 Microchip Technology Inc. Error - section 'PROG' type is non-overlay and absolute but occurs in more than one input file. W pliku ModulA.C (z main()) ma tak zadeklarowana...
Na sam początek to trzeba by było sobie poczytać co to jest definicja funkcji a co to jest deklaracja - bo to są dwie różne rzeczy, a po opisach które widać w tych przedstawionych plikach widać, że kolega miesza pojęcia a to właśnie m.in się mści przy prawidłowym includowaniu plików. Zasada jest taka, że jeśli zrobiłeś sobie np plik z funkcjami do 1wire...
Nie, to nie dyskusja polityczna. Chodzi o to, by wyjaśnić to w miarę dokładnie. Wiele błędów programowych, które z wielką cierpliwością wyjaśnia mirekk36, Freddie Chopin i wielu innych bierze się z niezrozumienia jak zmienne funkcjonują. A do mirekk36. Pisząc "obojętnie gdzie" miałem na myśli, że gdziebyśmy ich nie użyli, nie sugerując jak często i...
Witam. Mam problem z uruchomieniem kodu fatfs - a tak naprawdę problem jest prawdopodobnie przy linkowaniu kodu .cpp korzystającego z funkcji w plikach .c . Mianowicie jeśli nie includuje plików nagłówkowych obejmując je: extern "C" { #include "fatfs.h" } to linker nie może odnaleźć referencji do kodu funkcji (zgłasza unresolved...
W czym rozwiazanie z zamiana *.c na *.inc oraz warunkowa kompilacja w pliku types.common.c jest lepsze od warunkowej kompilacji kazdego pliku types_xxx.c z osobna ? type1.c: [syntax=c] #ifdef TYPE1 //tutaj wszystkie funkcje #endif [/syntax] type2.c: [syntax=c] #ifdef TYPE2 //tutaj wszystkie funkcje #endif [/syntax] Jak chcesz bardziej wyszukanego rozwiazania...
Usuń z pliku nagłówkowego. Albo zmień kolejność operacji przy usuwaniu buttona, wówczas usunie automatycznie: - usuń wnętrze funkcji (tzn. spraw aby funkcja była pusta) - zapisz plik => funkcja sama zniknie, - usuń button
Przejżę jeszcze te pliki. To przenoszenie z kodu programu do biblioteki, robiłem metodą ctr-x ctr-v i mogły się wdać jakieś definicje / deklaracje niezgodne ze sztuką. W pliku nagłówkowym były tylko dyrektywy #define i deklaracje extern funkcji, ale również dyrektywy #include. Jedna z nik włączała plik nagłówkowy, w którym jest deklaracja unsigned char...
Potrafię wyszukać jeśli coś jest prawdą, a nie mitem wyssanym z palca. kompilator nie może zoptymalizować wywołania takiej funkcji, bo jej prototyp jest określony przez typ wskaźnika na funkcję. [syntax=c] void (*ptr)(int); void test(int par) { } void itest(void) { ptr = test; ptr(5); } /* inny plik */ extern void (*ptr)(int); extern void test(int par);...
jeżeli o to Ci chodzi to ok. Dyskusja poszła chyba za deleko na cudzym temacie :) Zamiast pomagać Koledze to się tu rozdrabniamy. A jeżeli chodzi o extern to w przypadku funkcji nie jest potrzebny. Niezbedny jest za to w przypadku zmiennych - kompilator nie ma jak rozróznić definicji i deklaracji
Wydaje mi się że nie "przesunąłeś" tablicy wektorów przerwań: SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; w pliku system_stm32l4xx.c Tę linię należy usunąć z tego pliku o ile nie masz zamiaru zmieniać mapowania pamięci na adres 0x0 (a tego prawie nikt nie robi) albo jak zamierzasz zmienić i nie zmieniać ciągle tych definicji to dodaj symbol...
Zajrzyj do funkcji SysTick_Config. Prawdopodobnie nie jest możliwa konfiguracja systicka dla okresu SystemCoreClock. Twój plik źródłowy to *.cpp. W CPP jest coś takiego jak name mangling i musisz kod Twojego przerwania umieścić w sekcji extern "C" {} : [syntax=c] extern "C" { void SysTick_Handler() { GPIOD->ODR |= GPIO_ODR_ODR_13; } } [/syntax]
Wiem z literatury, że parametry funkcji można przekazywać przez wartość lub referencję. Ale czy poprawna jest poniższa forma: Dodano po 1 Dodam jeszcze, że zmienna_globalna jest współdzielona między wieloma plikami (extern).
Jest też opcja, że w nagłówkach brakuje extern "C", choć to raczej mało prawdopodobne... W każdym razie kod DSP/math z CMSIS nie jest tylko w nagłówkach, całkiem sporo funkcji i wszystkie stałe/zmienne są w normalnych plikach .c, które sobie trzeba dodać do kompilacji. Inną opcją jest użycie tej biblioteki jako biblioteki statycznej, czyli plik .a,...
Zeby nie dorabiało krzaczków to chyba wystarczy zaopatrzyć się w dyrektywę "extern C" i obudować nią blok funkcji, bo wtedy kompilator chyba nie dokłada tych krzaków, bo i po co nie ma takiego czegoś jak przeładowanie.
to nie biblioteka a plik nagłówkowy będący odwołaniem do biblioteki. Nie zaciekawiło cię extern? czy też brak definicji tychże funkcji? Wiadomo, że chodzi o bibliotekę. I co ma do tego extern jak i tak nie była używana. Biblioteka nie jest linkowana. Na próbę ją dodałem i kompilator wysypał błędy o redefinicji. Co do kogoś mądrzejszego to liczę na...
Tzn, że program może działać dalej poprawnie a debuger wskazuje na to, że jesteśmy w np HardFaultHandlerze ? Mógłbyś nieco rozwinąć myśl ? Czasem może być jakiś problem sprzętowy/programowy/systemowy, który może spowodować wywalenie się debuggera, który będzie np. uparcie twierdził, że jesteśmy wciąż w jakiejś linii, choć mikrokontroler sobie wtedy...
I teraz nie wiem czy mikrokontroler wykonuje moja funkcję SystemInit czy tą "standardową" ? Podglądnij kod asemblera :) Wystarczy, że wrzucisz przed main Jeśli konsolidator nie krzyczy, to znaczy, że widzi jedną funkcję SystemInit. Jeśli oryginalna zstała zadeklarowana jako WEAK, to podłączył Twoją. Pewnie nie krzyczy dlatego, że w pliku system_LPC13xx.h...
SeerKaza napisał: Czyli co wystarczy że włącze przerwanie i wstawię w mainię funkcje Akurat _w_ main() to raczej średnio Ci się uda (; Chodziło mi o plik main Jeśli całość kompilujesz kompilatorem C++, to funkcje przerwań muszą być extern "C" (jeśli akurat tablica wektorów jest kompilowana kompilatorem C, albo gdy jest w assemblerze). I teraz nie wiem...
Trzeba dodać funkcję: [/code] caddr_t _sbrk (int size) { extern char __heap_start; extern char __heap_end; static char *current_heap_end = &__heap_start; char *previous_heap_end; previous_heap_end = current_heap_end; if (current_heap_end + size > &__heap_end) { errno = ENOMEM; return (caddr_t) -1; } current_heap_end += size; return (caddr_t) previous_heap_end;...
Witam Posiadam zestaw uruchomieniowy ATmega8 zl2avr taktowany 1MHz(fabrycznie) i chciałem napisac program przesyłajacy dowolny znak na PC, ma byc odczytywane w hyperterminal. Ale niestety nie mia transmisji zadanego przeze mnie znaku. W trakcie transmisji (wskazuje ją świecaca się dioda) kursor w hyperterminalu mryga szybciej, czyli wnioskuje ze cos...
Pliki nagłówkowe zazwyczaj tworzy się, aby umożliwić współdzielenie - typów danych, funkcji, czy zmiennych globalnych - pomiędzy oddzielnie kompilowanymi plikami źródłowymi. Z tego powodu deklarowanie zmiennych globalnych czy funkcji w plikach nagłówkowych jako static z reguły nie ma sensu, bo chodzi nam o to, aby te zmienne były współdzielone, czyli...
...Wiem, że to coś ze wskaźnikiem, jednak nie wiem co. Męczyłem się z tym na różne sposoby i dalej jest ostrzeżenie, mimo to program działa. No to sprawdź jakich typów danych , wymaga funkcja ltoa(). extern char *ltoa(long int __val, char *__s, int __radix); void lcd_zmienna_zapisz(long i, unsigned char typ) { unsigned char *wsk; char...
O tym już wcześniej pomyślałem a++; EA = 0; asm_signal(); EA = 1; funkcja jest zadeklarowana w nagłówku extern void asm_signal(void); Zauważyłem na analizatorze że łączna długość wszystkich bitów jest mniej więcej stała, czyli jeśli jeden zostanie rozszerzony, inny zostaje zwężony. Czy może mieć tu związek że używam R7 i ACC, może Keil tutaj...
pytales o konwencje, a nie o przyklad <: konwencja to konwencja, a przyklad to przyklad [; w swoim pliku assemblerowym definiujesz sobie etykiete, ktora bedzie nazwa funkcji, w ciele funkcji robisz sobie co ci sie podoba, pamietajac o tym, co opisane jest w rozdziale ktory wspomnialem - ktore rejestry mozesz uzyc, ktore musisz zachowac, w ktorych...
(at)gacus.mk w <string.h> w GCC jest taka funkcja: /* Find the last occurrence of C in S. */ extern char *strrchr (__const char *__s, int __c) poszukaj czy nie ma czegoś takiego u ciebie pozdro
Witam Piszę ponieważ z linkera programu WinAVR wyskakuje mi komunikat Undefined reference to InitLCD Tyle że chyba mam wszystko dobrze zdefiniowane. Mam trzy pliki: - główny z funkcją main, gdzie jest: #include <lcd.h> oraz wywołanie funkcji: InitLCD(); plik lcd.h, w którym jest: extern void InitLCD(void); i plik lcd.c, w którym jest: #include...
Po zmianach wygląda to tak: powstał plik wyswietlacz.h który jest w dzrzewie projektu w gałęzi Headre Files i zawiera unsigned char wysw_bufor[9]; W pozostałych plikach *.c gdzie potrzebuję wysw_bufor inkluduję: #include "wyswietlacz.h" Zauważyłem, że przy takim rozwiązaniu w pliku wyswietlacz.c gdzie mam inkludowany wyswietlacz.h...
Musisz niestety troszkę się pouczyć C. Includuje się pliki .h, które zawierają: [syntax=c]/* definicje i makra */ #define STRSIZE 50 /* deklaracje typów */ typedef struct { int a; float f; double d; char c[STRSIZE]; }mytype; /* deklaracje funkcji ale bez definicji (czyli "ciała") */ int foo(int,int, mytype *); /* ddeklarcje extern - zmiennych zdefiniowanych...
To jest bardziej skomplikowane :) co nie znaczy, że nie da się zrobić. Po pierwsze zależy jaka ta biblioteka. Jeżeli da się w niej wydzielić interfejs kompatybilny z C (proste funkcje) to tylko te funkcje trzeba oznaczyć jako extern "C". Oczywiście z C nie da się wołać bezpośrednio wzorców, obiektów, konstruktorów itd. Po drugie, w czasie linkowania...
Dla Twojej wiadomości - extern nie deklaruje zmiennej jako zewnętrznej, tylko informuje kompilator, że taka zmienna występuje w innej jednostce kompilacji (innym pliku) i będzie widoczna dopiero po etapie linkowania. Każdy plik jest kompilowany oddzielnie, więc kompilator nie wie, że coś takiego w ogóle istnieje i gdzie (bo skąd ma wiedzieć). Po to...
Spróbowałem w pliku .c usunąć linijkę dołączającą plik .S do programu, i okazało się, że wszystko zadziałało. Kompilacja przebiegła bez problemu. Jednak procesor nie reaguje na funkcje, które przekazuję mu z pliku .S w sposób zaczerpnięty z książki: AVR Układy peryferyjne [syntax=c]extern void FunkcjaASM(void); int main(void) { while(1) { FunkcjaASM();...
(at)matej1410 Według mnie powinieneś zrobić instancję w funkcji albo jako zmienną globalną (statyczną jeżeli symbol używany jest w obrębie jednego modułu). Wszystko zależy od kontekstu w jakim chciałbyś tego użyć. W nagłówku jedynie można udostępnić symbol dla innych modułów (ze słowem kluczowym extern).
Hmm, zarówno zmiana optymalizacji, jak i dodanie atrybutu nie pomogło. Próbowałem nawet wywalić deklarację z pliku h, i w każdym pliku c dodawać extern inline void funkcja( void ); , żeby poszukał funkcji na zewnątrz, co prawda kompilacja przebiegała bez błędu, jednak dalej funkcja nie była rozwijana. Dopiero makro załatwiło sprawę, myślę że...
tak na pierwszy rzut oka to kolega powerm ma jaknajbardziej racje... powinno być: extern void kolejka(FILE *plik); zamiast extern void kolejka(); sprawdź,
Dołączasz do głównego programu, czyli masz jakiś plik np. main w projekcie. A dołączyłeś do tego projektu plik c zawierający kod twojej "biblioteki"? Pewnie nie, stąd info o braku definicji (btw, wklejaj wyjścia z kompilatora, to ułatwia pomaganie). Czyli wiesz już, że musisz załączyć plik c, oprócz nagłówka. No chyba, że skompilujesz to jako prawdziwą...
Witam Mam funkcje napisana w asemblerze i wykorzystuje ją w pliku "C". funkcja używa dwóch argumentów, są to zmienne GLOBAL w asemblerze "x1" i "x2", w pliku h mam zadeklarowane extern do tych zmiennych i funkcji "test" Program wygląda tak: main(void) { x1=2; x2=3; test(); } funkcja wykonuje operacje na x1 i x2,a wynik tych...
pinMode(led_lcd, OUTPUT); // podswietle... lcd.backlight(); To pierwsze led-lcd jest niepotrzebne. Zalatwia to biblioteka poprzez wywołanie metody backlight() -to właśnie włącza podświetlenie lcd. Z grubsza wgląda dobrze. Jeszcze przy definicji dwóch funkcji extern uint8_t dec_na_bcd(uint8_t num) ...
No i chyba nie można deklarować zmiennej jako extern a potem definiować jako static. To może niuans, ale taka interpretacja nawet mi nie przyszła do głowy, jak czytałem pytania. :) W każdym razie - w tym samym kontekście, oczywiście, nie można. Ale jeżeli w innym (wewnątrz funkcji czy bloku), to można - będzie to inna zmienna, przesłaniająca definicję/deklarację...
progmem extern static extern zmienna extern
termistor oznaczenie zasilacz kondensator 10000uf przeciekać passat
samsung ww12k8402ow zestaw komputerowy 15000
Błąd P0406 w Citroenie - jak naprawić EGR? Integracja SmartESS z Home Assistant: Modbus, API, MQTT