No, z przerwaniami to już masz program wykonujący wiele zadań jednocześnie - nie wiadomo, w którym momencie w gpsread starą jego wartość do 128 - a więc w następnym przerwaniu możesz wpisać do gpsread[128] - poza zakresem? A lepiej pisać if (++wpp >= sizeof gpsread) wpp = 0; - jak potem zmienisz rozmiar gpsread, to nadal będzie dobrze.
Witam Mam pewien problem - obstawiam że banalny ale nie mogę znaleść rozwiązania od 2 dni ;-( Otóż mam czujnika MEMS z którego zbieram dane (najlepiej ok 256 pomiarów z jednej osi) i chcę je wgrać na kartę SD. Niestety coś jest nie tak bo nie działa to dobrze. tzn działa gdy danych jest mało np: MEMS1_to_SDCard (50) oraz char tText_x[500]; natomiast...
Przy okazji walki z "magicznymi cyframi" - zapewne korciło Cię (może nawet tak zrobiłeś) żeby do funkcji podać rozmiar "4", natomiast o wiele lepszym rozwiązaniem jest napisać "sizeof (nazwa_twojej_zmiennej)". 4\/3!!
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
A nie prościej jak człowiek rozmiar przekazać jako argument, którym mógłby być sizeof?
(at)dziechu poczytaj co robi operator sizeof zamiast grzebać w rejestrach Ale przecież po inicjalizacji natępuje prawidłowe jednokrotne kopiowanie wg. sizeof.
[syntax=c]void MIDImessage(byte command, byte data1, byte data2) { uint8_t data[3]; data[0] = command; data[1] = data1; data[2] = data2; HAL_UART_Transmit_IT(&huart2, data, sizeof(data)); }[/syntax] Pamiętaj transmisja jest wykonywana w tle.
[syntax=c] int i; int suma_af = 0; const unsigned char * p = (const unsigned char *)&data for (i = 0; i < sizeof(my_type)l i++) { suma_af += p[i]; } [/syntax] Zakładam, że struktura jest upakowna ;)
Moze popatrz na to tak: Edit: lepszy sposob liczenia sz [syntax=c] const uint32_t *p = (const uint32_t *)data; const size_t sz = (ileśtam + 3) / 4; arrr = 0; for (i = 0; i < sz; i++) { BOOT_Save_32B((BASE_ADDRESS+ addr), p[i])); addr+= sizeof(uint32_t); } [/syntax] Zapisuje sie naraz 4 bajty.
Sprawdź najpierw pochodzenie tego zera. Najlepiej w terminalu jak Ci pisałem. Moje podejrzenie jest takie, że jak wysyłałeś przez putst() było OK, bo on eliminował zero na końcu Twojego "stringa" char dataBuff wychodząc z funkcji. To zero pojawia się w tablicy niejawnie, ale tam jest. Gdy uruchamiasz DMA nie bierzesz pod uwagę, że tablica ma rozmiar...
tprs->child = (struct TPARSER**)malloc (sizeof(TPARSER)); //dynamiczna allokacja pamieci To jest chyba źle, alokujesz rozmiar pamięci o wymiarach sizeof(TPARSER) a potem pod te wskaźniki dajesz znów malloc, nie powinno być coś w stylu?: tprs->child = (struct TPARSER**)malloc (sizeof(TPARSER*)*ElementsOfTab);
W moim przypadku to wygląda tak, że mam wypracowaną własną warstwę abstrakcji sprzętu. Przykładowo do SPI jest maszyna stanów co mieli strumień bajtów danych + nagłówek z kolejek (typu FIFO jako bufor cykliczny). Pod to callbacki do sprzętu (open, write, read, close, ioctl), i rybka czy w środku jest if (queue) wyslij czy na przerwaniach. Nagłówek zawiera...
[syntax=c]#include <string.h> ... memcpy(¤tFont, Font, sizeof(currentFont));[/syntax] Tak czy siak nie jest to kopiowanie do niczego potrzebne - wystarczy sobie gdzieś zapisać wartość Font (wskaźnik) i tego używać zamiast currentFont.
Zastanów się dobrze czego rozmiar tak naprawdę podajesz. [syntax=c]DMA2_Channel1->CNDTR = sizeof(dst_buf); //Buffor size :[/syntax]
Czasem Arduino do czegoś się przyda Dodano po 2 Możesz dać przykład takiej krytycznej czasowo operacji? Problem jest a raczej był związany z buforem nadawczym uarta. Mam funkcję: Blokuj tylko przerwania od UART.
Dobra, to ja się podczepię: odpaliłem w końcu semihosting, natomiast nie bardzo wiem, co zrobić ze skryptem linkera - bo nie do końca łapię pewne rzeczy: /* Linker script to place sections and symbol values. Should be used together * with other linker script that defines memory regions FLASH and RAM. * It references following symbols, which must be...
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...
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;...
nie no - sizeof() podaje rozmiar tablicy, ale nie zawsze. Jeśli tablica jest "widoczna" dla tego sizeof'a (czyli np. jest globalna w tym właśnie pliku, lokalna w tej właśnie funkcji), nie jest tylko wskaźnikiem na tablicę itd. to sizeof zwróci rozmiar tablicy w bajtach. [syntax=C]int tablica[] = {0, 1, 2, 3, 4}; extern int tablica_globalna_z_innego_pliku[];...
Niestety dalej hard fault. Na tej funkcji na pierwszym LWIP_DEBUGF. Hard fault występuje na drugim wywołaniu tej funkcji. [syntax=c]struct pbuf * pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type) { struct pbuf *p, *q, *r; u16_t offset; s32_t rem_len; /* remaining length */ LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F")\n",...
Po co ten cały dziwny kod w callbackach. Przesuwanie bitowe w prawo liczby ze znakiem jest niesprecyzowane przez C (implementation definded behaviour) a Ty po prostu chesz skopiować dane z jednej tablicy do drugiej. Uzyj memcpy memcpy(txBuf, rxBuf, 4 * sizeof(*txBuf)); /* i */ memcpy(txBuf + 4, rxBuf + 4, 4 * sizeof(*txBuf));...
Poprawiłem adres na 0x20 i próbuje użyć funkcji HAL_I2C_Mem_Write() i HAL_I2C_Mem_Read(), aby sprawdzić czy dobrze przesyłam dane, ale podczas debugowania wyświetla się problem, który staram się naprawić. https://obrazki.elektroda.pl/8895164800_... Jako test chciałem napisać to w taki sposób: uint8_t test = 0x11; // 0b00010001 HAL_I2C_Mem_Write(&hi2c1,...
Udalo mi sie napisac dzialajaca bibloteke. Problem byl jedynie z obsluga urzadzenie, jego statusu, configu. Jednak dla mnie to nie byl maly problem i ciesze sie ze w koncu to rozwiazalem. Oto kod i krotki film: https://filmy.elektroda.pl/51_1352475444...
Tak to ja, dołączam kod - main.c: [syntax=c]#include "main.h" #include "fatfs.h" SPI_HandleTypeDef hspi2; TIM_HandleTypeDef htim2; UART_HandleTypeDef huart2; void send_string(char* s) { HAL_UART_Transmit(&huart2, (uint8_t*)s, strlen(s), 1000); } volatile uint16_t Timer1=0; uint8_t sect[512]; //char buffer1[512] ="Selection of VAM is set by the previous...
Freddie ja się w całości z tobą zgadzam. Jednak prostu uart i2c coś prościutkiego gdzie jednak pokazane jest ze to C++ a nie C napisany z C++. Od dłuższego czasu wspierasz C++ z czym się zgadzam ale dla większości ludzi uwierzyć znaczy zobaczyć........... Trzeba by to przemyśleć (razem z aktualizacją przykładów), tylko ten brak czasu... Ehh... Ale...
Wielkie dzięki za projekt. Trochę czasu mi zajęło zanim się za niego zabrałem - pełno projektów na uczelni. Wielkie dzięki jeszcze raz! Przystosowałem projekt do swoich wcześniejszych wypocin ale dostaje dziwne błędy: uip\fs.o:(.rodata.file_404_html+0x0): multiple definition of `file_404_html' uip\fsdata.o:(.rodata.file_404_html+0x0)... first defined...
Ok, z niechęcią pokażę jeszcze trochę kodu. Od razu wyjaśniam - ten kod to tylko taka tymczasowa partyzantka celem sprawdzenia i wykrycia takich sytuacji jak ta powyższa. Docelowo to będzie zupełnie inaczej zorganizowane. Dane są zbierane do RAMu przy pomocy DMA do podstawy 5-5ms/kratkę. Powyżej już są wyświetlane na bieżąco. Niemniej w obu przypadkach...
Zaraz, zaraz. Trzeci krasnoludek to tablica globalna. Pierwszy - GPS nadaje ciągle w f = 1Hz, chyba, że masz na myśli coś innego. A drugi - z tego co zrozumiałem o DMA, to linia DMA_InitStructure.DMA_BufferSize = (uint16_t)sizeof(buf) - 1; powinna załatwić sprawę, tzn. po wysłaniu 99 znaków DMA skończy pracę. Ale nie wiem czy dobrze zrozumiałem DMA,...
Moim zdaniem użycie tutaj TCP jest błędem i powinieneś użyć UDP. Kto o zdrowych zmysłach otwiera połączenie TCP "forever"? P.S. Jakie jest "sizeof(Dev2PcState)" ? Jaka jest długość bufora ramki TCP? Co z retransmisją pakietów niedostarczonych? Tylko że TCP daje mi to że mam potwierdzenia(ack), a UDP nie działa tak że mogę coś zgubić ? Połączenie otwieram...
Ostatnio często korzystam z FatFS ale na procku 2148 (pisze w C++ w Eclipse). Myśle że prawie na 100% powinna ta funkcja wygladać tak: f_write(&file,tmp,sizeof(tmp)... poza tym zmienna "x" chyba powinna być typu unsigned int; przynajmniej u mnie tak to wyglada i zawsze jest oki
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...
No więc reasumując - jeśli element i tablica będą miały taki sam typ, to pomiędzy nimi kompilator na 100% niczego nie umieści. W przeciwnym wypadku może (ale nie musi) być tam "dziura". Dodano po 15 Jak można się wskaźnikiem poruszać wewnątrz struktury po komórkach tablicy ? Jak to napisać ? W sposób "zgodny ze sztuką" nie jest to możliwe. Można za...
Mam problem z inicjalizacją UARTA. Otóż kod działa na portach PA9,PA10 lub PC4,PC5. Jednak gdy zmieniam na PB6, PB7 komp nie otrzymuje danych wysyłanych przez płytkę. Może źle to robię, ale według specyfikacji to na te porty można wyprowadzić USART1, więc nie wiem o co chodzi, a jeszcze raczkuje w temacie STM32. [syntax=c]#ifndef _USART_C_ #define _USART_C_...
tymon z takim zapisem bym uważał, bo kolega kaczor jest początkujący i może uznać, iż on działa zawsze :) [syntax=c]#define MAX_ARRAY(array) ((sizeof(array))/(sizeof(array[0])))[/sy... Ja może wyjaśnię czemu void * jest przekazywany do funkcji i zeń też zwracany. Jest to chyba jedyny sposób na zachowanie uniwersalności takich funkcji bo można włożyć...
Optimized CRC-8-CCITT calculation. Zapomnieli tylko dopisać, że "optimized for small size", bo na pewno nie zoptymalizowany pod względem wydajności czy wygody używania. Do generowania kodu liczącego różne CRC polecam po prostu https://pycrc.org/ . Jak ktoś chce kod który jest szybki, to wybiera algorytm "table driven" - tablica o wielkości `sizeof(crc_t)...
Witam, chciałbym zrobić projekt w postaci pianina na mikrokontrolerze. Posiadam kontroler midi Behringer SWING, którego podłączam do mikrokontrolera STM32-Nucleo-F303RE z nakładką midi (MIDI OUT na klawiaturze do MIDI IN na nakładce). Klawiatura midi jest zasilona za pomocą usb z komputera. Chciałbym prosić o pomoc w przesłaniu sygnału midi z klawiatury...
Witam, Program jak poniżej w debuggerze zaiwesza się już na lini f_open. W momencie gdy zakomentuje linie z buforem BYTE buffer[256] program rusza i otwiera plik. Również gdy zmniejsze rozmiar tablicy np do 20 to program też przechodzi dalej i fresult zwraca FR_OK. Czym to może być spowodowane ? [syntax=c]#include "stm32f10x.h" #include "stm32f10x_gpio.h"...
w załączniku archiwum z kilkoma ciekawymi plikami dla STM32F0. 1. Cortex-M0.ld oraz STM32F051x8.ld Skrypty linkera - w projekcie używać należy bezpośrednio tylko tego drugiego, który zaś w środku dołącza ten pierwszy. Podział spowodowany jest tym, że "mapa" pamięci generalnie jest wspólna, więc wszystkie takie rzeczy są w tym Cortex-M0.ld, zaś w tym...
(at)marycyś No to przecież dałem Ci gotową funkcję. Dla Twojej tablicy to prostu wywołaj Dodano po 10 PS. Nie pisz na priv tylko tutaj. Nie wiem co znaczy [syntax=c]A jak zapisać Twoje: writeF(Page_127, Tablica, sizeof(Tablica)); w podobnym stylu jak tu?: *(__IO uint16_t*)(Page_127 + i) = (uint16_t*)&Rozum[0][0]; U mnie Eclipse zgłasza niechęć gdy...
Usiłuje uruchomi DMA tak aby zgłaszało mi przerwanie (na początku może by po zakończeniu transferu) Timer wyzwalający mam już skonfigurowany [syntax=c] TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; /* USER CODE BEGIN TIM1_Init 1 */ /* USER CODE END TIM1_Init 1 */ htim1.Instance = TIM1; htim1.Init.Prescaler...
Możliwe przyczyny: skrypt linkera, stos itd. "program idzie z RAM-u", a w programie mamy wymuszenie tablicy adresów wyjątków spod adresu 0. Parę innych kwiatków też tam jest, np. żmudne wisywanie do rejetrów ich domyślnej zawartości. No i to mnie rozwaliło: memset(&sys_timer.flaga, NIE, sizeof(sys_timer.flaga)); - ileż się trzeba namęczyć, żeby wyzerować...
Panowie, teraz pewna partia wprowadziła modę na rybę, nie wędkę - popłyńmy na myśli prezesa. Gotowiec: działają tak choćby karty SD, pamięci Flash czy EEPROMy - jak to się wtedy ma do Twojej koncepcji, bo tak się składa, że z punktu widzenia mastera coś musisz jednak nadać żeby cokolwiek odebrać... Nie ten procek, co go autor ma, ale ficzer przydatny,...
Dzięki Panowie za szybką odpowiedź :) bonczi7 LinkDriver użyłem niestety nic nie dało :( Marek_Skalski - nigdzie nie znalazłem nic na temat uruchamiania LSE do SD, a myślę że o SD przejrzałem cały User Manual od HAL jednak dla pewności uruchomiłem LSE jednak problem pozostał :( załączam zdjęcia po uruchomieniu LSE, Dla pewności użyłem programu od HAL-a...
Witam, mam problem z komunikacją po 1-Wire, termometr DS18S20 odpowiada mi na sygnał reset jednak nie wysyła danych, odczytuje cały czas z magistrali 0xFF. - Termometr działa na 100% - mam inną płytkę z ATmegą 32 w której go sprawdzam - i tam działa wszystko bez problemowo, Oto kluczowe fragmenty mojego kodu: [syntax=cpp] #define SYS_CLK 8000000 //...
No i pojawił mi się następny, gorszy problem (tamten został już rozwiązany). Otóż okazuje się, że w momencie kiedy użyję gdziekolwiek w programie funkcji malloc wynikowy wsad jest kompletnie niepoprawny pomimo iż kompilator nie zgłasza żadnych błędów. Program automatycznie się zawiesza, nie zostaje wykonana nawet choćby jedna linijka z funkcji main()....
[syntax=c]double* xcorr_table = malloc(Na*Ma*sizeof(double));[/syntax]
Jak chcesz wysyłać kilka zmiennych o różnych rozmiarach, to zrób strukturę. Ja mam np taką [syntax=c] struct CfgEEiic { uint32_t crc; // crc musi byc pierwszom zmienna w strukturze uint32_t CntWrite; uint32_t CntRst; uint16_t szt; uint32_t total; char txt[16]; }; struct CfgEEiic Cfg; [/syntax] Później wysyłasz tą strukturę przekazując adres i rozmiar...
Oczywiście mój przykład odnosi się do sytuacji prostych. Narzut w zależności od platformy jest mały i może wynosić zaledwie sizeof(void*) bajtów. Oczywiście jest tak jak piszesz, że alokator zazwyczaj zwraca blok co najmniej tak duży jak żądany, ale zwykle większy. Natomiast tkie śledzenie nie bardzo w ogóle ma sens - co z tego, że sprawdziłeś, że masz...
if((*tmp_ptr1)->content == NULL) { *tmp_ptr1 = NULL; Wg mnie w tym miejscu masz wyciek pamięci. Ile wynosi MAX_MSG_SIZE? Może po prostu przepełniasz stos? Zwiększ sobie go dwukrotnie to sprawdzisz czy w tym problem. Przy okazji - mógłbyś nieco uprościć i zoptymalizować alokację - nie ma potrzeby robić dwóch osobnych alokacji (na strukturę i na bufor)...
Tu masz przykład DMA. Zrobione na szybko. Po przesłaniu dowolnej liczby znaków DMA się wyłącza. [syntax=c]void init_usart( void ) { RCC->APB1ENR |= RCC_APB1ENR_USART2EN; RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; RCC->AHB1ENR |= RCC_AHB1ENR_DMA1EN; gpio_pin_cfg( GPIOA, 2, GPIO_AF7_PP_50MHz_PULL_UP ); gpio_pin_cfg( GPIOA, 3, GPIO_AF7_PP_50MHz_PULL_UP ); USART2->BRR...
sizeof struct stm32 sizeof tablica stm32 f103rb
chiński telefon naprawa samsung moduł silnika podgrzewane lusterka samochodzie
Eagle PCB – zmiana szerokości ścieżek ignorowana przez program, Net Classes i DRC Jak zdjąć simlock z telefonu Swisstone BBM625?