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...
Aby wyjaśnić Ci Twój problem, podaję Ci metodę "czytania" typów zmiennych, który wyjaśnia wszystko. Jest kilka zasad: 1. Czytanie zaczynamy od nazwy zmiennej 2. Czytamy w prawo dopóki nie dojdziemy do "końca", po osiągnięciu "końca" czytamy w lewo od nazwy zmiennej 3. Obowiązują nawiasy, które są "lokalnymi końcami" Tak więc: const char * const l_wartosc[]...
Witam Mam dosyć spory problem z parsowaniem tekstu, mianowicie użytkownik może w terminalu wpisać sobie taką o to składnie. Silnik 3,5;Silnik 5,25;Silnika 7,45; Ma to podzielić na "Silnik 3,5" , "Silnika 5,25" itp; Robię to w następujący sposób: -gdy z USARTa przychodzi ciąg znaków zakończonych znakiem '\0' wychodzi do przerwania gdzie tworzona jest...
Kompilowało się na AVR, a tutaj nie, to fakt. Potraktujcie to raczej jak pseudokod, chciałem pokazać tylko o co mi chodzi. Te tablice są dość spore, bo zawierają zestaw wszystkich znaków, dużych i małych liter lecz nie jest to cała tablica ASCII. W programie chcę się do tego łatwo odwoływać, potrzebuję adres pierwszego piksela pierwszego znaku każdej...
Witam Chcę aby tablice Z1...Z5 były zapisane w pamięci programu, różnią się rozmiarem pomiędzy sobą: const char Z1[] __attribute__((__progmem__)) = {...}; ... const char Z5[] __attribute__((__progmem__)) = {...}; Tutaj mam tablice wskaźników również zapisaną w pamięci programu const char* TABLICA_WSKAZNIKOW[] __attribute__((__progmem__)) = { Z1, Z2,...
Chciałbym utworzyć wskaźnik na tablice, żeby ten wskaźnik umieścić w funkcji przerwania UARTu. W pętli głównej podstawiałbym pod ten wskaźnik różne tablice, które chciałbym wysłać. Mam jednak problem z prawidłowym przypisaniem tablicy do wskaźnika na nią lub z prawidłowym pobieraniem zmiennych ze wskaźnika. Zadeklarowałem tablice: C0 00 00 00 00 00...
Witam. probuje zrobic wlasna stałą tablice skokow w pilku startowym .s (potrzebne mi jest to do bootloadera). probuje zrobic tak: globals .bt_vectors .section .ident_section,"a",%progbits .type bt_vectors, %object .size bt_vectors, .-bt_vectors bt_vectors: .word WriteFunction .word ReadFunction .word 0 gdzie WriteFunction i ReadFunction to sa funkcje...
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.
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ę...
- 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!!
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 ?
... czy da sie to zrobić jakoś wydajniej? Bo w tym przypadku dla każdej ikony tworzę oddzielna funkcję, która różni się tylko tablicą. Napisz jedną funkcję do wyświetlania z parametrami. Funkcję tę uruchom z RAM'u. Kompilator i tak rozmieści "liniowo" tę dwuwymiarową tablicę więc możesz używać wskaźnika zrzutowanego na "u16". Jakbyś nie zrobił (wskaźniki...
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])...
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 =...
Nie używaj tej głupawej biblioteki to będziesz wiedział dokładnie Co zrobiłeś i jak to cofnąć. Zmiana wskaźnika stosu PRZED wywołaniem jakiejś funkcji (FLASH_Lock() ) też nie wydaje mi się szczególnie dobrym pomysłem. W ogóle proste zadanie, ale tak je zakręciłeś jakimiś dziwnymi konstrukcjami, że nie wiadomo o co chodzi... A tak przy okazji, to skoro...
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...
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
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.
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.
(assignment makes integer from pointer without a cast Przetłumacz sobie to na polski: "operator przypisania powoduje zmianę wskaźnika na wartość całkowitą bez rzutowania" i chyba jest jasne w czym jest probiem? `*(__IO uint16_t*)(Page_127 + i)` - abstrahując od tego czy jest to poprawne, jest to "komórka w pamięci reprezentująca wartość typu uint16_t",...
Zupełnie naplątałeś... Po pierwsze, nie przejdzie *ple=99.1 . Dlaczego? Bo 'ple' jest wskaźnikiem na unsigned int , więc kompilator nie będzie przypisywał ci wartości zmiennoprzecinkowych do typu całkowitego, więc otrzymujesz ekwiwalent przypisu *ple=99; ... Po drugie, czy ty może dysponujesz debuggerem? Wypadałoby sprawdzić co dzieje się z pamięcią...
le jeżeli utworzę tablicę globalną jak poniżej: static const uint8_t tablica Nie. Co zrobi kompilator tego nie wiesz, bo modyfikatory static i const nie służą określaniu położenia zmiennych, czy tablic w pamięci. const ci jedynie daje tyle, że próba modyfikacji takiej tablicy powinna zakończyć się błędem podczas kompilacji. Oczywiście w praktyce, na...
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...
Witam Postanowiłem zapytać tutaj, ponieważ wydaje mi się że to odpowiedni temat. Uczę się programowania na bazie STM32. Teraz poznaje porty USART i pojawił się problem: Pokazałeś fragmenty kodu i myślę, ze nawet jak będziesz miał funkcję wysyłającą jeden znak na LCD to program nie zadziała poprawnie. Problem najprościej, na szybko, rozwiązać deklarując...
1. blink led jest funkcją która przyjmuje parametr typu wskaznik void a zwraca wskaznik do typu void. 2. task jest tablica wskaznikow do funkcji (dokladnie tych o ktorych mowa w pkt 1).
Poprzez reset tego nie uruchomisz. Potrzebna jest do tego inna opcja. Żeby program ruszył z RAMu, Loader musi ustawić wskaźnik stosu, wskaźnik tablicy wektorów i wywołać funkcję wejściową. Dodano po 41 Tablica wektorów przestawia się sama w zależności od konfiguracji pinów BOOTx. No tak, nie wziąłem pod uwagę, że to STM32 A jednak Note: When booting...
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!!
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.
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...
Radzę zignorować powyższą poradę... Tablica wektorów ma poprawną "formę", więc radzę jej nie psuć... Wielu osobom działa, więc nie szukaj błędu tam gdzie go nie ma. Zresztą gdyby ta część była błędna, to układ nawet by nie wystartował, wiec chyba jednak warto założyć, że nie ma tu "błędu". W tablicy wektorów popraw tylko te wektory, które są "powyżej"...
Nie zapomnij ustawić wskaźnika stosu przed skokiem do głównego programu. Jego wartość jest na samym początku kodu programu głównego. Ustalając adres bazowy głównego programu pamiętaj o wyrównaniu dla tablicy wektorów przerwań, nie pamiętam dokładnie, ale chyba do 512.
Witam ponownie, jakiś czas temu zadałem pytanie odnośnie przechowywania bitmap w pamięci flash mikrokontrolera. Jednakże troszkę to zagmatwałem ,więc postanowiłem otworzyć nowy temat. Postaram się wyklarować pytanie najbardziej jak potrafię. :) Mianowicie mam do przechowywania tablicę mieszczącą 76800 elementów 16-bitowych oraz kilka innych mniejszych....
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ć...
Język programowania to narzędzie. Wypada przeczytać instrukcję żeby wiedzieć jak się nim posłużyć. Prowadzenie dyskusji z kolegą Jacynka, przykro mi to pisać, prowadzi do mylnego wyobrażenia. Jesli wstawia kawałek pseudo kodu i pisze że to To podstawowy przykład ze strony mcs to jest to wprowadzanie ludzi uczestniczących w dyskusji w błąd . Przykład...
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...
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ć.
Startupy w C są w paczce z biblioteką ST Standard Peripheral Library - gdzieś tam są schowane. Zobacz ten startup w asm, poczytaj co tam jest zrobione i zrób to samo w C. Generalnie inicjalizację .data i .bss da się zrobić w pętli, inicjalizację dodatkowego stosu czy modyfikację rejestru kontrolnego trzeba robić przez funkcje-wstawki-assemblerowe które...
liczba=atoi(nrfRX To jest tzw Undefined Behaviour. I jest to błąd bardzo poważny. Wytłumaczę Ci, co to robi. Bierze jeden bajt (zakładam że typ tego jest uint8_t []) i konwertuje do wskaźnika do char. Następnie to na co wskazuje ten wskaźnik (a będzie on wskazywać na jakiś adres w zakresie 0x00:0xff (czyli na tablice wektorów)) jest traktowane jako...
Dajemy 'reset' a program nie uruchamia się z bootloader-a i co wtedy? A nie uruchamia się ponieważ: włączony jest remap, przeniesiona tablica wektorów, zawiera 'byle co', nieustawiona 'power domain' itp. Mieszasz sprawy. Reset to reset. Skoro Twój układ uruchamia się po podaniu zasilania, to po resecie tez się uruchomi. Jeśli po resecie się nie uruchomi,...
Tak, to wiem, ale funkcja będzie pobierać dane wg swojej deklaracji czy wg deklaracji tablicy? Według swojej deklaracji. Jeżeli przekażesz do funkcji tablice: [syntax=c] uint8_t tab[] = {0x14, 0x2A, 0x56, 0xDF}; [/syntax] to w funkcji odczytasz przez wskaźnik na zmienna 16 bitowa (zakładając ze procek jest little endian): [syntax=c] font[0] - 0x2A14;...
Timery i dokładne odmierzanie czasu w różnych miejscach kodu. Zamiast korzystać z kilku timerów, można w różnych blokach kodu konfigurować 1 timer i wstrzykiwać odpowiednią funkcję przerwania. Oczywiście pod warunkiem, że nie będziemy musieli odmierzać czasu dla dwóch bloków jednocześnie. Wygląda na to, że potrzebujesz po prostu callbacka w jednym...
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")));...
Bezpośrednie wywołanie funkcji termf ("double - %d", 1.35); powoduje błędne wyświetlenie. Bo parametr %d nie określa liczby zmiennoprzecinkowej. Trochę pobawiłem się biblioteką (STM32) i jak pisałem wyżej, funkcja termf nie działa prawidłowo gdy brakuje w jej wywołaniu wskaźnika do tablicy (nie wiem dlaczego) Trzeba go dodać: int termf (char *ptr,const...
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...
ja właśnie rozglądałem się za sprzętem do zrobienia falownika Mikro-kontrolery z rdzeniami arm jak stm32f103 lub lpc1768 mają bloki pwm przystosowane do sterowania silnika. 3 fazowe timery z wyjściami komplementarnym przykład taki masz w dokumencie dla lpc1768 http://www.nxp.com/documents/application... Problem na jaki się natknąłem przeglądając...
Czy do funkcji HAL_UART_Receive_IT na pewno powinien być przekazywany adres wskaźnika do struktury UART_HandleTypeDef? Dziękuję bardzo za wytknięcie błędu. Jeszcze sporo nauki przede mną. Po zmianie wywołania z HAL_UART_Receive_IT(&huart2, &Received, 1); na HAL_UART_Receive_IT(&huart2, Received, 1); UART zaczął ładnie odbierać dane...
Zabrałem się za stworzenie buforu i teraz mam pytanie z C++: [syntax=cpp]itoa(CzasImpulsu, CzasImpulsu_TAB, 10);[/syntax] Z itoa otrzymuje tablicę przykładowo 6 charów. Chciałbym ją jakoś sprytnie zapisać do bufora RamkaA[512] nie używając pętli iteracyjnych tylko np operacji na wskaźnikach a nie wiem jak się za to zabrać. Chodzi o zapełnianie np 85...
Dokładnie tak, interesowało mnie dlaczego kod nie działa w takiej sytuacji. Miałem takie problemy z testowaniem własnego kodu po wrzucaniu do ram lub flash naprzemiennie, niestety nie dotarłem do przyczyny i sobie darowałem. Płytka to olimexino stm32 z STM32F103RBT6. Zasadniczo wszystko ma swoje źródło w tablicy wektorów, znajdującej się w pamięci...
Generalnie wszystkie operacje jakie robisz w przerwaniach są jak dla mnie zbędne. 1. Wyłączasz to samo SPI w obydwóch przerwaniach... po co? Przecież może sobie zostać włączone. Gdy jest wyłączone np mogą się pojawiać niechciane stany na pinach zegara czy CSa. 2. Wyłączasz kanał DMA, choć on się wyłącza sam. 3. Kasujesz flagi, choć one kasują się same....
Po długiej przerwie wracam do tematu bootloadera. Zrobiłem nowy projekt w Eclipse z pomocą tutoriala Freddiego i na podstawie projektu bootloadera z EP. Połączyłem projekt stm32_blink_led z plikami bootloadera wykorzystując makefile, startup i .ld z projektu Freddiego. Udało się uruchomić i debugować aplikacje bootloadera. W załączniku połączone projekty...
Witam! Eclipse Kepler Sourcery CodeBench Lite 2011.09-69 OpenOCD 0.6.1 STM32F103ZET6 Szablon projektu - Freddie Chopin Do tej pory wszystkie projekty na STM32 działały dobrze jednak teraz buduję większa aplikację i pojawiają się problemy. Objawia się to losową zmianą wartości zmiennych np. zadeklarowanych jako const czy przerwaniem __Default_Handler....
Ściągnij sobie darmowe przykłady do mojej ksiażki o LCD-TFT w darmowych przykładach nie ma ssd1289 1. Niepotrzebne memcpy z tablicy AsciiLib do buffer. wystarczy użyć wskaźnika. Wiem, że wskaźnik byłby lepszy ale nie czuje/rozumiem na tyle dobrze wskaźniki w tablicach wielowymiarowych . Mimo to udało się ale wciąż widzę to za mglą. 2. Niepotrzebne...
stm32 tablica tablica wskaźnik stm32 wskaźnik
ładowarka balanser linki filmy mixer yamaha opinie
różnicówka indukcja wkład kominowy
Płyn chłodzący w kolektorze wydechowym traktora - przyczyny Instrukcja obsługi pralki Ariston Margherita AL848TX