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...
Nie wiem jak sprawdzić tylko ten fragment... Tu masz "byka". ustawienie flagi :idea: Po wtóre: Powinien wyglądać np. tak: [syntax=c_loadrunner]static inline void I2C_WaitForComplete() {while (!(TWCR & (1<<TWINT)));}; // czeka na ustawienie flagi TWINT[/syntax]
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...
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
Wiem, że temat był już poruszany niejednokrotnie i liczę się z "niemiłymi" odpowiedziami... No to pierwsza "niemiła" odpowiedź: Zajrzyj do dokumentacji AVR-ka i sprawdź DOKŁADNIE co należy wpisać do rejestru DDRx , by port był wejściem lub wyjściem. //... static inline void owire_wy(void) { DDR(OWIRE_PORT) &= ~(1<<OWIRE_PIN);...
(at)Piotr Piechota Ja robiłbym coś w stylu: [syntax=c] static inline uint32_t bitfield_update(uint32_t bf, uint32_t mask, uint32_t value) { return (bf & ~mask) | (value & mask); } .... const uint32_t mask = RCC_PLLSAICFGR_PLLSAIN | RCC_PLLSAICFGR_PLLSAIP | RCC_PLLSAICFGR_PLLSAIQ | RCC_PLLSAICFGR_PLLSAIR; const uint32_t value = 192 // N=192...
Spróbuj zakomentować to : static inline
no to doczytaj sobie jeszcze o takich rodzajach funkcji jak inline static itp - to znowu ci się wiele rozjaśni ;)
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...
https://www.nxp.com/downloads/en/softwar... Rzeczywiście nie rozpisali się w tym doku odnośnie sterowania GPIO za pomocą tej biblioteki, ale to nie jest jakaś tajemnica. Wystarczy zajrzeć do kodu odpowiedzialnego za gpio. [syntax=c]/* gpio_13xx_1.h * (at)brief LPC13xx GPIO chip driver for LPC13(15/16/17/45/46/47) families *...
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,...
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);...
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...
[syntax=c] char wynik1[3]; //bufor1 dla LCD char wynik2[2]; //bufor2 dla LCD [/syntax] Te bufory są za małe na przechowanie warości zwracanych przez itoa. Nie wziąłeś pod uwagę null termination stringa. Twój program jeżeli działa to przypadkiem;) Jeżeli chcesz to możesz wząć jakąś uproszczoną wersję itoa. Np przerobić coś istniejącego z internetu. [syntax=c]...
makro, static inline itd itd, rozwiązań problemu jest wiele.
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...
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.
W F030 strona ma wielkość 1kB co oznacza, że zmieści się tylko 256 zmiennych Jak to obliczyłeś? Pewnie 1024/4 bajty = 256, ale tutaj tak to nie działa. Strona 1024 bajty to 1024 bajty, inaczej 512 półsłów. Zapis do stron pamięci w STM32F0 wymaga zapisywania półsłów, do jednej strony oczywiście można zapisać 512 półsłów. W poniższym przykładzie zapisuję...
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.
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...
Makro zostanie rozwinięte do: [syntax=c] y = (x++) * (x++); [/syntax] Zatem przed mnożeniem dochodzi do dwukrotnej inkrementacji z 3 do 5. To fajny przykład dlaczego nie ma sensu takich makr robić Zamiast tego lepiej zrobić: [syntax=c] static inline int SQ(int x) { return x*x; } [/syntax]
U mnie sa roznice. Kompiluje na O2 (przy asm i tak to nie ma znaczenia). Procek dziala na 72MHz. Jeszcze raz powrorzylem test. Zapis do pamieci bb u mnie jest wolniejszy: [syntax=c] int a; volatile int xx = 1; volatile int k; static inline void bitband_str_prepare(void) { asm volatile(" \n" "movw r7, #0x84A8 \n" "movt r7, #0x4225 \n" ); } static inline...
Dodałem static i czas dalej jest taki sam Zarówno ze static inline jak i samo inline jak i bez dyrektywy inline. Więc czego powinienem użyć przy tej funkcji: [syntax=c] uint8_t przesuniecie_w_lewo(uint8_t liczba,int8_t oile) { return (oile>0) ? liczba<<oile : liczba>>-oile; } [/syntax] Samego inline, czy static inline?
Jak coś już coś muszę na pollingu robić to: tick_ms_irq musi być wywoływane w przerwaniu od tmera co 1ms. BTW: Ten kod z HAL'a to niezła padaka: if, if, if, if .... :)
Testowałem osobiście ten kod. Działa to fajnie ale jest jeden błąd w kodzie. Odpaliłem program a ATMega328 i nie działał ADC0. Należy zmienić to: [syntax=c] static inline void adc_channel(uint8_t channel){ ADMUX &= ~(0b11111); ADMUX |= 0b11111 & channel; } [/syntax] Na to: [syntax=c] static inline void adc_channel(uint8_t pin){ ADMUX = (ADMUX & 0xF0)...
Witam , Mam kolejne pytanie/ prośbę : Jak zapisać poprawnie poniższe proste funkcje inline z atrybutem "always_inline" (funkcje muszą być dostępne w pliku z main) : 1.) czy obowiązkowo rozdzielać deklarację/definicję, jeśli tak to gdzie xx.h czy xx.c ? 2.) czy może obowiązkowo w pliku z main to w jaki sposób - zapis ? [syntax=c]static inline bool F_isON(uint8_t...
Faktem jest że kiedy przeniosłem ją do pliku init.c, to buntował się na static inline. To znaczy że brakuje tego? GPIO_InitTypeDef GPIO_InitStructure;
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.
Funkcje static inline powinny znajdować się w pliku nagłówka (.h). To troche przesadzone.
W procedurze xmit_spi to ja nie widzę nic sensownego, a rcvr_spi można zapisać jako static inline albo makro o treści spi_Trans(0xff)
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...
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...
Nie wiem jak to jest z funkcjami static, ale static inline mogą być zdefiniowane w innym pliku (muszą być w *.h). Mogą wtedy być wywoływane np. w obsłudze przerwania, zdefiniowanej w pliku *.c, w którym jest też main().
Tak, jak pisze tmf, albo biblioteki, albo owijki, tylko to trochę upierdliwe: plik type1.h [syntax=c] #ifndef TYPE1_H #define TYPE1_H void type1_funkcja1(void); static inline void funkcja1(void) { type1_funkcja1() } #endif[/syntax] plik type2.h [syntax=c] #ifndef TYPE2_H #define TYPE2_H void type2_funkcja1(void); static inline void funkcja1(void) {...
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
https://whirlpool-cdn.thron.com/static/Y... 29 strona... Nawet nie zajrzałeś...
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...
Już się pogubiłem w tym co poszecie... Mam teraz tak master [syntax=cpp] //-----------------INICJALIZACJA SPI------------------------- static inline void SPI_Set_SS() //obsługa ATmega32 { PORTB|=(1<<PB3); //1 to ADS1256 nieaktywny (pinSS) PORTB&=~(1<<PB4); //ATmega32 aktywny (pin SS) } static inline void SPI_Reset_SS() { PORTB|=(1<<PB4);...
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...
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ę...
Pokaż trochę więcej kodu. Użycie powyższych makr może być niebezpieczne w niektórych przypadkach. Np: [syntax=c] if (a) TYL; [/syntax] Jeżeli zamiast makr użyjesz funkcji zdefiniowanych jako static inline nie stracisz nic na wydajności.
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...
To nie działa! :) [syntax=c]if((val & DP)==1) tmp&=~(DP);[/syntax] Powinno być: [syntax=c]tmp ^= val & DP;[/syntax] No i wypadałoby, żeby te funkcyjki, co mają po dwie linie kodu były zadeklarowane jako static inline.
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.
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.
Sorki że dopiero teraz odpisuje, ale ostatnio bardzo mało czasu mam na przesiadywanie przed komputerem. Optymalizacja w Makefile jest na -O0, więc nie jest to ten problem. Wydaje mi się, że program nie może wyjść z realizacji funkcji pierwszego delaya. Zapala diodę, a potem tkwi w pętli. Poniżej prezentuje funkcje, które wywoływane są w sposób pokazany...
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...
(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]
(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....
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); }...
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...
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...
Witam, Skleciłem na szybko układ na "pająka": ATMEGA128, Zasilanie 5V, Kwarc 20Mhz, Rezystory 470 Ohm w liniach RGB Poprawiłem jeszcze trochę timingi aby nie szarpało na początku obrazu. http://obrazki.elektroda.pl/4106040400_1... Przy okazji zapraszam do zaglądnięcia na mój projekt również wykorzystujący VGA ale przy pomocy sprzętowej...
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...
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...
(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ć...
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...
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...
gdy wystawisz wartość na wyjście, to możesz tą wartość odczytać z bufora wejściowego. To dobrze bo już nie miałem pewności. To jedynie wskazuje na pin będący w stanie wysokiej impedancji. Poprawnie załączasz pull up, więc zjawisko nie powinno występować Jednak występuje. Pin jest połączony bezpośrednio. ----------------------------------------...
Jak zrobic inline aby była widoczna dla wywołać zewnętrznych? Metody nie widze. 1. Jezeli funkcja jest w pliku nagłówkowym to oczywiście zostaie z-inline-owana. BZDURA. To, że jest w nagłówku nie oznacza, że będzie inlinowana. Po prostu powstanie wiele instancji tej funkcji. I dlatego jeśli mamy pewność, że funkcja jest dość krótka możemy umieścić...
Hi Dzieki za komentarze poszedlem w druga strone i teraz instaluje zgodnie z http://vsdev.me/notes/setting_up_arm_gcc... Aha przywrocilem jeszcze z orginalnych przykladow static inline cpu_t get_cpsr(void) { cpu_t val; asm volatile ("mrs %[val], cpsr\n":[val]"=r"(val):); return val; } static inline void set_cpsr(cpu_t val) { asm volatile ("msr...
Dzięki, link pomógł. Jednak rejestrom GYRO_CONFIG i ACCEL_CONFIG trzeba przypisać wartości, początkowe nic nie dają. Teraz wartości na wyjściu się zmieniają, tylko problem jest taki że odczyt jest pojedynczy, za drugim razem jest pustka, tak jakby się zawieszał. A przecież wgląd w nie powinien być bez ograniczeń. Próbowałem dać lekkie opóźnienia pomiędzy...
Za długi jest. Ważne że moje PORTB_PB0 = 1 daje taki sam kod maszynowy jak PORTB |= (1<<PB0) Tylko, że bez tego pliku nie da sie skompilować programu. Więc, albo podasz plik, albo trzeba będzie pozmieniać Twoje zapisy. PS. Tak krótkie funkcje jak u Ciebie led_on warto deklarować jako static inline. Nie jest wywoływana tylko wklejana w kod (jest...
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...
Przepisałem tą funkcję debounce i działa jeszcze gorzej, niż ta moja. Dodano po 4 Zamykam
Zaprojektowałem i zbudowałem płytkę wyposażoną w procesor STM32F107RCT6 oraz dekoder popularny MP3 VS1003. Jest to kolejna wersja starszego projektu na PIC32, który przenoszę na nowy mikrokontroler. Większa część projektu PCB pochodzi ze starej wersji. Do komunikacji z VS1003 używam popularnej biblioteki Andy'ego Karpova, którą już wcześniej przeportowałem...
...Chce zeby ,gdy na pinie np.PD1 wystapi stan 0 to wyszedl z petli. No to sprawdzaj właściwy rejestr , a nie jest nim PORTD :( #define OFF() (PIND & (1<<PD1)) //lub bardziej ANSI ;) static inline char OFF(void) { return (PIND & (1<<PD1));} //... DDRD&=~(1<<PD1);...
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.
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)...
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?
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ę,...
ok.. dopiero usiadlem wiec zaraz zajrze do tych wskazowek.... a poki co to tu masz kod: main.c #include "Board.h" void init(void) { // enable peripheral clock for PIO controller AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_PIOB); // enable reset-key on board AT91C_BASE_RSTC->RSTC_RMR = (0xA5000000 | AT91C_RSTC_URSTEN);...
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))....
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...
Moim problemem jest podzielenie programu, który napisałem na stosowne moduły. Chodzi zatem o pliki *.c i *.h. Kompilacja przebiega właściwie dla nazwijmy to zwykłych funkcji. Problem jest natomiast z funkcjami zadeklarowanymi jako inline. Kompilator nie znajduje definicji takich funkcji. Przykład pliku attiny2313.c (fragment): [syntax=c] #include <attiny2313.h>...
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...
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ł....
AtmelStudio GCC 4.8.1 Build started. ... Target "CoreBuild" in file "C:\Program Files\Atmel\Atmel Studio 6.2 ... Invoking: AVR/GNU C Compiler : 4.8.1 ... XMEGA128A1U EBI 4 portowy SRAM AS7C32096A-10TCN Mam dziwny problem z przekroczeniem 64KB Jest sobie kod [syntax=c] ... typedef uint32_t hugemem_ptr_t; static inline uint_fast8_t...
wszystko jest w pliku armint #include "armint.h" #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; }...
Nie masz racji. Kompilatory nawet najlepsze nie przewidują przyszłości. A po to aby wyeliminować takie tłumaczenia wstawiłem w kod static i inline. Choć nie są explicite potrzebne. I nie jest to warning dotyczący składni. Albert
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>...
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...
Pisałem gdzieś jak się je włącza, na co Freddie napisał, że są funkcje w CMSIS, które z resztą na forum też już wklejałem. [syntax=c]/** * (at)brief Enable Interrupt in NVIC Interrupt Controller * * (at)param IRQn The positive number of the external interrupt to enable * * Enable a device specific interupt in the NVIC interrupt controller. * The interrupt...
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...
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));...
Nie wiem skąd ten upór w stosowaniu PWM do sterowania serwa. Jeśli ustawimy prescaler tak aby podstawowy interwał był 20ms- a tak wymaga serwo- to rozdzielczość regulacji długości impulsu- zasadniczo 1-2ms jest bardzo kiepska. Zwłaszcza przy kilku serwach. Tu masz "gotowca"- ale dla ATMega32- pewnie ustawienia rejestrów dla ATMega8 mogą się nieco różnić....
Mam następujący kolejny błąd : SPI Collision FLAG. Przerwania nie naprawiły błędy. ktoś ma pomysł ? Dodano po 1 Witam, Naprawiłem problem. Napisałem jeszcze raz od nowa cały program, problem był w tym, że kompilator nie za bardzo rozumiał kodu w postaci (1<<PB4) gdzie był zatrzask. SPIIF kasuje poprzez dla zainteresowanych kod : [syntax=c] #include...
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...
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!!...
Plik h: [syntax=cpp]#include <iostream> #include <string.h> using namespace std; #pragma once class CBlad { public: CBlad(void); ~CBlad(void); int m_iKod; char* m_csOpis; static bool s_bJestBlad; char* OpisBledu(); inline bool Ostrzezenie() { return m_iKod!=0; } inline bool Blad() { return m_iKod<0; } inline int DajKodBledu() { return...
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,...
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()...
Witam Mam problem z transmisją I2C po wybudzeniu uC. Jeśli uśpienie nie było zbyt głębokie (tryb IDLE) transmisja I2C działa bez problemów. Jeśli uśpienie było głębsze (np. POWER DOWN) po wybudzeniu nie działa magistrala I2C. Aby ponownie zaczęła działać konieczny jest RESET uC. Napisałem krótki program ułatwiający analizę problemu. plik main.c: [syntax=c]#include...
To jest maszyna stanów kalkulatora według schematu przedstawionego tutaj: http://en.wikipedia.org/wiki/UML_state_m... Poniższy przykład zawiera: :arrow: proste dziedziczenie znane z obiektowości. Struktura fsm_t musi przylegać na początku struktury calculatora_t. Tak samo fsm_event_t do calculator_event_t. :arrow: obsługa...
Chyba już wiem o co biega. Porcedurka EEPROM_read() powinna wyć podobna jak w pliku eeprom.h: /** \ingroup avr_eeprom Read one byte from EEPROM address \a __p. */ __ATTR_PURE__ static __inline__ uint8_t eeprom_read_byte (const uint8_t *__p) { do {} while (!eeprom_is_ready ()); #ifE2END <= 0xFF EEARL = (unsigned)__p;...
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...
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();...
Nano czyli ATMega328P... biblioteka od SIM800, do tego LCD i brakło Ci RAMu. lcd.print przyjmuje string... a używanie typu string na 328P to bardzo zły pomysł. Albo zainwestuj w Mega 2560 Pro, albo zacznij bardzo szanować pamięć. Komunikaty trzymaj jako static const char albo inline jako F("tekst") . Czyli zamiast: lcd.print("status GSM = IDLE "); daj...
Wymiatanie GPIO jest mi potrzebne do przesyłania dużej ilości informacji na dodatek w sposób równoległy jak w na portach AVR. Zasugerowałem się licznymi wyjściami na płytce MMnet1002. Po krótce dodam, iż potrzebuję prędkości do sterowania równoległego buforów do mojego projektu http://www.banerled.pl panel RGB. Wymyśliłem trochę pochopnie MMnet1002...
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...
inline static funkcja static inline stm32 static inline
iskrownik ustawić wymiana anteny teleskopowej zasilacz lenovo zamiennik
zarówka punto archiwizacja danych dysku
Dodawanie pilota do bramy Somfy SGS 501 - instrukcje Podłączenie alternatora w Ursus C-360 - schemat i instrukcje