Piszę takie coś asm(in r16,PINB); i też wywala błąd. Nie znam avr-gcc ale stawiam $100, że będzie tak: asm("in r16,PINB");
Error asm("nop\n"); Nie wiem co masz za IAR-a , ale mój to kompiluje prawidłowo i nawet taką składnię rozumie asm("nop\nnop\n"); No to zamiast nop-ów użyj np. __delay_cycles(2) . Piotrek
Zamiast pytać o to jak odwołać się do tego rejestru (co prawda można tworząc zmienną przez jakas_zmienna >>= 1; if(PS_WEJ&0x01) jakas_zmienna |= 0x80; nie tracąc na szybkości (3 cykle przy rejestrze IO dostępnym przez sbic/sbis, 3 przy innym rejestrze [sbrc/sbrs], 5 przy komórce pamięci). Ze względu na skrajny bit można to zoptymalizować,...
to dopiero herezje.... tzw. inline assembler w keilu nie obsluguje rozkazow thumb i thumb2. embedded assembler obsluguje dowolny zestaw instrukcji. poczytaj manuala... funkcje pisane w asmie moga zwracac wartosc: w r0...
gaskoin- to jeszcze- gdzie to jest? No i to: "It may be removed in a future release". No i szukam w manualu- i nic. User manual 1.7.0 No i nie mogę znaleźć: * Toolchain Overview * Memory Areas and Using malloc() * Memory Sections * Data in Program Space * avr-libc and assembler programs * Inline Assembler Cookbook * How to Build a Library * Benchmarks...
Cytat z dokumentacji IAR dla AVR, rozdział "Efficient coding techniques": "Avoid using inline assembler. Instead, try writing the code in C or Embedded C++, use intrinsic functions, or write a separate assembler module." W kompilatorze do MSP430 też kiedyś widziałem podobny tekst.
Wstawki asemblerowe w AVRGCC można umieszczać w programie po instrukcji "asm volatile", zresztą najlepiej przeczytaj sobie "GCC-AVR Inline Assembler Cookbook" - znajdziesz go pod tym adresem: http://www.stanford.edu/class/ee281/proj... Pozdrawiam.
asm cortexa-m3 jest naprawdę prosty. wystarczy się zapoznać z dokumentacją, którą producent rdzenia udostępnia. Ja pisałem całe funkcje w tym asmie, bo inline assembler nie jest obslugiwany w keilu dla rozkazów thumb2 (nie wiem czemu, czasami byloby wygodnie). Często jednak jest tak, że kod C wygenerowany przez kompilator jest jednak lepszy niż to,...
No nie przesadzajmy, nie jest aż tak źle. Systemu operacyjnego nie musisz znać w całości, bo chyba nikt nie używa wszystkich jego funkcji, przynajmniej świadomie. Inna rzecz, ze jak już zaczniesz coś robić to ci się nie spodoba to co daje SO i zechcesz sam napisać jakiś mały kawałek lepiej, zwykle z powodzeniem. Kilka zastosowań assemblera jednak się...
eh... minuta szukania w helpie: C++ Language Reference Writing Functions with Inline Assembly Using C or C++ in __asm Blocks Microsoft Specific If you write a function with inline assembly code, it's easy to pass arguments to the function and return a value from it. The following examples compare a function first written for a separate assembler and...
To nie tak. Jak chcesz używać AVR Studio to musisz używać ich funkcji do zapisu / odczytu EEPROM-u. Funkcje kompilatora są napisane jako inline assembler i zapewniają, że opóźnienie między wystawieniem bitu Write Enable i zapisem (lub odczytem) będzie mniejsze niż 4 cykle. Jeżeli sam robisz taki zapis w C, to kompilator generuje ci więcej kodu i warunek...
Ścieżki:: $(ProjOutDir)\ reszta pusta Analiza:: Tryb.. :Object Pascal - deflaut.. zaznaczone opcje skladni: operatory w stylu jezyka C.., Pozwalaj na instrukcje LABEL, GOTO (-si), INLINE w stylu C++, Assembler style: domyslne Kod:: OPtymalizacje - Poziom 1; reszta odznaczona, Łączenie:: zaznaczone tylko Wyświetl numery lini.., Aplikacja graficzna win32.....
jako "plik" ;] Dodano po 2 No tak jak zasejwowalem plik z koncowka *.c to jest juz lepiej czyli kod nabral kolorow ale dalej mam bledy . moze ktos mi powie co jest nie tak w takim krotkim kodzie #include <at91sam7s64.H> int main() { __asm { ADD R7,R6 ; sum up } return 0; } Bledy ktore pokazuje kompilator to : Build...
Nie prościej tak nie kombinować? Funkcje zdefiniowane wewnątrz definicji klasy (zwykle w nagłówku) są domyślnie traktowane jako z atrybutem "inline" i po co kombinować więcej? A już jakieś atrybuty "always_inline", to prosta droga to zabawy w assembler++, bo skoro kompilator uznał, że inline'owanie nie ma sensu, to zapewne tak właśnie jest.
W pliku lpc17xx.h są zdefiniowane wszystkie makra odwołujące się do rejestrów peryferii, tak np. [syntax=c] /*------------- General Purpose Input/Output (GPIO) --------------------------*/ typedef struct { __IO uint32_t FIODIR; uint32_t RESERVED0[3]; __IO uint32_t FIOMASK; __IO uint32_t FIOPIN; __IO uint32_t FIOSET; __O uint32_t FIOCLR; } GPIO_TypeDef;...
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...
Kolega kamyczek nie bez powodu pisał o tosterach i mikserach i na tych przykładach pytał o sensowność pakowania do nich 64bitowych uC z megabajtami pamięci. A po co w ogóle komu mikrokontroler w tosterze albo mikserze, choćby z firmware napisanym w assemblerze? Po co w tych urządzeniach jakakolwiek elektronika cyfrowa? Ta dyskusja jest o tyle zabawna,...
"r" od "=r" różni się tym, że "r" jest stosowane przy wejściu (po drugim dwukropku), a "=r" przy wyjściu (po pierwszym dwukropku). Zmienne tymczasowe dawałem jako wyjściowe ze wstawek aby kompilator nie czepiał się do niezainicjalizowania zmiennej. Jeśli chcesz mieć zmienny adres, to nie możesz korzystać z sts, które zapisuje pod stały adres. Jeśli...
chociaż assembler arma to juz dla mnie czarna magia wolę c/c++ Widzisz, bo tak naprawdę, to zasada powinna być taka: piszę cały program w C (ew. C++, jeśli to ogromny projekt), natomiast w pewnych, krytycznych miejscach, dajesz funkcję jako inline asm wstawkę. To najlepsze imho połączenie technologii :)
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...
Witam wszystkich, Próbuję się uporać z problemem od kilku dni, jednak nie bardzo wiem co jest nie tak, a mianowicie próbuje odpalić najprostszy program zmieniający stan na pinach: http://obrazki.elektroda.pl/2092017600_1... To jest stan po kilku kliknięciach step over, dodam że program potrzebuje 7 kliknięć step over aby zacząć się wykonywać...
Witam. Zakupiłem konwerter I2C do wyświetlacza LCD i mam mały problem z jego obsługą. Komunikacja z ekspanderem następuje prawidłowo, jedynie co udało mi się uzyskać to miganie podświetleniem, ale uparty wyświetlacz za choinkę nie chce nic wyświetlić. Schematu konwertera niestety nie posiadam, gdyż producent go nie udostępnia. Kod którego używam prezentuje...
Witam. Właśnie staram się zrobić mysz komputerową na atmedze 32 za pomocą biblioteki V-USB. Program testowałem na płytce rozwojowej z kwarcem 16MHz, atmegą 32 i wszystko działało. Po przeniesieniu się na moją płytkę z kwarcem 12MHz i przekopiowaniu kodu, na wyjściach D+ i D- mikrokontrolera nic się nie pojawia, D- stan wysoki, D+ niski. Oczywiście zmieniłem...
Ciągle możesz to zrobić, tylko użyj innych rejestrów, które są wolne. Tu masz o wstawkach: http://www.nongnu.org/avr-libc/user-manu... Inna sprawa, że może źle wybrałeś procesor, lepiej pewnie by poszło z XMega, raz, że działa do 32MHz, a dwa, że ma DMA, które może wyrzucać dane na DAC, bez konieczności robienia tego programowo. Co do...
Dokladnie tak samo. Pliki naglowkowe udostepniaja prototyp funkcji, na etapie kompilacji nic wiecej nie jest potrzebne. Dopiero linker to sklada razem, wiec zeby potrafil polaczyc twoj kod z tym w asm, musisz w asmie wyeksportowac nazwy publiczne (widziane w innych modulach) dyrektywa .global. Ale tu pewien bol jest - jesli obsluge LCD masz napisana...
Po pierwsze co to jest k ą pilacja? DevCpp, jak widać ma inny nagłówek wstawki assemblerowej i o ile pamiętam ma jakieś wymogi co do zapisu liczb szesnastkowych (może 0x378h).
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...
Lektury na początek: https://www.nongnu.org/avr-libc/user-man... http://ww1.microchip.com/downloads/en/de...
Szkoda że im większą popularność zdobywają mikrokontrolery tym więcej powstaje środowisk typu "nic nie musisz wiedzieć by zacząć programować". Bo ja wiem. Ja tam jestem zadowolony z faktu, że w Atmel studio mogę napisać normalny program w pełni obiektowy na małego attiny2313 zamiast męczyć się w assemblerach czy kombinować w C. Przejrzystość kodu i...
Tak się składa, że wiem, że R0 jest wolny a każdy inny zajęty. Dziś jest wolny, jutro jest zajęty - obyś się nie przejechał. No i coś takiego nie działa, bo zmienna StackPointer Działa - potem R4 będzie przepisane do R0 żeby prawidłowo zwrócić wynik. jest ładowana do R4, który to ma być zrzucony instrukcją STMDB Wstawki assemblerowe są dużo bardziej...
No ale co masz za problem z tym inline?
Tak opisane są wstawki w manualu do GCC i nie tylko... tak też się pisze ;) http://www.nongnu.org/avr-libc/user-manu... ale dzięki za chęci Pozdr
http://www.nongnu.org/avr-libc/user-manu... http://www.nongnu.org/avr-libc/user-manu... Chcesz to przenieść do avr-gcc? Czy do asemblera? Jeśli do gcc to prościej stworzyć plik .S i dołączyć go do projektu - w plikach .S stosuje się notację praktycznie taką samą jak w asemblerze AVR, jedyne co musisz uwzględnić przenosząc...
Assembler nie zna port_addres i port_data. Musisz to przekazać jako argumenty do funkcji ASM, które umieszcza się po dwukropku. Zobacz tutaj są przykłady: http://www.ibiblio.org/gferg/ldp/GCC-Inl... Inny sposób to oczywiście to taki jak kolega napisał powyżej, ale nie jest to całkowicie uniwersalne, bo będzie to działać tylko do...
Z opisu funkcji wynika, że pętla używa 8-bitowego licznika. Gdzie w tej funkcji jest odniesienie do licznika.? W tej linii: dec %0 Po prostu jeden z rejestrów jest używany do odliczania opóźnienia i dlatego został "przezwany" licznikiem. Nie ma to nic wspólnego z fizycznymi licznikami/timerami. O wstawkach assemblerowych możesz przeczytać w manualu...
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ą...
No tutaj widać że masz zarezerwowane miejsce na stosie dla przekazywanych parametrów i nic nie jest "nadpisywane". Szczerze powiem nie wiem o co Ci chodzi. O to że spodziewałem się standardowego sposobu przekazywania parametrów, czyli kładzenia na stos (powodującego rozrost stosu). Tak przy okazji to jak dajesz taki kod do analizy to lepiej jak byś...
Pisząc w C tego nie wiesz i wiedzieć nie będziesz (chyba, że zajrzysz w wygenerowany przez kompilator kod assemblera - co swoją drogą jest czasami przydatne). Nie wiem jak daleko działa REGISTER, ale prawdopodobnie kompilator patrzy bardziej na to jak na mocną sugestię niż 100% wymuszenie, bo co by zrobił gdybyś zrobił 20 zmiennych int jako REGISTER?...
opcja "include" w c jest zarezerwonana dla bibliotek c, zazwyczaj piszesz #include <cośtam.h> Jeśli wstawki asm mają być krótkie to proponuje komendę inline(); jesli dłuższe to możesz zastosować __asm; Jeszcze inna metoda , ale już ściśle zależna od konkretnego kompliatora to opjca linkowania plików *.obj :( ale nie zawsze działa tak jak chcesz...
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...
Po kolei. Jesli na plytce masz interfejs JTAG to mozesz debuggowac w ukladzie. Jesli nie (po ISP sie nie da) to pozostaje ci tylko symulacja programowa. I tu wszystko dziala ci jak nalezy. Funkcje z delay.h sa deklarowane jako inline, dodatkowo kompilator robi optymalizacje wiec nie spodziewaj sie, ze bedziesz szedl linijka po linijce. Zeby tak zrobic...
Poczytaj tutaj: http://www.ibiblio.org/gferg/ldp/GCC-Inl... Do zmiennej odwołujesz się jako %0, %1 itp: const int c = 55; __asm__("movl %0, %%eax;\n\t" : /* bez operandów wyjściowych */ : "r"(c) /* c jest załadowane do dowolnego rejestru przed asm */ : "%eax" /* wartość EAX jest...
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...
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...
Zachęcony opiniami z innych tematów postanowiłem dopisać jakie są plany na kolejny release tego przykładu Zasadniczo mam już gotowy "startup w C". Cudzysłowy dlatego, że niestety ta zabawa wymaga funkcji inline, które implementują jedynie rozkazy assemblera (takie jak MSR choćby), również pętle inicjalizujące .data i zerujące .bss są napisane obecnie...
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...
Spróbuje i assemblera do prostych rzeczy Ciekaw jestem ile w swoim RTOS-ie kolega (at)Freddie Chopin napisał asemblera (stawiam ze pewnie ze 100 linijek jak już wyjścia nie miał)? Ja osobiście od dawna (poza kilkoma elementarnymi inline-ami do dsp) ani jednej. Te instrukcje procesora, które ew mogą Ci się przydać masz w CMSIS w postaci wygodnych definicji...
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...
Witam , mam problem z kompilacją w WinAVR biblioteki USBDRV i pliku main.c . W innym projekcie gdziem mam taki sam plik Makefile i te same biblioteki wszytko się dobrze kompiluje a tu wywala mi błąd i nie mogę znaleźć przyczyny. W załączniku zamieszczam cały kod. Przy kompilacji wywala takie coś : D:\Projects\USB_avr2\usb_lpt>make... all avr-gcc...
Z tego co widzę z MIDE nie da się. Jedyne wyjście to używania dyrektywy, które pozwalają zrobić w ciele funkcji (tzw. INLINE). sdas8051 -los asm_func.asm sdcc main.c asm_func.rel Wtedy w pliku asm_func.asm funkcja w asemblerze napisana przez Ciebie, a w main.c zawartość kodu w C. BTW. Może lepszy niż MIDE będzie dla Ciebie [url=http://mcu8051idesourceforge.net/pr...
inline assembler inline function inline static
sterownik serwo modelarski iiyama g2530hsu peugeot 93c66
toyota corolla kontrolka silnika reset pieca buderus
Bezpieczniki wewnętrzne w mikserach audio i kuchennych – rodzaje, lokalizacja, zabezpieczenia Wolf kocioł gazowy błąd 022 – presostat, wentylator, STB, diagnostyka