Mam zainstalowane Eclipse Która wersja? Czy masz zainstalowany GNU ARM Eclipse Plugin? Bez niego ten projekt nie zadziała. Problemów szukaj więc w konfiguracji Eclipse/CodeSourcery/GNUArmEclipsePlugin... Wczytałem ten "template" i się bezproblemowo kompiluje (w konfiguracji Debug). W konfiguracji Release (optymalizacja) występuje błąd: Jeśli podczas...
Witam, Czy jest jakaś różnica w objętości lub prędkości wykonywania kodu gdy mam możliwość uruchomienia uC w trybie Debugra czy nie? Na niektórych maszynach jest np tryb realase oraz debug, kompilacja w tym pierwszym powoduje krótszy kod wynikowy (oraz szybsze wykonywanie się kodu?). Czy jeśli pisze jakiś programik, a zależy mi na szybkości wykonywania...
Witam Spotkałem bardzo dziwny problem kiedy włączam optymalizację kodu w moim projekcie. Programuje w darmowym TrueSTUDIO na STM32. W bardzo wielkim uproszczeniu program wygląda tak: main{ ustaw_zegar_uc(); //stanadrdowe uruchomienie mikrokontrolera konfiguruj_GPIO(); konfiguruj_SPI(); // konfiguruje SPI dla wyświetlacza...
Cześć, czy taka konfiguracja projektu jak na screenie jest optymalna? Korzystam z Keila gdzie ustawiłem dodanie do projektu w zakładce CMSIS Core i w Devices Startup. Używam płytki stm32f303vc Discovery i próbowałem też w czystym projekcie dodać tylko biblioteki core_cm4.h, cmsis_gcc.h i stm32f30x.h ale wyskakiwały mi błędy i nie potrafiłem tego ręcznie...
Hej, chciałem zaimplementować zbieranie statystyk w systemie FreeRTOS. Zrobiłem jak w opisie funkcji: 1.włączyłem flagę configGENERATE_RUN_TIME_STATS 2.portCONFIGURE_TIMER_FOR_RUN_TIME_STATS... skonfigurowałem counter. 3.portGET_RUN_TIME_COUNTER_VALUE() - obsłużyłem odczyt z countera. Przy kompilacji poszło ok. Jednak jeśli dodam funkcję vTaskGetRunTimeStats(...
Od jakiegoś czasu próbuję odpalić oszukanego Black Pill'a - STM32F103C8T6 na Macbook'u Pro z OS Sierra używając środowiska Arduino IDE Zamówiłem konwertery TTL z Aliexpress (CH340, CP2102 i YP-01- do tego nie mogę znaleźć sterownika). Pinout sprawdzony kilkukrotnie, TX do TX, RX do RX, 3,3V i GND. W Arduino IDE ustawione: płytka - Generic STM32F103C,...
OpenCV uruchamiany jest głównie na wysokowydajnych platformach obliczeniowych czy mocnych mikroprocesorach, ale pakiet ten może wykonywać kilka rodzajów aplikacji do przetwarzania obrazu na prostych mikrokontrolerach. Przetwarzanie obrazu stało się częścią naszego życia. Nikogo nie dziwi rozpoznawanie twarzy w smartfonie czy wykrywanie pasa ruchu przez...
GPIOA->BSRR |= GPIO_BSRR_BS5; To nie źródło problemu ale tak się tego rejestru nie używa. To jest write only rejestr czyli tylko samo przypisanie Zgadza się, dzięki :) Co do głównego problemu, punkt 1. Użyj debugera okazał się bardzo pomocny :) Założyłem, że skopałem coś w Makefile (np. brakuje jakiejś flagi) i podczas debugowania nic ciekawego...
Witam Mam skompilowany przykład na stm32f103VCT6, kwarc 8MHz. Przykład dość znany ze strony Freddiego project: stm32_blink_led. kawałek pliku konfiguracyjnego: #define CRYSTAL 8000000ul #define FREQUENCY 72000000ul Główna pętla ograniczona do while (1) { //for (count = 0; count < count_max; count++);// delay LED_bb = 1; //for...
W normalnym świecie SPI działa w ten sposób, że wysyłając jeden bajt, odbiera się jeden. Pisząc pewien ogromny program, używałem powyższego założenia implementując obsługę SPI1 z pomocą kanałów DMA (DMA1_Ch2 i DMA1_Ch3). Jeden kanał używany do transferu bloku z pamięci RAM do SPI1->DR, drugi kanał do transferu w drugą stronę. Wszystko działało bez najmniejszego...
A czemu taka funkcja miałaby działać, skoro z punktu widzenia optymalizatora nie robi nic? [syntax=C] void delay(int del) { int i, tmp; tmp = 9000*del; for(i=0;i<tmp;i++); }[/syntax] Po optymalizacji będzie wyglądać mniej więcej tak: [syntax=C] void delay(int del) {}[/syntax] (; A magiczne brakujące słowo nie może być wypowiadane [; Nie umiem go...
No i już 1.7.6 i toolchain 4.9 2015q3 (nowszy deczko). Kompilacja z błędami.. W stosunku do oryginalnego kodu: 1. Usuń w projekcie link do pliku fsdata.c (prawym klawiszem na pliku -> delete -> OK) 2. Prawym klawiszem na projekcie ->Configuration->Druga zakładka (Compile) wybierz FPU soft i Optymalizację O2 3. Ctrl R (rebuild) efekt: Program Size: text...
Przecież ten wyświetlacz pozwala zapalić i zgasić dowolny pixel. Tylko, że ram X adresujesz co 8 bitów, czyli na raz operujesz 8 pikselami. Jeżeli wyświetlacz ma w X 400 pikseli, to adresy w ram są od 0 do 49. Nie musisz się też ograniczać do znaków o szerokości będącej wielokrotnością 8 bitów. Możesz rozważyć drukowanie znaków proporcjonalnych do...
1. Odpowiedź pytaniem - a dlaczego by nie? Równie dobrze mogę Cię spytać, czemu Twój program składa się z x plików zamiast z jednego i byłoby to nawet lepsze pytanie, bo taki program może być bardziej zoptymalizowany przez kompilator niż coś rozdzielonego na setkę plików (; 2. Jedyne miejsce gdzie kolejność ma znaczenie to sama tablica. W końcu w C...
Kod który pokazałem "nie działa" z transmisją przy dzielniku zegara wynoszącym 16. Za szybko? Jakby nie liczyć jeden transfer zajmuje 16*8 cykli zegara, wiec raczej nie ma opcji, żebym tak długo "dochodził" do warunku. Co do Twojego "testu" z breakpointem, to dowodzi on zupełnie NICZEGO - jak masz włączoną optymalizację, to układ sobie może skoczyć...
No pozostał problem z podzieleniem mul = frequency / crystal; musiałem wpisać na sztywno 6. Czy m0 nie da rady podzielić 2 liczb 32 bitowych ?? Na jakiej podstawie stwierdzasz, że tego nie robi? Bo jeśli na podstawie debuggowania programu który ma włączoną optymalizację, to niestety nie ma to żadnej wiarygodności. Can't find a source file at "/home/freddie/bleeding-edge-toolchain/x...
Więc, tak. Na pełnym loopback'u wszystko jest ok, czyli wysyłają się wiadomości. Po zmianach optymalizacji kodu, bo wcześniej wprowadziłem Was w błąd, debug zachowuje się już normalnie. Myślałem że nie przechodzi init, ale przechodzi poprawnie. (mój błąd w interpretacji. Problem jest teraz w wysyłaniu wiadomości w Normal Mode. Podejrzewam, że problem...
Stwierdziłem że będę uczył się STM (do tej pory pisałem programy tylko na AVR) patrząc na to co dzieje się "pod maską", tak żeby lepiej wszystko zrozumieć. Przekornie zapytam: co zrozumiesz lepiej w ARM oglądając kod asemblerowy, niż oglądając kod w C? Naprawdę nie wiem. Prawie nikt nie programuje w asemblerze ARM, bo 1. nie ma takiej potrzeby 2. Jest...
Szanowni Koledzy, Czy spotkaliście się z czymś takim jak function reference manual do bibliotek stm32? Wprawdzie z tego co tam widzę i co napisano już na tym (i nie tylko tym) forum te biblioteki to kiszka, ale do zrobienia jakiejś implementacji na szybko jeszcze można scierpieć optymalizację wg ST. Tyle, że do pełni szczęścia brakuje jakiejś dokumentacji...
Maxe: Twoja metoda nie działa już jej próbowałem co więcej po wprowadzeniu takiej lini: Dodano po 4 fantom: używam makefile'a Lucjana Bryndzy w którym miejscu powinienem dodać -I./lcd bo też nie dało mi to żadnych efektów. [syntax=c] # Automatic makefile for GNUARM (C/C++) # Copyright (C) Lucjan Bryndza <lucjan.bryndza(at)ep.com.pl> # #tutaj wpisz...
Dzięki, wszystko oczywiście działa. Chciałbym poruszyć jeszcze jedną kwestię dotyczącą bilioteki do obsługiwania peryferiów do STM32. Dopiero zaczynam, więc sam jej używam, jednak da się zauważyć, że produkuje ona obszerny kod wynikowy. Myślę, że podobną funkcjonalność można stworzyć używając samych dyrektyw preprocesora, które nic nie zajmują. Napisałem...
Jeżeli mam w projekcie ustawiony procesor STM32F100RB, to chyba kompilator powinien wiedzieć jakie pliki bin dołączyć. Zainstalowałem wersję 1.2 i co ciekawe z tego samego projektu źródłowego generuje sporo większe pliki, przy tych samych ustaiweniach optymalizacji itp. niestety, nie obsługuje ST-Link i nie moge zaprogramowac procesora. Jakim programem...
Cześć. Może mi pomożecie. Wykorzystując Keila, STM32 oraz MPL115A1 (z SPI) chciałem zobaczyć pracę takiego czujnika a zawłaszcza chodziło mi o pomiar ciśnienie. Jako przykładowy kod zastosowałem opisany w EP 01/2012 na stronie 76 opis użycia czujnika. Nie używa on obliczeń zmienno-przecinkowych zresztą jest on też w ostatniej książce BTC o STM32. Ale...
Czemu ty chcesz włączać konfig dla VSLINKa skoro masz ST-Linka? Przecież w OpenOCD jest nawet gotowy konfig dla płytki discovery, ale lepiej ponarzekać jak to wszystko jest beznadziejne bo nie działa tak jak Ty sobie to wymarzyłeś... Eeeej... poczekaj... nie to miałem na myśli. Jestem strasznym laikiem w konfiguracji Eclipse pod ARM. Otworzyłem twój...
Witam, posiedziałem odrobinę i większość problemów się rozwiązała. <Pituś Bajtuś> oczywiście masz całkowitą rację. Po adresie początku stosu ma być tablica wyjątków/przerwań a nie instrukcje. Tak się ciekawie złożyło że kod się uruchamiał (ale pewnie tylko pod debuggerem ) czyli głupi ma zawsze szczęście jeśli nawet jest ono złudne ;) dodałem...
Witam, Wrzucę swoje 2 grosze: #0. C++ to jest generalnie do bani ;) Do dnia dzisiejszego niektóre elementy standardu są tak niejednoznacznie wytłumaczone że różne kompilatory mogą w pewnych kwestiach(template) generować trochę inny kod. Ciekawe jak radzą sobie kompilatory na uC ? #1. jeśli chcesz używać STM32 M0 (które wielkością flasha nie grzeszą)...
To może lepiej zostać przy PIC'ach? - np. PIC32MX. Też pisze się w C, środowisko MPLABX daje Microchip, jak masz przypadkiem PicKita3, to od razu możesz programować. Jedyny minus, to trzeba sobie samemu zrobić płytkę developerską, bo te gotowe są cholernie drogie. No i oficjalny kompilator C od Microchipa ma opcję optymalizacji tylko do -O1. Ale peryferia...
Nie przeszkadza nic. Pytanie czysto filozoficzne Chodzi o to, że jak się jednak okaże, że któryś z tych wektorów zostanie wywołany (bo np. w tablicy wektorów jest błąd), to wtedy od razu wiesz który, a jak masz jeden do wszystkich zarezerwowanych funkcji, to już nie wiesz tego od razu. Generalnie taka jedna funkcja zajmuje 2-4 bajty (zależnie od optymalizacji),...
Proszę bardzo: Program jest taki prosty testowy: #include "stm32f1xx_hal.h" int main(void) { HAL_Init(); while (1) { }; } A oto Build Log: Komunikaty występują przy kompilacji plików: - stm32f1xx_hal.c - stm32f1xx_hal_cortex.c - stm32f1xx_hal_flash.c - stm32f1xx_hal_gpio.c - stm32f1xx_hal_rcc.c ----------------Make...
No to się porobiło... A ja staram się przekonać Czytelników, że to wszystko jest proste :) (at)tadzik85 - przejrzałem "snippetsy" dla F0 (kilka przykładów) i nigdzie nie mogę znaleźć tam instrukcji barierowych. Podobnie w przykładowych kodach z RM do L0 i erracie do F1 (stąd zresztą było moje zdziwienie gdy zwróciłeś uwagę na potrzebę stosowania). Z...
Zobacz kod asm - po optymalizacji została tylko pusta pętla nieskończona. Do debugowania ustaw optymalizację na -Og lub -O0 .
Pewnie zmienna "Temperatura" nie jest nigdzie używana, więc kompilator sobie ją "zoptymalizował" i to co widzisz to śmieci. Zresztą i to nie jest pewne, ponieważ wskaźnik aktualnej linii jest przed przypisaniem czegokolwiek do tej zmiennej, co również może być efektem optymalizacji.
Mkrasuski Trochę hobby trochę projekt komercyjny. Pracuje w stosunkowo małej firmie produkcyjnej i tworzę w niej coś na kształt "jednoosobowego działu utrzymania ruchu" ;) Parę miesięcy temu szef zamówił pięć do proszkowego malowania ale tak się stało, że ostatecznie musimy robić go sami... Konstrukcja już prawie jest więc pora na sterowanie. Muszę...
Podpowiem, że nie będę miał możliwości czytania 200 stron dokumentacji PDF To nie jest prosty AVR. Podstawowy dokument (Reference Manual) ma nie 200, a ponad 3 500 stron (ale szczęśliwie nie trzeba czytac "od deski do deski"). Do tego, jeśli ktoś chce poznać lepiej rdzenie i wbudowane w rdzeń peryferia, to dochodzą 2x Programming Manual po ok. 250...
Wreszcie udało się skonfigurować to wszystko i działa. Projekt kompiluje się poprawnie. Jednak jak wrzucę do projektu bibliotekę standardową od STM to kompilują mi się wszystkie C w obrębie projektu. Co gorsza nie istnieje optymalizacja na poziomie linkera i wszystkie punkcje nawet te nie wywołane lecą do pliku wynikowego przez co staje się ogromny....
1.Czy da się kompilować programy w trybie "Release" czyli bez informacji o debugowaniu, aby działały jak najszybciej i zajmowały mniej miejsca w pamięci. Taka opcja jest dostępna np. w Rowley Crossworks. Informacje o debuggowaniu niczego nie zmieniają. Można sobie ręcznie zmienić w Makefile opcje optymalizacji. Przykładowe projekty mają optymalizację...
Witam. Mam następujący problem. mam zestaw ewaluacyjny z procesorem Stm32F103VC i wyświetlaczem opartym na SSD1289. Do obsługi wyświetlacza używam bibliotek GLCD od producenta zestawu. Wszystko było by ok gdyby nie jeden dziwny problem. mianowicie taka funkcja chodzi bez problemu: 3 ][240]" gdy to zrobię nie działają żadne funkcje . Ani funkcja malująca...
Czyżby? Czy dla AVR ktokolwiek przejmuje się skryptami linkera, startupem, tablicą wektorów i Makefilem? Przecież dla tej platformy jest DOKŁADNIE TAK SAMO jak dla ARM, a jakoś nikomu nawet na myśl nie przyjdzie zajmować się tymi plikami - każdy korzysta z gotowców zawartych w pakiecie avr-gcc. Te pliki tam fizycznie są, nikt nie zajmuje się tym jak...
A wiesz co kompilator myśli o Twoich pętlach opóźniających jeśli włączyłeś optymalizację? 4\/3!!
Podążyłem tropem algorytmu punktowego. Na razie w 100% ze powodzeniem przeniosłem algorytm odbić od powierzchni płaskich na algorytm punktowy - przypadki odbić prostopadłych rozpatruję osobno (obliczenia bez funkcji trygonometrycznych będą szybsze, poza tym od razu pozbywamy się potencjalnego dzielenia przez zero w obliczeniach) - teraz zostało tylko...
dopiero zobaczyłem że skasowałem, w wyniku prób kasowania części kodu , volatile już jest dalej to samo , o dziwo bez volatile też osiągałem poprawną wartość delayms(). Volatile powinno być. Teraz Ci działa ale jak włączysz optymalizację to już niekoniecznie. Jednak w Twoim przypadku bez volatile i z optymalizacją, funkcja delay_ms może zacząć generować...
Witam Ćwiczę aktualnie transmisję po SPI, dane są wysyłane w jednym kierunku, do wyświetlacza GLCD. Problemem jest długi odstęp czasu wysyłania kolejnych bajtów. Do testów stworzyłem coś takiego, taktowanie uP 8MHz, optymalizacje wyłączone, jedynie microlib działa. Funkcje alternatywne na SCK i MOSI Konfiguracja SPI: [syntax=c]RCC -> APB2ENR |= RCC_APB2ENR_SPI1EN;...
Nie pozostaje mi nic innego jak tylko przeprosić W ramach pokuty skonfiguruj porty operując bezpośrednio na rejestrach i sprawdź czy program działa po włączeniu optymalizacji kodu ;) Btw. to moja wina, że nie załapałeś od razu o co chodziło - zmieniłem posta w czasie jak pisałeś swojego i się bałagan zrobił ;)
Skoro używasz go kilka lat, to powinieneś wiedzieć, że skoro wyświetlacz jest zasilony z 5V to stan wysoki na pinie = 0.7Vdd = 3,5V. Kiedyś na forum był też podobny problem i wynikał on ze zbyt niskiej wydolności prądowej IO w STM. Poza tym, co znaczą pojęcia "nie reaguje" oraz "cisza" ? Nic się nie dzieje? Zapala się rząd kratek? Czy może jeszcze coś...
Nie wiem jak z libem dla serii performance, ale na pewno lib USB-OTG jest całkowicie wolny od SPLa a cała warstwa odwołania do sprzętu idzie przez rejestry. Za to zauważyłem, że ten lib jest dosyć tłusty; bez magicznej optymalizacji (przez libusb, bulk endpoint) nie wyciągał nawet 100kB/s. Optymalizacja -o3 -otime na armcc poprawiła to do 300kB/s ale...
Lepiej nie uzależniaj tego od czegokolwiek a nabierz prawidłowego nawyku. Niestety nawyki wcale nie mają samych zalet, prowadzą do rutyny i wszystkich jej konsekwencji:) Poza tym praca z nawykami bywa nudna. W tym przypadku jest oczywiste że TIM3->SR = ~TIM_SR_UIF można używać zawsze i nie ma sensu zastanawianie się czy są inne przerwania czy nie....
Potrzebuję opóźnień rzędu 1-3 us, czasem kilkadziesiąt ns. Procesor taktowany jest 21MHz. Timer odpada, bo samo kasowanie flagi, ładowanie rejestru licznika i sprawdzanie w pętli flagi trwa zbyt długo. Używam pustego rozkazu NOP, ale nie wiem ile cykli zegarowych on trwa. Poza tym - czy asm("NOP"); nie jest pomijane przy optymalizacji?
Witam, Moja konfiguracja: Eclipse, bazuje na przykładzie od freddiego, Linaro z 28.IX, optymalizacja -O0, [syntax=c] __main_stack_size = 2048; __process_stack_size = 2048; rom (rx): org = 0x08000000, len = 64k ram (rwx): org = 0x20000000, len = 20k[/syntax] [syntax=c]void TIM3_Conf(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TI...
Wyłącz optymalizację (-O0) i jednak użyj debuggera, bo jeszcze nie raz Ci się ta umiejętność przyda. Wcześniej jednak sprawdź, co robi ta linia, bo założę się, że nie to, o co Ci chodzi: GPIOA->MODER |= GPIO_MODER_MODER5_0; Z kolei to w pętli nie ma sensu: GPIOA->BSRR = GPIO_BSRR_BS_5; Za to to miałoby sens (wyłącznie pod debuggerem, w pracy krokowej):...
Szkoda, tylko, że tworzenie tego projektu oparłeś o wykorzystanie bibliotek SPL. "szkoda" w sensie, że SPL są słabo zooptymalizowane, czy że "na topie" jest już CubeMX? Co do optymalizacji - cóż jak ktoś stawia pierwsze kroki to myślę, że optymalizowanie to wyższa szkoła jazdy i wymaga wiekszej znajomości architektury (wydaje mi się, że często o tym...
for(delayCnt=0; delayCnt<5000; delayCnt++); Ten "delay" nie ma żadnego sensu, bo jeśli włączyłeś optymalizację kompilatora to jego czas trwania będzie wynosił zero (kod zostanie całkowicie usunięty).
Proszę o podpowiedź jaki użyć interfejs sprzętowy dla STM32F429 żeby przerzucić dane obrazu z framebufora z pamięci SDRAM do wyświetlacza LCD ( najlepiej za pomocą DMA). Jakoś nie mogę dopasować żadnego interfejsu np. dla pamięci, może rozwiązanie jest proste ale nie mogę go zobaczyć :D Do tej pory miałem uruchomiony interfejs LTDC na przeszło 24 liniach...
no już Ci to napisałem. jezeli chcesz robić prawdziwe delaye to zrób sobie przerwanie timera (czy systicka) i inkrementuj jakąś zmienną w znanym sobie okresie czasu. Jak chcesz napisać sobie taką blokująca funkcję delay - to raczej w asemblerze, czy też inline asemblerze, aby nie byc zależnym od kompilatora jezeli chodzi o długość iteracji i optymalizacje,.
Dalej jednak nierozwiązany pozostaje problem tego debuggera, który nie chce wyświetlać mi moich zmiennych Zmienne lokalne zwykle są optymalizowane. Jeśli chcesz je oglądać w debuggerze, to albo trzeba kombinować (volatile, zmienne globalne/statyczne), albo trzeba zmniejszyć poziom optymalizacji.
Wniosek taki ze HAL nie jest poinformowany jaką funkcje ma wywolac bo wskaznik na funkcje wynosi NULL. Ktos mi dobrze podpowiedzial ze te dwa procki różnia sie rdzeniem jeden ma M0 drugi M0+. Isnieją tez problemy wykonwyania sie kodu nie po kolei - nie zgodnie z kolejnoscia napisania kodu teoretycznie niektore instrukcje zapisu moga nigdy nie zostac...
RM0008, strona 294, rysunek 52. Widać tam wyraźnie jaka jest relacja między CNT i CCx. Zawartość rejestrów CCx jest stale porównywana z zawartością CNT i w zależności od wyniku sygnał OCxREF ma wartość 1 lub 0. Dodatkowo, podczas porównania, może zostać wygenerowane zdarzenie CCxI, np. przerwanie, start dla DMA, zdarzenie dla licznika podrzędnego. Bez...
Z HAL-em mało mam do czynienie ale jedna uwaga - ind musi być volatile - nie ma do nie go poza collbackiem odniesienia w tym pliku i przykazdej optymalizacji ind++ zostanie z dużym prawdopodobieństwem wyoptymalizowany. Jezeli wartości będą "pływać" to proponuję zwiększyć czas samplowania.
Może nieprecyzyjnie napisałem. Używam DR 16-bitowo w sensie ustawienia ramki na 16-bitową i w sensie zapisywania wartości 16-bitowej do DR. Natomiast nie wymuszam dostępu 16-bitowego do rejestru DR. Chciałem sprawdzić jaki jest dostęp do tego rejestru ale w optymalizacji 0s nie znalazłem tego od razu. Zmieniłem optymalizację na O0 i skompilowałem, i...
czy w ogóle jest sens korzystać z Arduino, czy nie prościej ściągnąć FATFS, dodać obsługę I2C (kilkanaście linii kodu) i sprawa załatwiona. Skoro autor używa Arduino to raczej nie jest ekspertem od uC. Skoro tak, to na 99% bez Arduino nie da rady. Zapewne Arduino jakoś implementuje FATFS, warto się temu przyjrzeć, bo ten moduł można skonfigurować na...
Dziwne, początkowo w r3 był adres 0xF00000 [syntax=armasm] Name : r3 Details:15728640 Default:15728640 Decimal:15728640 Hex:0xf00000 Binary:111100000000000000000000 Octal:074000000[/syntax] Potem spróbowałem wyłączyć optymalizację kodu wynikowego. Zaczęły pojawiać się błędy podczas programowania płytki. Próbowałem jakoś przywrócić ten projekt do poprzedniego...
Program IAR jest jednym z podstawowych, dostępnych narzędzi do tworzenia oprogramowania na mikrokontrolery. Posiada kolorowe i wygodne środowisko graficzne, wraz ze zestawem zoptymalizowanych, standardowych bibliotek. Poniższy samouczek ma na celu pokazanie, jak skonfigurować te środowisko do wydajnej pracy. W autora praktyce sporym utrudnieniem są...
Uczę się od początku optymalizacji, bo jak kiedyś się bawiłem ESP8266 który ma zegar 160MHz i napisałem program w LUA, to okazało się, że był wolniejszy od Atmegi z zegarem 16MHz najpierw się naucz języka. To co piszesz to żadna optymalizacja. A program tak Ci chodził bo pewnie równie dobrze opanowałes sprzęt i lua co teraz C. To po prostu wynika z...
Próbowałem też w volatile, wyłączyć optymalizację również. Próbowalem też robić: [syntax=c] adc=adc_value[0];[/syntax] ale też nie było efektu. W STM Studio jak podglądam na żywo jak się zmieniają zmienne to adc_value[0] ciągle przyjmuje nowe wartości opowiadające zmianom napięcia na wejściu ale już zmienna adc ciągle miała wartość 0. Przyznam że pierwszy...
I co najlepsze, bez jakiekolwiek narzutu Mamy XXI wiek, GCC ogarnia tak proste optymalizacje, a uwierz mi daje radę z trudniejszymi Polecam: Kompilator kompilaorowi nie równy, a tutaj koleś pisze bez ogródek: x86 a cortex-m to dwa różne światy i nie ma co porównywać, chociaż nie neguje że tak prostą optymalizację jest w stanie zrobić, ale dowodem powinna...
Jest taki cały pierwszy wiersz zapełniony załączonymi pixelami (0XFF) a drugi jest pusty. Kontrast nie ma tu znaczenia. Kojarzę wzorek. Faktycznie to nie kwestia kontrastu. Wygląda po prostu jakby był nie zainicjowany. Kwestia z wrażliwością na napięcie wygląda mi raczej na jakiś efekt uboczny innej przyczyny. Testowałem kiedyś taki wyświetlacz na...
Problem jest taki - po sygnale reset program się uruchamia ponownie. Natomiast po wyłączeniu i włączeniu zasilania program nie rusza. Dopiero po wydaniu komendy "reset and debug" program ponownie rusza. Ten sam projekcik wgrany za pomocą KEIL działa bez tego mankamentu. zapewne wgrywasz program do RAMu, skad ginie on po zaniku zasilania. Ustawiony...
Ok, dzięki za wskazówki. Nie chce mi się układać kodu bo to i tak zupełnie przebudować muszę. Wyślę taką kaszanę jaką mam ale działającą: FLASH_Unlock(); //printf("\n\rSend the file\n\r"); /* Start address for flash programming */ sprintf(RxBuffer, "Przykladowy string"); FlashAddress = 0x08040000; if (FLASH_ErasePage(FlashAddress...
Problem mam chyba typowy. Oprogramowuje interfejs komunikacyjny. Jednym z poleceń tego interfejsu jest reset. Sprawa ma się oczywiscie odbywać tak, ze przychodzi ramka z poleceniem resetu, odsyłana jest ramka z ACK i następuje zerowanie. USART działa na przerwaniach. Jak wykryć kiedy ostatni bajt ramki opuścił bufor nadawczy? Teraz mam taki kod: USART_ITConfig(USART1,...
Sprawdziłem jak szybko mogę przesyłać i przetwarzać dane ale w związku z tym, że nie osiągnąłem zadowalających rezultatów to moje zabawy z USB na tym się skończyły. Bo te biblioteki to powinny robić za przykład jak NIE pisać kodu. Zagmatwane, bez sensownej dokumentacji, niejasne odwołania między plikami, ZERO optymalizacji - nawet kopiowanie danych...
Jak się na tym breakpoincie zatrzyma to zobaczysz zmienne (zakładając oczywiście, że są widoczne dla fragmentu kodu w którym jesteś i że nie zostały wycięte przez optymalizację. 4\/3!!
Jeśli kod skompilowałeś z optymalizacją i wiesz, że akurat tam wchodzi bo podglądasz krokowo JTAGiem, to wcale tak nie musi być? Instrukcje z bloku IT (Cortex-owy "if") jeśli warunek nie jest spełniony są niby wykonywane - PC przelatuje przez te adresy - ale faktycznie są realizowane NOPy. Jeśli to jest ten przypadek, to wyłącz optymalizację i/lub ustaw...
Witam, pętla może być taka: while(1){ GPIOB_BSRR = 0x0000FFFF; GPIOB_BRR = 0x0000FFFF; } Czy ktoś z was potrafi zrobić to szybciej? oznaczało by, że robię coś nie tak... Taka pętla rozwija się bez optymalizacji na taki kod asm: GPIOB->BSRR = 0x0000FFFF; movw r3, #3072; 0xc00 movt r3, #16385; 0x4001 movw r2, #65535; 0xffff str r2,...
Hmm. Dodatkowej wtyczki nie instalowałem czyli korzystam chyba z tych które były od razu w Eclipsie Helios CDT 7.02 SR2. W toolchain editor wybrany builder jest GNU Make Builder. W instalation details/plug-ins jest tam jakiś C\C++ Standard make build UI. No nie jestem biegły w tych zawiłościach eclipsa i wtyczek. Zainstaluj, warto... Potem New C Project...
Rzeczony kontekst dotyczył obliczeń. Co część argumentów bierze w łeb. A poza tym np. latency to nadrabia w 4 cyklach. Ile mają twoje przerwania? Bo moje obliczenia często mają jednak więcej niż 16 bit Oczywiście możemy się przerzucać fjuczerami. Ale to bez sensu. Przecież się zgadzmy, że dsPIC ma lepsze peryferia, a CM3 jest szybszy. O ile i co zaważy...
Witam, korzystam z Keil uvision 4, optymalizacja - O3 - optimize for time. Wysyłam dane do przetwornika DAC AD5724, ale przy tym poziomie optymalizacji krzaczy mi się jeden kanał, przy zerowym poziomie optymalizacji wszystko działa poprawnie. Pomyślałem żeby wstawić przed sprawdzaniem flag zajętości SPI rozkazy nop. W pliku core_cm3.h znalazłem, makro...
RCC_CFGR_PPRE2_DIV1 Chyba kolega coś pomylił: Ustawiam RCC_CFGR_ PPRE1 _DIV2 , a nie drugi raz rejetr PPRE2 _DIV1 Właśnie się odnosiłem do tego, żeby w ogóle nie "ustawiać" RCC_CFGR_PPRE2_DIV1 więc się nie pomyliłem. Jak zmienna i będzie volatile to też tyle samo trwa ? Masz tam wpisane wartości opóźnień na sztywno i optymalizator mógł stwierdzić,...
Na potrzeby projektu przykładowego wystarczyłoby pewnie ze 20 bajtów, więc kilobajt wydaje się wartością z wystarczającym zapasem (; Wszystko zależy oczywiście od poziomu optymalizacji, ale do 1kB droga jest daleka [; 4\/3!!
Czy jest sens dysponując 32bitową maszyną kopiować dane bajt po bajcie? Jakby programiści z Id Software tak myśleli, to Q1 by sie przycinał nawet na gigahertzowych procesorach... Przecież pisałem na początku, aby odpowiednim atrybutem wyrównywać bajtowe tablice do 32bitów. Jeśli ta operacja którą wykonuje autor będzie się odbywać chociażby 1k razy na...
Ok już wszystko się wyrabia jak zwykle problemem był "cudowny" TrueStudio... Ehh gdyby tylko OpenOCD obsługiwał SWD :( Mimo zmiany z debug na release (teoretycznie włącza to optymalizację) TrueStudio dalej dzielnie ładuje wersję debug bez optymalizacji i wtedy się nam wszystko przepięknie sypie. Pozostaje mi się tylko modlić o jak najszybsze dodanie...
Widziałem ten watek i ustawiłem wszystko wg podanych wskazówek, za uwarzyłem jeszcze ze ten problem nie występuje wszędzie i na początku funkcji main() można ustawić breakpointa i działa problem zaczyna się przy po wejściu do pętli while albo jakiejś funkcji, dodam ze mam wylaczone optymalizacje kompilatora 3.1.13. (10.9, 15) Zabronione jest publikowanie...
O jakie konkretnie zestawienia ci chodzi (mam obydwie platformy więc można by zrobić takie porównanie). Średnio przy dekodowaniu strumieni mp3 jest szybszy do 3 razy (dla fixedpoint'ów). Przy filtrach FIR/IRR do 8 razy szybszy (zwykle waha się to w granicach 4-6 razy). Przy obliczeniach wektorowych/macierzowych około 2 razy. Ciężko o jakieś szczególne...
Cześć. Piszę sobie program na STM32 w środowisku Keil uVision. Proszę powiedzcie mi jak zrozumieć generowane liczby mówiące o zajętości (wielkości) programu w pamięci Flash oraz ile pamięci RAM zajmuje program? W Keil nie ma optymalizacji kodu znanego z WinAVR -Os. Co odpowiada temu poziomowi w Keilu lub na który poziom bezpiecznie jest ustawić bo są...
Pewnie w STM jest ten sam powód (nie sprawdzałem bo to raczej nie ma już żadnego znaczenia, chyba, że próbujesz "wydusić" z STM'a tyle ile fabryka dała + 50%). Prędzej ktoś chce być sprytniejszy niż kompilator i do tego jeszcze nie zna assemblera którego chce wykorzystać. optymalizacja 0 out = in ^ 0xFFFFFFFF; 80001a8:f240 0300 movwr3, #0 80001ac:f2c2...
Zrobiłem tak: Błąd występował. Hard Fault. 1. Włączyłem optymalizacje O1. 2. Próbowałem kompilować. Błędy "registers may not be the same" 3. Poczytałem o tych błędach w necie i znalazłem jakieś tam niby podmianki do tych funkcji. 4. Nic one nie dały. Teraz błędu nie było "registers may not be the same" ALE wywalało błąd Hard fault przy wszystkich optymalizacjach....
O deskryptorach czytałem to chyba jasne. W każdym razie po kolei. Wykrywa mi go jako full speed bo tam jest kontroler full speed: USB 2.0 full speed interface jeden powinien miec adres 81 (czyli tryb IN adres 1) a drugi 02 (tryb OUT adres 2). Tak było w przykładzie z HIDem i tak zostawiłem. W trybie mass storage chyba tak samo jest. Zresztą zobacz sobie...
(...) ustawiłem wektor przerwań i początku pamięci flash w linkerze z odpowiednim offsetem (0x3800) Co to za magiczny offset? :D Pamięć STM32F103RB, pierwsze 14K (0x3800) zajmuje bootloader, pozostałe 114K program właściwy. W efekcie początek flash (w skrypcie linkera) zaczyna się od adresu 0x08003800. Właśnie... gdzie ja wyczytałem że tak jest akurat...
Cześć. Proszę Was o poradę bo nie za bardzo wiem co jest grane. Mam program na STM2 pisany w C w środowisku Keil. Była to funkcja czyszczenia LCD od Nokii 3310. Zamieniłem w nij pętlę jak poniżej i program wiesza się na tej pętli, tzn wywoływana jest funkcja czyszczenia ale program jej nie opuszcza. Nie wiem co to może być. Kompilowane było z 0 poziomem...
Metoda 1 - 18 cykli [syntax=c] GPIOE->ODR = (GPIOE->ODR &0xff) | (data<<8); //18 cykli [/syntax] Metoda 2 - 11 cykli [syntax=c] *((volatile uint32_t *)&GPIOE->BSRRL) = 0xff000000 | (data<<8); // 11 cykli [/syntax] Różnica spora - dzięki :) Edit: wyniki z optymalizacją: 0
gpio_pin_cfg(GPIOC,11,GPIO_IN_PULL_UP); // miso MISO na 99% też musi być jako AF6_PP Dodatkowo Twój proces transmisji jest nieco dziwny... Zrób tak: 1. Ustaw CS w stan niski 2. Poczekaj aż flaga TXE będzie równa 1 3. Zapisz coś do rejestru DR 4. Poczekaj aż flaga RXNE będzie równa 1 5. Odczytaj coś rejestru DR 6. Poczekaj aż flaga BSY będzie równa...
Z tego co wymieniłeś wszystko jest OK (zakładam, że 3. to wskaźnik na funkcję, a nie jakieś dziwne rzutowanie). Ja bym się jednak początkowo skupił na zainicjalizowaniu w main() wszystkiego co inicjalizuje Keil w startupie, czyli po prostu wywołaniem SystemInit() - jeśli to zrobiłeś to następnym krokiem będzie zastanowienie się, czemu kod w Keilu generuje...
Proszę :) Dodano po 27 Jeśli chodzi o optymalizacje to jest ustawiona na "None (-O0)"
Dołączam się do tematu. Jak uruchamiałem komunikację 1-wire na STM32F103 bez użycia timerów (opóźnienia odmierzane pętlą FOR), również spotkałem się z problemami różnych czasów wykonania funkcji opóźniającej. Opóźnienia początkowo skalibrowałem za pomocą analizatora logicznego/oscyloskopu. Po użyciu nowszego kompilatora lub zmianie optymalizacji kodu,...
... delayadc nie jest po to aby czekać na koniec konwersji, po za tym co to ma wspólnego z moim pytaniem? ... Timer uruchomiłbym chyba dla ozdoby;) Ano może mieć. Jaką masz gwarancję, że tak napisane delayadc w ogóle zajmuje jakiś czas procesora? Zwłaszcza, że zmienna k nie jest volatile, a to oznacza, że takie cudo: [syntax=c] { k++; k--; } [/syntax]...
Nie, bo sprawdzałem na wszystkie sposoby i nic to nie daje. Tak BTW to okazuje się że wyłączenie optymalizacji kodu w ustawieniach powoduje że całość w końcu zaczyna się kompilować tak jak powinna. Pomimo tego jestem ciekaw jak to trzeba zrobić aby przy włączonej optymalizacji całość działała...
Coś jest nie tak zainstalowałem najnowszego keila dla testów skompilowałem projekt z biblioteki st tzn. Peripheral_Examples\IO_Toggle\ i podobnie jak wcześniej mogę kompilować z funkcją "UseFPU" i bez niej. I program działa jednak gdy tylko dodam jakąkolwiek zmienną float do projektu pojawia się hard fault. Czy mógł by ktoś posiadający stm32f4discovery...
Ale opinia o tym co jest szybsze/lepsze/fajniejsze już poszła w świat. Ciekawe ile opinii opartych jest o takie "testy"... Ja wrzucam assemblera. Kompilator GCC jest tak fantastyczny, że na układzie bez FPU wszystkie obliczenia trwają tylko 1 cykl! Magia: float a = 1, b = 0.001, c; c = a / b; f74:4b25 ldrr3, [pc, #148]; (100c <__process_stack_size+0xc>)...
Twój układ jest chyba pierwszym na świecie, który ma CS aktywny w stanie wysokim... Pozatym Twój delay jest bezsensu (po optymalizacji wyparuje w kosmos), a do tego nie wiemy jaki to mikrokontroler... Co jeszcze - wg komentarzy (o których pisałem przed chwilą) skonfigurowałeś też wejście jako wyjście (MISO). W komentarzach piszesz że masz tryb slave,...
Sorry, ale to chyba najgorzej napisany program jaki widziałem od dawna... Słyszałeś już o takim paradygmacie, że zmienne globalne są złe? No ale już pomijając to... Rozważałeś opcję, że skończył Ci się RAM/stos? STM32F0 na tej płytce ma ledwo 8kB, a ty np sobie wesoło ustawiłeś ten milion zmiennych globalnych, w tym 2kB tablicę (nie używaną, jak spora...
Teraz kolej na Ciebie - odszczekaj te magiczne optymalizacje i zapamiętywanie rejestrów. Bez komentarza. Każdy sobie policzy w moim przykładzie powyżej, że z atrybutem zapamiętuje 5 rejestrów, a bez atrybutu 8, wiec sorry, ale dla mnie jest to optymalizacja. Ty możesz zaś pisać wszystkie swoje programy bez tego atrybutu i powodzenia życzę! Mnie mało...
Ja zawsze kasuje bity żądania na koniec przerwania i nigdy nie maiłem takich problemów w STM32, niezależnie od poziomu optymalizacji przerwanie wykonywało się tylko raz.