Jeżeli funkcji dajesz kwalifikator "inline", to kompilator może próbować rozwinąć ją w miejscu wywołania ("inline" to tylko sugestia, nie wymaganie), ale aby mógł to zrobić musi widzieć definicję (ciało) funkcji w tej samej jednostce kompilacji, co wywołanie. Jeżeli będzie widział tylko deklarację, to wstawi normalne wywołanie. Stąd często funkcje inline...
A co z tymi funkcjami inline? Chciałem, żeby program był czytelny. Używać ich, czy wystarczy #define? Inline w ogóle zajmują miejsce w pamięci? Oczywiście używać inline - unikaj define jak ognia, to dyrektywa preprocesora, która tylko wprowadza zamieszanie. Obecnie nie ma za wiele sytuacji, w których należy ją używać. Napewno nie należy jej używać...
Prawdopodobnie kompilator rozwijał funkcję inline i nie było problemu zamazania stosu przed wyjściem z funkcji. Wyjście z main to i tak koniec programu. 5 to też jest za mało. Potrzebujesz 4 znaki na cyfry, 2 na 'mV' i 1 na zero konczące. Razem co najmniej 7. Jak na skutek jakiegoś wydarzenia wartość w zmiennej będzie ponad 9999 to więcej. Dla pełnego...
Ale sprawdziłeś wygenerowany kod? Bo na 90% kompilator sam wygenerował to co tak pracowicie wstawiłeś w asemblerze - a jeśli nie to prosta zmiana opcji kompilacji, dodanie inline itd. spowoduje, że taki kod powstanie automatycznie. Ja niedawno pisząc w C podobną funkcję uzyskałem ok 14 Hz odświeżanie na Matrycy 320x240, w trybie równoległym 16 bitowym...
Kilka uwag w przypadkowej kolejności 1. Nie bój się C++ - niekoniecznie cała biblioteka standardowa jest optymalna i właściwa na uK, ale jest wiele kochanych ficzerów samego języka. a) niepubliczne pola i metody - to ci się bardzo przyda, jak chcesz mieć architekturę b) konstruktory, w tym obiektów statycznych (moduły mogą się rejestrować do modułu...
Wszystkie te których używam (sqrtf(), powf(), acosf()) są liczone przez FPU? Niekoniecznie. W Newlib (czyli libm.a) nie ma implementacji specjalnie dla tego koprocesora, jednak jeśli masz włączoną optymalizację, skonfigurowane FPU (opcje kompilacji) i dodaną flagę -ffast-math, to kompilator niektóre z nich potraktuje jako funkcje inline i zastąpi odpowiednimi...
Panowie wydaje mi się, że właśnie w takim przypadku użycie volatile jest KONICZNE i to zdecydowanie, ponieważ to właśnie tylko w funkcjach a w zasadzie TYLKO w funkcjach zawierających pętle nieskończone bez możliwości ich przerwania dochodzi do buforowania zmiennych Nie jest to prawdą: Natomiast co ciekawe jeśli używamy zmiennej w przerwaniu to jej...
ARM7, Cortex-M3 to - powiedzmy - "handlowe nazwy" architektur, odpowiednio ARMv4 i ARMv7-M. Oczywiście nowsza jest ARMv7 czyli własnie Cortex. ARM7 jest już nieco przestarzały, a układ LPC2106 to w ogóle antyk - NXP od czasu tego układu wypuściło bardzo wiele fajnych układów z tym rdzeniem, dokładnie chodzi o rodziny LPC23xx i LPC24xx - LPC2106 to chyba...
Zamiast pytać o to jak odwołać się do tego rejestru (co prawda można tworząc zmienną przez jakas_zmienna >>= 1; if(PS_WEJ&0x01) jakas_zmienna |= 0x80; nie tracąc na szybkości (3 cykle przy rejestrze IO dostępnym przez sbic/sbis, 3 przy innym rejestrze [sbrc/sbrs], 5 przy komórce pamięci). Ze względu na skrajny bit można to zoptymalizować,...
Dziękuję koledze LordBlick, poprosiłem go o odblokowanie tematu, bo wydaje mi się, że mimo pozornej prostoty problemu warto się nad nim chwilę zastanowić. Zanim przejdę do odpowiedzi na post #3, powiem dwa słowa o makrodefinicjach. Wiele osób z nich chętnie korzysta, w pokazanym wyżej przykładzie zdecydowanie lepiej posługiwać się makrami LED_ON i LED_OFF...
(at)ElektrodaBot - jakich opcji gcc trzeba użyć dla procesora X86 o architekturze Haswell, aby wygenerował instrukcje zmiennoprzecinkowe w kodzie, zamiast wywoływać funkcje biblioteczne? Próbowałem "gcc -march=haswell -mfpmath=both -mhard-float -O9" - bez powodzenia, wywołuje np. "cos(at)PLT", nie używa wprost FCOS. Bezpośrednia odpowiedź - Nie wymusisz...
(...) bić, żeby poinformować kompilator, że ma optymalizować kod w C, ale nie pomijać tej wstawki asm(...)? Próbowałem asm volatile (...), nie pomaga. (at)ElektrodaBot jaka dyrektywa działająca tylko na wstawkę asm() w programie w C kompilowanym przy użyciu GCC ochroni ją przed wyrzuceniem przez optymalizację? Bezpośrednia odpowiedź na pytanie Aby...
(at)elektrodabot Błędy kompilacji: anaw.cpp anaw.cpp(16) : warning C4005: '_CRT_SECURE_NO_WARNINGS' : macro redefinition command-line arguments : see previous definition of '_CRT_SECURE_NO_WARNINGS' anaw.cpp(17) : warning C4005: '_SCL_SECURE_NO_WARNINGS' : macro redefinition command-line arguments : see...
...ale jak zrobić funkcję inline w pliku innym niż main? bo obojętnie czego bym nie zrobił, to kompilator olewa inline :( Bo kompilator nie wie, gdzie funkcja będzie użyta. Mimo, że jest inline, to nie masz pewności, że kompilator tak ją zrobi :) tmf wyjaśnił chyba wszystko.
Dodałem static i czas dalej jest taki sam Zarówno ze static inline jak i samo inline jak i bez dyrektywy inline. Toć napisałem, że kompilator dodaje inline za Ciebie dlatego nie widzisz różnicy. Jak wyłączysz opcje kompilatora , żeby nie inlineował funkcji to różnicę zauważysz. Wystarczy samo inline dodać, nie wiem po co tu static, ale to może freddie...
Witajcie, Nie wiem, jaką składnią w GCC "ogarnąć" wstawki asemblerowe NOP by nie były "wyrzucane" przez kompilator. Mam takie proste funkcje: [syntax=c] #define NOP() __asm__ __volatile__("nop") inline void ledSendBit(uint8_t Bit) //Dla zegara 8MHz (takt 125ns) { if(Bit) { LED_SET; NOP(); //580...1000ns NOP(); NOP(); NOP(); NOP(); LED_RESET; NOP();...
1. Jeśli się nie mylę to gcc bez optymalizacji zawsze ignoruje inline. 2. Żaden kompilator nie ma obowiązku respektować inline - patrz standard C 3. inline może występować bez static, ale w Twoim wypadku to zupełnie bez sensu. bo kompilator musi wtedy wygenerować także definicję funkcji - nie może założyć, że nie ma zewnętrznych odwołań do niej. Albert
Jeśli funkcja będzie inline, to kompilator być może wygeneruje efektywny kod (IN/OUT/SBI/CBI). W przeciwnym wypadku będziesz miał LD/ST. A co ma do tego inline ?
No to przeczytaj (najlepiej w K&R skoro już go masz) co powoduje inline. W skrócie - nie da się pobrać adresu funkcji inline - bo ona nie istnieje jako osobna funkcja. Teoretycznie jeśli niejest zadeklarowana jako static inline, to kompilator powinien tworzyć dwie wersje - jedną inline i jedną zwykłą funkcję, której adres możesz pobrać. Niemniej inline...
pomijając parę innych kwestii, chociażby możliwość deklarowania funkcji jako inline (tak, wiem, w przypadku zwykłego słówka "inline" jest to tylko sugerowanie kompilatorowi, żeby inline'ował, ale np. w przypadku gcc można funkcji nadać taki atrybut: __attribute__((always_inline)) i wtedy kompilator nie ma wyboru, nawet gdy ma optymalizacje ustawione...
No i wypadałoby, żeby te funkcyjki, co mają po dwie linie kodu były zadeklarowane jako static inline. Z czym znowu możnaby dyskutować :) Oczywiście to w niczym raczej nie zaszkodzi, ale też nie jest potrzebne - gcc automatycznie traktuje jako inline funkcje, których kod wynikowy jest nie większy niż zadana wartość, którą można zmieniać stosowaną opcją...
Jak ma być szybko to dlaczego nie sprzętowy SPI tylko programowy? Wygodniej było mi płytkę zaprojektować. Ot tyle. Poza tym t84 ma uniwerslane USI...R Dodano po 2 Wiem, widziałem. Niemniej jeśli trafi na ten temat ktoś z podobnym problemem, to dobrze aby uzyskał wyczerpujące infomacje. U Ciebie to było inline, u kogoś innego to mogą być kwestie związane...
Nie. Kiedyś funkcja była jako static inline z atrybutem always_inline, no i kompilator skracał sobie bezpośrednie wywołania. Bez tego volatile komunikacja częściej zawodzi.
da sie wymusic inline funkcji, ktora jest najnormalniej w swiecie zdefiniowana w INNYM pliku? jesli deklaracje i definicje funkcje wzbogace o 'inline', to kompilator stwierdza przy kompilacji modulu wywolujacego, ze: undefined reference to `io_init' pomaga umieszczenie ciala funkcji w pliku naglowkowym, ale... ale to kiepskie rozwiazanie, wolalbym gdyby...
https://obrazki.elektroda.pl/7013991800_... Dodano po 50 To miało być masa syfu :d Jeszcze konieczna była zmiana rezystora z filtru V0 z 10k na obecnie chyba ok 640R (nadal to ledwo wystarcza), pewno 10k nie wystarczy na zwykły LCD 2x16 a ten jest 5 razy większy
W zasadzie słowo inline to tylko wskazówka dla kompilatora i kompilator nie ma obowiązku jej wykorzystać. Faktyczne zachowanie zależy od opcji optymalizacji (i heurystyki kompilatora). Zapewne masz opcję -Os i to jest rezultat. Myślę jednak, że powinno pomóc (dając najmniej efektów ubocznych) zdeklarowanie tych funkcji jako static inline zamiast tylko...
W serii tych blogów jest chyba prawie wszystko łopatologicznie opisane o programowaniu AVR w C: Deasembler nie istnieje bin nie da się odwrócić . Robi się to podsłuchując działające urządzenie lub program Znalazłem w końcu-da się zdeasemblerować HEXa którego wysyłamy przez ISP do uP AVR;) Można zobaczyć jaki wpływ na kod mają opcje kompilacji. W tym...
Kod z funkcjami wirtualnymi dla kompilatora jest trudniejszy do optymalizacji, ponieważ kompilator nie wie dokładnie, która konkretnie funkcja zostanie wywołana na rzecz którego obiektu. No i? Przecież funkcje publiczne które nie są inline nie zostaną jakoś magicznie zoptymalizowane, bo kompilator popatrzy w reszcie projektu jak są używane. Jedyna...
Na avr/gcc jeszcze nie próbowałem, ale jak mi tzreba cos podobnego na innych środowiskach, robie w C pustą funkcję o odpowiedniej nazwie i liście parametrów, każę kompilowac nie do zbioru binarnego tylko do źródła w asemblerze (zwyklwe jest jakaś opcja) i mam szkielecik funckji kompatybilnej z C (jakby w zbiorze .s). Modyfikuję, przepuszczam programem...
loocasm : funkcje static inline w nagłówku owszem mogą być, aczkolwiek nie powinno się tego stosować zbyt często - jeśli funkcja jest długa i nigdy nie została by wstawiona inline przez kompilator, to zostanie ona skompilowana w każdym module w którym jest używana z osobna - wynika to z tego, że kompilator ignoruje wtedy inline, po wstawieniu nagłówków...
Poczytałem trochę o tym inline i z tego co udało mi się ustalić to jego używanie nie powoduje oszczędności. Wychodzi na to że kod z funkcja typu inline jest po prostu wstawiany w miejsce jego wywołania. Czyli jeśli w programie użyję 5 razy tą samą funkcję typu inline to kompilator po prosu mi wstawi kod tej funkcji do programu aż 5 razy. Zwykła funkcja...
define w ogóle nie jest instrukcją strukturalną ani niczym co kompilator ANALIZUJE (sprawdza). Hmm... Z tego co wiem , a wiem o C jeszcze niewiele , to preprocesor "podmienia" makra na stringi i podrzuca to kompilatorowi. Poeksperymentowałem co nieco z inline i ... wygląda to nieciekawie w AVR-GCC.Bez optymalizacji kompilator generuje skok do podprogramu...
Podaj wersję kompilatora. W nowszych zostało to poprawione i kompilator odkłada tylko te rejestry, które używa. Niemniej, nawet w tak prostym kodzie może używać ich wiele, bo w większości przypadków nie wiąże się to z żadnymi kosztami, więc optymalizator nie jest na to nastawiony. Zauważ, że w C nie ma koncepcji przerwań, więc kompilator nie do końca...
Odwracasz kota ogonem. Nigdzie nie pisałem, że ta oszczędność do czegokolwiek jest potrzebna. Ale skoro autora to gnębi, to mu odpowiadamy. A poznanie kompilatora może kiedyś się przydać. Piszesz o asemblerze, modyfikatory typu const, static, inline po coś wymyślono. Dobrym nawykiem jest informować kompilator o swoich intencjach, a nie pisać byle się...
Ja tego nie wymyślam. Jeśli byłoby samo inline, to kompilator oprócz rozwijania funkcji utworzyłby osobne ciało, które można byłoby wywołać (call). W przypadku static inline tego nie zrobi. Co do sensu lub nie, przykład z core_cm3.h [syntax=c]static __INLINE uint32_t SysTick_Config(uint32_t ticks) { if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);...
tam jest tylko jedna operacja - chodziło o to aby było 32k iteracji inline i nie inline Poprawiłem zanim odpowiedziałeś. Nie inkrementujesz adresu i kompilator wycina odczyty. Gdybyś inkrementował to zabrakło by ramu.
Funkcja typu inline to funkcja która nie jest wywoływana, lecz jej kod jest wstawiany bezpośrednio w miejsce wywołania. Czy w związku z tym taka funkcja może korzystać ze zmiennych lokalnych funkcji ją wywołującej? Trzeba stosować np. takie same nazwy zmiennych, albo kompilator robi to sam automatycznie?
Jeśli chodzi o C to ja też zbyt zaawansowany nie jestem, ale czytam posty ludzi o wiele mądrzejszych ode mnie i stosuje się do ich rad. Jak funkcja nie jest inline to jest ona normalnie wywoływana co zabiera procesorowi kilka cykli na skok do bloku w pamięci, w którym ta funkcja się znajduje i jeszcze parę cykli na powrót z procedury. Jak funkcja jest...
No widzisz :) Pierwsze sprawdziłem- działa. TIMSK zaremowany, puste przerwanie też. TIFR |= (1 << TOV1); wstawiony do przerwania od ADC. Co prawda kod jest jeszcze bardziej niezrozumiały- ale działa. wystarczy dodać komentarz :P Co do reszty- inline jeszcze nie przerabiałem- link od Ciebie Avrlibc manual czytam codziennie i podręcznik do C też-...
Nie prościej tak nie kombinować? Funkcje zdefiniowane wewnątrz definicji klasy (zwykle w nagłówku) są domyślnie traktowane jako z atrybutem "inline" i po co kombinować więcej? A już jakieś atrybuty "always_inline", to prosta droga to zabawy w assembler++, bo skoro kompilator uznał, że inline'owanie nie ma sensu, to zapewne tak właśnie jest.
Nie jest to możliwe, gdyż optymalizacja _delay jest zabroniona - zawiera ona volatile. Dlatego też napisałem właśnie, że wydaje mi się to dziwne - nie miałem pod ręką kompilatora aby sprawdzić czy tam jest volatile w środku. Czyli mój trop był błędny. Dodatkowo nie ma atrybutu zezwalającego na zastąpienie wywołania wynikiem funkcji (__attribute__(const))....
Poświęcilem sie i sprawdziłem AVRStudion 4 z WinAVR-20060421 w defaultowych opcjach. Frontend GCC jest taki sam (backend się róźni na konkretny hardware), dlaczego mikroprocesorywy C miałby tu być językowo gorszy? Ty mówisz o jakich kompilatorach? Używam kompilator Hi-tech dla PICów. Producent ściśle trzyma się normy C89 i inline nie ma. Jeśli chcę...
A co jest złego w użyciu tablicy zamiast struktury i wołanie zawartosc ((uint8_t*)&zawartosc)... Rzutujesz strukturę na tablicę i używasz jej jak by pamięć struktury była tablicą. Znów zamiast wpisywać wartość wpisujesz w/w (albo robisz referencję i używasz referencji). Jednak to podejście jest śliskie - bo nie masz gwarancji...
Wywal definicję funkcji lcd_GetFile z pliku lcd.c, a zdefiniuj ją w pliku lcd.h funkcja inline to coś a'la makro, kompilator nie generuje dla niej jednego kodu do którego się "skacze" z różnych miejsc przez call, ale generuje wprost ten sam kod w każdym miejscu w którym jej użyjesz - tyle razy ten sam kod ile jest wywołań. Podczas kompilacji musi wiedzieć...
Pod PA0 podpiętą mam diodę przez rezystor 4k7(próbowałem też 220R) do zasilania. Próbowałem zasilać go przez zasilacz komputerowy oraz programator usbasb z takim samym skutkiem. Tak mam kondensatory na zasilaniu. Nie mam ustawionych bitów BODLEVEL moje fusbity o E4:99. Poza tym uC się nie resetuje jeżeli funkcja test() jest inline co moim zdaniem sugeruje...
Zainteresowany jestem dekompilacją wsadów, przeróbką na własne potrzeby, ponowną kompilacją i generowaniem podpisu. Poruszyłeś tu dwa tematy: modyfikację istniejącego skompilowanego kodu i generowanie podpisów. Kilka uwag na oba tematy. 1/ Modyfikacja kodu binarnego W przypadku kodu natywnego (C, C++) nie ma co liczyć na pełną dekompilację do kodu...
Nope. Kompilator nigdy nie zoptymalizuje w ten sposób nieskończonej pętli. Nie jestem pewien czy w Atmel Studio nie mialem kiedys takiego problemu wlasnie z wlaczona optymalizacja (kompilator usuwal petle i program konczyl sie po jednym przebiegu). Glowy jednak nie dam, bo to dawno bylo ;) - ale dla pewnosci mozna wstawic inline asm z instrukcja nop...
Powiedz mi jeszcze, dlaczego trzeba zrobić takie zmiany. Mógłbyś to krótko wytłumaczyć?? Bo atrybuty, w rodzaju PROGMEM, czyli przypisanie do konkretnej sekcji pamięci, mogą mieć tylko zmienne, a nie typy danych. Natomiast atrybut inline ma sens tylko wtedy, jeżeli kompilator w momencie użycia funkcji zna jej definicję, a nie tylko deklarację. W praktyce...
wprost nieobsługuje się przerwania nie rozumiem. O co Ci chodzi Ale jak RX nie jest volatile to kompilator uzna że nie może się zmienić w tej pętli while i odczytać wartości tylko raz. Później będzie porównywać tylko wartości rejestrów, Zobacz sobie jak to działa : https://godbolt.org/z/pKPEx2 wywołać którąś assemblerową instrukcję synchronizacyjną...
mam nastepujaca linijke kodu while (indeks_linii<64) {} kompilator AVRGCC zamienia to w nastepujacy ciag instrukcji in R31,0x23 cpi R31,0x40 brcs PC-0x02 jak zrobic z tego wstawke asemblerowa do AVRGCC? kod typu asm volatile("in R31,0x23"); asm volatile("cpi R31,0x40"); asm volatile("brcs...
inline function assembler inline inline static
twarde dyski fujitsu podłączyć transformator schemat radius panel
naprawa modułu pralki samsung manta dvbt024
Scott MDX62 – przetwornica nie działa, spalony R101, diagnostyka i naprawa Scott MDX62, MDX i62, MDX i65 – schemat płyty zasilacza, wartości R101/R307, diody UF