Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

AVR-GCC pozycjonowanie tablic w pamięci flash

rejestr007 17 Kwi 2010 00:53 1700 5
  • #1 17 Kwi 2010 00:53
    rejestr007
    Poziom 17  

    Witam!
    Jak w AVR-GCC zapisać tablice z danymi pod konkretnym adresem w pamięci flash procesora? Będę wymieniał te tablice za pomocą bootloadera w zależności od wersji urządzenia dlatego muszę mieć je zapisane pod odpowiednim adresem. Jest coś takiego jak dyrektywa "ORG" w asemblerze?
    Pozdrawiam

    0 5
  • #2 17 Kwi 2010 01:22
    atom1477
    Poziom 43  

    Najlepiej to zadeklarować sobie nową sekcję.
    Bezpośredniej dyrektywy do tego nie ma.

    0
  • #3 17 Kwi 2010 09:20
    rpal
    Poziom 27  

    ja się przyłączę do tej rozmowy i zapytam, a jak zadeklarować nową sekcję w Eclipse ?

    0
  • #4 17 Kwi 2010 11:01
    atom1477
    Poziom 43  

    Przecież Eclipse to nawet nie jest kompilator. Więc co za różnica?
    Tak samo jak wszędzie.
    Ja mam tak:

    Code:

    MEMORY
    {
       rom (rx)    : org = 0x00000000, len = 500k
       eeprom (rx) : org = 0x0007D000, len = 4k
       ram (rwx)    : org = 0x40000000, len = 64k
        sdram0 (rwx) : org = 0xA0000000, len = 16384k      /* External SDRAM Bank0: 16M */   
    }

    __rom_start = ORIGIN(rom);
    __rom_size = LENGTH(rom);
    __rom_end = __rom_start + __rom_size;

    __eeprom_start = ORIGIN(eeprom);
    __eeprom_size = LENGTH(eeprom);
    __eeprom_end = __eeprom_start + __eeprom_size;

    __ram_start = ORIGIN(ram);
    __ram_size = LENGTH(ram);
    __ram_end = __ram_start + __ram_size;

    __sdram0_start = ORIGIN(sdram0);
    __sdram0_size = LENGTH(sdram0);
    __sdram0_end = __sdram0_start + __sdram0_size;

    PROVIDE(__rom_start = __rom_start);
    PROVIDE(__rom_size = __rom_size);
    PROVIDE(__rom_end = __rom_end);

    PROVIDE(__eeprom_start = __eeprom_start);
    PROVIDE(__eeprom_size = __eeprom_size);
    PROVIDE(__eeprom_end = __eeprom_end);

    PROVIDE(__ram_start = __ram_start);
    PROVIDE(__ram_size = __ram_size);
    PROVIDE(__ram_end = __ram_end);

    PROVIDE(__sdram0_start = __sdram0_start);
    PROVIDE(__sdram0_size = __sdram0_size);
    PROVIDE(__sdram0_end = __sdram0_end);

    po za tym już nic więcej nie robiłem.
    Po prostu nadaję atrybut tablicom i trafiają one do odpowiedniej sekcji.
    Oczywiście te w sekcji sdram będą nieinicjalizowane, a te w sekcji eeprom nie trafią do wsadu procesora (będą jedynie zapisywane i odczytywane przez program).
    U Was trzeba będzie jeszcze coś dodać, ale co to nie wiem ;)

    0
  • #5 17 Kwi 2010 11:15
    rpal
    Poziom 27  

    może nieprecyzynie się wyraziłem chodzi o to że sekcje pamięci mam zdefiniowane w Project Options->Memory Settings a samym programie umieszczona etykieta opisana odwołująca się do zdefiniowanej etykiety. Czy podobny sposób defioniowania segmentów pamięci jest możliwy w Eclipse i wiem że to nie kompilator a środowisko.

    0
  • #6 17 Kwi 2010 11:20
    atom1477
    Poziom 43  

    Chm. A ja myślałem że w C nie ma takich dziwactw jak w BASCOMie.
    Ja mam zwyczaj wszystko konfigurować w kodzie (i w BASCOMie też tak robiłem) a nie w ustawieniach projektu.
    Więc u siebie sekcje zadeklarowałem w pliku ld.
    Czy się da w jakichś ustawieniach w Eclipse to nie wiem.
    Ale pewnie tak choćby z tego powodu że do Eclipse jest cała masa wtyczek.

    0