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ą.
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ć...
Dla mnie zmienia. Nie zmienia. Semantyka kodu pozostaje identyczna. Piszesz o optymalizacjach, tym się zajmuje optymalizator. Jeśli jest sprytny, to być może użyje zmiennych ze stosu funkcji wywołującej, a jeśli się nie da, to i tak zaalokuje nowe zmienne na stosie. Ty nie masz nad tym bezpośredniej kontroli, możesz co najwyżej kombinować z flagami...
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
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...
: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:...
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...
no to doczytaj sobie jeszcze o takich rodzajach funkcji jak inline static itp - to znowu ci się wiele rozjaśni ;)
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ć,...
Można np. zadeklarować funkcje inline włączające i wyłączające diodę w jakimś headerze i potem je wywoływać. Tak jak proponujesz, to się generalnie nie da zrobić, chyba, że np. masz w okresowym przerwaniu zegarowym kod, który będzie takie zmienne przepisywał na wymagane porty. (oczywiście, powyższe dotyczy tego, co napisał autor, nie excray)
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...
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...
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.
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...
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...
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ść...
A dlaczgo nie funkcja inline zamiast tego?
Po 1) użyj znaczników [code]... Po 2) funkcje inline _delay_us i _delay_ms muszą być wywoływane z argumentami o wartości znanej w trakcie kompilacji (stałe) - było o tym wielokrotnie na forum. [url=http://www.nongnu.org/avr-libc/user... Po 3) co do inline asm to zobacz [url=http://www.nongnu.org/avr-libc/user...
jedna linijka kodu może zawierać w sobie od kilku do kilkuset a nawet tysięcy linijek kodu To musi być jakieś monstrualne makro, ew. funkcja inline. W innym przypadku linijka kodu to linijka kodu. Może to być wywołanie jakiejś funkcji, ale to już załatwia kompilator i linker.
ważna jest dla niej latencja Jeśli to jest naprawdę ważne, to zostaje raczej tylko asembler. ie wywołuje innych funkcji poza funkcją inline i _delay_us (jest niezbędna) ale one nie są wywoływane tylko wprowadzane w miejscu wywołania To wcale nie jest takie oczywiste, inline nie wymusza osadzenia kodu, jest tylko sugestią.
A nie prościej napisać kilka uniwersalnych funkcji inline? Nie będzie kary wydajnościowej.
Opakuj funkcję _delay_ms() swoją funkcją inline, w której zdefiniujesz warunek preprocesora.
Albo makro, albo możesz przekazać adres SFRa jako (volatile uint8_t*). Zobacz: http://www.nongnu.org/avr-libc/user-manu... 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. Jeśli będziesz przekazywać tylko jeden z 2 możliwych rejestrów, to rozważ...
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...
miej swiadomosc faktu, ze funkcje inline w gcc rzadko kiedy sa naprawde inline. 4\/3!!
Funkcje inline muszą być static żeby to miało sens. 4\/3!!
Daruj sobie te makra i napisz funkcje inline. Czytelnie, prosto, tak samo efektywnie.
Proponuję abyś się nie uczył tego obrzydliwego stylu pisania gdzie funkcje, które powinny byc inline sa w postaci definicji. Nie bierz z tego przykładu. Jest to złe, niewłaściwe, ciężko debugowalne, bez kontroli typów itd itd. Tego się nawet na trzeźwo czytać nie da.
Przy C++ sprawa trochę się komplikuje, nieprawdaż? Dlaczego? Jeśli zmienna/funkcja jest wewnątrz klasy, to tak naprawdę jej nie tworzysz, tylko opisujesz typ danych (klasę). A i przy C są wyjątki jak od każdej dobrej reguły. Mam na myśli funkcje inline. Dla potrzeb tej dyskusji można traktować funkcje inline jako makro i nie jest to wtedy żaden wyjątek....
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...
...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.
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.
Nie wiem jak te sprawy wyglądają w C, ale w C++ zrobiłbym makrodefinicje albo funkcje inline
"Jakąś schludność" w obsłudze przerwań można uzyskać przez wywoływanie w nich funkcji inline, które są podefiniowane w innych, już "tematycznych" plikach źródłowych. :)
To znaczy ze nie kompiluje coś innego. zobacz co Twój kompilator skompilował tak naprawde po rozwinieciu #define -ów Jak chcesz uniknąć takich problemów zamiast #define zrób funkcje inline.
No na małych intach to może i tak. Ale nie wiadomo jak z innymi typami. W taki wypadku wiadomo, :(. U mnie to działa trochę w inny sposób bo funkcje mam cały czas we Flashu i są one skompilowane z projektem, a tylko je wywołuję z innego projektu. Czyli mam np 100 funkcji a przez usb wgrywam program który je tylko wywołuje z rożnymi parametrami, czyli...
Optymalizacja ta sama? T84 ma uboższą listę rozkazów, nie ma tych rozkazów związanych z mnożeniem, więc kod może być dłuższy. To nie była kwestia innej listy rozkazów a wyłącznie potraktowania funkcji inline w obu przypadkach. Pisałem o tym powyżej... R
A skąd ma wiedzieć jak nie zaincludowałeś niczego co definiuje te typy. Np stdint w C nie ma takich typów, dopóki sobie nie zrobisz ani __IO ani innych cudów. jak masz wstręt do includów to możesz sobie gcc internalsa __uint8_t zastosować. Przy okazji ja osobiście wolę zamiast takich definicji funkcje inline.
Akurat funkcje te są zdefiniowane i wywoływane w jednym pliku... Możesz pozbyć się __inline lub lepiej poprzedić deklaracja static, np. -fgnu89-inline Kiedy usuniesz __inline uC będzie za każdym razem skakał do adresu gdzie znajduje się funkcja, zamiast wstawiać ciało za każdym razem kiedy funkcja jest wywoływana. Poczytaj https://gcc.gnu.org/onlinedocs/gcc/Inlin...
Jeśli chodzi o goto, to w C nie użyłem go ani razu - od 20 lat... A co do "makr", czyli funkcji inline - zależy od sytuacji. Jeżeli potrzebujesz funkcji, która jest krótka, a czas jej wykonania jest krytyczny - używasz inline. Jeżeli jednak czas nie jest aż taki krytyczny, nie robisz tego - zyskujesz wówczas rozmiar kodu mniejszy.
No- czytam. Ale mi się jeszcze plącze. W pierwszym poście podałem że najpierw jest deklaracja, potem main() a potem definicja. Po Bożemu. Tylko nie rozumiem co to znaczy prototyp zdefiniowany. Czy to chodzi o funkcje inline? Nie mam tu takich.
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...
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...
Mogą byc definiowane w kodzie (.c). Keil to akceptuje.
ehh... __nop(); //wstawia dokladnie jeden NOP, dziala nawet na -O3 -Otime LIPA [syntax=C] __asm void nop_asm (void) { NOP BX LR } [/syntax] Po co skok i return tylko po to aby wykonac JEDEN nop? Bezsens. Nop trwa jeden cykl, a wywolanie i powrot powyzszej funkcji to kilka cykli. I tego nie da sie oczywiscie zmienić, bo keil nie inline-uje funkcji...
Uzyj funkcji. Jezeli chcesz aby zachowywala sie jak makro to dodaj atrybut inline. BTW: mozesz pisac wieloninikowe makra (oddzielasz linie \) [syntax=c] #define set_ADC1_sample_time(value, channel) \ do { \ \ } while(0) [/syntax] Info na temat jak uzywac funkcji inline: http://www.greenend.org.uk/rjk/tech/inli...
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ć...
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
http://download.savannah.gnu.org/release... Część kodu jest w plikach nagłówkowych .h w postaci makr i funkcji inline. Jak chcesz mieć jedną funkcję korzystającą z różnych pamięci (SRAM, FLASH) bez zbędnych zabiegów to zmień uC na takie z inną architektur. AVR się do tego nie nadaje.
Rozumiem, że nie dopuszczasz tutaj rozwiązań oferowanych przez CMSIS, które z poziomu pliku startupa są chyba jednak funkcjami "C". Chodzi Ci o te funkcje inline, wrappery na instrukcje assemblera? Jak kod w C może "przeżyć" że mu podmieniasz nagle stos na zupełnie inny? Nie żebym to sprawdzał, niemniej jednak wydaje mi się, że dowolne czary nie są...
W ten sposób tylko skonfigurowałeś pin jako wejście z podciąganiem, a stan został 0, bo po resecie rejestr GPIOB->ODR jest domyślnie = 0. Żeby wymuszać stany można zdefiniować sobie proste funkcje: [syntax=c] static inline void gpio_pin_LO(GPIO_TypeDef * const port, T_GPIO_PIN pin) { port->BRR = pin; } static inline void gpio_pin_HI(GPIO_TypeDef * const...
warning: function declaration isn't a prototype - wyskakują mi takie 3 warningi, odnoszą się one do funkcji inline static void, czyli inicjacja, StartZliczania i StopZliczania. Szukałem odpowiedzi w dokumentacji, ale nic nie znalazłem. Wiecie co może być źle??
void SetADCChannel(unsigned char channel){ ADMUX = (ADMUX&0xE0) + channel; } można ją zrobić jako funkcję inline Ja też sobie już od dawien dawna wmawiam, że zrobię sobie płytkę a jeszcze nigdy jej nie zrobiłem :P
Dziwny ten twój program. Po pierwsze wywal te swoje procedury obsługi EEPROM i użyj tych z biblioteki AVR-libc, wyeliminujesz jedną z możliwych przyczyn. Poza tym w przerwaniu nie używaj cli i sei, nie jest to potrzebne - wejście w przerwanie automatycznie blokuje kolejne. sei() na końcu może być niebezpieczne, jeśli twoje przerwanie SPI jest za długie,...
Oczywiście, że jest - avr-ar. Standard c znajdziesz bez problemu w necie. Co do nagłówków to słusznie się domyślasz - w zależności od opcji z którymi kompilujesz albo miałbyś błąd, albo wielokrotne kopie tych samych funkcji. Stąd też ciała funkcji w plikach nagłówkowych występują właściwie wyłącznie w przypadku funkcji inline.
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...
Tak ogólnie... Nie przytoczę teraz źródła, ale widziałem nawet taką wypowiedź, która traktowała wystąpienia #define jako mało profesjonalne. Pewnie chodziło o to, że lepiej robić funkcje inline (dla makr które coś robią), lub o użycie const zamiast define (na AVR jednak lepiej używać define).
(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...
Po _powrocie_ z funkcji. Ewentualnie postaw sobie breakpointa w HAL_DMA_Start_IT() i wtedy zobacz. Do momentu w którym kompilator nie napotka czegoś co można by nazwać "ogólnym miejscem synchronizacji" (wywołanie funkcji nie-inline, powrót z funkcji nie-inline, dostęp do pamięci oznaczonej jako volatile, ...) to może sobie poprzestawiać te instrukcje...
Jeśli chcesz / miałbyś problem to wrzuć taki kod jaki kompilujesz obecnie (cały projekt), to wrzucę Ci dezassemblację całości - tam można wypatrzyć dosyć ciekawe rzeczy. Mogę też zmienić to makro na funkcję inline - wtedy można debuggować na pewno, a nie zaburzy to idei FreeRTOSa. 4\/3!!
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...
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++);...
Eclipse sobie z tym poradzi może, bo jest na tyle zaawansowany, że być może zrobi to rozwinięcie,... Atmel Studio radzi sobie poprawnie w każdym tego typu przypadku także pod kątem sprawdzania poprawności składni programu (dodatek Naggy): http://obrazki.elektroda.pl/4810365100_1... Nie ma więc problemów ani po stronie edytora, preprocesora,...
Zmien owire_delay na funkcje inline - inaczej generowane krotkie opoznienia rzedu 1us sa super niedokladne (wez pod uwage, ze musisz wykonac mnowstwo instrukcji wywolujacych funkcje). Po rozpoczeciu konwersji musisz miec opoznienie (to co jest zakomentowane), inaczej uklad nie zdazy podac wynikow. Podaje wtedy stala wartosc (do poolingu), stad moze...
(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ć...
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...
Za to trzeba szczególnie uważać na takie definicje: #define TIMER0_START TIMSK0 |= (1<<TOIE0); TCCR0B |= (1<<CS00) | (1<<CS01); i lepiej zamiast nich zrobić normalną funkcję inline, żeby później nie mieć totalnej kiszki gdy się zastosuje zapis jak poniżej ;) if( cos_tam ) TIMER0_START;
Cze, //Funkcja inline static void spi_init(void) { return; } //Program główny int main() { DDRB |= 1<<5; PORTB &=~(1<<5); spi_init(); while(1) PORTB |= 1<<5; } Sprawdzam stan na porcie PORTB5. Gdy zakomentuje wywołanie funkcji, program działa. Jest stan wysoki na wyjściu....
(at)elektronik666 Dlaczego używasz makr do tego? To jest idealny przypadek do użycia funkcji inline. Jak już chcesz używać makr to należy to zrobić zgodnie ze sztuką czyli: - bez zbędnego ; na końcu - dodać nawiasy do definicji makra informujące o tym, że to makro jest function like [syntax=c] #define BCK_0() PORTD &= ~(1<<PD0) [/syntax]
Najgorsze jest to, że rację ma kompilator. A szukasz pewnie tego: -fno-inline-functions
(at)md5crypt 1. Trochę nadużywasz słowa kluczowego inline. Zwłaszcza w implementacji. Pozwól kompilatorowi działać w tej materii. Jedno/kilku liniowe funkcje możesz zostawić z inline. 2. Przy deklaracji/definicji funkcji często masz pustą listę parametrów. W C (w odróżnieniu od C++) nie jest to tożsame z void. 3. API jest trochę skomplikowane. Wystarczyłby...
Funkcje static inline powinny znajdować się w pliku nagłówka (.h). To troche przesadzone.
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...
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...
I czemu Ty na miłość boską wkładasz całą funkcję w header ? To właściwe miejsce na funkcję "static inline" Albert
Oprócz błędu wspomnianego przez poprzednika (użycie rejestrów LAT* zamiast PORT*) popełniasz błąd wpisując definicję funkcji do pliku nagłówkowego. Tam powinny być tylko deklaracje, (ewentualnie funkcje static inline). Albert
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 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 chyba że masz nagłówek z inline funkcjami, wtedy wystarczy tylko nagłówek, ale jest to pewna specyficzna sytuacja, raczej nie polecana.
osoba ktora twierdzila ze nie mozna robic #define zaproponowala aby takie funkcje zrobic w funkcji void inline cos() { } tak wiec nie trzba bedzie latac po calym programie i zmieniac rejestrow danych portow tak jak to opisujesz !
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...
Dokładnie gaskoin. Do autora - jak masz problem odpal symulator w AVR Studio, w tak prostym kodzie błąd znajdziesz natychmiast obserwując rejestry. Poza tym #define to coś o czym lepiej zapomnieć :) Jak już musisz udziwniać, to zamień to na zwykłe funkcje - kompilator i tak zrobi z tego inline, efekt końcowy będzie więc taki sam, a przejrzystość, kontrola...
Warto dodać, że jak od każdej reguły, także tu są pewne wyjątki - w plikach nagłówkowych czasami umieszcza się definicje funkcji static inline - efektem jest osadzenie w kodzie dołączającym nagłówek tychże funkcji, można także umieszczać definicje zmiennych static const - takie zmienne efektywnie zachowują się jak symbol zdefiniowany przez #define.
Oczywiście że chodzi mi o optymalizację wprowadzoną przez kompilator, na optymalizację algorytmu przez użytkownika zawsze w jakimś stopniu chronią UT. Ja miałem problem właśnie z volatile, jakimś cudem kompilator zoptymalizował zmienną w dość niefortunny sposób co powodowało wywalenie się kodu. Co ciekawsze było to w examplu od ST a kompilowane pod...
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,...
GCC (którego używa DevCpp) nie obsługuje/obsługuje zupełnie inaczej kod assemblerowey wewnątrz funkcji (inline assembler). Dla Buildera/Visual C++ ten kod jest w zasadzie poprawny. #include <cstdlib> #include <stdio> using namespace std; void zapisz(char); int main(int argc, char *argv[]) { char liczba; printf("Wpisz...
Przy czym przestrzegam cię przed makrami, to pozornie fajne jest ale pozbawiasz się kontroli typów i co gorsze, przekazywanie parametrów do makra wygląda inaczej niż do funkcji, co może prowadzić do błędów. Generalnie to co dają makra uzyskasz bezpiecznie poprzez definiowanie funkcji static inline w nagłówku.
Mój błąd - użyłem słowa "biblioteka" do plików "*.h" z funkcjami inline. Żaden z dołączanych przeze mnie (jawnie) plików h ( io, signal, wdt, delay, pgmspace ) nie odwołuje się (poprzez nagłówek extern) do plików obj. Więc mam nadzieję że będzie ok. Jeśli te same operacje będą wykonywane przy użyciu zmiennych deklarowanych w RAMie to pojawiają się zakłócenia...
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...
Dynamiczne kreowanie kodu, a w sumie o to chodzi, bardzo rzadko jest prawdziwą potrzebą. Jakbyś ratował jakiś XY Problem, tylko nie wiem jaki ... w Javascvripcie to jakby formalnie łatwiejsze, co nie znaczy że należy https://stackoverflow.com/questions/2567... https://stackoverflow.com/questions/1640...
Ok, tak może (nie musi) zrobić kompilator, jeśli symbol ma atrybut static. Tylko po co polegać na optymalizacji, skoro to samo można uzyskać bez tej optymalizacji nie tworząc zbędnych danych w pamięci? Bez takiej optymalizacji kod będzie dłuższy i wolniejszy. Kontrola typu stałej rzadko ma uzasadnienie. Moim zdaniem więcej strat niż zysków. Poza tym...
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...
Dzięki za odpowiedź, 1) Włączam port. W tej chwili korzystam z tej funkcji bibliotecznej i działa. Nie mam pojęcia jaka jest przyczyna. 2) Docelowo miała to być funkcja typu inline. Ale nie ma to znaczenia, bardziej martwi mnie to, że nie działa, bo może sygnalizować problemy gdzieś indziej. Od lat nie zdarzyła mi się taka niewiadoma.
Takie zjawisko masz, jak stos ci wchodzi na zmienne. Rejestry odkładają się na stosie, jak wywołujesz zagnieżdżone funkcje. Stos przyrasta z przeciwnej strony RAMu, niż zmienne. Jak masz 70% pamięci danych zajęte, to jest to na 99.99% tego skutek. Rozwiązanie jest takie, żeby zmniejszyć liczbę zagnieżdżeń, ew. rozwinąć USART_Transmit wewnątrz USART_Transmit_Word....
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...
(at)gaskoin nie zrobisz tutaj za dużo w plikach nagłówkowych bo są one używane przez kompilator. Bibliotekę kompilujesz jako całość i w niej taki plik nie może istnieć (bo zmienia się dla każdego projektu). (at)Freddie Chopin jeżeli chodzi o nomenklaturę informatyczną to może rzeczywiście słowo biblioteka jest nie trafne w 100%. Nie mniej jednak jest...
Użycie cyfr jako lokalnych etykiet masz tu: http://ftp.gnu.org/pub/pub/old-gnu/Manua... Jest to bardzo użyteczne w funkcjach assemblerowych do kodu w C jeśli potrzebujesz w nich etykiet i specyfikatora inline. {cond} LO jest równoważny CC. Albert
Preprocesor C nie obsługuje tablic. Podobnie jak żaden inny, przynajmniej jeżeli chodzi o definicję w takim sensie w jakim to jest zrobione w C. Tablicę musisz zadeklarować normalnie. Jeżeli nie chcesz marnować miejsca, to oczywiście deklarujesz ją tak, żeby zapisana byłą w pamięci programu (zresztą, jakkolwiek byś tego nie zrobił, to właśnie tam ona...
Tu nie chodzi o zapotrzebowanie, fizycznie jest to trudne do wykonania. Zauważcie, że przy kompilacji, optymalizator dużą część kodu zjada, czasem tnie na kawałki i trochę go przekłada. Nigdy nikt nie będzie w stanie przetłumaczyć ASM na logicznie napisane C. Choćby z tego powodu, jaki podałem w tym poście wyżej, lub z takiego, że w asmie makra typu...
funkcja static inline inline function inline static
wymiana potencjometr limit polaczen sprawdzić tętnienia oscyloskopem
odkurzacz xiaomi odkurzacz xiaomi
Wymiana zaworu przy dużym palniku w kuchence gazowej Klucz do odkręcania napinacza Ford S-Max 2.0 TDCi 2009