Poczytać chociażby w książce z mojej stopki. Jak chcesz na piechotkę to manual do objcopy i o attribute section w gcc.
Po PRZECINKU __attribute__ ((section(".ext_mem"), aligned (32))) 4\/3!!
...Zauwałzyłem, że po zadeklarowaniu w ten sposób liczba komórek RAM zmniejsza się:... Pamięci programu również :( Zajrzyj do pliku pgmspace.h , no i oczywiście do dokumentacji , a w lot zrozumiesz ;) #define EEPROM __attribute__ ((section (".eeprom"))) #define FLASH __attribute__ ((section (".progmem.gcc"))&...
[syntax=c] const uint8_t ala_ma_kota __attribute__ ((section (".MySection1"))) = [/syntax] Pozostaje poinformować linker pod jakim adresem ma umieścić ".MySection1".
Mam na sztywno podać ich rozmiar? Też można. Niestety nie rozumiem tego: "No bo takie rzeczy trzeba robić "po ludzku", czyli bufor ręcznie (wcześnie), a następnie należy go podpiąć do tej struktury (zmienić tablicę na normalny wskaźnik). " Z tego zrozumiałem, że to ma być jednak wskaźnik, nie tablica. Zrób tak: [syntax=c] struct framebuffer { ... void*...
Ty napisałeś: __attributte__ ((section(".ext_mem"))); Ja proponowałem: __attribute__ ((section(".ext_mem"))) Porównaj ilość i lokalizację liter 't' 4\/3!!
Witam. Ja robię to tak #define EEPROM __attribute__ ((section (".eeprom"))) unsigned int tab[5] EEPROM ={18,2984,3188,3400,36200}; pozdr.
Również natknąłem się na ten problem i nie wiem jak go rozwiązać. Niemniej jednak można makro EEMEM zastąpić tym czym jest naprawdę ( __attribute__((section(".eeprom"))) ) i wtedy ten problem nie występuje. 4\/3!!
Ja mam tak: __attribute__ ((section(".bootloader&... int program_page(unsigned short *data, unsigned int adr) {... } i linker: .bootloader 0x08000000+128K-1K : { *(.bootloader) } i działa
Nie możesz zmienić "&zmienna", bo to jest r-wartość. W gcc możesz użyć atrybutu section, który powie kompilatorowi do jakiej sekcji wrzucić zmienną: https://gcc.gnu.org/onlinedocs/gcc/Varia... [syntax=c] #define BKP_SRAM __attribute__ ((section ((".bkpsram")))) uint32_t zmienna BKP_SRAM; [/syntax] Linkerowi należy podać argument "--section-start=.bkpsram=0x40024000",.....
W wielu nowszych AVRach jeśli watchdog był źródłem resetu to zostaje włączony automatycznie, bo bit WDE jest ustawiany tak jak WDF z rejestru MCUSR. Pozostałe bity rejestru WDTCSR są wyzerowane, a to oznacza, że ustawiony jest minimalny czas. Wyłączenie watchdoga należy wykonać przed funkcją main. Służą do tego sekcje .initx. Ponieważ będzie to funkcja...
Witam, A jak już utworzysz sekcje to jak chcesz umieścić tam zmienna robisz np tak: [syntax=c] int tablica[ 200] __attribute__(( section(".sekcjaRam") ));[/syntax] Popatrz sobie na taki rysunek w manualu (na początku)tam masz co do czego ma dostęp, ogólnie CCM_RAM nie dostępu do DMA Pozdrawiam
Lepiej wykorzystaj do tego celu pamiec programu , ewentualnie eeprom. Sposob deklaracji tablic dla winavr : dla eeprom : #include <avr/eeprom.h> #define EEPROM __attribute__ ((section (".eeprom"))) unsigned char temp [20] EEPROM ={1,2,3,4,}; dla pamieci programu : #include <avr/pgmspace.h> static unsigned char temp_1 [2] PROGMEM = {1,2,3,4};
Bezedura.. Keil i może potrafi wykryć takie coś, jednak nie GCC. No faktycznie, po próbach z GCC, przyznaję Ci rację, że nie jest w GCC tak prosto i wygodnie ze zmiennymi absolutnymi, jak mi się wydawało po praktyce w Keil. Ale pewnym prostym wyjściem może być zdefiniowanie buforów w sposób podobny jak tu: [syntax=c]unsigned char __attribute__((section...
Przykład: a)Utwórz własną sekcję. unsigned int value[128] __attribute__ ((section("moja_sekcja&... = {1,2,3,4,5,6,7,8,9}; b)Dodaj opcję linkerowi. -Wl,-section-start=moja_sekcja=0x0800 0x800 to przykładowy adres pamięci ;)
.bkp_mem (NOLOAD) : { *( .bkp_mem .bkp_mem.*) } > bkp_ram volatile int16_t Zmienna_BKP_SRAM __attr... .bkp_ram "))); Wystarczyło w pliku .dmp albo .map zobaczyć adres tej zmiennej i wszystko byłoby jasne. W ostateczności w pliku .lss też można dojść do adresu.
Zademonstruję Ci: Nowy projekt w Atollic for STM32: Bez modyfikowania skryptu linkera: https://obrazki.elektroda.pl/4714547300_... A teraz Twoje przezroczyste przypisanie: https://obrazki.elektroda.pl/8906289200_... Dopiero po dodaniu do skryptu linkera: https://obrazki.elektroda.pl/4995382700_...
Zrobiłem test na przykładzie z innego wątku i to działa void __attribute__ ((long_call, section (".data"))) Delay1(unsigned int del_time); void __attribute__ ((long_call, section (".data"))) Delay1(unsigned int del_time) { for(unsigned int abc=0;abc<del_time;abc++);...
Można i tak, choć jak masz startupa z moich przykładowych projektów, to są prostsze sposoby (; Tak, mam startupa z Twojego projektu... prościej to znaczy jak ? Jeszcze chciałem się zapytać czemu nie mogę utworzyć zmiennej lokalnej np.: section attribute cannot be specified for local variables
Domyślnie jeśli Watchdog jest włączony cały czas to po resecie ma domyślnie ustawiony czas 16ms (bity WDP2..0 w rejestrze WDTCR są zerami) Zatem układ wciąż ci się resetuje po pierwszym przebiegu. Żeby się tego pozbyć wklej sobie przed funkcją main() coś takiego static void __init3( void ) __attribute__ (( section( ".init3"...
Czyli void(* resetFunc) (void) = 0; wstawiam przed funkcją setup(), a resetFunc(); mogę wywołać np z przerwania? Tak, wywołać na końcu obsługi przerwania. Wykonywanie głównej pętli programu" i jego resetowanie chyba nie jest podstawowym zadaniem urządzenie które budujesz? Spróbuj przedstawić algorytm który ułożyłeś, może komuś uda się rozwiązać problemy...
Co do umieszczania kodu w odpowiednich przestrzeniach to trzeba zmodyfikować skrypt linkera oraz użyć atrybutów do danych i kodu aby kompilator odpowiednio stworzył obiekty. Ale to nie jest wystarczające. Trzeba dopisać trochę kodu w startupie jeżeli mają być zainicjalizowane (zerowanie też uznamy dla uproszczenia za inicjalizację aby nie tworzyć dodatkowych...
Raczej nie chodzi o bootloader, a o same mechanizmy kasowania i zapisu pamięci FLASH - one w 99% przypadków muszą być uruchomione na innej szynie, czyli zwykle w RAM. Teraz nie mam czasu, żeby się rozpisywać, wieczorem postaram się napisać jak wrzucić funkcje do RAM. Możesz też poszukać na szybko jak to zrobić w google pod hasłem "ARM ram function"...
Wystarczy w skrypcie linkera ZA wektorami przerwań, a PRZED normalnym kodem wstawić offset (poprzez ". += jakis_offset;") tym sposobem miejsce to będzie zasadniczo puste. Wstawienie konkretnej wartości najprościej zrobić tworząc nową sekcję (uprzednio niestety rozbijając tą standardową na obszar dla wektorów i obszar dla normalnego kodu): MEMORY {...
OpenOCD to soft obsługujący debuggery JTAG, ja go używam do programowania/debugowania procesorów ARM. Ale z tego co można wyczytać w sieci coś się dzieje wokół wsparcia dla AVR-ów. OpenOCD komunikuje się z JTAG-iem i udostępnia dwa serwery debugowania telnet oraz gdb(do tego drugiego można podłączyć się samym gdb i debugować program). A manual do OpenOCD...
https://gcc.gnu.org/onlinedocs/gcc/AVR-V... The progmem attribute is used on the AVR to place read-only data in the non-volatile program memory (flash). The progmem attribute accomplishes this by putting respective variables into a section whose name starts with .progmem. /* Use custom macros from AVR-LibC */ #include <avr/pgmspace.h>...
Oto plik ze zmiennymi z których chce korzystać w programie głównym: #ifndef H_ZMIENNE_EEPROM_H #define H_ZMIENNE_EEPROM_H uint8_t smieci1 __attribute__((section("... = 0; uint8_t temp_zadana __attribute__((section("... = 28; uint8_t temp_zalaczenia_pompy __attribute__((section("...
Zrobiłem coś takiego: #define EXTMEM1 __attribute__((section("... #define EXTMEM2 __attribute__((section("... #define EXTMEM3 __attribute__((section("... #define EXTMEM4 __attribute__((section("...
Oczywiście przeglądałem plik .lss i jest tam parę spraw do wycięcia, np. ... inicjalizacja .bss Jeśli zmienne nie muszą być inicjalizowane, to może umieścić je w sekcji .noinit ? Po dodaniu atrybutu sekcji .noinit do wszystkich zmiennych globalnych rozmiar kodu wyniósł u mnie po skompilowaniu: 1022 bytes (99.8% Full). 4.5 The .noinit Section This sections...
Natomiast drążąc dalej temat jak wyjaśnić to, że na atmedze16 przy identycznej kofiguracji fuse'ów wszystko działało elegancko? Na procku ATmega162 ale podobnie na ATmega88 itp ... też działa elegancko. Tyle, że trzeba doczytać w nocie i pamiętać, że domyślnie Watchdog jest włączony. I wcale nie trzeba go zaraz fusami wyłączać bo po co? Może się często...
No wlasnie /; Wydaje się, że gcc jeszcze nie jest skłonne do obsługiwania bit bandingu dla SRAMu w wygodny sposób Wygody? Zgodny z duchem twórców procesora ;-) #define BAND(x) (x) __attribute__((section("... int BAND(bb), BAND(aa); int main() { bb = 1; aa = 0; return...
Pisze program na AT91SAM7S256. Chcąc przenieść część kodu do ram-u stosuje __attribute__ ((section (".data"))), ale w efekcie dostaje komunikat jak w temacie. Program próbowałem kompilować w WinArm. Komunikat to tylko ostrzeżenie więc nie przeszkadza w kompilacji, ale wydaje mi się że nie świadczy o niczym dobrym i sprawia że to co chciałbym przenieść...
#define RAMFUNC __attribute__ ((long_call, section (".fastrun"))) a potem np: RAMFUNC void wyslij(int costam);
(at)osctest1 Uprościłem to po swojemu, może trochę dziwnie ale działa. .xram [syntax=c] ## Intel Hex file production flags HEX_FLASH_FLAGS = -R .eeprom -R .fuse -R .lock -R .signature -R .xram [/syntax] Kompilator utworzył tablicę 13200 bajtów. Program dział i mam dostęp do zewnętrznej pamięci ram. [syntax=dos] .xram 0x00801100 0x3391 .xram 0x00801100...
Przy próbie wyciągnięcia jednego elementu: [syntax=c]const uint32_t gValue __attribute__((section(".ARM.__at_0x0800... = __DATE__[1];[/syntax] Zwracany jest ten sam błąd (używam standardu C11)
Pytań ciąg dalszy: alokując wektory przerwań do innej części FLASH za pomocą attribute((section".aaa")) napotkałem na taki oto problem....a mianowicie linker zawsze umieszcza przerwania w tej samej sekcji...nie ma możliwości umieszczenia wektora 1 np w sekcji .aaa a wektora 9 w seksji .bbb !!! jakby tego było mało to najpierw jest umieszczany wektor...
No to napisałem:) Po prostu wstawiłem __attribute__ ((section (" .data"))). To wszystko. Nie tworzyłem żadnych dodatkowych sekcji.
Trzeba użyć __attribute__((section(".eeprom"))) tutaj http://avr.elektroda.eu/?q=node/13 masz przykład...
Spróbuj zdefiniować funkcję bootloadera z atrybutem __attribute__ ((section(".bootloader")))
Mam jeszcze taki problem, że po uruchomieniu programu z linijką kodu: [syntax=c]const uint CRC_Programu __attribute__((section (".myBufSection"))) = 0xe948;[/syntax] program wchodzi do obsługi przerwania Default_Handler. Bez tej lnijki kodu program działa prawidłowo.
No własnie po resecie jest włączony i nie wiem jak go wyłączyć bo chyba nawet nie przechodzi boodloader... A polecenia [syntax=bash]// Function Pototype void wdt_init(void) __attribute__((naked)) __attribute__((section(".init3"))); ... // Function Implementation void wdt_init(void) { MCUSR = 0; wdt_disable(); return; }[/syntax] Jakby nie działały
__attribute__ ((section("jakas-sekcja"))) + dodanie tej sekcji do skryptu linkera + modyfikacja startupa aby inicjalizował też te obszary P.S. WinARM? Przecież ten pakiet ma jakieś 300 lat... 4\/3!!
Nie za bardzo mi to wychodzi.. powiedziałbym, że nawet wcale :( uint8_t adr __attribute__((section(".eeprom"))); (...) eeprom_write_byte(&adr, zm); i zm=eeprom_read_byte(&adr); -dziala, jednak zalezalo mi na nieco wiekszej wartosci
Dla jednego segmenmentu pamięci. Powtórzyć dla innych Czy wystarczy deklaracja typu: Nie zawsze. O ile jej nie użyjesz to pewnie zostanie wyoptymalizowana (zakładam włączenie jakiś optymalizacji). Przywróciłem. Może komuś się przyda. ---- Skasowano z tematu: [url=https://www.elektroda.pl/rtvforum/v...
No ale przecież to naprawdę nie jest w ogóle skomplikowane. Zdecyduj jednak najpierw czy wolisz w tym "drugim" pliku zmienne umieszczać "ręcznie" w sekcjach czy chcesz żeby WSZYSTKIE zmienne z tego pliku były w innym obszarze ramu Opcja 1: [syntax=C]uint32_t zmienna1 __attribute__ ((section(".jakas_dziwna_sekcja"))); // albo #define uint32_ext_t uint32_t...
Nie wiem czy dobrze się rozumiemy, skrypt linkiera umieszcze dane w pamięci DCTMRAM której nie obsługuje DMA1. Więc za pomocą makra [syntax=c]#define SRAM_D1 __attribute__((section(".sram_d1")))[/sy... Utworzyłem zmienna globalną UART_TxBuf którą zainicjalizowałem napisem STM32H7 UART, lecz zmienna zawiera jakieś przypadkowe wartości. Dopiero w dalszej...
Jak rand liczy to dowiesz się z źródła: [syntax=c]/*- * Copyright (c) 1990, 1993 *The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the...
Albo zmienić skrypty linkera, tak, aby poinformować linker, że masz więcej RAM, albo stworzyć nową sekcję pokrywającą SDRAM i w niej umieszczać struktury: int foo __attribute__ ((section (".sekcja"))); Przy czym adres sekcji należy zdefiniować albo w skrypcie linkera, albo w opcjach projektu w Atmel Studio.
To nie są żadne atrybuty tylko makrodefinicje (ściślej dyrektywy preprocesora) zdefiniowane w plikach nagłówkowych. Skoro już się tak zagłębiasz to może zerknij co to są za makrodefinicje, zanim napiszesz, że bzdura i nieprawda. Poza tym, co to za uściślenie - makrodefinicje (ściślej dyrektywy preprocesora). Przecież makro jest jedną z dyrektyw, a...
Okej jest to całkiem proste I skuteczne rozwiązanie. Poczytałem jeszcze o sekcjach. Mozna osiągąć moj cel w bardziej elegancki sposob z zachowanie wygody poslugiwania sie indeksowabiem tablicy. Znalazłem coś takiego.w sieci: [syntax=c] strtuct { int n; long l; char c; ... } eevars __attribute__((section(".eevars"))); -Wl,-section-start=.eevars=0x81000C...
Ok tylko mam tak zdefiniowaną sekcję: #define BootSection __attribute__ ((section(".bootloader&... #include"rfm22/rfm22.h" BootSection int main(void) { while(1); } mam bibliotekę obsługującą RM22 przy pomocy którego chcę wgrywać program. Kiedy podglądam plik hex widzę że cała biblioteka...
Wiadomo że LPC1754 ma 32kB RAM'u. Jednak jest ona nieliniowa (16K pod 0x2000000 i 16K pod 0x2007C000). Czy istnieje inny sposób umieszczenia np: obiektu klasy czy innych zmiennych w tej "drugiej" pamięci niż tak jak poniżej? [syntax=cpp] class cl_file File_ __attribute__ ((section(".ramII"))); [/syntax] Oczywiście w pliku linkera sekcja ramII jest odpowiednio...
uint8_t numer __attribute__ ((section(".noinit"... tego możesz używać, ale zawsze musisz zadbać o zainicjowanie takiej zmiennej samodzielnie. Przykładowo reset wywołany przez POR zeruje zmienną, a w przypadku wykrycia, że przyczyna resetu jest inna zmiennej nie zerujesz. Wystarczy odpowiednio wcześnie sprawdzic zawartość...
Umieszczanie tych danych w ten sposób to straszne chodzenie dookoła i proszenie się o kłopoty... Wystarczyłoby w skrypcie linkera dodać nową sekcję - wzorując się np. na .bss, skopiować, zmienić "bss" na "moja_sekcja" i potem w kodzie sobie zrobić zmienną: typ tablica[BARDZO_DUŻA] __attribute__ ((section(".moja_sekcja"))); 4\/3!!
oo właśnie tego szukałem. chciałbym się jeszcze dowiedzieć jak by miała ta wspomniana struktura wyglądać bo nie bardzo mam pomysł na to ? takie cos ?? typedef struct struczas{ int min; int godz; int dzienmies; int mies; int rok; uint8_t eeprom_val __attribute__((section("... }; nie wiem nawet czy...
deklaracja https://obrazki.elektroda.pl/6052358500_... Udało się ale program działa źle, nie działa usart, timery (nie wnikałem czy nie sa włączone, wszystko wskazuje jakby zegar nie był wcale konfigurowany). Mój poprzednik, który napisał ten program musiał też mieć z tym problem, bo zmniejszył obszar ram i zmienne, które nie miał być...
Chodzi mi o te dwie kreseczki cudzysłowia (") ale na dole. Przepisuje program w AvrSide z gazety i jest taka linijka : #define NOINIT __attribute__ ((section ( " .noinit " ))) Tuż przed .noinit jest początek cudzysłowia , tylko że w gazecie jest on na dole. Nie wiem czy to błąd w druku bo coś mi dalej w kompilatorze nie wyświetla zmiennych w oknie WATCH...
ok umieszczenie zmiennej const w danej sekcji powinno pomóc, tylko mam problem z deklaracją [syntax=c] static char const *const ssi_tags[ssitags_num] __attribute__ ((section(".ssitag"))) = { "t0", //0 sekundy "t1", //1 minu "t2", //2 godziny "t3", // 3 dni "t4", // 4 czas "out", //5 out state "inp1", //6 INP1A "inp2", //7 INP2A "inp3", //8 INP3A "inp4",...
Dzięki podpowiedzi tadzik85 udało się rozwiązać problem. Opisywana metoda pozwala umieszczać w stałym obszarze pamięci FLASH dane (bitmapy, czcionki itp) które zajmują dużo miejsca (rzędu kilkuset kB) i nie są często zmieniane. Dzięki tej metodzie, wielkość kodu wynikowego wpisywanego do procesora redukujemy do kilkudziesięciu kB. Czas programowania...
Zrobiłem szybki test, aplikacja która wywoływała bootloader poprzez wdt_enable(WDTO_15MS); zamieniłem na wdt_enable(WDTO_250MS); bo ewidentnie po tym procesor ciągle był resetowany przez WDT, ustawiony bit WDRF mimo że bootloader jako trzecia z instrukcji w main ma wdt_disable(); Dodałem więc: [syntax=c]static void __init3( void ) __attribute__ (( section(...
Używam kompilatora GCC i tam wygląda to tak: Dla funkcji w C __attribute__ ((section (".data"))) static void AntiAlias(int *x, int nBfly) ; dla funkcji w asm .data (na początku pliku asm) podobno trzeba też dodać atrybut long_call, ale czy jest on konieczny nie wiem bo nie sprawdzałem, czy działa bez niego. Mogę jedynie powiedzieć, że do funkcji w C...
Witam zrobiłem to w inny sposób użyłem funkcji: [syntax=c] GUI_SetOrientation(GUI_SWAP_XY | GUI_MIRROR_Y);[/syntax] Tylko żeby to działało trzeba w GUIConf.c ustawić [syntax=c]#define GUI_NUMBYTES (1024 * 128*8) U32 extMem[GUI_NUMBYTES / 4] __attribute__((section(".HeapMemSection"... [/syntax] i zrobić sekcje w linkerze adres 0xD0100000 (zewnętrzy...
odkopuję stary temat, bo napotkałem nowy problem. tak jak poradził (at)tmf stworzyłem zmienne EMEM: char jeden __attribute__((emem)); char dwa __attribute__((emem)); int dziesiatki, jednosci; char wybrany1,wybrany2; zdaje się, że nie ma takiego atrybutu w gcc, jak już to __attribute__((section("...
Wydaje mi sie ze wystarczy zapisac const unsigned char Niekoniecznie, rownie dobrze moze byc zaladowany do RAM-u.Jesli to GCC to najlepiej dodac __attribute__((section(".text"))) zeby byc pewnym. ale w C wartosc const mozna zmieniac przez wskaznik, wiec nie wiem czy to bedzie poprawny zapis dla danych zapisanych w FLASH. To nie ma nic do rzeczy.
Nie ma to jak wrzucać dokładny kod błędu... main.c:32:32: error: Roleta_EEPROM causes a section type conflict with Roleta_EEPROM2 volatile struct Roleta_offsets Roleta_EEPROM[7] __attribute__ ((section(".eeprom_mem&... __attribute__ ((aligned (32))) = ^ Jak chcesz to mieć...
y0yster poczytaj jeszcze ten manual, bo wyważasz otwarte drzwi - stosowny atrybut już jest zdefiniowany w bibliotece pod nazwą EEMEM. Prawda, jest on zdefiniowany: #define EEMEM __attribute__((section("... Tylko wcześniej go nie widziałem :). Ale prawda jest taka, że oba zapisy są równoważne :), więc nie ma...
Dobrze kombinujesz z tym że wcześniej musisz włączyć zewnętrzną magistralę danych i adresową (ustawić odpowiednie bity). To jeden ze sposobów. Jednak koniecznie potrzebujesz ażeby ta zmienna była w zewnętrznej pamięci ?? Bo jeżeli nie to może zmieści się w wewnętrznej ? Magistralę w GCC włącza się tak: void xram(void) __attribute__ ((naked)) __attribute__...
Podpowiedzcie mi prosze, jak zadeklarowac zmienna w pamięci eeprom po adresem 0x01?? bo: #define EEMEM __attribute__((section(".eeprom"))) EEMEM unsigned char ZMIENNA; lokuje ja w pierwszej wolnej komorce czyli 0x00. Moge zadeklarowac wczesniej inna zmienna PUSTĄ tak aby kompilator ulokowal ja pod 0x00 ale nie jest to elegancke. W '51 robilo sie to...
Witam. Dołączę się do tematu. Jakiś czas temu próbowałem umieścić coś w sekcji .fini - niestety bez powodzenia. Dziś nie pamiętam, co dokładnie uC robił po zakończeniu "main", ale na pewno nie wykonywał utworzonej przeze mnie funkcji. Oto kod: void returncode (void) __attribute__ ((section (".fini9"))); void...
Witam, skryp linkera już zmieniłem, uruchomienie na 16Mhz mam za sobą (STM32F427) Chciałem się tym "pobawić" ale na zewnętrznym ramie. (STM32F429I-DISCO) Mam rozumieć ze nie włączasz żadnych peryferii? i CONFIG_TICK_CLOCK 16000000 używasz tylko do SysTick. Czyli jak jestem w "main" wtedy wszystko sobie uruchamiam? (dla mnie to ma sens ale chce się upewnić...
Umieszczam pojedyńcze funkcje w pamieci ram za pomocą __attribute__((section(".data"))) i funkcje te ładnie lądują w pamięci ram. Jak teraz sprawić, żeby procesor poprawnie skakał pod ich adres w ramie? Do puki funkcja main jest w ramie i wszystkie inne też to jest ok ale gdy z funkcji main znajdującej się w pamięci FLASH skoczę do funkcji znajdującej...
szefolin(at)szefolin-lapek:~/bf210/l... readelf -A lighttpd Attribute Section: aeabi File Attributes Tag_CPU_name: "5TE" Tag_CPU_arch: v5TE Tag_ARM_ISA_use: Yes Tag_THUMB_ISA_use: Thumb-1 Tag_ABI_PCS_wchar_t: 4 Tag_ABI_FP_denormal: Needed Tag_ABI_FP_exceptions: Needed Tag_ABI_FP_number_model:...
Witam, niech ktoś łaskawy mnie oświeci :) bo dawno nic nie "klepałem" na AVR'ki - co to robi, dlaczego i poco :P void __init0(void) __attribute__((naked, section(".init0"))... void __init0(void) { asm volatile( "out %0, %A2" "\n\t" "out %1, %B2" "\n\t"...
Nie wiem co jeszcze napisać. ADC na rym kodzie działa dobrze a chyba jasno określiłem w tytule o co chodzi i zaznaczyłem w kodzie niewłaściwy sposób "wyzerowania" "wyskalowania" pomiaru aby pokazywał faktyczną wartość przepływającego prądu a nie cuda niewidy. Pre-definicja ADC [syntax=csharp] //********** definicje zmiennych dla ADC volatile uint16_t...
Korzystam z przykładu od Freddiego stm32cl_blink_led-1.2.1-120107 i tam w vectors.c jest właśnie funkcja Default_Handler która kręci się w kółko... Poza tym zadeklarowanych jest dużo funkcji w tym: [syntax=c]// System tick timer void SysTick_Handler(void) __attribute__ ((interrupt, weak, alias("__Default_Handler")));[/syntax] oraz: [syntax=c] void Reset_Handler(void);...
Tak oczywiście. Linker skrypt trzeba odpowiednio zmodyfikować, dbając o to by nie nałożyć na siebie sekcji, choć i tak kompilator tego nie zaakceptuje. np taka sekcja. [syntax=c]mojalokalizacja 0x70000: { *(.miejsce1); } >FLASH [/syntax] i deklaracja funkcji: [syntax=c]void foo(void) __attribute__((section(".miejsce1")));[/... Spowoduje umieszczenie...
Pierwszy zapis o który pytasz, to tablica wskaźników na funkcję, która to funkcja nie zwraca wartości i nie przyjmuje wartości. Zapis const oznacza, że tablicy nie będziemy modyfikować. Zapis, moim zdaniem bardziej czytelny, który sam stosuję w takim przypadku (z głowy): typedef void (*pVector_t)(void); __attribute__ ((used,...
Miałem ten sam problem. Pół dnia szukałem błędu, myślałem, że to hardware, ale to było bez sensu, bo po dołączeniu zasilania działało, a po resecie watchdoga zawieszka (ciągłe resetowanie). Okazało się, że po resecie watchdog nadal działa i to z najmniejszym czasem zadziałania (około 15ms) i nawet jak dawałem w main() wdt_disable() to nie pomagało....
Witam, Spotkałem się z następującymi metodami umieszczania fukcji w pamięci RAM: przez dyrektywę preprocesora [syntax=c] __attribute__( ( long_call, section(".codeRam") ) ) void ram_foobar (void) { ... } [/syntax] oraz przez kopiowanie kodu funkcji bajt po bajcie do RAMu: [syntax=c] __attribute__((section(".codeRam"))) Byte buffer[128]; #define...
Prawie dobrze, tylko trochę nie doczytałeś :) , możesz to zrobić tak jak zacząłeś wpisując sam do rejestru WDTCSR, ale musisz zrobić to w dwóch krokach. Najpierw odblokować zabezpieczenie ustawiając w rejestrze bity WDCE oraz WDE (istotna jest tutaj suma logiczna z zawartością rejestru, żeby nie wyzerować preskalera i nie spowodować kolejnego resetu...
Trochę inaczej. Musisz wymusić ręczne umieszczenie w wybranej sekcji: uint32_t variable __attribute__ ((section(".xxx_data"))); Pamiętaj o kropce przed xxx_data, bo tak się ta sekcja nazywa: -> *(.xxx_data); Pamiętaj też o tym, że .xxx_data musisz zainicjalizować w startupie (kopiować z FLASH spod adresu __xxx_data_init_start do RAM __xxx_data_start),...
Witam Chciałem umieścić tablice pod stałym adresem w pamieci flash, ale nie na koncu flasha. Do tej pory robiłem to tak: wycinek z pliku linkiera dla GCC [syntax=c] MEMORY { rom (rx): org = 0x08000000, len = 192k var (rx) : org = 0x08030000, len = 64k ram (rwx): org = 0x20000000, len = 64k } .... SECTIONS { .dane : { KEEP(*(.dane)) *(.dane*) } >var...
Da się w AVR studio - w opcjach projektu masz memory settings - tam możesz zdefiniować własne segmenty, lub przesunąć już istniejące - wystarczy je ponownie zdefiniować z nowym adresem początku. Zmienne jeśli nie mają trafić do standardowych segmentów definiujesz z odpowiednim atrybutem __attribute__ ((section (".XMEM"))), gdzie XMEM to nazwa segmentu...
sklonowane tutaj dla bezpieczeństwa https://github.com/divadiow/xr872_sdk Czy ktoś próbował zbudować z tego obraz hello world? Może wtedy moglibyśmy znaleźć offset flash w tym 1MB chipie, gdzie moglibyśmy flashować ten hello world... Dodano po 1 Kompilacja pod WSL dotychczasowe doświadczenia: 1. Pobrałem SDK stąd: https://launchpad.net/gcc-arm-embedded/4...
Chciałbym aby program wiedział ile zajmuje pamięci flash. W asm było to proste, to co umieściłem w ostatniej linijce kodu źródłowego (np tekst "END OF CODE", zajmowało ostatnie bajty pamięci, w C tak nie jest, bo w przypadku AVR-GCC teksty znajdują się zaraz za wektorami przerwań. Na szczęście, funcje z sekcji ".fini" znajduja się na końcu kodu: [syntax=avrasm]...
Panowie, czy któryś z was używał VUSB z pamięcią zewnętrzną RAM ? Ja mam 64k na mojej płytce z atmega128 i niestety gdy dodaje: [syntax=c] void before_main(void) __attribute__((naked)) __attribute__((section(".init3"))) { MCUCR = 1<<SRE; SFIOR = 1<<XMBK | 1<<XMM0; DDRC = 0x80; PORTC &= ~(1<<7); SP = 0xffff; } [/syntax] do...
Chcę wykorzystać w programie informację o przyczynie resetu procesora. Odczyt rejestru MCUSR realizuję zgodnie z dokumentacją, wiadomo: char MCUSR_string jest o wiele za krótka, mimo, że najdłuższy string ma teoretycznie 22 znaki łącznie z nullem. Wyświetlany napis jest ucięty. Jeśli wydłużę łańcuch do np 40 znaków, to napis pojawia się w całości. Czy...
Program działał bez pamięci zewnętrznej SRAM ale na mniejszych tablicach. Rozumiem, że choćby nie wiem co, na tym procku nie mogę posługiwać się tablicami większymi np. niż 2-3kB, tak, żeby stos miał gdzie się hodować? Dodatkowo pomyślałem, że może w taki sposób można by to zrobić, do makefile LDFLAGS += -Wl,--section-start,.xram=0x801100,--def...
Nawet jakby działało, to pewnego razu stos by się przewrócił :) ------------------------------ Edytowałem, ale chyba robak był szybszy :P Nie ma co kombinować, nawet jak się uda, to program będzie działał np przez 50 przyciśnięć, po czym nastąpi zwiecha. Nie ma też co dyskutować na temat sensu takiegoż programu, gdyż sensu on wówczas mieć nie będzie...
W przypadku LPC i LPCXpresso ( bo z tego głównie korzystam ) nie muszę martwić się o modyfikacje skryptu linkera, bo o to już zadbali deweloperzy LPCXpresso. Dodali sekcję .after_vectors i u mnie to sprowadza się tylko do dodania atrybutu __attribute__ ((section( .after_vectors ))) do definicji struktury. Nie ma znaczenia teraz jakiej wielkości jest...
Witam Mam w programie stworzoną sekcje eeprom które umieszcza dane pod adres 0x808000 [syntax=c] #define EEP __attribute__ ((section(".eeprom"))) const uint8_t EEP EEP_boot=0x1; const uint8_t EEP EEP_init=0x1; const uint8_t EEP EEP_name[32]; const uint32_t EEP EEP_code=0x34333231;[/syntax] Jak robiłe kompilację z wyłaczona optymalizacją (OPTIMIZATION...
Otóż plik elf generowany jest podczas każdej kompilacji projektu w avrstudio. Dodają w pliku main takie dyrektywy: FUSES={ .low=0xFF, .high=0xD9, };//External oscilator 16MHz, SPIEN LOCKBITS = 0xF0;//readout protection typedef struct { unsigned char B2; unsigned char B1; unsigned char B0; } __signature_t; #define SIGNATURE __signature_t...
Odgrzeję kotleta. Spędzam popołudnie wraz z tym projektem i niestety jest problem z odczytem drugiej linii hexa. Pierwsza linia jest ok, dostaję odpowiedź '+', a przy następnej wiesza się w pętli gdy czeka na pierwszy znak tj ':' i program staruje od początku. Kompetnie nie wiem dlaczego, gdy czeka na drugą linię tylko wchodzi do funkcji z petlą : static...
Definiujesz w MEMORY obszar, który ma konkretny adres i konkretną długość (oczywiście wtedy z pozostałych obszarów trzeba ten zakres wykluczyc). Potem w SECTIONS dodajesz sobie jakąś sekcję umieszczoną w tym obszarze. Można dodać kilka sekcji, a ich adresy początkowe ustawiać poprzez kropkę (". = 0x12345678;"). Zawartość plików które tam muszą być umieścisz...
Dzięki- zwykle mam rano dylemat: Czy wziąć tę grubszą książkę do C czy tę lżejszą. Do czytania w metrze i autobusie. Ale co z funkcją do zmiany kanałów- to się nie da tak prosto dodawać jak kanały będą różnicowe ze wzmocnieniem. A jeszcze można dodać kalibrację prądu jak się da np. MUX 01000 a potem MUX 01001 margas- chyba jeszcze o tym nie wiesz. I...
Może jakiś link na którego jeszcze nie "wpadłem" A proszę Cię bardzo, ba jeżeli instalowałeś kompletny avr-gcc, to masz to nawet na dysku :P : http://www.nsc.res.in/~elab/AVR/avr-libc... How do I relocate code to a fixed address? W programie, za prototypem funkcji w przypadku deklaracji, lub z tego co pamietam...
Przed chwilką wyczytałem w którymś z pdfów od NXP coś takiego.. W kodzie dodałem #define CRP2_MAGIC 0x87654321 #define CURRENT_CRP_SETTING CRP2_MAGIC __attribute__ ((section(".crp"... const uint32_t CRP_WORD = CURRENT_CRP_SETTING; natomiast fragment skryptu linkera zmodyfikowałem następująco: SECTIONS { .text :...
tmf- jestem ciekawy co znajdziesz. Ja szukałem i po za dokumentem takim jak ten (i analogiczne chyba dla AVR DA czy megaAVR seri 0): https://www.microchip.com/content/dam/mc... to niewiele znalazłem i z tego niewiele wynika. Ten manual jest...
Jeżeli zrobię bufor w pamięci zewnętrznej SRAM i prześlę go bez użycia DMA przy użyciu tego kodu: [syntax=cpp]uint16_t screen[SSD1289::MAX_X * SSD1289::MAX_Y] __attribute__ ((section(".extram"))); int main() { SSD1289::init(); SRAM::init(); for(uint32_t i = 0; i < (SSD1289::MAX_X * SSD1289::MAX_Y); i++) { screen[i] = SSD1289::BLUE; } SSD1289::setCursor(0,...
Witam, skompilowałem AES bootloader (pod gcc). W zasadzie wszystko działa jak powinno poza jednym wyjątkiem. Jeśli zostanie wywołany reset z watchdoga procesor się zawiesza, nie pomaga sprzętowy reset, pozostaje odłączenie zasilania. Fusebity HIGH mam ustawione na D8. Początek bootloadera mam ustawiony na .text=0x1E000. Jeśli ustawię fusebity HIGH na...
change section attribute interrupt eeprom section
komputer dlugo wlacza esp8266 flashowanie ustawienia czcionki
pralka indesit cieknie pralka indesit cieknie
Dym z pieca przy otwieraniu drzwiczek - przyczyny i rozwiązania Jak wyłączyć tryb demo w radiu Blaupunkt R6?