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,...
Ciągle możesz to zrobić, tylko użyj innych rejestrów, które są wolne. Tu masz o wstawkach: 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 rejestrów indeksowych - niestety 3, które posiada AVR to nie...
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ę...
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ś...
Lektury na początek:
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...
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...
No ale co masz za problem z tym inline?
Poczytaj tutaj: 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 nadpisywana w kodzie asm */ ); Zapisanie wyniku operacji...
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=]Link
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...
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. I zgadzam się z tym. Niestety w niektórych szczególnych przypadkach...
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...
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ć,...
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...
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: Pozdrawiam.
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...
Error asm("nop\n");
"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...
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...
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;...
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: To jest stan po kilku kliknięciach step over, dodam że program potrzebuje 7 kliknięć step over aby zacząć się wykonywać ponownie. Będąc na rozkazie w pamięci C000 po kliknięciu...
Nie miałem za bardzo czasu ale wracam do nierozwiązanego problemu. Tak wyglądają screeny po wywołaniu programu CRCGEN. Pliki wgrane programatorem działają poprawnie a przez bootloader tylko ten krótki (choć po przemieleniu ma także 248kB). Tak wywołuję CRCGEN [syntax=c](at)echo off hex2bin blink.hex CRCGEN-NEW blink.bin 0x3e000 0X30314753 0x0000 pause[/syntax]...
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...
Moze zle sie wyrazilem - nie tyle skladnia pozostaje dla mnie niejasna, co nie umiem stwierdzic, dlaczego nie jest generowany plik ELF, pomimo tego, ze w pliku make istnieje regula (chyba) za to odpowiedzialna. # MCU name MCU = attiny45 # Processr frequency. # This will define a symbol, F_CPU, in all source code files equal to the # processor frequency....
Fajna konstrukcja, choć uważam, że z minionej epoki. (teraz załóżmy, że cofamy się z 10/18 lat) Mógłbyś przejść z takim urządzeniem na bazar używanego sprzętu i wybrać tylko działające joysticki i je sprzedawać xD, lub prowadzić szybką naprawę. Bardzo podobają mi się listingi binarnego kodu wraz z opisem, sam to robiłeś? W kontekście macie jakiś pomysł...
Ok, punkty przesłałem. Mam jeszcze pytanko odnośnie tego inline. Jeśli odpalę debuggera to czas wykonywania się tej funkcji jest taki sam z volatile jak i bez. Jeśli używasz debuggera to sprawdź kod assemblerowy, jeśli funkcja wywoływana jest callem to najprawdopodobniej kompilator zignorował twój inline. Aby wymusić spróbuj w pliku nagłówkowym .h...
jeśli wolno na chwilę wtrącić coś bardziej podstawowego , Ja zadam jeszcze bardziej podstawowe pytanie. Te całe magiczne optymalizacje związane z próbami wymuszenia na kompilatorze inline'owania funkcji - one mają jakiś normalny cel? Czy Twój program działa zbyt wolno do REALNEGO zadania jakie przed nim postawiłeś? Może nie wyrabia się w rzeczywistej...
Moim zdaniem bardzo fajny projekt, jeśli chodzi o zaoszczędzenie miejsca na program, hym.. pewnie trochę można było zaoszczędzić gdybyś funkcje pomocnicze nie deklarował jako inline. Generalnie obsługa kilku czujników na jednej szynie nie jest zagadnieniem banalnie łatwym. Do czego stosujesz wstawki assemblerowe z instrukcją NOP? Rozumiem, że to wyczekanie,...
To normalne, że podczas kompilacji występuję ten błąd ? (wytłuszczona część kodu podana pod listingiem) C:\Documents and Settings\XyX\Pulpit\bootloader_c_oraz_pr... all avr-gcc -Wall -Os -I. -mmcu=atmega8 -D START_DELAY_SEC=5 -D UC=atmega8 -D BAUD=9600 -D F_CPU=8000000 -D BOOTSTART=0x1E00 -fno-inline-small-functions -fno-split-wide-types...
Kto nie użył nigdy INLINE w C niech pierwszy rzuci kamień... No i miłej zabawy w procesy krytyczne czasowo robione w języku wysokiego poziomu. Niestety, ale najczęściej przerwania w ASM, a aplikacja w C (przynajmniej ja tak robiłem w czasach Borlandowskiego Turbo C). W pełni kontrolowalne miał przerwania, praktycznie z każdego rozkazu można było się...
makefile ########################################... # Makefile for the project projekt ########################################... ## General Flags PROJECT = projekt MCU = atmega8 TARGET = projekt.elf CC = avr-gcc ## Options common to compile, link and assembly rules COMMON = -mmcu=$(MCU)...
Każdy procek ma jakieś tam systemowe funkcje biblioteczne, które można zastosować, ale zazwyczaj zajmują one więcej miejsca niż proste rozkazy assemblerowe. (dochodzi chociażby rozkaz skoku do procedury). Czy warto z nich jednak korzystać? Np. dla STM'ów: __disable_irq (); będzie lepsze niz: __ASM volatile ("cpsid i"); ? "Twoja własna wersja" nie będzie...
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...
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...
Z pewnym opóźnieniem z powodu małej awarii, ale oto przykład: [syntax=c] #include <avr/io.h> inline void write_data(uint16_t data) { PORTE_OUT=data>>8; PORTF_OUT=data; } int main() { write_data(0xffaa); } [/syntax] I wygenerowany kod: [syntax=asm] 00000218 <main>: #include <avr/io.h> inline void write_data(uint16_t data) { PORTE_OUT=data>>8;...
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...
Mój program który stworzyłem na swoje potrzeby analizuje plik OBJ tworzony przez kompilator i pokazuje które rejestry zostały użyte podczas obsługi przerwania. Pozwala to na użycie parametru Nosave i znaczne przyspieszenie w przypadku Bascoma. Plik OBJ można oczywiście załadować do Atmel Studio i patrzeć na Assemblera, ale to niewygodne bo nie wszystkie...
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...
Nie wiem po co każdą instrukcję ldr Twój program wykonuje warunkowo. To akurat jest oczywiste. Procesor bierze to, co jest. Taki ma program, to taki wykonuje ;p Powinieneś raczej zapytać dlaczego napisałem taki program ;p Otóż nie wiedziałem co robi instrukcja ldrlo. W opisie instrukcji ldr nie było nic o zwiększaniu rejestru wskaźnikowego. Myślałem...
ok trochę czasu mi to zajeło ale udało mi sie przejść ten problem po przez edycje pliku makefile wyedytowałem 3 linie odpowiedzialne za wybór kompilatora i poszło. CC=avr-gcc OBJCOPY=avr-objcopy AVRDUDE=avrdude ale powstał kolejny problem mianowicie problem z plikiem demo.cof wiem że win avr zrezygnował z coff ale niewim jak poprawic makefile aby ten...
Witam, muszę przekopiować projekt pod STM32F107 (Działający już) na CrossWorksie -> Eclipse, problem leży w makefile'u, ale nie mogę podejrzeć co robi ten crossworksowy, mój wygląda następująco: [syntax=c] ########################################... # Start of default section # TRGT = arm-none-eabi-...
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...
Tutaj jest cały log : Dodano po 5 Zaktualizuj sobie soft w programatorze. Problem z tym jest o tyle, że z tego co czytałem (jeśli to nie prawda to poprawcie mnie) do tego potrzebny jest albo drugi programator albo żeby USBaps posiadał zworkę samoprogramowania. Na chwilę obecną dysponuję jedynie jednym programatorem i nie ma on żadnych wyprowadzonych...
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...
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 kod to różnice w ABI pomiędzy IAR i avr-gcc.
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...
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ą...
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 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...
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...
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...
Na avr/gcc jeszcze nie próbowałem, ale jak mi tzreba cos podobnego na innych środowiskach, robie w C pustą funkcję o odpowiedniej nazwie i liście parametrów, każę kompilowac nie do zbioru binarnego tylko do źródła w asemblerze (zwyklwe jest jakaś opcja) i mam szkielecik funckji kompatybilnej z C (jakby w zbiorze .s). Modyfikuję, przepuszczam programem...
Hej, tutaj wklejam kod z lekcji 13 ////////////////////////////////////////... // main.c - plik główny programu testującego możliwości wyświetlacza graficznego z telefonu nokia3310 // przeznaczenie: "Programowanie procesorów języku C (EdW)" // // Autor: RadosĹ‚aw Koppel...
Jest to wg projektu z EdW: ////////////////////////////////////////... // harddef.h - definicja sprzętu dla programu testującego możliwości wyświetlacza z noki3310 // przeznaczenie: "Programowanie procesorów w języku C (EdW)" // ////////////////////////////////////////...
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();...
Hi Dzieki za komentarze poszedlem w druga strone i teraz instaluje zgodnie z 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 cpsr, %[val]\n" ::[val]"r"(val) ); } Nastąpił armagedon,...
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))....
Witam szanownych forumowiczów! Od niedawna staram się nauczyć języka C na AVR. Postanowiłem zbudować poza migającą diodą LED i całą resztą "mini projektów" odbiornik sygnału DMX. W zamierzeniu chcę zrobić DIMMER PACK (sterowanie jasnością 4 urządzeń, stąd 4 kanały i detekcja przejścia przez zero). Jednak przy pisaniu programu napotkałem dość znaczące...
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.
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...
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?...
Aktualnie mam prototyp programu (napisany naturalnie w asemblerze pod DOSem) ktory rozumie takie cos: ustaw gpio5 jako wejscie ala ustaw gpio6 jako wyjscie bela label: jesli ala ma stan wysoki Musisz nas nauczyć jak w DOSie się programuje RP gpio. Skoro to chodzący prototyp, to szacun. W czasach DOS czy Windows 9X ludzie pisali programy w asemblerze....
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: 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 danych zawartych w argumentach funkcji.
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 :)
Ś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.....
Prawdopodobnie znowu optymalizacja jest przyczyną. Zmienna lokalna char *reszta; jest po optymalizacji w rejestrze, a do rejestru nie mozna wyłuskac adresu. Ż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....
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...
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...
Tak jak obiecałem w pierwszym poście, załączyłem do tematu źródła. Kod jest napisany w C, kompilator gcc-avr w wersji 4.5.3-4 + biblioteki avr-libc 1.7.1-2. Jeszcze jeden filmik z "ekstrakcji" w HD :) (at)ADI-mistrzu: U mnie obsługa wyświetlacza i klawiatury była z założenia zadaniem o najniższym priorytecie, stąd nie obsługuję ich w przerwaniach. W...
Nie, żebym chciał cię do czegoś przekonywać, ale: - obecnie assembler stosuje się tylko tam gdzie to ma sens - czyli na naprawdę małych prockach, np. ATTiny10, gdzie nawet jeśli by się dało coś w C zrobić to nie miałoby to sensu, lub wymagało takich manipulacji linkerem, że traciłoby to sens. Asembler stosuje się też tam, gdzie optymalizacja jest niezbędna,...
Wiem, wiem. Siedzę i próbuję skompilować nowy, ale jak krew w piach..... Próbowałem z tego wątku: U mnie wyskakują inne błędy - tak jakby kompilator nie miał praw zapisu pliku, jakieś błedne linki do katalogów itp itd, a cmd uruchamiam jako admin.... Dodano po 23 POSZŁO !!!! Nie mógł utworzyć: Fatal error: can't create obj/AVRISP-MKII.o: No such file...
wprost nieobsługuje się przerwania nie rozumiem. O co Ci chodzi Ale jak RX nie jest volatile to kompilator uzna że nie może się zmienić w tej pętli while i odczytać wartości tylko raz. Później będzie porównywać tylko wartości rejestrów, Zobacz sobie jak to działa : wywołać którąś assemblerową instrukcję synchronizacyjną po co instrukcja synchronizacyjna?...
Ok, compiling cppsupport.c... ..\..\..\Libraries\ISIX_RTOS\include\isi... warning: #260-D: explicit type is missing ("int" assumed) ..\..\..\Libraries\ISIX_RTOS\include\isi... error: #65: expected a ";" ..\..\..\Libraries\ISIX_RTOS\include\isi...