Standard C nic nie mówi o kolejności zmiennynch w pamięci. Przyzwoity kompilator i linker będzie rozmieszczał dane w kolejności malejącego rozmiaru, a nieupywane będzei eliminował całkowicie. Chcesz mień znany rozkład danych - użyj struktury - kompilator nie ma prawa jej zoptymalizować, ale będzei stosował wyrównanie naturalne, czyli np. int32_t będzie...
Możesz zrobić to np. tak: [syntax=c] typedef __packed struct { uint8_t byte_1 :8; uint8_t byte_2 :8; uint8_t byte_3 :8; uint8_t byte_4 :8; }ftobytes_t; float dana; ftobytes_t *zapis; zapis=(ftobytes_t*)(&dana); eeproma=zapis->byte_1; eepromb=zapis->byte_2; eepromc=zapis->byte_3; eepromd=zapis->byte_4; [/syntax] Ja opierałem się na kompilatorze RelView...
jak to zrobić aby te dane znajdowały się w drugiej połowie 128kB flash i zaczynały się dokładnie od początku drugiego 64kB?. A po co Ci takie coś? Adres wgranych danych możesz sobie pobrać ze wspomnianych symboli, nie musi to być więc jakaś stała wartość. No chyba że chodzi Ci o to, żeby dane nie zostały nigdy skasowane podczas wgrywania nowej wersji....
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...
Zmieniając łańcuch wywołań zmieniasz zużycie stosu. Coś mi świta, że kiedyś ktoś pisał coś o FreeRTOSie który jednak NIE wyrównywał sobie stosów do 8... Heap chyba też musi być do 8 wyrównany, bo przecież chyba właśnie na nim są stosy dla tasków... No generalnie pogoogluj, to powinieneś znaleźć - na 99% problemem jest wyrównanie, więc to jest hasło...
Przecież pisałem na początku, aby odpowiednim atrybutem wyrównywać bajtowe tablice do 32bitów. Nie wszystko da się zawsze wyrównać, dostęp od początku danych nie ma problemu, ale jak dostęp jest do danych gdzieś np ze środka tablicy to już tego nie wyrównasz. Można napisać własną funkcje kopiującą która sprawdza wyrównanie i w razie czego niewyrównane...
Dziękuję za pomoc. Mnie nie szkodzi włączenie jednego bitu, więc mogę dopisać na starcie i faktycznie nie będzie kłopotu. Mogę Cię prosić o jeszcze takie coś, bo nie mogę tego zrozumieć i może mi pomożesz. 1. Co będzie jak nie wyrównam stosu, kiedy natknę się na problem? 2. Jeśli procesor odkłada coś na stos co co ile jest adres jego zwiększany? I jeśli...
gaskoin - pytam dlatego, bo gdzieś kiedyś czytałem że w procesorach 32 bitowych dla każdego char itp. kompilator i tak rezerwuje całą komórkę 32 bit, nie używając po prostu reszty. Z tego wynika że adresowane są nie słowa 32 bit, ale pojedyńcze bajty, jeżeli dobrze rozumiem? Adresować możesz poszczególne bajty, a korzystając z bitbandingu - w ograniczonym...
Problem to jest taki, że keil nie spełnia standardów języka C dotyczących kilku całkiem istotnych spraw. Jeśli kod o którym mówisz jest tym samym o którym myślę (nie chce mi się ściągać 14MB, bo pewnie wrzuciłeś tam pliki bin, elf i nie wiadomo jakie jeszcze zupełnie nie potrzebne do niczego) to w kodzie Keila jest mnóstwo operacji typu: Według mnie...
A najlepiej połączyć strukturę z sekcją. Wtedy już jest zupełnie łatwe. Nie ma tu się czego uczyć więc to nie argument :D (obsługuje się jak zwykłe zmienne) Tylko w tej sekcji trzeba by wymusić dostęp jedynie z wyrównaniem do 4. Jak to wymusić nie wiem, ale na pewno się da.
Twój układ się wykrzacza. Przy używaniu funkcji variadic (ze zmienną liczą argumentów) KONIECZNE jest wyrównanie WSZYSTKICH stosów do 8. Poza tym w tej funkcji jest na stosie sporo zmiennych, przede wszystkim ten 100bajtowy bufor. To też może być problemem jeśli pamięć się kończy. 4\/3!!
Wiesz że dane zapisane w ten sposób zajmują 2x lub 3x więcej pamięci flash niż rozmiar struktury? Chodzi o wyrównanie Flasha do 4 bajtów? Próbowałem zapisać rzutując na int a nie char i dać size jako: [syntax=c] int size = sizeof(EEPROM_Data)/sizeof(int); [/syntax] I zapisywać do Flasha po 4 bajty ale nie działało. Dostawałem śmieci. [/quote]
Ok, nie zauważyłem tego v7-M. Racja. Ale dalej nie rozumiem, co dobrego robi __interrupt. Ew nie rozumiem, z jakiego powodu Twój kompilator bez __interrupt zapamiętuje rejestry, których nie musi zapamiętywać (bo przy wyjątku zrobi to procesor, a w innym przypadku - procedura wołająca). Aha, już wiem, co robi dodatkowy kod u mnie - to, o czym piszą w...
A dla czego? Pamiętam, że jak kiedyś przygotowywałem strukturę która miała różnej wielkości zmienne (1, 2 i 4 bajtowe), to przy wysyłce struktury nie były ułożone dokładnie jedne za 2 gimi tylko miały wyrównanie do 32 bitów. Ale to może kwestia kompilatora. Robiłem to w uvision. Jestem tak blisko uruchomienia, a nie mogę sobie poradzić... Usunąłem więc...
michalko12 napisał: uint32_t *_fb = (uint32_t*)((uint32_t)fb & 0x03); Ta linia wcale nie robi tego co oczekujecie. Robi coś dokładnie odwrotnego. No masz rację, dla mnie już późnawo było i już kiepsko wczoraj myślałem. Nawet jak to poprawicie, to kod ten _NIE_ jest poprawny, ponieważ w pewnych wypadkach będzie on pisał poza danymi z tego całego "fb",...
to nie wiem jak jest pod STM-owymi ARM-ami, ale na większości (jeśli nie wszystkichi) nie 8-bitowych platformach, taka struktura wyrówna swoje membersy do granicy słowa platformy/rozmiaru adresowania, więc będzie dziura między nimi. Chyba, że się wyłączy lub wyspecyfikuje konkretny packing/aling. A niby czemu miałaby to zrobić, skoro tablica i pojedynczy...
chodzi o ALIGN ? Dokładnie, chodzi o ALIGN, ale nie tylko, bo generalnie ALIGNem wyrównujesz początek, a chodzi o wyrównanie końca... <: Wszystko zależy od konkretnej konstrukcji skryptu linkera i startupa... Zobacz jak to jest zrobione w moich przykładach (stm32). jaką flage trzeba dodać, aby kompilator ignorował przypisywanie do samego siebie?...
(at)szelus Wiekszość startupów ma ten sam adres obłsugi tych wyjątków. Dlatego nazwą się nie sugeruj o ile nie zostały napisane ich handlery Nie wiem jak za bardzo działa "Instrution Stepping Mode", Nie. Normalnie wykonuje to na uC Macie pomysł co może być winą albo jak dojść do problemu? 1. Jeżeli masz zainstalowany Atolloc albo CubeIDE to znajdź...
To da się bardzo prosto zrobić z przerwaniem od zbocza: - przerwanie od zbocza blokuje przerwanie od zbocza i uruchamia timer w trybie one shot, - przerwanie timera włącza przerwanie od zbocza. Jak widać wystarczy dedykowany timer i dwa przerwania i już można obsługiwać przycisk przerwaniem od zbocza. Zamiast dedykowanego timera może być programowy...
Macie może pomysł na zautomatyzowanie tworzenia nagłówka ? No generalnie ciężko... myślę że nad skryptem spędziłbyś tyle czasu co robiąc to "pół-automatycznie". Do tego taki skrypt działałby tylko na nagłówkach od danego producenta, bo np NXP w nagłówku dla LPC17xx nie ma definicji bitów w ogóle, więc tylko manual. Mogłbyś Freddie cos wiecej napisać...
Nie zwykłem używać tych funkcji bibliotecznych jako że zaciemniają widok na zawartość rejestrów. Jak widzisz, identyfikator który wpisałeś jest wyrównany do prawej, podczas gdy według [url=http://www.st.com/stonline/products... powinien być wyrównany do lewej. Dokładne informacje znajdziesz w RM0008; bxCAN; 23.7.4 Identifier...
Stos "w każdym momencie" musi być wyrównany do 8 bajtów. Czemu do 8 a nie do 4?
Witam Mam mały problem z odczytem ramu IS61LV25616AL, ram jako 16 bitowy 10ns, ustawienia Stm32F2 120Mhz Bank3 is enabled: BCR3_MBKEN bit set to ‘1’ Memory type is SRAM: BCR3_MTYP is set to ‘00’ to select the SRAM memory type Databus width is 16 bits: BCR3_MWID is set to ‘01’ to select the 16-bit width The memory...
Co do stosu to nie jestem pewien. Wziąłem ten skrypt linkera: https://github.com/PaxInstruments/STM32C... Widzę tam tylko: _Min_Stack_Size = 0x400;; /* required amount of stack */ Czy rozmiar stosu jest jeszcze gdzieś indziej? Bo...
Z kolei modyfikacja skryptu linkera ma tą wadę, że jeśli przeniosę kod na inny MCU to znowu bedę musiał ten skrypt modyfikować. Emulacja oparta na czystm C po prostu zadziała. No... bo każdy mikrokontroler ma dokładnie ten sam rozmiar strony i dokładnie ten sam kontroler pamięci, więc z pewnością zadziała Ci ten kod bez żadnych zmian... Ehe... Kupę,...
Prawdopodobnie adres przekazywany w argumencie src jest nieparzysty. Zadeklaruj bufor danych, które chcesz zapisać w pamięci jako wektor uint16_t albo unię uint16_t i uint8_t, ew wymuś wyrównanie przez _Alignas.
O rozmiar stosu, bo printf to lekko licząc zwykle sobie zajmuje z 750B. No i jeszcze dochodzi wyrównanie stosu do 8, co również może być czasem problemem przy printf(), choć tutaj akurat nie. Proponuję na początek zamiast printf() stosować iprintf(), bo raczej żadnych zmiennoprzecinkowych liczb nie będziesz używał w takim zastosowaniu. 4\/3!!
Chciałbym zmierzyć napięcie na końcówce VBAT w STM32F427. VBAT jest podłączone wewnętrznie do kanału 18 ADC1. Napięcie VBAT jest za pomocą wewnętrznego dzielnika napięcia dzielone przez 4. Na potrzeby testów zamiast baterii podłączyłem potencjometr: skrajne końcówki do zasilania, ślizgacz do VBAT. Ogólnie ADC działa, odczytywana wartość zmienia się...
Wskaźniki są 32 bitowe, wystarczy spojrzeć do jakiegokolwiek manuala jak adresowana jest pamięć. http://www.st.com/web/en/resource/techni... Żeby dostać się pod dowolny adres wystarczy [syntax=c] uint8_t* wskaznik = (uint8_t*)(0xADRESS_KOMÓRKI); [/syntax] i potem [syntax=c] *wskaznik = zapis; odczyt = *wskaznik;...
Do CCM dostęp ma tylko procek. Więc jakby to było możliwe chętnie bym tam zasadził stosy. Dzięki ze info. Tylko pytanie co do sekcji bo tworzenie ich jest dla mnie jak na razie czarną magią. Już znalazłem część sections w linkerze i podejrzewam że tam powinienem zrobić swoją własną sekcje tylko jak. .bss : { . = ALIGN(4); __bss_start...
Niedawno stoczyliśmy z Freddiem potyczkę, w wyniku której wyszło, że w niektórych Cortexach STM nie jest włączone domyślnie wyrównanie stosu przy wyjątkach, i z tego powodu procedury obsługi przerwań powinny być na nich deklarowane z atrybutem interrupt. Nie wiem, czy dotyczy to również M4F. Co prawda w takim przypadku problem byłby przy wywołaniu innej...
Czyżby? Czy dla AVR ktokolwiek przejmuje się skryptami linkera, startupem, tablicą wektorów i Makefilem? Przecież dla tej platformy jest DOKŁADNIE TAK SAMO jak dla ARM, a jakoś nikomu nawet na myśl nie przyjdzie zajmować się tymi plikami - każdy korzysta z gotowców zawartych w pakiecie avr-gcc. Te pliki tam fizycznie są, nikt nie zajmuje się tym jak...
Ja bym się tam nie poddawał. Jeśli nie działa Ci printf() z floatami, to - jak pisałem - jest spora szansa, że w projekcie masz poważny problem związany z wyrównaniem stosów. Zignorujesz semihosting to w końcu trafisz na inny objaw tego samego, nierozwiązanego problemu. W każdym razie problem z wyrównaniem stosów objawia się też tak, że czasem takie...
Po kilkunastogodzinnych zmaganiach z wyrzucaniem programu do Default Handler Dzieje się to dlatego, że: 1. modyfikujesz stos, choć nie informujesz o tym kompilatora w sekcji "clobber" Twoich dyrektyw, 2. zostawiasz stos niewyrównany do 8 (na niektórych rdzeniach to nie jest problem, w sumie z STM32 domyślnie to jest problem chyba tylko na F1). Efekt...
Podsumowując... Loader umieszczony jest we flash od adresu 0 i nie ma od tego odstępstw. Aplikacja umieszczona jest pod dowolnym adresem we flash z wyrównaniem do 512. Żadne biblioteki nie maja kodu na stałe przypisanego pod konkretny adres, nawet SPL, wszystkie startupy i tak zależą od linkera, no chyba, że ktoś sobie coś udziwił i coś na stałe przypisał....
Co do konfiguracji PLL to nie wiem bo u mnie kodek był masterem i nie potrzebowałem konfigurować PLL. Możesz wymusić wyrównanie bufora przez: [syntax=c] __attribute__ ((aligned(4))) [/syntax] Na stm32f1 na pewno jest problem z DMA i SDIO w przypadku niewyrównanych buforów do 4. Ten bug jest o tyle nieprzyjemny, że w przypadku dużych transferów z/do...
1. Konfiguracja kanału DMA1_Stream1, ale bez włączania go. 2. Konfiguracja multipleksera DMAMUX1_Channel1 i tutaj chyba trochę brakuje. Sprawdziłbym jeszcze ustawienia pozostałych bitów z rejestru. 3. Włączenie DMA1_Stream1 poprzez: DMA1_Stream1->CR = DMA_SxCR_EN; 4. Włączenie żądania transferów DMA z UART poprzez UART4->CR3 = USART_CR3_DMAT; Jak wygląda...
mi nie chodziło o rozmiar elementy tablicy,tylko połozenie w pamięci (wyrównanie). Chodziło mi o liczbe transferów do wykonania - czy sie zmieniła po odpaleniu.
Zakładając, że nigdzie w skrypcie linkera nie masz dyrektyw ALIGN(), to zapewne jest to narzucone przez model pamięci i/lub algorytm programowania w OpenOCD. Możesz ewentualnie spróbować wprowadzić w tej sekcji wyrównanie do bajta (ALIGN(1)), jednak nie wiem czy coś to da, a istnieje pewne szansa, że zaszkodzi... W każdym razie jeśli masz uint32_t i...
Jeśli zapis pod 0x40006000 zmienia wartości pod Może adresowanie tej pamięci od strony CPU jest co drugie słowo 16b , tj. ADDR0_TX jest pod adresem 0x40006000, a COUNT0_TX jest pod adresem 0x40006004? Zastanawia mnie tylko, na ile sposobów vendor spierniczył dostęp do tych adresów, bo może tylko busmaster CPU jest dotknięty zarazą, a np. transfer DMA...
Cześć, Pozwolę sobie oszczędzić trochę czasu innym, którzy spotkają się z tym problemem. Nie wiem jak wygląda sprawa ze starszymi mikrokontrolerami, ale w F7 rozwiązano problem odwróconej kolejności bitów, rejestry modułu CRC pozwalają na ustawienie sprzętowego odwrócenia bitów i bajtów. Przykład konfiguracji pod CRC32[zip, itp] dla biblioteki HAL:...
Gdzieś to już słyszałem ;) https://www.elektroda.pl/rtvforum/viewto... Strona 32 defrost czyli rozmrażanie. https://planetaklimata.com.ua/instr/Tosh... Zebrali się chłopaki, dyskutowali, ale do konkretów nie doszli, a część nawet nie załapała o jakie ciśnienie chodziło....
Przecież ten wyświetlacz pozwala zapalić i zgasić dowolny pixel. Tylko, że ram X adresujesz co 8 bitów, czyli na raz operujesz 8 pikselami. Jeżeli wyświetlacz ma w X 400 pikseli, to adresy w ram są od 0 do 49. Nie musisz się też ograniczać do znaków o szerokości będącej wielokrotnością 8 bitów. Możesz rozważyć drukowanie znaków proporcjonalnych do...
Wydaje mi się, iż jest to spowodowane tym, że to 16 bitowy timer taktuje DMA Niet :) Reference manual, opis rejestrów GPIO: The peripheral registers have to be accessed by words (32-bit). Dalej rozdział o "rozmiarach i wyrównaniach" danych DMA: Addressing an AHB peripheral that does not support byte or halfword write operations Czyli dokładnie to co...
Wyrównanie stosujesz domyślnie dla każdej sekcji ? Czy tylko .text ? Aktualnie stosuję dla wszystkich które lądują w takiej lub innej formie we flash i zawierają kod. Natrafiłes na podobny problem czy dałeś wyrównanie profilaktycznie ? W commicie jest to opisane - obiekt z odpowiednio dużym wyrównaniem potrafił sprawić, że kod przestawał działać prawidłowo,...
Witam Ja zapisuje i odczytuje też przez wskaźnik, np dla 16 bitów zapis liczby 22: [syntax=c] // write *(uint16_t *) ( WriteAddr) = 22; //read uint16_t dataRead = *(__IO uint16_t*) ( WriteAddr);[/syntax] zapis i odczyt może być 8, 16(adres wyrównany do 2 ) lub 32 bitowy(adres wyrównany do 4 ) Pozdrawiam
No to przykładowe projekty w wersji 1.2.0-rc1 zamieściłem na swojej stronie - www.freddiechopin.info w Download > ARM > Przykłady Czekam na komentarze dotyczące nowości czyli: 1. Kompilacja plików w dowolnych folderach 2. Nieco bardziej standardowe nazwy w pliku Makefile 3. Możliwość definiowania rozszerzeń plików z kodem 4. Możliwość wywołania...
Pewnie się "o dziwo kompiluje", bo nie masz dołączonego nagłówka stdio.h Tak czy siak: - za mały stos - stos nie wyrównany do 8 - za mało pamięci na stertę to trzy przyczyny które odpowiadają za 99% problemów. Aha - no i doprecyzuj, czy układ się sypie PRZED czy PO sprintf(), bo nie do końca jest to jasne. Kolejna sprawa - istnieje pewna niewielka szansa,...
Problemem w M0 jest brak opcji unaligned access. Jeśli funkcja jako argument dostaje adres i jest to adres dowolny tzn. niekoniecznie wyrównany do 4(2) bajtów to w przypadku M0 próba odczytania danych 32b(16b) z pod takiego adresu skończy się wygenerowaniem wyjątku. M3 i M4 wspierają unaligned access i dlatego funkcje dla obydwu rdzeni mogą mieć jednakowe...
To jest ARM. Instrukcja LDRB/STRB. Tablica bajtów powinna się zaczynać w miejscu wyrównanym do 4 (lub do czegokolwiek), ale dalej jest dokladnie jeden adres na bajt, i ani rdzeń ani kompilator nie komplikują dostępu do adresów nie wyrównanych do 4, niezależnie od tego, czy dane są we flashu czy w ramie. Przestrzeń adresowa ARMów jest ciągła, instrukcje...
Nie. Architektura ARMv7-M obsługuje niewyrównany dostęp 16 i 32bitowy. Tylko dostęp na słowa większe niz 32bity (LDRD/STRD, LDM/STM) z niewyrównanym do 4 bajtów adresem rzucają fault. Inna sprawa, że w STM32 SFRy ogólnie nie lubią niewyrównanych zapisów lub zapisów o szerokości innej niz sam SFR. Ale to się nie kończy faultem, tylko dziwną wartością...
(...) gnał, widzę tylko cyfry w debugerze. Z kolei do PCM5102 jeszcze nie pisałem prostego kodu, chociażby sinusoidy, to jest w planach. 7. Połączenia są poprawne. Zasilanie zgodne z dokumentacjami technicznymi, PCM1808 respektywnie ma dostarczone zarówno 5 V jak i 3.3 V, PCM5102A ma dostarczone tylko 3.3V. Dziękuję za dodatkowe informacje i szczegółowy...
Witam! Mam następujący problem. Podłączam gitarę do przetwornika ADC w mikrokontrolerze Nucleo f103rb. Podpinam ją w taki oto sposób: https://obrazki.elektroda.pl/4729012400_... Wzmacniacz zasilam niesymetrycznie więc należało dodać 1,65V do sygnału dla symetryzacji. Ustawiłem odpowiednie wzmocnienie w sprzężeniu zwrotnym i teraz kiedy...
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...
A jaką precyzję mają te rezystory? Mierząc ich wartości dokładnie wyszło mi, że stosunek wyszedł około 64,3 do 1. Jeden z nich miał 1%, drugi chyba 5%, akurat takie miałem. A z innej beczki powstał mi nowy problem, ogólnie kod został dosyć skopiowany z jakiegoś artykułu, więc może być parę błędów w odniesieniu do moich zapotrzebowań. [syntax=c] #include...
Witam, prosił bym o pomoc. Potrzebuję robić 5 pomiarów napięć i chcę do tego wykorzystać 5 kanałów ADC1. O ile wydaje mi się że poprawnie wszystko konfiguruję, tak nie wiem w jaki sposób odbierać dane z ADC1->DR. Wiem, że przez DMA, lecz jeśli podaję do DMA adres źródłowy ADC1->DR i adres docelowy np. &do_adresu, to nie wiem z którego kanału...
wyrównanie potencjałów wyrównanie 18650 wyrównanie głowic
zerwana plomba sterowanie rolet zewnętrznych skrzynka bezpiecznik voyager
Schemat podłączenia licznika Beta RR50 2010 bez akumulatora OP-COM do Opel Vectra C 1.9 CDTI 2006 – wybór interfejsu, firmware, kompatybilność CAN