Więc tnij jak pisałem, nie przejmując się czy działa tylko błędem. Wtedy znajdziesz i będziesz mądrzejszy ;-) Aha, a czy pies nie jest pogrzebany w braku static przed inline? Albert
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...
Jeśli koniecznie chcesz mieć jakiś fragment kodu w odpowiednim miejscu innej funkcji i mieć pewność, że tam się znajdzie, to musisz przyglądnąć się makrom. Inline to sugestia dla kompilatora nie obowiązek, natomiast makro wklei ciało funkcji w to miejsce gdzie rozwiniesz makro. Brzydkie ale skuteczne.
funkcje inline muszą być w plikach includowanych - jest to logiczne bo nie są linkowane tylko ich treść wstawiana w miejsce "wywołania". ps. pytanie spowodowane niezadowalającym wynikiem kompilacji ( wielokrotne użycie tychże funkcji powoduje nie tylko brak efektu" inline" ( ale i zdecydowanie nadmiarowy kod... Nie rozumiem co zmnaczy w kontekście tego...
Z tego: [syntax=c]#define Trig (1<<PD0) PORTD |= (1<<Trig); [/syntax] de facto wykonane zostanie : [syntax=c]PORTD |= ( 1 << (1<<PD0) );[/syntax] czyli: [syntax=c]PORTD |= ( 1 << (1<<0) );[/syntax] czyli: [syntax=c]PORTD |= ( 1 << 1 );[/syntax] co skończy się ustawieniem bitu PD1 w PORTD a powinno być: [syntax=c]PORTD...
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...
Masz 2 błędy: 1. Funkcja delay nie jest static. 2. Przekazujesz do _delay_ms wartość nie znaną na etapie kompilacji. [syntax=c]static inline void delay(uint16_t cnt) { #if !DEBUG while (cnt--) _delay_ms(1); #endif }[/syntax] BTW: Wklejając tutaj kod + komunikaty błędu kompilacji będziesz miał większe szanse na uzyskanie pomocy niż w przypadku screen...
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...
Przez czas jak pisałeś te dwa posty już ze 4x przejrzałbyś CAŁĄ listę przerwań, bo nie wiem skąd założenie, że koniecznie muszą być po kolei. P.S. Co złego jest w funkcji z CMSISa robiącej to samo co Ty tylko czytelniej? Przy okazji jak być jej użył, to nie robiłbyś zupełnie bezsensownego ORa... P.S.2. Funkcja z CMSIS jest typu inline - nie da się tego...
Podmieniłem #define EVE_CFAF800480E0_050SC (ta z linii 104) na #define EVE_RVT35. Pytanie dlaczego akurat tutaj trzeba to podmienić skoro w 75 linii jest to samo #define EVE_RVT35 ?? Poniewaz wszystkie wczesniejsze #define masz w warunku #if 0 #endif czyli niespelnionym. Zreszta w CubeIde powinienes miec to zaznaczone na szaro (wylaczone). Czy zatem...
Czy istnieje jakaś dyrektywa preprocesora, która umożliwi wciśnięcie w kod jakiegoś pliku tekstowego? Mam skrypt w sql który nie chcę przepisywać do pliku źródłowego w C++. Chciałbym natomiast zrobić coś w tym stylu: Funkcja_Wkonywujaca_Kod_Sql(" #include "moj_skypt.txt" "); Chodzi o to aby preprocesor umieścił zawartość...
... jednak dalej coś jest nie tak bo RTC nie reaguje... Myślałem , że zauważysz , ale nie zauważyłeś :| Twoja funkcja I2C_Tx() , wysyła na magistrale tylko 7 bitów :( Poza tym , nie odkładaj na później sprawdzania ACK , bo możesz nigdy nie dojść do tego momentu ;) I na koniec propozycja . Wstaw sobie taki fragment i używaj funkcji do operacji na SCL...
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...
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ć...
Czasem Arduino do czegoś się przyda Dodano po 2 Możesz dać przykład takiej krytycznej czasowo operacji? Problem jest a raczej był związany z buforem nadawczym uarta. Mam funkcję: Blokuj tylko przerwania od UART.
No tak, wskaźnik do funkcji inline... pomyśl chwilę nad tą zagadką :) Ale powodem twoich problemów zapewne jest fusebit kompatybilności z ATMega103 - skasuj go i twe kłopoty znikną.
.... mam notę a WinAVR zainstalowałem w wtorek. Z czego przy programowaniu spędziłem 2-3 godzinny dziennie więc nie oszukujmy się, nic nie jest dla mnie zrozumiałe z tematu timerów. Po tak krótkim czasie spędzonym na nauce programowania w C od podstaw (jak zebrać do kupy te spędzone godziny to wyjdzie może ze 2-3 dni) to nie oszukujmy się, dosyć oczywiste...
oczywiście.. funkcja ma ciało - coś się tam wykonuje. IAR koloruje składnie słówka "inline", więc powinien ją też rozpoznawać. __inline nie działa tak samo jak __inline__ :) w nowsze wersji tego programu, można zaznaczyć w opcjach, żeby wykożrzstywał funkcji inline - a w wersji 1.53e nie ma takiej opcji.
A dlaczgo nie funkcja inline zamiast tego?
https://obrazki.elektroda.pl/2135111100_... Witajcie moi drodzy. Przedstawię tutaj płytkę Fubarino-Eth oferującą łączność USB i Ethernet opartą na 32-bitowym PIC32MX795F512H (512KB Flash, 128KB RAM) i nieśmiertelnym ENC28J60. Płytka ta stanowi moją wersję słynnego Fubarino-SD 1.5 od Projekt płytki Projekt ten jest moją przerobioną...
aby funkcja była inline i była przez kompilator wstawiona pisze się np: [b]inline[/b] void Funkcja(void) { ... } void main(void) { Funkcja(); } Dodat tylko, że funkcja taka musi być w tym samy pliku źródłowym. Przynajmniej mi nie udało się zmusic gcc, żeby wstawił funkcję inline gdy znajdowała...
...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.
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...
No to masz dwa wyjścia: - albo dodatkowa wspólna funkcja obsługi enkoderów wywoływana z funkcji ISR wraz z jakimś parametrem (ale to rozwiązanie odrzucasz), - albo funkcja inline z parametrem.
U mnie w kodzie nie ma ...... /* * sterownik dla Margas * wersja dla NUCLEO STM32F446RE * działa dzieki życzliwości i zaangarzowaniu członków forum ELEKTRODA * wspomagających moją skromną wiedzą programistyczną * za co jestem im bardzo a to bardzo wdzęczny * data xx-xx-2024 */ #include "STM32TimerInterrupt.h" #include "STM32_ISR_Timer.h"...
moze, ale funkcja inline jest uzyta KONKRETNA ilosc razy, w KONKRETNYCH miejscach i z KONKRETNYM argmentem. z tego wzgledu kompilator moze KAZDE wystapienie takowej funkcji zoptymalizowac osobno, tak aby byla jak najlepsza. za to gdy funkcja jest nie-inline, to kompilator nie ma prawa zalozyc, ze - dla przykladu - argumenty beda takie, ze lepsza bylaby...
(at)tronics Sorry ale taka analiza powinna się odbywać poprzez przejrzenie symboli w pliku *elf a nie jakimś trywialnym porównaniu. Wielkie mi nieba, zapis do rejestru zajął mniej niż call funkcji. Ponadto ciekawe o ile będzie korzystniejszy ten _delay_ms z avrlibc w stosunku do tego ardinowego w przypadku wywołania w wielu miejscach. Bo ten z avrlibc...
(at)lelekx Nie wiem czy ta funkcja inline zadziała. Nie jestem specem od AVR ale z tego wynika: http://www.atmel.com/webdoc/AVRLibcRefer... ze generowane są inne instrukcje dostępu do SFR w przypadku przekazania przez adres.
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ć...
Ludzie !!! Nie uczcie innych ludzi takich #define Przecież to horror, jak to użyć w nieco innym konteksie. a) podstawienie w #define !!! b) sklejane instrukcje ; nie zamkniete nawiasami c) nawiasy nie do pary z takimi nawykami potem ktoś ciężko szuka błedu w 'bezbłednym' kodzie. Błedy w makrach NIE SĄ diagnozowane przez kompilator, to czyste wstawienie...
(at)Tadzik ale o co Ci chodzi z tym static inline na końcu bo nie łapię? Taki twór służy "lepszej implementacji makra" w nagłówku. Nie pamiętam jak dokładnie standard mówi ale tak z głowy to z tego co pamiętam z dok. gcc: a. inline to sugestia, jakby co masz jeszcze attribute always_inline b. i tak musi być utworzona kopia tej funkcji, żebyś mógł pobrać...
Ja pomijając timery bardzo często korzystam właśnie z takich funkcji typu podaj wskaźnik na coś i zwróć index, nie ważnie czy to jest wskaźnik na jakiś timer, czy adres jakiegoś offsetu w tablicy (np. wskaźników na funkcje przy FSM), więc akurat to jest przydatne, tylko nie w tej formie co tam, zazwyczaj to jest tylko jakaś funkcja inline typu: return...
Jak juz to lepiej ( bo mniej operacji) tak (bazując na hioba propozycji) void Wyslij_USART(unsigned int dana)// zadne static, to nie C++ ani funkcja inline { while(!(UCSRA & (1 << UDRE))); UDR = dana; } void Tekst_USART(char *tekst) { while(*tekst) { Wyslij_USART(*text++);...
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...
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...
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...
Nie moge z nią zrobić jak z inną funkcją bo funkcja przerwaniowa ma określony adres. A inna funkcja ląduje tam gdzie ląduje. Nie, to adres tej funkcji umieszczany jest w odpowiednim miejscu. No to jak skonstruować taki kod dla avr-gcc? Aby jeszcze był przenośny pomiędzy atmegami? Najlepiej static inline i w obu miejscach wywołać taką funkcję,
Przy okazji przypomniało mi się, że nie warto wywoływać funkcji w przerwaniach (chodzi głównie o avr'y) - wywołana funkcja (według konwencji) może zmienić wartość rejestrów r0, r18-r27, r30, r31 oraz sreg Oczywiście dotyczy to jedynie funkcji łączonych zewnętrznie, tj. z biblioteki lub innej jednostki kompilacji. Funkcje statyczne w obrębie danego...
Pomijając ustawienia optymalizujące, poniżej zamieszczam kod, który realizuje to czego szukałem. Wszystkim dziękuję za dotychczasową współpracę Do następnego ;) PS. Pomysł otrzymany od bardziej doświadczonych, za co serdecznie dziękuję. [syntax=cpp] inline float sqr(float x) { return x * x; } // funkcja inline void calcMeanVar(float *data, size_t size,...
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.
No tutaj widać że masz zarezerwowane miejsce na stosie dla przekazywanych parametrów i nic nie jest "nadpisywane". Szczerze powiem nie wiem o co Ci chodzi. O to że spodziewałem się standardowego sposobu przekazywania parametrów, czyli kładzenia na stos (powodującego rozrost stosu). Tak przy okazji to jak dajesz taki kod do analizy to lepiej jak byś...
ODR steruje wtedy pullupem jeśli taki tryb działania wybierzesz. Co do funkcji działających na portach, to - jak pisałem wyżej - dorobienie takiej która robi konfigurację dla więcej niż jednego pinu to 2 linijki, a taka która wystawia wartość czy ją odczytuje jest bezsensu, bo od tego masz rejestry, więc czemu nie odczytać ich wprost (ewentualnie funkcja...
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...
:arrow: krzkomar To juz chyba trochę OT, ale jeszcze dopowiem. Po pierwsze zgadzam się absolutnie w kwestii wyższości funkcji inline nad makrami. Z makr korzystam tam, gdzie nie da się użyć funkcji, ewentualnie do definiowania stałych czy konfiguracji (#ifdef). Brak nawiasów rzucił mi się w oczy, bo to podstawa, a odpowiedź pisałem w pośpiechu. :wink:...
Twój kod jest zły, bo czwórki bitów dla poszczególnych przerwań są w tych tablicach IP[] upakowane po 8. Funkcje z CMSISa do przerwań (do NVIC) są generalnie funkcjami inline, więc efekt finalny będziesz miał taki sam - czy użyjesz swoich dostępów do rejestrów, czy tych funkcji. Ja bym proponował zostać przy tych funkcjach. Jak koniecznie chcesz poczytać,...
Cześć! Poszukuję wsparci gdyż powstał mętlik w głowie. Mam program, który komunikuję się z modułem GSM, używa wielu globalnych tablic, funkcji operujących na strumieniach typu strcpy, str n cpy, strstr, strtok, poniżej wklejam większość deklaracji dużych zmiennych: Dodano po 1 Przeniosłem deklarację StackPoint z .int1 do .int3 i program zaczął wyświetlać...
Próbuje rozgryść I2C w C, ale napotkałem mały problem. W kursie EDW do opóźnień używane sż wstawki assemblera, którego ni w ząb nie rozumiem. Zastanawiałem się czy jest możliwość zastąpienia ich opóźnieniami pisanymi w C? // Funkcja dłuższych opóźnień #if I2C_nhalf < 3 // Nic #elif I2C_nhalf < 8 static void i2c_xdelay(void) { NOP();...
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 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))....
Dlaczego dostaję ostrzeżenie Takiej flagi nie masz, za to masz -Wall, chyba nie trzeba opisywać do czego służy. I dlaczego dostaję ostrzeżenie: ... Choć ta funkcja jest zdefiniowana jako inline w pliku fat/fs_tools.c? Czemu się dziwisz, skoro deklarację masz w pliku h, a definicję w pliku c? Jeśli funkcji tej nie zamierzasz udostępniać "zewnętrznie",...
funkcja static inline inline function assembler inline
podłączyć falownik silnik schemat blokada rodzicielski pilot matrix reset
projektor multimedialny karta graficzna solidworks
Telewizor plazmowy nie włącza się - możliwe przyczyny Nissan P12 - Brak Kontrolki Immobilisera i Problem z Odpaleniem Silnika