no to doczytaj sobie jeszcze o takich rodzajach funkcji jak inline static itp - to znowu ci się wiele rozjaśni ;)
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,...
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...
Funkcje static inline powinny znajdować się w pliku nagłówka (.h). To troche przesadzone.
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
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
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.
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.
Zgadzam się z kolegą wyżej, poza tym można taką funkcję zrobić statyczną (static inline) i nie zobaczysz różnicy w ogóle. Takie warunki można zastąpić czymś szybszym - bezpośrednim wywołaniem wskaźnika na funkcję z tablicy. Wtedy nie ma tysiąca warunków, jest tylko dereferencja i wywołanie, ale po co ? Wielu programistów tu na forum zapomina (albo nie...
GCC znakomicie optymalizuje funkcje typu static inline. I sam się zastanawiałem dlaczego nie są one używane zbyt chętnie w bibliotekach obsługi peryferiów dostarczanych przez producentów procesorów z rdzeniem ARM. Przedstawiony powyżej kod, zapisany jako funkcja static inline, przy włączonym jakimkolwiek poziomie optymalizacji, przy podaniu na wejście...
Generalnie taki jest właśnie sens użycia static. Jeśli funkcja ma być dostępna w różnych miejscach, to umiść ją w nagłówku jako static inline.
OK, ale tu nie ma żadnej magii. Widzę tylko dwa sensowne rozwiązania: 1. IdKoprocesoraX deklarujesz przez #define, używasz pierwszej wersji makr i generujesz kod bardziej optymalny. 2. Używając drugiej wersji makr, możesz umieścić numer koprocesora w zmiennej. To się może przydać np. gdyby jeden drajwer mógł obsługiwać więcej niż jeden koprocesor. Albo...
(at)excray To wlasnie funkcje inline sie umieszcza w naglowku (jezeli planuje sie uzywac je w wielu modulach). Kolega zapomniał jeszcze o static. BTW. To nie jest wywolanie funkcji :) [syntax=c] ... set_SDIN ... [/syntax]
Cóż, jestem w "C" zaledwie rozpoczynającym ( kolejny raz :cry: ) , ale próbowałem już Clean Project/Solution itp. a ciągle wywala właśnie tę jedyną definicję .. ps. w Output jest wskazanie na ten właśnie plik gdzie zamiast tej pierwotnej funkcji static inline wpisałem tą z "always_online" ps2. chwilowo moja zaraza ==> win10 "zbisurmanił się " i nie...
Dziękuję koledze za interwencję :) Powinienem założyć temat w dziale dla początkujących. Wracając do tematu, rzecz w tym że zmieniam biblioteki z megi na xmegę i muszę pozmieniać macra pinów wyświetlacza i nie wiem czy mógłbym zastosować funkcję static inline void LED_on(). Dzięki wcześniejszej pomocy udało mi się zmienić poprawnie bibliotekę. Pozdrawiam...
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...
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 wiem po co tu static Bez static funkcja jest globalna. Na etapie kompilacji kompilator nie wie czy ta funkcja nie jest jeszcze gdzieś wykorzystywana i musi ja zostawić jako zwykłą funkcję dla linkera. Jeśli dasz static funkcja staje się lokalna i kompilator może ją wstawiać jako inline . Żeby funkcja static inline była globalnie widoczna trzeba...
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...
Dobra naprawiłam, miałam malutki błąd w programie i podczas 'suchego' testu bez żadnych warunków czy funkcji silnik kręci sie w obie strony i zatrzymuje się. Ale wewnątrz pętli lub warunku pojazd nie jedzie do tyłu. Stoi w miejscu. Gdy w programie wprowadzam komendę jazdy do przodu (obroty w kierunku zgodnym z ruchem wskazówek zegara) albo zatrzymania,...
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))....
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.
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...
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...
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...
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??
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...
Po pierwsze to powinieneś solidnie komentować takie funkcje. Opisz sobie dokładnie które zmienne powinny mieć jakie jednostki. Gdybyś to zrobił to byś zobaczył że do zmiennej która trzyma wartość w stopniach przypisujesz radiany. Dalej - zastąp RAD2ST makrem DEG2RAD(x). Będzie czytelniej. Jeżeli nie masz jakiejś kosmicznej konieczności stosowania liczb...
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....
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...
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...
Wybacz ze wyjde nieco poza temat, ale musze zapytac. CZy deklarowanie krótkich funkcji jako 'static inline' w jakis sposób przyspiesza działanie programu? Ew. upraszcza program? i jaki w praktyce jest sęs jej stosowania (poprostu co mi to da ;) ). (w C jestem poczatkujacym, mam mase nawyków z PHP, który to jezyk dobrze znam, a których to nawyków chce...
Nie do końca. Kompilator musi wygenerować ciało funkcji tylko jeśli program pobiera jej adres. W sytuacji, w której program składa się z oddzielnych modułów kompilacji oczywiście tego stwierdzić nie może i dopiero wtedy linker może ten kod usunąć (--gc-sections). Z drugiej strony linker sam od siebie spisze się dobrze i zbędny kod usunie bez dodatkowych...
To jest normalna różnica związana z optymalizacją kodu. Kompilator prawdopodobnie w 2 przypadku zamienił Twoje funkcje na inline. Przenoszenie funkcji do osobnego modułu ma sens jeżeli chcesz z takiej funkcji skorzystać wielokrotnie. Wtedy rzeczywiście oszczędza się miejsce w przeciwieństwie do Twojego przypadku. PS 1: Funkcje wykorzystywane tylko w...
A najgorsze, że nie byłoby jak podzielić go wtedy na dwa pliki. Aż strach pomyśleć jak wyglądają Twoje programy zapisane tylko w maini.c. Plus jeden do designu oprogramowania. Idąc Twoja logiką możnaby zapisać ten program w jednej linii. Jakby nie działał to od razu wiadomo w której linii jest błąd. Zastąp ten fragment tym co (at)BlueDraco napisał....
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ę,
Mimo tego zawiłego opisu, nie jestem pewien, czy dobrze zrozumiałem, co chcesz zrobić. Piszesz w C? Bo, jak rozumiem, MIDE to środowisko, zakładam, że w C. Masz dwie możliwości: 1. Przekazać numer portu i bitu jako argumenty do funkcji. Nie jestem 100% pewien, czy na 51-ce da się pośrednio adresować porty, ale chyba tak. Tylko takie rozwiązanie troche...
Nie ma jednoznacznej odpowiedzi na to pytanie. Wszystko zależy gdzie ta funkcja zostanie umieszczona - w pliku nagłówkowym, czy źródłowym i od jej prototypu. O ile będzie w pliku źródłowym, a prototyp nie będzie zawierał static lub inline to funkcja zostanie stworzona tylko raz, niezależnie od ilości jej wywołań. Przy czym to też nie jest tak pewne...
To są jednak rejestry sprzętowe i należy to minimalnie zmodyfikować (nie sprawdzałem poprawności adresów itp) [syntax=c]#define DWTEn() (*((volatile uint32_t*)0xE000EDFC)) |= (1<<24) #define CpuTicksEn() (*((volatile uint32_t*)0xE0001000)) = 0x40000001 #define CpuTicksDis() (*((volatile uint32_t*)0xE0001000)) = 0x40000000 #define CpuGetTicks()...
Czy w projekcie jest załączony plik zawierający definicję (a nie tylko deklarację) ciał tych funkcji? Czy nie są one zadeklarowane z jakimś modyfikatorem typu static, lub inline?
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++);...
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ę...
(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ć...
Freddie Chopin : Funkcja inline jest wstawiana tylko w obrębie aktualnego modułu (kiedy to kompilator posiada funkcję w postaci nie skompilowanej i może ją w miejscu zoptymalizować do funkcji wywołującej). Jeśli funkcja nie jest statyczna, to mimo to pojawi się w ciele modułu jedna kopia ogólna, którą można wywoływać z zewnętrznych modułów (w nagłówku...
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...
Witam, Przepisałem dokładnie cały przykład inicjalizacji interfejsu I2C z ksiązki Tomasza Francuza, a mimo to Avrstudio nie pozwala mi go skompilować. Szukałem pomocy w innych przykładach ale nie widze błędu. Prosze o pomoc. //Próbuje uruchomić akcelerometr mma7455l [syntax=c]#include <avr/io.h> // Załaduj bibliotekę input/output #include <avr/interrupt.h>...
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...
Wielkie dzięki za pomoc. Ale mam jeszcze jedną prośbę. Potrzebuję odczytywać z różnych rejestrów o różnych długościach (8,16,24 bity). Jak napisać tą funkcję aby była ogólna a żebym nie musiał mieć trzech różnych funkcji odczytujących? Mirek podał ci rozwiązanie z makrami, skuteczne, ale makra są ryzykowne. To samo zrobisz klasyczną funkcją w C. Po...
Filtrować zasilanie zawsze warto. Ja przy swoim hc pin sclr podciągałem zawsze przez rezystor 470. Dodatkowo moja funkcja wygląda tak: [syntax=c]void Master_SPI_Transmit(uint8_t data) { SPI_RESET_SS(); SPDR=data; while(!(SPSR & (1<<SPIF))); SPI_SET_SS(); }[/syntax] Gdzie [syntax=c]static inline void SPI_SET_SS() { PORTB|=(1<<PB2); }...
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...
Tak zauważyłem, że to jest tablica typu 8-bitowego, ale definicja TFTLCD_DELAY wynosi 0xFFFF, czyli 16 bitów. Raczej nie mogę tego tak po prostu przyciąć do 0xFF? Dodano po 5 EDIT: Dobra, finalnie przyciąłem tą wartość TFTLCD_DELAY do 0xFF, usunąłem ten static inline i poprawiłem jeszcze drobny błąd w funkcji read8. Wyświetlacz ruszył na finalnym urządzeniu...
Bo taki kod jest bardziej dla mnie czytelny, mam rejestr na którym wykonuję dwie operacje, zamiast makaronu ifów które ustawiają kolejne rejestry (zależne od ustawień). Funkcja może wyglądać tak: [syntax=c]static inline void GPIO_Config(GPIO_TypeDef* gpio, uint8_t pin, uint8_t conf){ if(pin > 7){ gpio->CRH &= ~( 0xF << ((pin - 8) * 4));...
Do konfiguracji GPIO, zamiast tego pasztetu który masz, polecam coś takiego: [syntax=c]#define CNF_ANALOG 0 #define CNF_FLOATING 1 #define CNF_INPUT 2 #define CNF_RESERVED 3 #define CNF_GPPP 0 #define CNF_GPOD 1 #define CNF_AFPP 2 #define CNF_AFOD 3 #define MODE_INPUT 0 #define MODE_OUTPUT_2MHZ1 #define MODE_OUTPUT_10MHZ2 #define MODE_OUTPUT_50MHZ3...
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...
U ciebie oprócz sprawdzenia warunku dochodzi narzut na wywołanie funkcji publicznych. Funkcje są zdefiniowane jako always_inline więc ich kod jest wklejany w miejscu wywołania. Bzdura, inlinowane są funkcje zdefiniowane jedynie w danej jednostce kompilacji. MrKiel. Skoro wybierane funkcje masz w innych bibliotekach, to żaden inline nie zadziała. NIGDY!!...
sbit OFF = P2^5; - w tym momencie przypisuje portowi 2 i pinie 5 nazwe OFF?tak?Czy to dziala na innej zasadzie? Zaraz, zaraz... To z kodu C dla '51, tak? AVR Studio nie akceptuje tego wiec robie tak #define OFF_0 PORTD &= ~_BV(PD1) - dobrze?skladnia instrukcji bedzie taka sama? To jest to samo? Noooo, to nie jest to samo :| Możesz zrobić np. tak:...
Witam. Chodzi mi po głowie uruchomienie 1-Wire pod Linuxem. W sumie pomysł dla sportu ale zawsze do czegoś kiedyś komuś może się przydać. Jak wiadomo obsługa z poziomu Linuxa portów gpio nie należy do najszybszych i tutaj pojawia się pytanie. Chciałbym napisać program w C wykorzystując poniższe funkcje static inline u32 at91_read(unsigned int offset)...
No, to tylko część modyfikacji, trzeba przerobić cały plik na "arduinowy" bo nie widzi że to jest dla LGT tylko robi jak dla Atmega328P, a on nie ma takich rejestrów. No i resztę funkcji, bo odczyt musi być też między ustawieniami rejestrów: https://obrazki.elektroda.pl/8960353100_... Może inicjalizacje IO można zostawić poprzednią...
1. Co to jest "nkoder"? Nie znam takiego urządzenia. Słyszałem coś o enkoderach. 2. nie prościej; static inline _Bool sprawdz_stan(int nkoderLewy) { return nkoderLewy < 9000; } ... o ile to w ogóle musi być funkcja 3. ustawiasz jakieś sterowanie gdy zatrzask == 1, a nie zmieniasz nic gdy zatrzask == 0, więc nic dziwnego, że robi dalej to samo, co...
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.
Co należałoby poprawić, aby móc wyeliminować ten błąd, uruchomić program i wygenerować plik? Utworzyć plik o nazwie np. main.h , w którym znajdzie się deklaracja funkcji getPlik (): main.cpp dopisać definicję tej funkcji i przenieść deklarację zmiennej globalnej plik do jej wnętrza: plik , użyć funkcji getPlik () np.: Dodano po 4 A sugestia, że w plikach...
Jak by Ci tu powiedzieć... Procesor zna wyłącznie postać binarną. To ty ją sobie zapisujesz jako liczbę dziesiętną. W procesorze są tylko zera i jedynki. Poprawnie powinniśmy raczej mówi o konwersji z naturalnego kodu binarnego na BCD i odwrotnie. Funkcje konwersji tym razem poprawne, tylko nawiasy mają nadmiarowe i typ danych niedookreślony - standard...
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",...
Przepisałem tą funkcję debounce i działa jeszcze gorzej, niż ta moja. Dodano po 4 Zamykam
int function(void) { Gdzie ta funkcja się kończy? (nazwa też jakaś "mizerna" :D) Brakuje nawiasu "}" przed static inline void lcd_sendHalf(uint8_t data) void_lcd_write_byte(unsigned char _data) O jeden znak "_" za dużo. if (data(1<<0)) Bezsensowny zapis. Dalej nie przeglądałem.
...Jak ktoś jest wstanie powiedzieć co jest ... NA PEWNO źle, to był bym wdzięczny za odpowiedź, bo cały czas stoję w miejscu. Na początek, sprawdź ten fragment: [syntax=c_loadrunner]uint16_t speed; void I2C_SetBusSpeed()// czestotliwosc taktowania magistrali { speed = (F_CPU/speed/100-16)/2; uint8_t prescaler = 0; while(speed>255) { prescaler ++;...
Bardzo fajny przykład dydaktyczny z serii "jak nie należy pisać programów". ;) Typy... od 19 lat mamy w C typy o jawnych rozmiarach - uint8_t, int16_t itd.. Dobra zasada - jeśli coś nie może być ujemne - powinno być typu bez znaku. Czy rozmiar danej może byś ujemny? Dekompozycja na procedury - dwa razy pod rząd mamy ten sam paskudny kod zamiany tetrady...
To użyj DMA. Tak jest zrobione. DMA podaje próbki na DAC, ale bufory trzeba co jakiś czas zapełnić. Bazuję na przykładzie z książki. Z wyjątkiem serii E5 mapowanie można włączać i wyłączać. Ja bym je włączył i olał odczyt przez funkcje eeprom, a zamiast tego zrobił zwykły odczyt, co przy okazji rozwiązuje problem z dostępem do FLASH. Czyli wtedy eeprom...
Można to zainicjalizować tak: [syntax=c] static inline void init_ADC(void) { ADMUX |= _BV(REFS0); ADCSRA = _BV(ADEN); #if F_CPU>=8000000ul ADCSRA|=_BV(ADPS0)|_BV(ADPS1)|_BV(ADPS2)... #endif #if ((F_CPU>=4000000ul)&&(F_CPU&l... ADCSRA|=_BV(ADPS0)|_BV(ADPS2); #endif #if ((F_CPU>=2000000ul)&&(F_CPU&l... ADCSRA|=_BV(ADPS2);...
Schematu nie dałem, bo go nie ma. Jak znajdę czas to narysuję :wink: Jeśli chodzi o instrukcje nop to są tam wstawione ze względu na specyfikacje 1-wire. Najpierw trzeba wystawić stan niski i odczekać czas trochę dłuższy niż 1us (dając dwa razy nop czekam 2us bo działa na zegarze 1MHZ, przy większym zegarze pasuje dać już fukcje opóźniające) i potem...
mirekk36, znowu nie przesadzaj z ta strasznoscia funkcji hd44780_putStr. Wystarczy sobie zadeklarowac proste makro: #define ARRAY_LENGTH( x ) (sizeof(x) / sizeof(x[0]) i juz mozesz to wykorzystac to obliczenia dlugosci stringa przez kompilator. Wystarczy tylko odjac 1 na zamykajace stringa \0 i gotowe. Co do niesprawdzania...
(at)nvsync Nie chcę się wdawać w poboczne dyskusje - poprzedniego posta usunąłem, bo nic nie wnosił nowego po Twoim poście, a Twojego jeszcze nie było, jak go pisałem. Tym niemniej Twoje uwagi do niego, to nadinterpretacja. Ani nie polecałem, ani nie odradzałem stosowania tagów - po prostu napisałem, że dla działania programu nie ma to żadnego znaczenia....
Nie może Cię interesować tylko C - tak czy siak będziesz musiał oglądać wygenerowany kod i połapać się, czy już jest wystarczająco dobry, czy nie. Oczywiście CFLAGS += -Os Wszystkie funkcje, których nie eksportujesz z modułów (są używane tylko lokalnie) zaznaczasz jako static. To samo z danymi globalnymi wewnątrz modułu. Uważaj na promocje arytmetyczne...
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();...
Witam Jak już widzicie po tytule nie mogę uzyskać poprawnego wyniku z przetwornika zewnętrznego PCF8591 połączonego z mikrokontrolerem (Atmega16-8Mhz pod piny SCL i SDA) poprzez programowe I2C. Już nie mam pomysłów co może być źle, w czym tkwi haczyk. Wszystko wydaje się być dobrze podłączone, program kompiluje się bez błędów. Kod sprawdziłem już na...
No tak zapisałem ze stałymi w funkcji bo tablica miała być globalna ale z pomocą pierwszego zapisu można zamknąć ASM z parametrami i zwracaną wartością. Najczęściej jest to w makrze albo jako static inline( nagłówki z 'avr-libc'). Dlaczego? Bo są inlajnowane a dostępna składnia pozwala kompilatorowi na lepszą optymalizację. Noże dzisiaj ostrzymy na...
Mam kod programu w którym definiuję stałą F_CPU: [syntax=c] #include <util/delay.h> #define F_CPU 8000000L //definicja częstotliwości zegara [/syntax] W bibliotece delay.h także jest zdefiniowany F_CPU i wygląda to tak: [syntax=c] #if !defined(__DOXYGEN__) static inline void _delay_us(double __us) __attribute__((always_inline)); static inline...
Wlaczam. Wywoluje w mainie enable_irq #define IRQ_MASK 0x00000080 #define FIQ_MASK 0x00000040 #define INT_MASK (IRQ_MASK|FIQ_MASK) static inline cpu_t get_cpsr(void) { cpu_t val; asm volatile ("mrs %[val], cpsr\n":[val]"=r&q... return val; } static inline void...
Dzięki, tak intuicyjnie wyczuwałem. Czy byłbyś jeszcze uprzejmy spojrzeć na kody dla Mega, które przesyłają te dane bez oczekiwań, a nic się nie dzieje? W którym miejscu tych funkcji jest oczekiwanie na gotowość Slave i jak to przełożyć na funkję nadającą w Xmega? Dodano po 1 Chyba wreszcie zbliżam się do jakiegoś finału. Podłączyłem analizator na magistralę,...
tmf: tak nagłówkowe są atm identyczne, zostawiłem tak bo mogę sobie odrębne komentarze dać w każdym z osobna (czy to będzie potrzebne nie wiem), co do bibliotek to się nie odważę na obecnym moim etapie nauki :). Grzegorz: jest to rozwiązanie chyba najprostsze z możliwych, aktualnie pliki type1.c type2.c mają po ok 100-150 wierszy (same definicje funkcji),...
[syntax=cpp] #include<iostream> #include<conio.h> using namespace std; class StatekHandlowy { private: int tonaz; int liczbaZalogi; int typProducent; static int razemZalogi; static int razemTonaz; public: StatekHandlowy(); ~StatekHandlowy(); }; StatekHandlowy::StatekHandlowy() { std::cout<<"Podaj tonaz:\n"; std::cin>>tonaz; std::cout<<"Podaj...
Debugger IMHO nie wchodzi w kod makr, taki jego urok... Może gdybyś tymczasowo zmienił makro na rzeczywistą funkcję (najlepiej jako "static" ... "__attribute__ ((always_inline));") to wtedy mógłbyś ją faktycznie zdebuggować. Nie sugerowałbym się więc pierwszymi linijkami... 4\/3!!
Po nic niewnoszących dyskusjach, sprawdzona funkcja odmierzająca us [syntax=c] __STATIC_INLINE void Delay_us(volatile uint16_t microseconds) { TIM10->CNT = 0; while ( TIM10->CNT < microseconds); } [/syntax] Wymaga oczywiście inicjalizacji timera na 1MHz (dla zegara 96MHz): [syntax=c] static void MX_TIM10_Init(void) { htim10.Instance = TIM10;...
Dziękuję za odpowiedź. Nie umiem dokładnie znaleźć tej funkcji. Znalazłem tylko taką: [syntax=c]static __INLINE __ASM uint32_t __REV16(uint32_t value)[/syntax] Ja chcę zamieniać bajty w zmiennej 16 bitowej.
Witam Temat być może pojawia się po raz wtóry, ale poprzednie tematy nie rozwiązały problemu. Chcę wykonać prosty zegarek cyfrowy oparty na uC ATMEGA8(L) oraz wyświetlaczu LCD 2x24. Wszystko chodzi bez zarzutów, gdyby nie fakt złego odliczania czasu przez mój uC. Otóż mój ATMEGA8 pracuje z kwarcem zewnętrznym 8MHz + dwa kondensatory ceramiczne 22pF...
Wypowiem się co do forward declaration w sensie enkapsulacji. Wg mojego przekonania jest to wynalazek JEDYNIE do rozwiązywania cyklicznej zależności gdyż kompilator C pracuje sekwencyjnie (a nie integralnie jak Javy /C#). Więc wolał bym każdy "formalizm języka" uzywać w tym duchu, w jakim jest przeznaczony. Zdaję sobie sprawe do czego jest forward...
Witam, Mam następujące kłopoty (błedy przy kompilacji). Zastanawiam się, czemu niektore rzeczy nie są opisane w ksiażce :/ Np. jak powinna wyglądać definicja I2C_Error? Jaka jest potrzebna biblioteka avr zeby niktore funkcje I2C były "rozumiane" przez kompilator? W programie głównym dodałem #include <util/twi.h> ale zostało kilka błędów. Proszę...
No właśnie- kłócicie się o bajty a całe moje rozumowanie idzie chyba o kant... potłuc. tmf podał w swojej książce opis menu- dość rozbudowany, z podmenu i innymi bajerami. Kod jest na ftp Helionu. Obsługuje się to enkoderem z przyciskiem. Jak się jest na określonej pozycji to naciśnięcie powoduje włączenie funkcji dopasowanej do tej pozycji- w moim...
Witam, wraz z przewodnikiem Elektroniki dla Wszystkich próbuję zaprogramować wyświetlacz od nokii 3310. Kod myślę, że poprawnie przepisałem, jednak wyskakują następujące błędy przy kompilowaniu: In file included from main.c:6: lcd3310.h: In function 'Lcd_GoTo': lcd3310.h:29: warning: implicit declaration of function 'Lcd_Command'...
michalko12 ma rację. Przykład nie powinien dawać warninga i nie daje. Zresztą wywołanie f(x1), gdzie f po prostu zwraca x1 jest celowym działaniem programisty i trudno tu się dopatrywać błędu, stąd warning byłby nie na miejscu. I zdecydowanie nie zgodzę się z tezą albertb, że inline wstawia kod funkcji w miejscu wywołania - znaczy rozumiem, że to skrót...
No to jeszcze aktualny kod. sulfura- a nie mój. [syntax=c] #include <avr\io.h> #include <avr\interrupt.h> #define LICZBA_KANALOW 5 #define OCR1A_VALUE ((2*F_CPU/100)/LICZBA_KANALOW) #define OCR1B_MIN (6*F_CPU/10000) #define OCR1B_ADC ((18*F_CPU/10000)/1024) #if OCR1A_VALUE > 65500UL #error OCR1A_VALUE is too high, please change preskaler...
Boje się zapytać co w tym kodzie zajmuje tyle miejsca... - Nazwy funkcji/zmiennych zamieniane są na adresy, więc czy funkcja nazywa "konstantynopolitanczykiewiczowna" czy nazywa się "a" w pamięci zajmie tyle samo miejsca. - Między switchem a ifami nie ma różnicy. - Włącz sobie optymalizację. - Pozamieniaj zmienne globalne na automatyczne, podejrzewam,...
Podejmę wątek kolegi BoskiDialer i również poprę funkcje statyczne. Zapewne nie jest to powszechna wiedza, ale jeśli funkcja nie jest statyczna, dla kompilatora jest globalna - musi więc on założyć, że może ona zostać wywołana przez dowolne źródło w dowolnym momencie. Jeśli zaś funkcja jest statyczna dla danego modułu, to kompilator wie, że jedynie...
Kiedyś wpadł mi w ręce wyświetlacz LCD 3x40 OPTREX-50465N na M50530 W avr-gcc napisałem program do obsługi, może komuś się przyda // Obsługa M50530 #include <avr/io.h> #include <util/delay.h> #include <avr/pgmspace.h> // P0 - I/OC2 // P1 - I/OC1 // P2 - R/W // P3 - EX // P4 - DB4 // P5 - DB5 // P6 - DB6 // P7 - DB7 #define port_lcd...
Ok dzieki za radę na pewno się zastosuje, jestem początkującym w tej dziedzinie dlatego potrzebuje naprowadzenia jak tego sie uczyć :) Wracając do mojego konkretnego problemu, wstawiam caly kod i z ciekawości poprosze o wskazanie gdzie jest blad. Z góry dziekuje za chwile poswieconego czasu. [syntax=c] #include <util/delay.h> #include <avr/pgmspace.h>...
Żaden kompilator nie umieści takiej zmiennej w rejestrze, skoro gdzieśtam potrzebny jest jej adres. Tak samo funkcje statyczne nigdy nie zostaną za-inline-owane jeśli gdzieś używane są ich adresy. Zdaje sobie z tego sprawę, że nie powinien tego robić, ale kompilator to tylko program. Bardzo podobną sytuację mam z FreeRTOSem, jesli podam adres zmiennej...
Obsługa maszyn stanów/automatu, pseudo-biektowość (polimorfizm), lepsza hermetyzacja i kapsułkowanie modułów i itp. Charakter takiego podejścia oddaje przykład. W metodach exec możesz zrobić obsługę komend, znaki razem z '\0' terminatorem na końcu, posłużą przy parsowaniu. Wystarczy stworzyć strukturę zawierającą string z nazwą komendy oraz przypisaną...
Witam, ostatnio zabrałem się za opanowanie interfejsu I2C (TWI). Staram się od dobrych 2 dni odczytać dane z układu PCF8583 (RTC). Napisałem gromadę funkcji do obsługi I2C, większość pochodzi z książki "Język C dla mikrokontrolerów AVR" więc sądzę że nie mają błędów. Pierwszym problemem jest adres jaki ma układ ma podłączone wejście A0 do zasilania...
Witam, chciałem się poradzić wyjadaczy (albo każdego kto się zna i może coś doradzić) od STM32F103 nt. wydajnej obsługi portów na tym procku. Nie pisałem dużo rzeczy na te procki a już szczególnie nie takie które wymagały świetnej wydajności. Teraz bardzo zależy mi na tym, zarówno na obsłudze portów typu (odczytaj port/zapisz na port, odczytaj/zapisz...
inline static static inline funkcja inline
szyba wewnętrzna ogniwo peltiera zwarcie przepływomierza kable
sterownik roweru elektrycznego sterownik roweru elektrycznego
Aktualizacja firmware rejestratora GISE - krok po kroku Rolka w tacce papieru Xerox 6605 - opór i działanie