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...
Wszystko stanie się jasne, jak poznasz sposób na "czytanie" typów zmiennych. 1. Zaczynasz od nazwy 2. Idziesz do "końca" w prawo 3. Następnie do "końca" w lewo 4. Nawiasy mogą wyznaczać "lokalne końce". Tak więc Twoja zmienna const uint8_t *Tab[3] to trzyelementowa tablica wskaźników na stałe uint8_t Jak sam widzisz nie da się wyczytać, że sama tablica...
Jeżeli skok jest z przerwania to HardFault jest spowodowany tym, że zmieniasz wskaźnik stosu w obsłudze przerwania.
Czy do funkcji HAL_UART_Receive_IT na pewno powinien być przekazywany adres wskaźnika do struktury UART_HandleTypeDef?
Pamięci są te same tylko że jedna jest podłączona do STM32F1, a druga pamięć do STM32F2. Konfiguracja FSMC jest taka sama, tylko GPIO jest trochę inne - które jest na pewno dobrze skonfigurowane.
Użyj memory view z adresem który podaje wskaźnik.
for(uint8_t i = 0 ; i < sizeof(data); i++) - to jest złe. Bo sizeof(data) zawsze będzie 4 jako że jest to wskaźnik. ma być i < length Masz tu UB. Być może jest coś jeszcze bardzo podobnego. Pamiętaj sizeof(wskaźnik) nie zwraca wielkości obiektu wskazywanego przez wskażnik, tylko wielkość samego wskaźnika
(at)bartosz.tarnowski Na pierwszy rzut oka przekazujesz niezainicjalizowany wskaźnik do funkcji f_opendir . Prawdopodobnie przekazujesz również niezainicjalizowany wskaźnik do f_mount .
- po co było rzutowanie *(__IO uint32_t*) i dlaczego adres wyliczał się błędnie Nie wiem czemu to usunąłeś, ale to jest KONIECZNE. A to dlatego, że ty nie masz skoczyć pod adres (tablica_wektorów + 4), tylko pod adres który jest zapisany w (tablica_wektorów + 4). I właśnie po to było tam rzutowanie i dereferencja wskaźnika. 4\/3!!
extern należy dodać wtedy gdy dołączamy ten sam plik .h kilka razy (zresztą kompilator nas o tym uprzejmie poinformuje). Wskaźnik jest zmienną wskazującą na dane w obszarze flash i jest umieszczony w RAM'ie'. Wskaźnik może wskazywać również na dane w RAM'ie.
Jak już korzystasz z bibliotek ST to masz chociażby funkcje: FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data) i FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data) Operując na wskaźnikach możesz tam zapisać zmienne dowolnego typu, czy całe struktury.
A widzisz, różnica jest taka, że u mnie nie jest wywoływane setenv() tylko bezpośrednio przypisuje ten łańcuch do wskaźnika.
O wskaźnikach kolega słyszał?
Dzięki za szybką odpowiedź. Przy okazji zapytam. Jeśli jest wykorzystywana tablica, to szybciej będzie się wykonywało obliczenia z wykorzystywaniem standardowej obsługi, czy obliczeń na niej z wykorzystaniem wskaźników ?
Musisz sobie utworzyć coś w rodzaju wskaźnika do tablicy. Może to być np int, który będzie wskazywał na kolejne indeksy w tablicy. Wpisujesz zmienną do tablica[indeks] i zwiększasz indeks.
OK, dzięki wszystko mi działa. Może też skorzystać np ze wskaźników, jeśli tak jest komuś wygodniej. Mam zamiar jeszcze napisać coś do obsługi pamięci NAND i moje pytanie jest takie... czy przybliżyłbyś mi mniej-więcej jak to zrobić na wskaźnikach ?
Możesz stworzyć unię (union) która umożliwi ci zapis/odczyt zmiennej w postaci long i/lub float. [syntax=c]typedef union { long L; float F; } LF_t; [/syntax] Oraz - wykorzystaj wskaźniki :)
Powodem może być niepoprawna konfiguracja rejestrów sterownika. poza tym nie pokazałeś jak wygląda funkcja zapisu do ramu i ustawienia kursora. Ja używam takich funkcji: [syntax=c] typedef struct { vu16 REG; vu16 RAM; }LCD_TypeDef; #define LCD_BASE (0x6c000000) #define LCD (( LCD_TypeDef *) LCD_BASE) void LCD_WrReg(u8 reg, u16 data) { LCD->REG =...
Na 99% nie. Można kombinować z auto-reload i transmisją jednego bajtu, o ile uda się przekonać DMA, że docelowy UART jest pamięcią, a nie peryferialem i o ile będziesz miał pewność, że nigdy dane nie będą równocześnie nadchodziły w takim tempie, żeby zapchać nadajnik. Czyli: nawet gdyby się udało, to jest to rozwiązanie wysoce niepewne i zawodne. Co...
Trzeba właczyć w opcjach kompilatora długie skoki. Ewentualnie trzeba skakać do funkcji w RAM przez wskaźnik, bo to zawsze wykorzystuje długie skoki. P.S. Na Cortex-M3 funkcje z RAM działają WOLNIEJ niż z flasha, to nie ARM7. 4\/3!!
He, he, he... Patrz na to: while (1); Nic, co jest dalej, nie ma szans się wykonać, więc kompilator eliminuje zbędny kod. ...A ponadto masz błąd w inkrementacji wskaźnika. idx = (idx + 1) % BUFSIZE; - to najprostszy poprawny zapis tego, co masz zrobić, chociaż nie zawsze daje optymalny kod.
A no z tego samego powodu dla którego ktoś decyduje się na pisanie w C++. Chce mieć obiektowe API i hermetyzację. Jeśli już coś piszę obiektowo (czysto teoretycznie) to nie po to aby w obiektach używać odwołać do API bez obiektowości. A jeśli ktoś pisze program w C++ i chce skorzystać z biblioteki lwIP to też musi ją opakować w klasy? Czy jak ktoś...
(at)KryQ A jesteś w stanie zobaczyć jak wyglądają struktury pod debugerem w wersji działającej i niedziałającej? Nie wrzuciłeś kodu gdzie inicjalizowany jest wskaźnik base.
1. Deinicjalizujesz RCC, PLL i pozostałe zegary 2. Resetujesz i wyłączasz Systick 3. Wyłączasz przerwania wcześniej zerując flagi 4. Ustawiasz wskaźnik stosu na początek pamięci bootloadera 4. Skaczesz do adresu pamięci bootloadera +4 Wszystko jest analogiczne do poniższego przykładu dla F4: https://stm32f4-discovery.net/2017/04/tu...
Mówisz wszystkie? Przecież tam masz przypisanie do zmiennej wskaźnikowej zmienną uint16_t, to nie ma prawo działać. Zresztą robisz to kilkukrotnie. Wg mnie musisz mocno przemyśleć zastosowanie wskaźników bo ewidentnie mieszasz. Przemyśl sobie poniższy kod, który nie powoduje błędów - jest tylko przykładem: [syntax=c] uint16_t wart[16][16]; //tablica...
po takiej deklaracji w sekcji .ssitag lądują wskaźniki do tej tablicy, a nie sama tablica, jak wymusic żeby całosć tam wylądowała? Musiałbyś albo w tablicy umieścić nie napisy ("...") tylko po prostu wskaźniki do tych napisów (osobnych obiektów), z których każdy miałby również ten atrybut. Druga opcja to zrobienie tablicy tablic (obecnie masz tablicę...
To co wpisujesz do rejestru MOAR to jest "adres adresu" (wskaźnik na wskaźnik) a raczej nie o to Ci chodzi... Tym bardziej że w tym kontekście tab to zmienna lokalna, więc i tak nie zadziała jak trzeba. DMA1_Stream6->M0AR = (uint32_t)&tab; 4\/3!!
instrukcja BLX oznacza Branch with Link and Exchange. Kluczową kwestią jest owe Exchange. Chodzi o to, że instrukcją tą można zmienić tryb instrukcji z ARM na Thumb (lub odwrotnie) lub go nie zmieniać. Jeśli ostatni bit adresu (czyli twojego rejestru R3) jest zapalony, to rdzeń skoczy pod adres ignorując ten bit (traktując go jako zero, bo PC i tak...
Niestety funkcja umieszczająca dane w kolejce potrzebuje wskaźnika na te dane. Jeśli masz dużo takich danych stałych to umieść je w tablicy stałych a w #define zadeklaruj wskaźniki do danych w tej tablicy. [syntax=c]const int ConstTab[] = { 10,20, 30, 40, 50}; #define STALA_A (&ConstTab[0]) #define STALA_B (&ConstTab[1]) #define STALA_C (&ConstTab[2])...
http://www.elektroda.pl/rtvforum/viewtop... Można też kombinować przez zakładkę Variables, ale tam można te watchpointy robić chyba tylko na wskaźnikach/referencjach. 4\/3!!
Nie można w ten sposób inicjalizować tablicy data, bo ona musi mieć albo podany konkretny rozmiar, albo musi być zdefiniowana gdzieś indziej i tutaj tylko wskaźnik. 4\/3!!
Tutaj już wiele może być źle - zwykle chodzi o zapis do nieistniejących adresów, wykasowanych wskaźników itp. 4\/3!!
Stos jest umieszczany zaraz za danymi Nie tak zaraz. Domyślna konfiguracja z Cube'a ustawia wskaźnik na końcu pamięci.
efekt w 100% prawidłowy - napisałeś kod, w którym s jest w pamięci RAM, a następnie tworzysz na niego wskaźnik, który zresztą też jest w pamięci RAM. Naprawdę weź jakiś przykładowy projekt dla STM32... 4\/3!!
char *s = 0; sprintf_(s,"Moj stryj ma %d lat",liczba);//przykladowy tekst Przecież sprintf nie przydziela dynamicznie pamięci - jeśli wywołasz tą funkcję w ten sposób, to sprintf_() zaczyna pisać pod adresem 0 (aktualna wartość wskaźnika i koniec. Do tej funkcji musisz podać prawidłowy bufor, który pomieści cały text wynikowy. Zadeklaruj...
Znalazłem informację, że: text + bss = FLASH data + bss = RAM To powinno wygladac tak: text + data = FLASH data + bss = RAM Zmienne zainicjalizowanie (.data) powinny zostac przekopiowne z FLASH do RAM przed funkcją main. 1) Deklarujesz tablice i ja inicjalizujesz (bedzie zajmowala miejsce we FLASH oraz RAM) 2) Tylko flash. 3) Zadeklarowałeś tablicę...
Tom RealTime Akurat mam Telit-a GL865. Komunikacja wygląda tylko na zasadzie zapytanie-odpowiedź, jedyną sytuacją jest połączenie przychodzące i ewentualnie dane GPRS które przychodzą asynchronicznie. Program piszę bez żadnego OS-a. Z mojego punktu widzenia wykorzystanie DMA może być problematyczne ponieważ nie mam stałej komend wysyłanych do modułu,...
Pomijając sensowność używania sprintf do SKOPIOWANIA stringa do jakiejś zmiennej, to błędów jest bardzo dużo. 1. Skasowałeś stronę którą chcesz zapisywać? 2. Odblokowałeś zapis do flasha? 3. Twój zapis jest dziurawy, bo jak zero będzie na nieparzystej pozycji, to pętla nie zakończy się wtedy kiedy będziesz chciał 4. Odczytujesz FlashStatus, to sprawdź...
Jak pisałem nie znam CooCox'a więc nie pomogę z jego konfiguracją. Czy wystarczy zmienić definicję STACK_SIZE? Jeśli tak to na jaką? Nie, jak sama nazwa wskazuje jest to rozmiar stosu, a nie jego położenie. Co do wektora przerwań w funkcji ... W aplikacji bootloadera nic nie zmieniasz w projekcie - skrypcie linkera. Przed wywołaniem głównej aplikacji...
Freddie a co w przypadku preinkrementacji np: *++data; Nigdy nie spotkałem się z takim zapisem. Czy taka składnia byłaby również poprawnie zrozumiana. Zwiększ adres wskaźnika o 1 przed pobraniem wartośći.
Witam, cały dzień męczę się z obsługą przerwania od odbioru danych w STM32103RB. Korzystam z biblioteki HAL. Po całym dniu dalej nie wiem jak to ma wyglądać, dostępne example robione są w STM32CubeMX, a ja z tego nie korzystam. W dokumentacji chyba nie potrafię się poruszać bo nie wyiskałem z niej co po kolei trzeba wywoływać aby obsłużyć to przerwanie....
Znowu się na chwilkę wepchnę w temat czy podczas inicjalizacji takie równanie da prawidłowy wynik czy mogą wyjść jakieś krzaczory. UART->BRR = (uint16_t) ((fpclk + (baud>>1))/baud); UART to wskaźnik pobierany przez funkcje inicjalizującą
Z LCSC (lub zmontowane przez JLC PCB) zawsze działały prawidłowo. Z AliExpress bluepill nigdy nie sprawiały mi problemów, ale dostałem płytki z STM32H743IIT6 niewłaściwie przechowywane, z zaśniedziałymi złączami i ścieżkami. Układy do montażu, np. STM32G071 i podobne kupowałem tylko u sprawdzonych wcześniej dostawców (małym zamówieniem lub innymi produktami)...
To sprawdź od razu czy problem występuje dla obiektu na stosie. Aby to zweryfikować trzeba wymusić użycie przez wskaźnik, np. tak: int main() { Derived object; Base* volatile pointer = &object; pointer->function(); ... Jeśli powyższe zadziała, a dla obiektu globalnego nie, to znaczy że problem jest w globalnych konstruktorach....
Może ktoś wyjaśnić jak działa ta funkcja? To jest kod dostarczony wraz z zestawem STM32 Discovery. Chodzi mi głównie o ten znaczek ->. Co to jest? Jakiś wskaźnik? Czy poprostu wyrażenie GPIO_PORT[Led]>GPIO_PORT[Led]-BSRR [syntax=c]void STM32vldiscovery_LEDOn(Led_TypeDef Led) { GPIO_PORT[Led]->BSRR = GPIO_PIN[Led]; }[/syntax]
To, że dajesz const w deklaracji, to jest to przekonanie kompilatora, to juz Ci da tyle, ze jak przypadkiem sobie cos zaczniesz jednak modyfikowac, to Ci kompilator zgłosi błąd. Więc w zasadzie dodanie const i przejście bez błędów kompilacji gwarantuje Ci, że nie modyfikowałeś tego na co wskazuje wskaźnik no i warningu też nie będzie, mam nadzieję,...
A oto konsekwencje pożaru - stare wskaźniki wracają do Peugeotów: https://motoryzacja.interia.pl/wiadomosc... Wskaźniki wskaźnikami ale czym zastąpią µC w sterowniku silnika ? Może wróci do łask ten słynny regulator a maszyny parowej ?
No i wszystko zaczęło ładnie działać. Długość ciągu wejściowego obliczam teraz tak: [syntax=c] while(*txt++) dlugosc++; [/syntax] Jak widać wychodzą braki w doświadczeniu. Po prostu w tym przypadku: [syntax=c] dlugosc = sizeof(txt); [/syntax] Obliczał długość wskaźnika, a nie tablicy na którą jest ten wskaźnik. Bardzo dziękuję za pomoc tadzik85.
Ok, Jest jakieś sensowne zastosowanie zmiennej const i volatile? Stricte zmiennej to nie ma. Taka kombinacja może mieć ewentualnie sens w przypadku wskaźnika odnoszącego się do sprzętowego rejestru tylko do odczytu.
Chłopie, myślisz, że uda się się przesunąć vector Resetu oraz początkowy wskaźnik stosu? Dlaczego pierwsze a nie ostatnie to przecież bez znaczenia.
(at)Bluedraco Po drugie (stanleyst) nikt nic nie przeoczył pisząc bibliotekę. Przeoczył programista pisząc błędną wartość w podstawieniu. A co z polami struktury DMA init? przecież tam są miejsca nie na wskaźnik ale na zwykłego inta, to, że to ma akurat taką samą długość, to inna sprawa.
Bardzo wiele zostało już powiedziane (bardzo dobre porady). Moim zdaniem krokiem zero jest jako tako umieć programować w C na PC (jak przebiega proces kompilacji, kod źródłowy podzielony na pliki *.c i *.h, organizacja pamięci i wskaźniki, struktury i wskaźniki do nich, słowa kluczowe register, volatile, static, etc., preprocesor, makefiles i make,...
A masz namiar na prostą bibliotekę parsującą NMEA? Najlepiej taką, która jako parametr wejściowy oczekuje wskaźnika do bufora z ramką z modułu oraz wskaźnik do jakiejś struktury, w której będą rozkodowane dane.
Po wyjściu z funkcji ginie, W takim razie nie rozumiem dlaczego strcpy działa? Ono też jako argument przyjmuje wskaźnik: char * strcpy( char * dest, const char * src ); Przypadek.....
Dobra a możecie mi powiedzieć jakie są wnioski z tej Wasze rozmowy, bo co prawda nie wszystko rozumiem o czym piszecie, ale dla mnie ważne są wnioski, jak mam pisać te tablice i wskaźniki stringowe aby były we Flashu PS. co to jest RISC-V toolchain
Najpierw marycyś musi zrozumieć, co to jest funkcja i co to jest wskaźnik. To tu jest problem, a nie w jakimś STM32. Narazie nie zrozumiał ani mojej linijki kodu, ani funkcji kol. stmx, czyli oba gotowce są dla niego bezużyteczne. Dobra rada: poćwicz programowanie w C na PC, a potem przesiadaj się na mikrokontrolery.
Sprzętu się nie czepiaj. HardFault może być powodowany przez różne rzeczy, z popularniejszych to za mały stos lub popsute operacje na wskaźnikach. Zamieść cały kod jaki masz. I po co ten FlashUnlock na początku?
Jeśli chodzi o transoptor to spójrz w notę do PC814. Ciągniesz kable z gniazdka, do obu podpinasz rezystory i podpinasz do diod. Z drugiej strony otrzymujesz cyfrowy wskaźnik zera sieci :) Edit: W innym, równoległym temacie znalazłem tego linka:http://www.edw.com.pl/pdf/k07/04_0... zerknij na ostatnią stronę - właśnie tak to ma być podłączone, tyle,...
Nie jest to wcale dobry pomysł, bo: a. peryferia będą w nieznanym stanie b. wskaźnik jednego ze stosów NIE zostanie ustawiony (ustawiany jest on sprzętowo). 4\/3!!
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...
Bufor cykliczny, inaczej też nazywany kołowym, to najlepsze rozwiązanie do tego co chcesz zrobić. Tym bardziej, że jak zaznaczyłeś danych będzie sporo. Każdy odebrany znak wpisujesz do bufora i przesuwasz wskaźnik zapisu o 1. Możesz to robić przez obsługę przerwania od portu szeregowego, albo możesz do tego wykorzystać DMA. Dlaczego bufor? Ponieważ...
Ja po AVR'ach poszedłem w stronę NXP i mikrokontrolerów LPC1xxx. Muszę powiedzieć że tak droga była bardzo gładka i przyjemna. W zasadzie może kilka tygodni zabawy z płytką stykową ([url=http://www.elektroda.pl/rtvforum/t... testowanie peryferiów i już następne projekty opierałem o te mikrokontrolery. Już kilka razy o tym pisałem,...
Albo za mały stos, albo błąd w kodzie (np. włączone przerwanie które nie jest obsługiwane, używanie nieprawidłowego wskaźnika, ...). Żeby wyeliminować pierwszą opcję wystarczy stos powiększyć i sprawdzisz co się wtedy stanie.
A zobacz przez wskaźnik czy Ci zadziała? Wtedy będziesz miał jedna wątpliwość mniej.
Mam przeczucie, że umieszczenie funkcji Ten fragment jest poprawny. Po każdym wykonaniu Callback'a należy włączyć odbiór kolejnych danych. (at)skim Zamiast robić tablicę jednoelementową zrób zwykłą zmienną. Pamiętaj że HAL_UART_Receive_IT przyjmuje wskaźnik do bufora uint8_t *pData - jako parametr podaj &key. W Callbacku dodaj HAL_GPIO_TogglePin aby...
Co to są za brednie? Watchdog reset nie powoduje wyjątku HardFault , tylko SYSRESETREQ (sygnal wewnetrzny resetujący procesor). Po raz setny napiszę, kiedy hardfault wystepuje najczęsciej: - zapis nieprawidlowego adresu (instrukcje STR,STRB,STRH,STREX,STM...) - niedozwolone kombinacje przy PSR - wykrzaczenie się stosu lub źle wyrównany stos - użycie...
Nawet dla takiego małego Miki jak ja już na pierwszy rzut oka jest jasne że te kody to potężne źródło problemów. Co widać bez wgłębienia się w szczegóły: * Funkcja main() jako rozbiegówka to słaby pomysł. Kolega stmx napisał coś na ten temat (nawet podaje link w promowanych tematach), warto to przeczytać. * Stos musi mieć odpowiednie wyrównanie, zwykle...
A w funkcji print(); nie wykonujesz przypadkowo jakiś zapisów pod wskaźnik? Co jest w temp zaraz przed zapisem na kartę?
Na tak nie zauważyłem że tam jest gwiazdka czyli wskaźnik a nie dane. Już zaznaczyłem sobię All warnings -Wall i teraz widzę listę wszystkich zastrzeżeń. Dziękuję za pomoc
Tzn, że program może działać dalej poprawnie a debuger wskazuje na to, że jesteśmy w np HardFaultHandlerze ? Mógłbyś nieco rozwinąć myśl ? Czasem może być jakiś problem sprzętowy/programowy/systemowy, który może spowodować wywalenie się debuggera, który będzie np. uparcie twierdził, że jesteśmy wciąż w jakiejś linii, choć mikrokontroler sobie wtedy...
https://obrazki.elektroda.pl/7195277300_... W materiale we współpracy firmą F&F mamy okazję przetestować działanie urządzeń monitorowania i kontroli napięcia sieciowego. Są to zarówno https://obrazki.elektroda.pl/1038592300_... Ciekawym pomysłem jest zintegrowanie w module o szerokości jednego pola lampek kontrolnych...
Jest napisane: ustaw PSIZE na 32 bity. To wpływa na sposób i czas zapisu i nie ma nic wspólnego z organizacją pamięci. W F4 pamięć zapisuje się w słowach 32-bitowych - zrzutuj wskaźnik na uint32_t na tę tablicę i zapisuj po 32 bity.
Faktem jest że o stosie często się zapomina, bo program działa a tu nagle po dodaniu nowej linijki, na pewno bez błędu, nagle wszystko się sypie - i nie wiadomo co się dzieje. Szczególnie problematyczne kiedy pamięci jest na styk i trzeba go rozważnie ustawić a nie da się przewidzieć wszystkich możliwych sytuacji - przerwań, wywołań funkcji itd. Nie...
Tak to prawda dzięki :) już działa lepiej aczkolwiek widzę że dalej przy którejś pętli wiesza się przy tworzeniu dziecka [syntax=c]tprs->child = (struct TPARSER**)malloc (sizeof(TPARSER)*tprs->ElementsOfTab);[/... jakby mu brakowało pamięci albo wchodził na zapisany wskaźnik ;/ hmm w jaki sposób móglbym to sprawdzić w keilu ?
Mieszasz 100 niepotrzebnych rzeczy. Masz podobno chodzący debuger. Więc: 1. jaka jest wartość SPI_DMATransmitReceiveCplt przed przypisaniem 2. jaka jest wartość hspi->hdmarx->XferCpltCallback po przypisaniu. Jeśli są różne to jakie i jakie instrukce wykonał program? I tyle. Niezależnie od rdzenia, architektury, cache, HAL'a itd. Albert
Z tym rzutowaniem to wolę jednak "ręcznie" to robić....jakoś tak wydaje mi się bezpieczniej. U mnie akurat sizeof zawsze będzie mniejsze niż 256 gdyż jest to po prostu ilość bajtów do zapisania jednej zmiennej/tablicy/struktury i nie zamierzam robić większych :wink:. Biblioteki z ST są zakręcone..niestety. Zaletą mojego pomysłu jest to że struktura...
Przy odczycie z DR jest dokładnie ten sam problem co przy zapisie - jak chcesz 8-bitów, to musisz się odwołać przez wskaźnik 8-bitowy (identyczny jak ten powyżej do zapisu). Twoja zmienna tmp i w tym przypadku nie ma żadnego znaczenia, bo "szerokość" odczytu/zapisu jest zdeterminowana tylko i wyłącznie przez źródło odczytu lub cel zapisu, a nie rozmiar...
1. Stos nie za mały? W dobrym miejscu pamięci? 2. Przerwania? Wskaźniki? 3. Inny SamplingTime (dłuższy/krótszy) coś zmienia? 4. Problem sprzętowy? Przeniesienie key_bb na inne wyprowadzenie (z dala od PA1) pomaga? Vref (jeśli jest)/AVCC stabilne i niezależne od PA0/key, PWM, LCD, itp? Sygnał na PA1 stabilny i niezależny od PA0/key, PWM, LCD, itp?
echh jednak Freddie miał rację :) http://gcc.gnu.org/onlinedocs/cpp/Standa... __DATE__ __TIME__ [syntax=c]string ver = __DATE__ + __TIME__; string eever = read_ee(123421); if(ver != eever) send_ee(wskaźnik_na_kupę_danych);[/synta... Kod oczywiście nie zadziała ale you got an idea!
Rzeczywiście program wychacza po skasowaniu strony - próbowałem kasować dwusetną stronę i to samo. Jak w takim razie wybrać odpowiednią stronę do skasowania ? Jak zapisać zmienną na stałe - sugerowałeś podać adres przez wskaźnik. Rzeczywiście program wychacza po skasowaniu strony - próbowałem kasować dwusetną stronę i to samo.
Skompilowane! ale jeszcze nie wgrane. inicjalizacja NVIC po zmianie: NVIC->IP [5] |= 0x00000010; /* set priority lower than SVC */ NVIC->ISER[0] |= (1 << (USB_LP_CAN1_RX0_IRQn & 0x1F)); "Trochę na ślepo walczysz" - nie powiem, że nie. Błąd error: lvalue required as left operand of assignment kompletnie...
W żadnym ARMie (i praktycznie w niczym poza niektórymi 8-bitowymi PICami) nie ma stosu sprzętowego. A to że rdzeń / kompilator w jakiś sposób korzystają z rejestru używanego jako wskaźnik stosu, nie znaczy jeszcze że masz do czynienia ze stosem sprzętowym.
Kolejnym problemem jest nieciągłość wolnej przestrzeni pamięci. To, że X pamięci jest wolne nie oznacza, że X pamięci da się zaalokować. Stąd też miałem pomysł na mem manager, który śledzi (zapamiętuje gdzieśtam) wskaźniki na wszystkie dynamiczne wskaźniki po to, aby napisać rezydentny wątek defragmentujący cyklicznie dostępną stertę... Ale to znowu...
Jak więc jest z tymi: __main_stack_size __process_stack_size Czy muszą być obydwa tworzone jeśli stosuję przerwania i nie mam OSa ? Jak już wyżej napisano można pracować na jednym. Ale ma to dwie poważne wady: 1. nie mamy gwarancji że zapełnionego stosu aplikacji wystarczy na obsługę przerwania, 2. jeśli stosy msp i psp są rozłączne to debugowanie...
Witam Ja bym to zrobił tak: 1. Kompiluje sobie moja funkcję- mam .bin. 2. W pliku .map lub debugując patrzę jaki funkcja ma adres. 3. Kopiuję bin'a na kartę SD i potem czytam .bin'a od adresu gdzie się zaczyna moja funkcja i kopiuję ramu procesora. 4. Wywołuje funkcję z ramu, przez wskaźnik. Jak nie zależy ci na szybkości to ok, bo trzeba odczytać z...
No to wstaw tam dowolny wkaźnik, żeby reset handler był przesunięty o te 4 bajty. Analogicznie do innych zarezerwowanych. Swoją drogą, czy tablica wektorów musi zawierać osobne adresy do funkcji reserved ? Zdaje się, że starczyła by jedna (pomijając fakt rozszerzalności takiego rozwiązania). Nie wstaw cokolwiek po adresem jest adresem 0 początkowy...
Witam Czy istnieje jakiś sprytny sposób dodania pliku BMP (bitmapa) do projektu w taki sposób, żeby zawartość pliku znalazła się we Flash'u a program dostałby wskaźnik do początku danych. Oczywiście wiem, że można umieścić dane w kodzie programu ale to dość uciążliwe. Pozdrawiam
Sposobów jest kilka. Ale zacnzijmy od tego, czy rzeczywiście potrzebujesz, aby te dane były w określonym miejscu? Nie wystarczy, aby program wiedział, gdzie te dane są? Jeśłi tak, to przetwórz je do obj i potraktuj jako blob. W programie możesz uzyskać dostęp do takiego obiektu, a linker wszystko ładnie połączy. Jeśli koniecznie musi być w określonym...
Nie podaje się linków do aukcji!! Są volatile, i przez to później zostaje wiszący wskaźnik i forumowicze się na niego nacinają..!! Mało danych. Coś robisz, coś ci nie dziala i nie wiesz co dalej...
Witam! Mam kłopot z uartem w stm32. Wysyła ok, wchodzi w przerwanie od rx uarta i odczytuje jego DR zapisując do tablicy i zwiększając wskaźnik do tablicy żeby był gotowy na następne przerwanie ale ono właśnie nie wystepuje pomimo, że następny bajt przychodzi uartem. Systick co 100ms inicjuje wysłanie zapytania do zewnętrznego urządzenia i urządzenie...
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ą...
IDE Arduinowe mnie drażni Fakt, jest toporne, lata używania normalnego IDE (najczęściej uzywam opartych na eclipse a do remote NetBeans) pokazują niedostatki Arduino, ale parę lat temu to kompletnie się nie nadawało do napisania czegoś więcej niż example. Teraz jest już lepiej, ale najbardziej brakuje mi otwarcia includa poprzez kliknięcie na nim....
Hard fault praktycznie zawsze pojawia się gdy załączymy przerwanie, dla którego nie zdefiniujemy handlera Weź lepiej już nic nie pisz w tym temacie. W dokumentacji rdzenia są opisane wszystkie możliwe przypadki wystąpienia wyjątków. Najczęstszą przyczyną jest próba dostępu do niezaimplementowanych obszarów pamięci lub niewłaściwy dostęp do rzeczywiście...
Datasheet podaje, że wytrzymałość pamięci flash to minimum 10000 cykli. Przemyśl, czy naprawdę warto kombinować, bo - uwierz - niepoprawne uruchomienie programu z RAM potrafi czasem sporo namieszać (szukasz błędu który nie istnieje). Co do komend, to po pierwsze musisz mieć inny skrypt linkera (bo nie używasz już flash), musisz wiec inaczej linkować...
Witam, wiem, że temat stary, ale też używam Keila i przyszła mi potrzeba za alokować 2kB pamięci, żeby wczytać dane z zewnętrznego ramu i zapisać w zewnętrznym flashu i też malloc zwracał mi wskaźnik NULL i w moim przypadku wystarczyło w pliku *.s zmienić Heap_Size EQU 0x00000200 na Heap_Size EQU 0x00000F00
Nie wiem jak wygląda Twój projekt. Ja mam w pliku port.c gdzieś tam dopisane tylko 3 linijki: [syntax=c] void PendSV_Handler(void) __attribute__ ((interrupt, naked, alias("xPortPendSVHandler"))); void SysTick_Handler(void) __attribute__ ((interrupt, alias("xPortSysTickHandler"))); void SVC_Handler(void) __attribute__ ((interrupt, naked, alias("vPortSVCHandler")));...
A może robisz jakieś błędne operacje przy pomocy wskaźników? W zasadzie samo manipulowanie numerami komórek tablicy to operacje wskaźnikowe... I W ten sposób bezwiednie nadpisujesz inne dane? Podałeś za mało informacji. Jak chcesz żeby ktoś Ci pomógł, musisz bardziej precyzyjnie pytać.
Co jest oczywiście źle bo do funkcji HAL_SPI_Transmit jako drugi argument wchodzi "uint8_t *pData". Chodzi Ci o to ? Ja wiem że jest źle. Ale tylko HAL_SPI_Transmit bo do HAL_SPI_Receive wchodzi uint8_t. Nie wiem jak zrobić, żeby odczytywać drugi bajt Dodano po 1 Może inaczej. Czy da radę odczytać danę na wskaźniku ? (nie używając tablic) (dane przychodzą...
Nie da się tego zrobić, Twój program jest po prostu źle zaprojektowany. Aby dane były prywatne dla wątków muszą być albo na stosie, albo globalne i w takiej ilości jak ilość wątków, a każdy wątek dostaje wskaźnik do "swojego" kawałka (nie wie nic o pozostałych). Arbitraż o którym piszesz to zadanie dla Twojego programu, a nie FreeRTOSa. Jeśli interesuje...
W sumie to nie wiem czy to właściwie problem z MCU, GCC czy zrobiłem gdzieś jakiś banalny błąd, który mnie teraz prześladuje, ale wnioskując z tego, że na F103, F107 i x86 działa poprawnie, chwilowo obstawię jakiś związek z MCU. Bo ten wyjątek istnieje tylko na STM32F030. [syntax=C]static void fnSensRead(uint8_t cbData, uint8_t *ptr) { uint32_t *pSmp...
stm32 tablica wskaźnik stm32 struktura wskaźnik stm32 f103rb
rozdzielczość 1360x768 pilot odbiornik radiowy bramy fotokomórek testowanie
Odblokowanie klawiszy kotła Beretta Mynute Evo X25C Marantz M-CR611: Rozwiązanie błędu połączenia 03