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

ST7Lite29 + Cosmic Idea 4K, pierwsze starcie == problem

rayden 01 Mar 2010 23:34 2839 3
REKLAMA
  • #1 7771521
    rayden
    Poziom 14  
    Witam, dostałem pewien prototyp do oprogramowania. Jest na procku jak w temacie. Wybrałem środowisko Cosmic ST7 v. 4K free.
    Niestety natrafiłem na pewien problem. Otóż wszystko jest ok dopóki nie dodam zmiennej statycznej. Wtedy zmienna a w zasadzie stała użyta do inicjalizacji
    trafia do pliku hex (który w moim mniemaniu powinien zawierać tylko dane dla flasha).

    Na razie mam model pamięci short. Używam tez 'startupu' crts.s który domyślnie nie inicjalizuje żadnych sekcji w tym .bsct

    W pliku hex pojawia się linia:
    :0200800000037B (czyli z lokacja w RAMie :( )
    i tu programik ST Visual Programmer protestuje ze adres jest nielegalny.

    Próbowałem zamiast startupu bez inicjalizacji użyć ctrsi.s ale z kolei mam problem z linkowaniem bo linker nie widzi symboli:

    symbol c_x not defined (crtsi.o )

    nie wiem gdzie i jak te symbole powinny być zdefiniowane w pliku linkera? *.lkf?

    Proszę o informację jak skonfigurować opcje programu tak aby móc używać zmiennych statycznych i były one prawidłowo inicjowane oraz generowany plik hex zawierał tylko dane do zaprogramowania flasha.

    Z góry dziękuje za pomoc.

    P.S. do manuala już zajrzałem ale nie pomógł mi znaleźć odpowiedzi na w/w pytania.

    Pozdr,

    Robert
  • REKLAMA
  • #2 7771646
    nenpa8lo
    Poziom 17  
    rayden napisał:
    Witam, dostałem pewien prototyp do oprogramowania. Jest na procku jak w temacie. Wybrałem środowisko Cosmic ST7 v. 4K free.
    Niestety natrafiłem na pewien problem. Otóż wszystko jest ok dopóki nie dodam zmiennej statycznej. Wtedy zmienna a w zasadzie stała użyta do inicjalizacji
    trafia do pliku hex (który w moim mniemaniu powinien zawierać tylko dane dla flasha).

    Zdecyduj się czy zmienna czy stała - wielka różnica!
    Stała jak najbardziej jest ładowana do flasha, a gdzie miała by być w RAMie - przecież jej się nie modyfikuje.
  • REKLAMA
  • #3 7772186
    rayden
    Poziom 14  
    No widzę ze kolega łapie mnie za słowa ;) Ma to być zmienna zainicalizowana czyli zmienna która jest przypisana do sekcji inicjalizowanej.

    Czyli przy starcie systemu zmienna zdeklarowana jako:

    static char zmienna_a = 5;

    oczywiście podobna sytuacja dla każdej zmiennej zainicjalizowanej
    np.

    int licznik = 0;

    itp....itd...

    jeszcze przed skokiem do funkcji main powinna zostać zainicjowana.
    Czyli jeśli dobrze rozumiem jeśli linker ulokuje tą zmienna pod adresem np
    0x0080 czyli RAM to w startupie zostanie skopiowana wartość spod adresu XXXX
    we flashu czyli to co widać w pliku crtsi.s.
    Nie wiem tylko dlaczego w pliku .hex jest jakieś odwołanie do adresu 0x0080.
    Powinny się tutaj pojawić jedynie dane dla adresów 0xE000 - 0xFFFF chyba ze ja czegoś nie rozumiem lub nie do końca rozumiem.

    Problem pojawia się gdy dodam jakakolwiek zmienną zainicjalizowaną jeśli ich nie ma jest ok.

    W manualu Cosmica "C" pisze:

    An object declaration in C follows the global format:
    <class> <type> <name> <initialization> ;

    <initialization> gives an initial value to the object. Depending on how
    the object is allocated, it may be static information to be built by the
    linker, or it may be some executable code to set up the variable when it
    is created
    . This field is optional and may be omitted.

    Pozdr,

    rn
  • #4 7781505
    rayden
    Poziom 14  
    Trochę głupio samemu odpowiadać sobie na pytanie ale może się przyda innym użytkownikom :).
    Otóż mój problem rozwiązuje dodanie dwóch lini w pliku komend linkera:

    ...
    "C:\Program Files\COSMIC\EVAL_ST7\Lib\crtsi.st7"
    # Put your files here
    #crts.o - plik crtsi.s wyrzucony zamiast tego powyzsza biblioteka
    # object pliku z funkcja main
    main.o
    #
    # float and integer library names depend on the model used
    #
    #"C:\Program Files\COSMIC\EVAL_ST7\Lib\libisl.st7"
    # machine library zalatwia wszystko
    "C:\Program Files\COSMIC\EVAL_ST7\Lib\libm.st7"
    ...


    Wszystko ładnie ale przybyło dodatkowe 400 bajtów kodu wynikowego. Trochę pewnie startup a część to efekt dolinkowania machine library.

    Wiec teraz już linker nie próbuje 'wrzucać' mi obszarów RAM do hexa.

    Ciekaw jestem co dokładnie jest zdefiniowane w tej bibliotece że wszystko jest ok.

    Załączam przykład testowego pseudo-projektu.

    Pozdr,

    rn
REKLAMA