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

MSP430 C Tablice - zbyt mało pamięci zarezerwowanej.

korekpl 29 Paź 2014 13:10 2754 4
  • #1 14084173
    korekpl
    Poziom 10  
    Witam,
    mam problem z tablicami w mikrokontrolerze MSP430g2553, kiedy chce skompilować taki program:

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


    wyskakuje mi następujący błąd:

    Error[e16]: Segment CSTACK (size: 0x50 align: 0x1) is too long for segment definition. At least 0x30 more bytes needed. The problem occurred while processing the segment placement command "-Z(DATA)CSTACK+_STACK_SIZE#", where at the moment of placement the available memory ranges were "CODE:3e0-3ff" Reserved ranges relevant to this placement:
    200-3d7 DATA16_I
    3d8-3df DATA16_Z
    3e0-3ff CSTACK

    z tego co rozumiem w mikroprocku skończyła się pamięć, da się zarezerwować więcej pamięci dla tej tablicy, żeby zmieściło się to co jest w tej chwili czyli 240 elementów, lub więcej np. 1000 elementów?
  • #2 14084201
    alagner
    Poziom 26  
    G2553 ma maks. 512B ramu, używasz 4*60*sizeof(int) [obstawiam że 2 lub 4], policz...

    Jeżeli tablica ma być stała dołóż do niej static const (ew. coś jeszcze, nie pamiętam czy w MSP430 jest do tego jeszcze attribute), powinna wtedy trafić do flasha.
    Można skorzystać z uint8_t zamiast int. Pytanie, czy Ci to styka.

    Jak to obejść/zrobić lepiej- enum. Ale licz się z tym, że 240B to już bardzo dużo jak na ten mikrokontroler, a enum <8b mieć nie będzie. Ale z kodu, który pokazałeś śmiem twierdzić, że mądrze użyty typ wyliczeniowy styknie z naddatkiem.


    Jeśli nie - pozostaje Ci męczyć się z polami bitowymi/operacjami bitowymi.
  • #3 14084404
    BlueDraco
    Specjalista - Mikrokontrolery
    Reasumując: potrzbujesz (a przynajmniej tak Ci się wydaje) trzymać w pamięci (zapewne stałej - ROM, której uC ma sporo) 720 bitów, czyli oszczędnie 90 bajtów, a mniej oszczędnie - 240 bajtów, ale zamiast tego używasz do trzymania swoich danych po 480 bajtów pamięci ROM i RAM (której za dużo nie ma). Z optymalnym wykorzystaniem zasobów niewiele ma to wspólnego. ;)
  • #4 14084898
    korekpl
    Poziom 10  
    Przy użyciu deklaracji: const int tab[] lub static const int tab[] udało mi się zmieścić 1820 elementów, przy większej ilości kończy się pamięć: Fatal Error[e89]: Too much object code produced (more than 0x1000 bytes) for this package. To powinno mi wystarczyć. Teoretycznie chyba powinno się zmieścić 2048 zmiennych typu int i 4096 char, ale jest tego jak widać trochę mniej.

    uint8_t - kompilator nie wie co to jest, MSP to nie AVR albo brakuje mi jakiejś biblioteki
  • #5 14084910
    BlueDraco
    Specjalista - Mikrokontrolery
    #include <stdint.h>

    albo zamiast uint8_t napisz unsigned char;
REKLAMA