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...
Jak chcesz gotowca, to wykorzystałem takie coś w projekcie LED Cube ( to co ciebie interesuje jest w 16 minucie ): Czyli wpisując znak "C" komputer robi takie obliczenie (67-65)*5 = 10, czyli automatycznie przesuwa wskaźnik tablicy na 10 miejsce, czyli na pierwszą kolumnę litery C. Następnie zmienna "i" wyświetla następne kolumny. Jakbyś miał jakieś...
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,...
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...
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...
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ę...
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...
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 ?
- 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!!
... 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])...
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.
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 =...
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.
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ą...
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...
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).
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...
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...
(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",...
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.
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...
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...
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ć...
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ć.
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...
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"...
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...
Myślałem żeby załaczyć Ci mój projekt ale - 1. jest komercyjny 2. jest zbyt myślę złożony Tak że na szybko sama idea - jest to zrobione w 5 minut i skrypt linkera powinno sie przerobic lepiej. Funkcje też są do kitu - bo parametry trzeba przekazywać wskaznikiem do nich) wtedy nie jesteś ograniczony ich ilościa itd itd. Nie jest to reentrant i bezpieczne....
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: Temat wydzieliłem, ponieważ nie ma nic wspólnego z poprzednim.
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")));...
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....
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...
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...
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...
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,...
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....
tablica wskaźników obiekty tablica wskaźników polonez stm32 tablica
volvo silnika odbiornik superreakcyjny prąd rozruchowy silnik
pilot bramy zasięg odbiornik superreakcyjny
Manetka e-bike Giant działa niestabilnie: przyczyny i rozwiązania Odpowietrzanie pompy ABS w Suzuki - instrukcja