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...
Czyli nie ma żadnej przeszkody, żeby w tablicach globalnych oznaczonych jako const przechowywać duże zawartości danych ? chciałbym w takich tablicach trzymać rysunki do wyświetlacza LCD. Skoro zostaną one umieszczone w flashu to nic nie stoi na przeszkodzie, żeby zajmowały nawet z 200 kB? (o ile nie przekroczę wolnej pamięci flash oraz pewnie zadeklarowanej...
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...
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) >>...
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, 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...
Czy wystarczy utworzyć sekcję w taki sposób, powtarzając ten wpis dla każdej sekcji, czyli d1sramdata, d2sramdata, d3sramdata? Nie. Albo inaczej. Sekcje zostaną utworzone i jeśli przypiszesz do nich jakieś zmienne, to one tam wylądują, ale aby dane zostały zainicjalizowane domyślnymi wartościami (a'la sekcja .data) lub wyzerowane (a'la sekcja .bss),...
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...
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;...
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...
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...
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...
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...
Ok, a konkretnie, które z wymagań standardu nie zostanie spełnione, jeśli zmienna lokalna liścia z atrybutem volatile i bez odwołania przez adres zostanie zrealizowana w rejestrze, a nie w pamięci? No ale we fragmencie który zacytowałem nie ma rozróżnienia, czy dotyczy on tylko zmiennych globalnych, czy może tylko lokalnych, więc definitywnie sensownym...
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ć....
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]
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...
nie trzeba robić sztuk ze zmiennymi globalnymi ? Jakich to sztuczek? Normalna zmienna globalna, bo i funkcja wykorzystywana przez większość innych. A kod jak kod, można tak i na 100 innych sposobów:) Ale sposób ciekawy. Rozdzielczość staram się mieć dużą nie dla akurat takiej sytuacji z błędem +-1 (to niejako przy okazji, jeżeli kod podobny jak powyżej),...
Kolego Smashing, pominąłeś największy problem tego typu zagadnienia, czyli zgodność adresów w obu fragmentach kodu. Ładowany kod zapewne będzie się odwoływał do innych funkcji lub zmiennych globalnych etc. Funkcje która uruchamiam jest zawsze ładowana do wolnego ramu to można zrobić. Funkcje taka taktuję zawsze tak ze co coś jej daje a ona coś ma zrobić,...
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...
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...
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,...
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...
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ń....
Ja na samym początku przerzucam wektory przerwań na początek pamięci RAM. A później wstrzykuję swoją funkcję w miejsce oryginalnego wektora. Po rozmyślaniu na ten temat doszedłem do następujących wniosków. 1. Możliwość dynamicznej rejestracji przerwań (najlepiej w wysoce abstrakcyjny sposób, tak aby funkcje nie musiały być publiczne) byłaby z pewnością...
globalny zmienna zmienna globalny deklaracja zmienna globalny
lodówki bosch opinie oporność głośnik kaspersky porty
frytkownica beztłuszczowa samsung wf70f5e0w2w
Zasilacz 12V i wzmacniacz stereo – piszczenie w głośnikach, zakłócenia masy, filtracja SMPS XLoader na Arduino - gdzie znaleźć i jak używać?