Czy zmienna kierunek jest globalna i volatile? Już po pierwszym przerwaniu powinna przyjąć wartość 1 lub 2, a nie być cały czas 0. Czy zaobserwowałeś zwiększanie wartości zmiennej enkoderA ?
Czy działa Systick to łatwo sprawdzić w debuggerze. Zresztą wiele spraw można sprawdzić. Ja bym zaczął od tego czy właściwe rejestry podlegają zmianom. To nie jest nic trudnego, w krokowym trybie Też jaka wartość jest SystemCoreClock, to zmienna globalna. Może ląduje gdzieś w HardFault, zaraz po uruchomieniu. EDIT. Często problemem przy kopiowaniu plików,...
Jaki duży masz stos i gdzie umieszczony? Czy tą tablicę modyfikujesz w innej części programu? Czy to zmienna globalna, czy automatyczna? Albert
Ja w takich przypadkach stosuję metodę którą na swoje potrzeby nazwałem "split objects". Obiekt u mnie składa się po prostu z dwóch części - stałej i zmiennej. Zwykle "główny" obiekt jest stały, a ten "zmienny" fragment jest podrzędny, jednak są sytuacje w których robię to odwrotnie, głównie wynikające z polimorfizmu lub dlatego że łatwiej/lepiej jest...
Po co ci ta sekcja krytyczna w EXTI9_5_IRQHandler ? Czy jeszcze jakies przerwanie korzysta ze zmiennych ktore chcesz chronic ? Jesli jest faktycznie potrzebna )w co watpie) to obliczaj pierwiastek poza nia, skopiuj wynik do zmiennej lokalnej i dopiero w sekcji krytycznej przekopiuj zmienna lokalna do globalnej. Nieliniowe funkcje biblioteczne potrafia...
Witam, Mam pewne pytanie dotyczące zmiennej globalnej wyspecyfikowanej jako const. Taka zmienna nie może zostać zoptymalizowana i jest trzymana w sekcji nazywanej .rodata, która to znajduje się w pamięci FLASH. (W mikrokontrolerach stm32) W takim razie jeżeli zadeklaruje np. tabelicę: [syntax=c]const uint8_t tablica[1000]; [/syntax] to oznacza, że taka...
Dodam tylko że użycie metody którą opisałem nie wymaga zmieniania tablicy w locie jak to zrobił Marek_Skalski . U mnie kod z przerwania wygląda tak: [syntax=c] Angle2 += Angle2_Step; Angle2_2 = Angle2 >> 6; U = (sinus_3har[(Angle2_2 + 0) & 0x03FF] * Vm * 2816) >> 20; V = (sinus_3har[(Angle2_2 + 341) & 0x03FF] * Vm * 2816) >>...
Witam, próbuję funkcją malloc() za alokować około 2kB danych, jednak procesor zamiast za alokować wybrany obszar pamięci, wpada w przerwanie Hard Fault, występuje jakiś problem. Pamięci mam wolnej tyle ile potrzeba gdyż program jeszcze nie jest bardzo rozbudowany oraz mogę statycznie za alokować 2kB danych albo więcej tzn. np. stworzyć zmienna globalna...
Witam Kolegów Przy okazji problemu z jakim borykam się [url=http://www.elektroda.pl/rtvforum/vi... udało mi się poprawnie uruchomić na procesorze STM32F107 system freeRTOS. Jestem mega pozytywnie zaskoczony tym, że całość systemu udało mi się poprawnie odpalić w Eclipse w zaledwie 4 godziny. Do tej pory uważałem, że...
Witam, problem polega na tym że utworzyłem trzy zmienne globalne typu const uint8_t i kompilator przypisuje dwóm pierwszym ten sam adres 0x80030D4 . Trzecia zmienna już miała inny adres. Utworzyłem więc dwie kolejne zmienne do testów aby sprawdzić jaki otrzymają adres: const uint8_t ZMIENNA_TEST1=3; uint8_t zmiennaTest2=10; lecz niestety debugger ich...
Program jest następujący: Mam strukture dla czujników a w niej tablice dla której zapisuje odczytane dane z danego czujnika: [syntax=c] typedef struct { // jakies inne zmienne volatile uint8_t dataToCalculate[6]; // do zapisu danych } czujnik; [/syntax] Tworzę 3 globalne zmienne 'czujnik' (używam 3 czujników): [syntax=c] czujnik Zyroskop = { ...}; czujnik...
Biblioteki to jeden ze sposobów na pisanie kodu. Z tego co widziałem na forum to właśnie jest to sposób na szybki start, a krytyka jest związana raczej z nieumiejętnym korzystaniem z biblioteki w tym również w przykładach. Za przykład podam tutaj przykład GPIO - IO Toggle (stm32f4_dsp_stdperiph_lib). Definicja zmiennej GPIO_InitTypeDef GPIO_InitStructure;...
int TDelay wyciągnij jako zmienną globalną. Za każdym razem, gdy SysTick wejdzie do przerwania ją tworzy, a to bez sensu, co? :) w końcu nigdy nie doliczysz do 500, skoro będziesz cxo chwile tworzył tą zmienną. właśnie tak myślałem że z tym jest coś nie tak, niestety z C też nie jestem mistrzem i przez to ta gafa, dzięki Porównaj: SysTickHandler SysTick_Handler...
Czyli nie dość, że na stosie masz 1 kB tablicę, to jeszcze używasz funkcji która jest znana z tego, że używa naprawdę DUŻO stosu. Zacznij od zmniejszenia tej tablicy albo przeniesienia jej do zmiennych globalnych, a następnie - jeśli nie pomoże - znajdź jak w Keilu zwiększyć rozmiar stosu. Wielkie dzięki, pomogło. Przeniosłem do globalnych Do sekcji...
Witam serdecznie, jakiś czas temu zacząłem moją zabawę z stm32. Po kilku tygodniach walki z darmowym oprogramowaniem (Eclipse + GCC, ograniczony Keil itd), zdecydowałem się na TrueStudio w wersji light. Mam jednak problem z tym oprogramowaniem podczas debugowania. Jaki to projekt? - projekt ma za zadanie odczytać dane z modułu RFID, następnie ma rozpoznać...
Pierwsza opcja to oczywiście zdefiniowanie NAPRAWDĘ DUŻEGO stosu, ale to średnie rozwiązanie jak wiadomo [; Do rozbudowanej aplikacji na ARMa myślę że należy liczyć minimum 1kB, jeśli używa się jakichś potwornych funkcji standardowych (printf!) i to głęboko to lepiej zaopatrzyć się w 2kB (o apetycie tych funkcji na pamięć pisałem ostatnio http://www.elektroda.pl/rtvforum/topic13...
Odkomentuj to: [syntax=c]// pulSrc = &_sidata; // // for(pulDest = &_sdata; pulDest < &_edata; ) // { // *(pulDest++) = *(pulSrc++); // } // // /* Zero fill the bss segment. */ // for(pulDest = &_sbss; pulDest < &_ebss; ) // { // *(pulDest++) = 0; // }[/syntax]
Hejka, robię właśnie przesiadkę projektu z kompilatora IAR'a do GCC'a i mam problem z przeniesieniem niektórych ustawień, konkretniej chodzi o nie wycinanie przez linker konkretnych, nieużywanych zmiennych globalnych wygenerowanych przez zewnętrzne narzędzie, zawierających informacje np. o dacie buildu, checksumie itp. które są potem w przypadku reklamacji...
1. Wartość SystemCoreClock jest nieokreślona, jeśli nie zawołałeś SystemCoreClockUpdate. Zmienna globalna raczej nie może być nieokreślona. I spojrzyj przykładowo: https://www.keil.com/pack/doc/CMSIS/Core... https://www.keil.com/pack/doc/CMSIS/Core... Albert
Postanowilem podzielic sie z wami moimi doswiadczeniami wykorzystania interfejsu USB we wlasnych projektach. Jak wiadomo interfejs USB jest juz powszechnie dolaczanym interfejsem do mikrokontrolerow wiekszosci producentow na rynku. Sama obsluga USB zarowno po stronie mikrokontrolera jak i pc (a wlasciwie Windows) jest mniej przyjazna niz w wiekszosci...
Rzeczywiście. Rozmiar stosu mam 1024 więc się przepełnia. Dzięki. Skoro stos ma rozmiar 1024B to pozostałymi 111kB SRAMu są nie używane? Co stoi na przeszkodzie na rozszerzeniu stosu na cały zakres pamięci? Nie ma innego sposobu niż globalna zmienna? Czasami potrzebuję zapisać dużo danych tylko w obrębie jednej funkcji. Natomiast Malloc wydaje mi się...
1. Jaka jest różnica między tymi dwoma zapisami, czy dobrze to rozumiem? TIM3->SR &=~TIM_SR_UIF; (tu zerujemy?) Powinno być: TIM3->SR =~TIM_SR_UIF; (tu rozumiem,że zmienia stan na przeciwny?) efekt powinien być w tym wypadku ten sam. Różnica opisana jest w RM, w którym opisana jest sekwencja zerowania bitów rejstru SR timerów. Zapisanie zera kasuje...
Poniedziałkowe dziędobry. Teraz ADC + DMA. Może się komuś przyda. Na razie bez przerwań ale działa (dzięki komu to chyba wiadomo, a gdyby nie, to dzięki Freddie Chopin i BlueDraco, kolejność przypadkowa (kłopot z odmianą w Języku Polskim) ). [syntax=c] /***************************************... * Funkcja inicjalizacji ADC tak, ze...
Jeśli zmiana rozmiaru buforów powoduje że program przestaje działać oznacza to że prawdopodobnie kończy się pamięć na stosie. Kilka rozwiązań jest. 1. zwiększyć stos 2. zdefiniować bufory jako static albo zmienne globalne wtedy nie trafią na stos 3. jeżeli idea projektu na to pozwala podzielić odczyt na mniejsze paczki i zapisywać po trochu(używając...
Jest wiele metod. Najwygodniejsze: 1. Ustaw sobie SWV data trace i pisz do jakiejś globalnej zmiennej. Bedzesz miał w CubeIde licznik taktów wyświetlony kiedy ten zapis się dokonał. Odejmiesz dwie wartości i będziesz miał wynik :) [url=https://www.elektroda.pl/rtvforum/v... pisałem Ci już o SWV Jest to potężne narzędzie...
Normalna zmienna globalna, bo i funkcja wykorzystywana przez większość innych No właśnie, globalna. A po co? ;) bo i funkcja wykorzystywana przez większość innych No moja też. I jeszcze problemu wyścigu nie ma ;) A bez uszczypliwości - nie lubię globalnych zmiennych. Zajmują miejsce, wszystko ma do nich dostęp i trudniej mi zapanować nad ich dostępnością...
Dla nowych wersji FreeRTOSa trzeba przedefiniować (np. poprzed globalną definicję w Makefile) zmienną globalną "uxTopReadyPriority" na "uxTopUsedPriority". Wciąż chodzi to nieco koślawo (po pierwszym odpaleniu OpenOCD muszę kilkukrotnie uruchomić GDB żeby cały zestaw "załapał"), ale już jest lepiej chyba [; 4\/3!!
Kompilator języka C (zakładając poprawną konfigurację projektu/make'a) nawet jakbyś wrzucił milion niepotrzebnych plików, to wyrzuci z nich funkcje, których nie używasz (tak zwany martwy kod). Nie będą więc one w kodzie wynikowym No tak, ale np. gcc zrobi tak tylko gdy wywołasz go z flagami -ffunction-sections i -fdata-sections. A jeszcze potem trzeba...
Wątpię, by bez specjalnej deklaracji był tylko we flashu. W czystym C tego nie da się zażądać ( To prawda, czyste C nic nie wie o żadnych FLASH-ach, stosach, RAM-ach i innych (dotyczy to też sekcji, segmentów itp). Ale w realnym życiu używamy konkretnych implementacji, które coś o różnych lokalizacjach w pamięci wiedzą (bo w końcu kod jakoś sie musi...
Skrypt linkera z Cube'a "działa" tak, że na początku pamięci ram ląduje sekcja data (zmienne inicjalizowane przy starcie programu - lokalne statyczne i globalne), potem jest bss (zmienne zerowane przy starcie programu - nie inicjalizowane statyczne i globalne). Następny kawałek to _user_heap_stack - czyli sterta i stos "w jednym". Rozmiar data i bss...
Jakiego typu jest absolutnie absurdalny i perwersyjnie wypaczony pomysł, aby mając OSa robić takie delay'e w wątkach ??? Również o podobną perwersję zakrawa wykonywanie przerwania timera co mikrosekundę tylko po to, zeby zmniejszać tam jakąś zmienną. Wez timer, skonfiguruj go jako one-shot, skonfiguruj mu takt na 1us, do ARR wpisz chciany czas w us,...
Znalazłem chwilę czasu aby kontynuować próby z przeniesieniem kodu ale tym razem trafiłem na dziwny problem z kodem wynikowym a dokładnie miejscem umieszczenia zmiennych z C++. W trakcie debugowania okazało się ze zmienne zostały umieszczone w pamięci ICTM która jest przeznaczona dla kodu a nie dla danych. I nie wiem jak temu zapobiec. Zmienne są niszczone...
Możesz tak zmodyfikować swoje funkcje, aby zwiększały specjalną zmienną globalną na starcie i zmniejszały przed powrotem o tyle bajtów ile zajmują zmienne lokalne danej funkcji. Wartość takiej zmiennej możesz wyrzucać na port szeregowy (co nie zawsze jest możliwe) albo odczytywać debugerem.
Przykłady dobrych typedefów: size_t, ssize_t, uint32_t bo powoduja że twój kod jest portowalny. Przykłady złych typedef to właśnie struktury bo: - zaśmiecają globalną przestrzeń nazw - dają złudne przekananie że można taką strukturę na zadeklrować (bezpiecznie) jako zmienną automatyczną (na stosie) Rozdział 5" https://www.kernel.org/doc/Documentation...
Przypadkiem :) Jeśli bufory są zmiennymi globalnymi, sizeof zwróci Ci rozmiar tablicy pomnożony przez wielkość typu tej tablicy. Jeśli przekazujesz je przez parametr, cóż... sizeof zwróci Ci liczbę 4. W Twoim przypadku zadziałało, bo to pewnie zmienne globalne, a DMA bez sensu kopiuje 4x więcej danych (jakieś śmieci z jednej części pamięci do drugiej...
Coś naplątałeś... Aby uzywać malloca bez dziwnych errorów, musisz zadeklarować odpowiednią ilość miejsca na stertę . Co z tego, ze twoje zmienne zajmują niewiele ramu, skoro najpewniej ustawiles sobie parę kB sterty, i gdy przekroczysz te pare kB, program ci sie natychmiast wykrzaczy, bo oczywiście najpewniej nigdy nie sprawdzasz, czy malloc przypadkiem...
Zmienne globalne zajmują...... Pewnie ram dla led jest rezerwowany w chwili uruchomienia biblioteki przez memalloc. Gdybyś sam pisał obsługę led to użyłbyś tablicy o określonym rozmiarze dzięki czemu wiedziałbyś ile ram zajmuje program. Poszukaj jak wyświetlić ilość wolnej pamięci ram w czasie działania programu. Jakiś freemem jest. Trochę oszuka ale...
Heap size, to globalna wielkość stosu dla całego programu. Wszystkie funkcje, przerwania, zmienne itd. w tym siedzą. Spokojnie możesz dać 2kB te defaultowe 128 czy twoje 256 to dość mało. Pozostałych dwóch stosów nie zgłębiałem jeszcze - nie wiem - jak się dowiesz, to napisz, to też się czegoś nauczę
Już działa.. We wszystkich funkcjach pojawiło się łącznie kilka dużych zmiennych lokalnych, usunąłem je i utworzyłem je jako globalne w strukturze i działa...dzięki za pomoc. Pozdrawiam, Maciek
Witam Programuje w różnych środowiskach od kilku lat ale czegoś takiego jeszcze nie widziałem. Zacząłem dziś tworzyć aplikacje na arma STM32 w środowisku uVision. Stworzyłem nowy plik nagłówkowy w którym chce zadeklarować sobie zmienną globalną. Zastosowałem dyrektywy #ifndef __MAIN_H #define __MAIN_H #endif, wewnątrz zadeklarowałem odpowiednią zmienną,...
Nawet nie trzeba pisać całego menagera pamięci, wystarczy poprawić funkcje free/malloc/alloc/realloc tak, aby zmieniały wartość zmiennej globalnej określającej wielkość wolnego obszaru sterty - w c++ właściwie wystarczyłoby pokryć operatory new i delete oraz new[] i delete[]. Z drugiej strony wobec istnienia stosu na niewiele to by się zdało.
Witam, Spotkałem się z bardzo dziwną sytuacją. Mianowicie, podczas deklaracji globalnej zmiennej tablicowej program nie działa. [syntax=c] char * Tablica[2]; int main( void) { } [/syntax] Jeśli w programie występuję deklaracja tak jak powyżej program zamiast wskoczyć do funkcji main() przerywany jest i obsługuje go przerwanie: NMI_Handler Jaki może...
OK, działa :-) Dzięki serdeczne. Inicjalizację FSMC dałem na samym początku, gdyż pierwotnie "chciałem" tam też mieć zmienne globalne (a w wewnętrznej pamięci sam stos) i inaczej by się nie inicjalizowały, ale obecnie jest to mało istotne.
Tak na przyszłość - na stosie lepiej nigdy nie tworzyć obiektów większych niż kilkaset bajtów, zwłaszcza że stos często ma ograniczony rozmiar (np do 1kB, poniżej są już inne zmienne). Do tak dużych elementów lepiej coś globalnego, albo jak koniecznie musi być zwalniane albo potrzebne jest rzadko, to malloc() / new. 4\/3!!
Hmm, czy nie jest bardzo wolny to bym dyskutował :) ale z pewnością to niezły kombajn. Jeśli chodzi o tą opcję "go to definition" to umieszcza ona kursor na definicji zmiennej globalnej po zaznaczeniu jej w kodzie, i to chyba tylko w obrębie jednego pliku źródłowego.
Od kilku dni testuję nowe środowisko Crossworks v.2.0 for ARM z układami STM32. Równolegle pracuję w środowisku Ride7 i wszystko w nim działa bez problemu (wierzchołek stosu jest zawsze daleko w pamięci od zmiennych globalnych) W Ride7, stos układów STM32 jest ustawiany bezpośrednio po resecie na wartość 0x20000000 + rozmiar RAM co w moim przypadku...
Chyba rok temu przerabiałem GUI z jakiegoś przykładu dla tego modułu. Wycinałem masę niepotrzebnych śmieci. Zostawiłem tylko jedną funkcję ustawiająca współrzędne piksela, ustawiając odpowiednio jedną zmienną globalną obracam współrzędne x,y dowolnie (cztery możliwości) mając x,y pionowo czy poziomo z każdej strony, oczywiście uzgodnione ze współrzędnymi...
Witam U mnie akurat to pomogło... ale cóż co projekt to inne problemy. Ja osobiście nie zrobił bym nigdy tak jak Ty czyli odbierać dane w przerwaniu i zapisywać je do globalnej zmiennej. Jak już muszę używać jakiś globalnych zmiennych to używam to zapisu i odczytu tych zmiennych funkcji. np readCos, i writeCos. Wiem że tylko ta funkcja może mi coś zmienić....
Teraz jest taki problem. Jutro spróbuję poszukać pliku. Arduino:1.8.9 (Windows 10), Płytka:"Generic STM32F1 series, BluePill F103C8, STM32CubeProgrammer (SWD), Enabled (generic 'Serial'), None, Low/Full Speed, Smallest (-Os default), Newlib Nano (default)" A subdirectory or file sketch already...
Tymczasem, gdy kod wykonywany jest pod kontrolą systemu, to operacje te zawsze wykonują się szybciej (przynajmniej te o których wspomniałem). Może we FreeRTOSie zrobili optymalizację JIT? (; Tak serio - różnica 2 taktów na pętlę naprawdę jest mało istotna. Spróbuj zmierzyć coś sensownego, np. policz sinusa czy jakiś pierwiastek, albo coś w ten deseń....
globalna zmienna zmienna globalna stm32 zmienna
rozebrać pilota sharp naprawa unifonu wymiana grzałki
kgv33vl31e bosch milwaukee dioda
Siemens lodówka – która lampka sygnalizuje najmocniejsze chłodzenie, Super Cool, Super Frost, skala poziomów MA6D49 zamiennik – MUR420CT, UF420C, STTH3R02D-FP, ES3D-C – dioda FRD 3A/200V TO-220