logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

SAMD11D14 C/ATMEL STUDIO - tablica const w pamięci flash zamiast RAM

alak 19 Lip 2017 10:33 996 6
REKLAMA
  • #1 16596127
    alak
    Poziom 11  
    Posty: 23
    Pomógł: 1
    Witam,
    proszę o wyjaśnienie moich wątpliwości:
    - mam zadeklarowana tablice - modyfikator const która powinna trafić do pamięci flash
    [syntax=c]
    volatile const uint8_t Tab[10]={0,1,2,3,4,5,6,7,8,9};
    [/syntax]

    i po kompilacji uzyskuje:
    [syntax=c]
    		   text	   data	    bss	    dec	    hex	filename
    		   2608	     16	   1088	   3712	    e80	test_led.elf
    
    		   Program Memory Usage 	:	2624 bytes   16.0 % Full
    		   Data Memory Usage 		:	1104 bytes   27.0 % Full
    [/syntax]

    po zwiększeniu rozmiaru tablicy o 40 B uzyskuje
    [syntax=c]
    volatile const uint8_t Tab[50]={0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9};
    	
    		   text	   data	    bss	    dec	    hex	filename
    		   2608	     56	   1088	   3752	    ea8	test_led.elf
    		   
    		   Program Memory Usage 	:	2664 bytes   16.3 % Full
    		   Data Memory Usage 		:	1144 bytes   27.9 % Full
    
    [/syntax]


    pytanie brzmi czemu rośnie zarówno użycie pamięci flash jak i ramu , co dziwne sekcja .text nie zmienia się?
    program skopilowany w AS7 w przykładowym projekcie atmela.
    pozdrawiam i dziękuje za pomoc.
  • REKLAMA
  • #2 16596139
    grko
    Poziom 33  
    Posty: 1386
    Pomógł: 247
    Ocena: 141
    Wklej tutaj skrypt likera jaki jest używany w Twoim projekcie. Z tego co pamiętam atmel nie używał standardowych nazw sekcji (zamiast .data mieli .realocate). Powodowało to błędny (mylący) output narzędzia size. Najlepiej sprawdzić plik elf w taki sposób:

    Kod: Bash
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #3 16596203
    alak
    Poziom 11  
    Posty: 23
    Pomógł: 1
    Witam,
    skrypt linkera
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    dodam tylko że przy dużej tablicy pojawia się błąd - "brak pamięci ram"
  • Pomocny post
    #4 16596325
    grko
    Poziom 33  
    Posty: 1386
    Pomógł: 247
    Ocena: 141
    Wygląda na to, że gcc umieszcza zmienne volatile const w sekcji data. Dziwne. W sumie to nie wydaje mi się aby volatile w przypadku stałej miało jakiś sens.
  • REKLAMA
  • #5 16596330
    alak
    Poziom 11  
    Posty: 23
    Pomógł: 1
    Witam,
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    tylko po to by kompilator nie usunął nie wykorzystywanej tablicy - na potrzeby testu.

    w sumie mi wygląda na to że tablica mimo że powinna być we flashu to kopiowana jest dodatkowo do ramu (na podstawie zwieszającego się licznika wykorzystania flash i ram)
  • REKLAMA
  • Pomocny post
    #6 16596346
    grko
    Poziom 33  
    Posty: 1386
    Pomógł: 247
    Ocena: 141
    alak napisał:
    Witam,
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    tylko po to by kompilator nie usunął nie wykorzystywanej tablicy - na potrzeby testu.

    w sumie mi wygląda na to że tablica mimo że powinna być we flashu to kopiowana jest dodatkowo do ramu (na podstawie zwieszającego się licznika wykorzystania flash i ram)


    Volatile nie ma nic wspólnego z (nie)usuwaniem nieużywanych zmiennych ponieważ usuwanie tych zmiennych dzieje się na etapie linkowania. Konsolidator usuwa wszystkie symbole pozbawione referencji (oczywiście jeżeli jest ta funkcjonalność włączona). Sprawdź czy działa to bez volatile. Tylko użyj tej tablicy przykładowo w funkcji main.
  • #7 16596418
    alak
    Poziom 11  
    Posty: 23
    Pomógł: 1
    Witam,
    usnięcie volatile załatwiło sprawę

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    grko napisał:

    Volatile nie ma nic wspólnego z (nie)usuwaniem nieużywanych zmiennych ponieważ usuwanie tych zmiennych dzieje się na etapie linkowania. Konsolidator usuwa wszystkie symbole pozbawione referencji (oczywiście jeżeli jest ta funkcjonalność włączona). Sprawdź czy działa to bez volatile. Tylko użyj tej tablicy przykładowo w funkcji main.


    lektura na wieczór

    Dziękuje i pozdrawiam

Podsumowanie tematu

✨ W dyskusji poruszono problem umieszczania tablicy z modyfikatorem const w pamięci flash zamiast RAM w kontekście mikrokontrolera SAMD11D14 i Atmel Studio. Użytkownik zauważył, że po zwiększeniu rozmiaru tablicy, dane w pamięci RAM wzrosły, co sugerowało, że tablica była kopiowana do RAM. Odpowiedzi wskazały, że użycie modyfikatora volatile mogło powodować, że kompilator nie usuwał nieużywanej tablicy, co prowadziło do błędnych wyników. Po usunięciu volatile, problem został rozwiązany, a tablica została poprawnie umieszczona w pamięci flash.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA