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

STM32 i problem po zresetowaniu zasilania

psiemek 07 Gru 2009 10:06 3378 14
  • #1 07 Gru 2009 10:06
    psiemek
    Poziom 21  

    Witam,
    Zaczynam zabawę z Cortexami. Dotychczas bawiłem się tylko AVRami i '51. Poustawiałem sobie środowisko zgodnie z opisem na stronie Freddiego Chopina. Załadowałem jego przykładowy projekt, zmodyfikowałem go do mojej płytki i zadziałał. Wszystko ok. Później dodałem ten skrypt który ułatwia konfigurację projektu oraz tworzy makefile, stworzyłem swój projekt za jego pomocą, projekt się skompilował załadował do procka i miga diódkami tyle że jak odepnę zasilanie i znowu dołączę to już nie miga. Wygląda na to że kod ładuje się do RAM ale jak sobie podejrzę w Open OCD:
    mdw 0x08000000 32 to widzę że wsad tam siedzi. O co chodzi ?? Czemu nie startuje ? Dodam jeszcze że poprawnie skofigurowałem nogi BOOTP0 i 1. Czy za to odpowiada jakiś przełącznik kompilatora. Skrypt startowy jak i skrypt linkera wziąłem od Freddiego. Jedynie makefile teoretycznie tworzy się sam za pomocą tego skryptu *.jar.
    Proszę o pomoc bo mi się pomysły skończyły dlaczego projekt Freddiego działa a mój nie.
    Przemek

    0 14
  • Arrow Multisolution Day
  • #3 07 Gru 2009 10:23
    psiemek
    Poziom 21  

    Tak odpinałem. Chyba znalazłem problem tylko nie wiem jak zaradzić. Widzę porównując debugowanie twojego i mojego projektu że u ciebie podczas ładowania kodu projektu do procka masz tylko sekcję .text ładowaną pod 0x8000000 natomiast ja mam jeszcze .eh_frame pod 0x8001420, sekcję .data ładowaną pod 0x8001424 oraz tą która według mnie jest tu problemem sekcję .jcr ładowaną pod 0x20000018 co oznacza RAM. W tej sekcji jak podglądam plik *.map jest coś z katalogu Codesorcerery o nazwie crtend.o oraz crtn.o. Co to jest i jak przenieść tą sekcję na flash. Coś mi się wydaje że o ile ładuję kod JTAGIem i debuguję to jest ok bo JTAG ładuje tą sekcję kodu natomiast wyłączenie zasilania kasuje tą sekcję i procek idzie w maliny.
    Czy mam rację ?? Jak to zmienić ?

    0
  • Arrow Multisolution Day
  • #4 07 Gru 2009 10:30
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Używasz jakichś elementów które z tej sekcji korzystają, a tak być nie powinno - to po pierwsze. Po drugie zaś możesz spróbować dodać po prostu sekcję .jcr do którejś z sekcji w skrypcie linkera - np do .text (jeśli może być ona stała), lub do .data (jeśli musi być faktycznie zmienna).

    Jeśli koniecznie chcesz używać tej wtyczki do Eclipse, to polecam ściągnąć najnowszą wersję z SVN - do znalezienia bez problemu.

    4\/3!!

    0
  • #5 07 Gru 2009 13:47
    psiemek
    Poziom 21  

    Tzn nie koniecznie chcę jej używać ale jak na początek chciałem coś zautomatyzować. Szczerze mówiąc nie pisałem jeszcze makefile i stąd ten pomysł. Sekcję .jcr teoretycznie nie wykorzystuję. A przynajmniej jej sam nie deklarowałem. Tym bardziej że znajdują się w niej jakieś pliki z Code Sorcerery (crtend.o oraz crtn.o). Wedlug mnie gdzieś to w tym skrypcie jest dodane. Tylko po co i jak to wyłączyć. Freddie a ty korzystałeś z tego skryptu może ? Tobie też tworzył sekcję .jcr w RAMie ?

    Dodano po 1 [godziny] 32 [minuty]:

    Chyba doszedłem o co chodzi choć nie wiem dlaczego tak jest. Dotychczas kopiowałem od Ciebie tylko startup.s , hdr_special_registers.h i plik stm32f103rb_rom.ld i działało ale po zdjęciu zasilania i podłączeniu już nie. Dodałem plik vectors.c i zaczeło działać również po resecie. Dlaczego nie było błędów ani warningów w kompilacji. Czego mu brakuje co znalazł w pliku vectors.c ?

    0
  • #6 07 Gru 2009 13:47
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Jak mówiłem - umieść sekcję .jcr w .data w skrypcie linkera i będzie "dobrze" - będzie działać po resecie.

    Co do pisania Makefile - wszyscy podchodzą do tego jak do jeża, a to naprawdę jest proste, ponieważ nie trzeba tego robić [; , tylko trzeba znaleźć taki Makefile, żeby załatwiał wszystko sam, z ewentualnymi małymi poprawkami [; Jak zwykle polecam swój, który jest bliski tego "celu" <:

    EDIT:
    yyy... bez pliku vectors.c brakuje mu tego co jest w pliku vectors.c, czyli tablicy wektorów, bez której żaden mikrokontroler / procesor nie będzie działać.

    4\/3!!

    0
  • #7 08 Gru 2009 12:30
    psiemek
    Poziom 21  

    Ok, wydaje mi się że przewalczyłem ten problem. Tzn teraz mam plik *.ld (sam zedytowałem jakiś znaleziony w bibliotekach STM32) i dodałem tablicę wektorów znajdującą się w w pliku stm32f10x_it.c. (chodzi mi o to by wykorzystać biblioteki bez przeróbek). Wszystko się teraz ładuje do Flasha z tym że jak debuguję to procesor skacze po programie. Tzn wchodzi do reset handler później do pierwszej funkcji wywołanej w main potem na początku main a w końcu wskakuje do BusFault Handler. Teraz to już komletnie nie wiem o co chodzi.

    0
  • #8 09 Gru 2009 13:32
    psiemek
    Poziom 21  

    Jak rozumiem nikt nie miał takiego problemu że procesor skacze jak chce po czym ląduje w BusFault Handler ? Może ktoś wie co oznacza tenże wyjątek (BusFault) ?

    0
  • #9 09 Gru 2009 14:19
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Dokumentacja firmy ARM wie wszystko

    BusFault The BusFault fault handles memory related faults other than those handled by the
    MemManage fault for both instruction and data generated memory transactions. Typically
    these faults will arise from errors detected on the system buses. Implementations are
    permitted to report synchronous or asynchronous BusFaults according to the circumstances
    that trigger the exceptions. The fault can be disabled (in this case, a synchronous BusFault
    will escalate to HardFault). BusFault has a configurable priority.

    Istnieje szansa, że twój program skacze w przysłowiowe "maliny", gdzie w ogóle nie ma żadnej pamięci, albo że np chce "wykonywać" dane. Poskładałeś sobie kod z jakichś niekompatybilnych kawałków to masz [;

    4\/3!!

    0
  • #10 09 Gru 2009 22:42
    psiemek
    Poziom 21  

    No właśnie nie do końca. Skrypt startowy jak i całą resztę wziąłem z bibliotek STM. Tak samo skrypt linkera jednak tutaj troszkę pogrzebałem i stąd problem (prawdopodobnie).
    Mam taki plik:

    Code:

    /*
    Default linker script for STM32F10x_512K_64K
    Copyright RAISONANCE S.A.S. 2008
    */

    /* include the common STM32F10x sub-script */

    /* Common part of the linker scripts for STM32 devices*/


    /* default stack sizes.

    These are used by the startup in order to allocate stacks for the different modes.
    */

    __Stack_Size = 1024 ;

    PROVIDE ( _Stack_Size = __Stack_Size ) ;

    __Stack_Init = _estack  - __Stack_Size ;

    /*"PROVIDE" allows to easily override these values from an object file or the commmand line.*/
    PROVIDE ( _Stack_Init = __Stack_Init ) ;

    /*
    There will be a link error if there is not this amount of RAM free at the end.
    */
    _Minimum_Stack_Size = 0x100 ;


    /* include the memory spaces definitions sub-script */
    /*
    Linker subscript for STM32F10x definitions with 512K Flash and 1024K RAM */

    /* Memory Spaces Definitions */

    MEMORY
    {
      RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
      FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 10K
      FLASHB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0
      EXTMEMB0 (rx) : ORIGIN = 0x00000000, LENGTH = 0
      EXTMEMB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0
      EXTMEMB2 (rx) : ORIGIN = 0x00000000, LENGTH = 0
      EXTMEMB3 (rx) : ORIGIN = 0x00000000, LENGTH = 0
    }

    __main_stack_size = 1024;
    __process_stack_size = 1024;

    PROVIDE(__main_stack_size = __main_stack_size);
    PROVIDE(__process_stack_size = __process_stack_size);

    /* higher address of the user mode stack */
    _estack = 0x20010000;



    /* include the sections management sub-script for FLASH mode */

    ENTRY(Reset_Handler);

    /* Sections Definitions */

    SECTIONS
    {
        /* for Cortex devices, the beginning of the startup code is stored in the .isr_vector section, which goes to FLASH */
        .isr_vector :
        {
       . = ALIGN(4);
            KEEP(*(.isr_vector))            /* Startup code */
       . = ALIGN(4);
        } >FLASH
     
        /* for some STRx devices, the beginning of the startup code is stored in the .flashtext section, which goes to FLASH */
        .flashtext :
        {
       . = ALIGN(4);




            *(.flashtext)            /* Startup code */
       . = ALIGN(4);
        } >FLASH
     
       
        /* the program code is stored in the .text section, which goes to Flash */
        .text :
        {
           . = ALIGN(4);
          
            *(.text)                   /* remaining code */
            *(.text.*)                   /* remaining code */
            *(.rodata)                 /* read-only data (constants) */
            *(.rodata*)
            *(.glue_7)
            *(.glue_7t)

           . = ALIGN(4);
           _etext = .;
           /* This is used by the startup in order to initialize the .data secion */
           _sidata = _etext;
        } >FLASH
       
     

        /* This is the initialized data section
        The program executes knowing that the data is in the RAM
        but the loader puts the initial values in the FLASH (inidata).
        It is one task of the startup to copy the initial values from FLASH to RAM. */
        .data  : AT ( _sidata )
        {
           . = ALIGN(4);
            /* This is used by the startup in order to initialize the .data secion */
            _sdata = . ;
           
            *(.data)
            *(.data.*)

           . = ALIGN(4);
           /* This is used by the startup in order to initialize the .data secion */
           _edata = . ;
        } >RAM
       
       

        /* This is the uninitialized data section */
        .bss :
        {
           . = ALIGN(4);
            /* This is used by the startup in order to initialize the .bss secion */
            _sbss = .;
           
            *(.bss)
            *(COMMON)
           
           . = ALIGN(4);
           /* This is used by the startup in order to initialize the .bss secion */
           _ebss = . ;
        } >RAM
       
        PROVIDE ( end = _ebss );
        PROVIDE ( _end = _ebss );
       
        /* This is the user stack section
        This is just to check that there is enough RAM left for the User mode stack
        It should generate an error if it's full.
         */
        ._usrstack :
        {
           . = ALIGN(4);
            _susrstack = . ;
           
            . = . + _Minimum_Stack_Size ;
           
           . = ALIGN(4);
            _eusrstack = . ;
        } >RAM
       

       
        /* this is the FLASH Bank1 */
        /* the C or assembly source must explicitly place the code or data there
        using the "section" attribute */
        .b1text :
        {
            *(.b1text)                   /* remaining code */
            *(.b1rodata)                 /* read-only data (constants) */
            *(.b1rodata*)
        } >FLASHB1
       
        /* this is the EXTMEM */
        /* the C or assembly source must explicitly place the code or data there
        using the "section" attribute */
       
        /* EXTMEM Bank0 */
        .eb0text :
        {
            *(.eb0text)                   /* remaining code */
            *(.eb0rodata)                 /* read-only data (constants) */
            *(.eb0rodata*)
        } >EXTMEMB0
       
        /* EXTMEM Bank1 */
        .eb1text :
        {
            *(.eb1text)                   /* remaining code */
            *(.eb1rodata)                 /* read-only data (constants) */
            *(.eb1rodata*)
        } >EXTMEMB1
       
        /* EXTMEM Bank2 */
        .eb2text :
        {
            *(.eb2text)                   /* remaining code */
            *(.eb2rodata)                 /* read-only data (constants) */
            *(.eb2rodata*)
        } >EXTMEMB2
       
        /* EXTMEM Bank0 */
        .eb3text :
        {
            *(.eb3text)                   /* remaining code */
            *(.eb3rodata)                 /* read-only data (constants) */
            *(.eb3rodata*)
        } >EXTMEMB3
       
       
       
        /* after that it's only debugging information. */
       
        /* remove the debugging information from the standard libraries */
        DISCARD :
        {
         libc.a ( * )
         libm.a ( * )
         libgcc.a ( * )
         }

        /* Stabs debugging sections.  */
        .stab          0 : { *(.stab) }
        .stabstr       0 : { *(.stabstr) }
        .stab.excl     0 : { *(.stab.excl) }
        .stab.exclstr  0 : { *(.stab.exclstr) }
        .stab.index    0 : { *(.stab.index) }
        .stab.indexstr 0 : { *(.stab.indexstr) }
        .comment       0 : { *(.comment) }
        /* DWARF debug sections.
           Symbols in the DWARF debugging sections are relative to the beginning
           of the section so we begin them at 0.  */
        /* DWARF 1 */
        .debug          0 : { *(.debug) }
        .line           0 : { *(.line) }
        /* GNU DWARF 1 extensions */
        .debug_srcinfo  0 : { *(.debug_srcinfo) }
        .debug_sfnames  0 : { *(.debug_sfnames) }
        /* DWARF 1.1 and DWARF 2 */
        .debug_aranges  0 : { *(.debug_aranges) }
        .debug_pubnames 0 : { *(.debug_pubnames) }
        /* DWARF 2 */
        .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
        .debug_abbrev   0 : { *(.debug_abbrev) }
        .debug_line     0 : { *(.debug_line) }
        .debug_frame    0 : { *(.debug_frame) }
        .debug_str      0 : { *(.debug_str) }
        .debug_loc      0 : { *(.debug_loc) }
        .debug_macinfo  0 : { *(.debug_macinfo) }
        /* SGI/MIPS DWARF 2 extensions */
        .debug_weaknames 0 : { *(.debug_weaknames) }
        .debug_funcnames 0 : { *(.debug_funcnames) }
        .debug_typenames 0 : { *(.debug_typenames) }
        .debug_varnames  0 : { *(.debug_varnames) }
    }


    I nie wiem która linijka tego skryptu odpowiada za takie zachowanie. Mam procesor STM32F102C8 i chcę skorzystać ze standardowych bibliotek.

    Pozdrawiam i dziękuję ci Freddie za aktywny udział w moim temacie.

    0
  • #11 09 Gru 2009 23:30
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Po pierwsze ta linijka jest bardzo ciekawa:

    DISCARD :
    {
    libc.a ( * )
    libm.a ( * )
    libgcc.a ( * )
    }

    Ja bym to wywalił od razu, bo to wcale nie usuwa informacji debugowania, tylko CAŁOŚĆ kodu biblioteki, który w tym momencie nie będzie zlinkowany - dzielenie, funkcje matematyczne, dowolne funkcje "standardowe" - aż dziwne że z czymś takim się to kompiluje.

    Pozatym jeśli korzystasz z CodeSourcery, to na końcu każdej sekcji powinno być (np.):

    } >RAM AT >RAM

    gdzie pierwszy adres to "adres rzeczywisty", a drugi to "adres ładowania", który tylko dla .data powinien być inny (bo sekcja .data jest kopiowana na starcie programu z flasha), ale to masz załatwione przez te kiepawe dyrektywy na początku, więc .data zignoruj.

    Pozatym jest wyjątkowo pomieszany, więc problemów może być więcej.

    W skrypcie też masz fizycznie wymuszoną potrzebę posiadania 64kB RAMu, bez tego zawieszka gwarantowana (stos jest na fizycznym końcu pamięci o takim rozmiarze).

    Skrypt linkera wziąłeś jakiś udziwaczniony, ale nie wiem w którym miejscu ten mój by nie działał z tą biblioteką? Wystarczyłoby zmienić pewnie nazwę .vectors (u mnie) na .isr_vectors (tutaj) i koniec zmian w zasadzie... Zasadniczo nie wiem czemu którykolwiek z moich plików (startup, makefile, linker itp.) miałby nie działać z tą głupawą i nic nie wartą biblioteką, którą tak wszyscy uwielbiają...

    W ogóle beznadziejny ten skrypt... Człowiek się męczy starając się zrobić skrypt który jest na prawdę dobry, uniwersalny, wygodny, bezbłędny, jasny (zrozumiały) itp, ale większość osób jak widzę i tak woli jakieś "przekładańce" zrobione przez 100 osób i powielające 5 sprzecznych ze sobą konstrukcji, przez co strach cokolwiek tam zmieniać żeby nie popsuć, tylko po to, żeby używać jakichś dziwnych bibliotek... Chciałbym tylko powiedzieć, że jeśli ta biblioteka wymaga aż takich kombinacji, żeby zadziałać, to znaczy że jest po prostu "lewa do kwadratu" i chyba już nigdy nie skumam, co w niej takiego cudownego...

    Zirytowałem się lekko, ponieważ szukasz rozwiązania problemu, który już został przeze mnie rozwiązany dawno temu - przez stworzenie zestawu skrypt linkera + startup + makefile + tablica wektorów, który zawsze* działa. Teraz pytasz o rozwiązanie, a ja uważam, że jest ono wciąż takie samo - zastosuj moje pliki (zamiast jakichś przypadkowych kawałków pozbieranych w necie) i problem zniknie, a bibliotekę z nimi da się uruchomić na pewno, bo nawet ktoś o tym pisał na forum - jest to kwestia dodania kilku definicji i katalogów do Makefile'a (co nawet nie jest konieczne) i tyle, może jakieś niewielkie zmiany (nazwy) w pozostałych plikach i gotowe.

    4\/3!!
    ____

    * nie wątpię, że ktoś znajdzie sytuację gdy nie działają, ale ja obstaję przy swojej wersji - nie działają, bo ktoś nie wie co robi.

    0
  • #12 10 Gru 2009 09:19
    Bruum
    Poziom 23  

    Witam!
    Freddie-jesteś wielki i wszyscy tu to wiedzą. Odwalasz kawał roboty edykacyjnej, porobiłeś przykłady, linkery, skrypty i zestawy-szacun prawdziwy. Sam Ci dziękuję za kilka naprawdę pomocnych postów.
    Ale...
    Zwróć uwagę, że powtarzają się sytuacje:

    Cytat:

    W ogóle beznadziejny ten skrypt... Człowiek się męczy starając się zrobić skrypt który jest na prawdę dobry, uniwersalny, wygodny, bezbłędny, jasny (zrozumiały) itp, ale większość osób jak widzę i tak woli jakieś "przekładańce" zrobione przez 100 osób i powielające 5 sprzecznych ze sobą konstrukcji, przez co strach cokolwiek tam zmieniać żeby nie popsuć


    w różnych odcieniach.
    Nic tu nie pomoże ganienie "przekładańców" przy każdej okazji. Ludzie, ze mną na czele, nie mają tak naprawdę pojęcia co z tymi skur...łymi linkerami i skryptami zrobić. Masz chłopie odpowiednią wiedzę by to zmienić. Napisz porządnego ebuka i zamieść go na swojej stronie na zasadach np. takich jak instrukcja do freertos-Ty zarobisz a mi się rozjaśni. Tylko zrób to porządnie, nie tak jak sławna książka, gdzie zagadnienia są lekko naświetlone. Opisz makefile ale tak, żeby większość wiedziała po co jest każde pole, co robi, jak się to pisze. Co napiszesz, przyślij mi do przejżenia-zdziwisz się, ile kwestii dla Ciebie oczywistych, będzie wymagało gruntownego dopowiedzenia.
    Na rzeczywistość nie ma co się obrażać, trzeba ją poznać i w niej się znależć Kolego szanowny. O co mi chodzi? O angielski. Rzeczywistość jest taka, że nie wszyscy tu przegadają anglika w jego ojczystym języku. Więc potrzebne są nawet książki typu tłymaczenie datasheeta. Zobacz ilu korzysta z Twoich wykładów nt odpalenia eclipse itd itp.
    O bibliotekach to kiedy indziej.
    Pozdrawiam kj

    0
  • #13 10 Gru 2009 09:52
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Bruum napisał:
    Nic tu nie pomoże ganienie "przekładańców" przy każdej okazji. Ludzie, ze mną na czele, nie mają tak naprawdę pojęcia co z tymi skur...łymi linkerami i skryptami zrobić.

    Wywalić i zastosować takie które działają <:

    Cytat:
    Masz chłopie odpowiednią wiedzę by to zmienić.

    The truth lies out there [;

    Cytat:
    Opisz makefile ale tak, żeby większość wiedziała po co jest każde pole, co robi, jak się to pisze.

    To chyba niewykonalne [; Przecież to tak jakbyś chciał napisać w skrócie ebooka o skryptach shella w linuxie, możliwości gigantyczne, a każdy chciałby dokument na max 3 strony, który przeczytasz w 15 minut i wiesz wszystko. Nie jest tak? Czy większość nie poprzestaje na jakimś znalezionym w necie "skrawku" i nie dotyka go, bo nie chce się tracić czasu na walkę z narzędziami zamiast tworzenia jakiegoś kodu. Większość osób właśnie dlatego woli demo wersje komercyjnego softu, zamiast przewalczyć ten darmowy, co jest możliwe, ale nie proste. Zaczynam myśleć, że walka z tą postawą, to walka z wiatrakami.

    Cytat:
    Co napiszesz, przyślij mi do przejżenia-zdziwisz się, ile kwestii dla Ciebie oczywistych, będzie wymagało gruntownego dopowiedzenia.

    Popatrz na to tak - zamieściłem opisy na stronie i tematy tutaj na forum - w czym problem zaproponować coś czego brakuje, zasugerować ulepszenia, objaśnienia czy cokolwiek innego? Przesłać mi lepszą wersję? Jakoś nic takiego w zasadzie nie zaszło...

    Cytat:
    Na rzeczywistość nie ma co się obrażać, trzeba ją poznać i w niej się znależć Kolego szanowny.

    Jeśli chcesz podejścia "realisty" to raczej mi go nie sugeruj bo wygląda ono tak - "po co mam pomagać komukolwiek za "uśmiech", udostępniać cokolwiek za darmo i tracić swój cenny czas na szkolenie swojej własnej konkurencji na rynku pracy?" <: Nie obrażam się, ale chciałbym się dowiedzieć, czemu wiele osób zamiast - zgodnie z logiką "nie wyważania otwartych drzwi" - zastosować pliki które działają i robią coś dobrze, szuka jakichś dziwnych, niezrozumiałych i wzajemnie niekompatybilnych plików w necie? Z mojego punktu widzenia rozwiązaniem problemu ze skryptem linkera, Makefile'm czy startupem są takie zmiany, które w zasadzie tworzą z tych plików odpowiedniki logiczne moich wersji, więc po co robić to 100x? Po co 100x udzielać tej samej porady?

    Cytat:
    O co mi chodzi? O angielski. Rzeczywistość jest taka, że nie wszyscy tu przegadają anglika w jego ojczystym języku. Więc potrzebne są nawet książki typu tłymaczenie datasheeta.

    Tutaj można by odpowiedzieć tym co sam napisałeś wyżej - "zamiast próbować zmienić rzeczywistość, trzeba się w niej znaleźć". A że "angielski" jest tutaj "rzeczywistością", to cóż...

    Cytat:
    Zobacz ilu korzysta z Twoich wykładów nt odpalenia eclipse itd itp.

    Tego akurat w zasadzie nigdzie nie widziałem po angielsku w sensownej formie i z nowoczesną zawartością (pomijam dokumenty sprzed kilku lat, które są już totalnie nieaktualne).

    Cytat:
    O bibliotekach to kiedy indziej.

    Poproszę teraz, bo ten temat też mnie bardzo ciekawi... Czy sięgnięcie po tak wydajny procesor od razu oznacza, że można spokojnie stosować extremalnie głupi i niewydajny kod, który jest w 100% nieprzenośny na cokolwiek innego? Podejrzyjcie sobie czasem kod tej biblioteki... Nie uważam się za nie-wiadomo-jakiego-mistrza-programowania, ale to co tam jest, to z grubsza niekończące się Ctrl+C - Ctrl+V zamknięte w blokach typu if (ch == CH1) {...} else if (ch == CH2) {...} else if (ch == CH3) {...} ...

    4\/3!!

    0
  • #14 10 Gru 2009 09:56
    psiemek
    Poziom 21  

    Nie rozumiem twojej irytacji. Ktoś chce zrobić inaczej niż ty.
    Po prostu chcę zrobic po swojemu żeby się nauczyć czegoś i samemu sprawdzić czy te biblioteki są takie słabe jak piszesz. To że biblioteki narzucają dużo niepotrzebnych skoków i dyrektyw nie oznacza że są słabe. Te akurat są napisane degenerycznie co daje uniwersalność. Ja potrzebuję z nich skorzystać z prostego powodu. Potrzebuję dużej przenośności kodu w obrębie rodziny STM32, oraz obsługi wielu peryferii. Wszystko to muszę zrobić w dość krótkim czasie. Biblioteki mi to zapewnią o ile nie mają bugów. To że będą zużywały dużo zasobów nie oznacza że bez sensu jest ich stosowanie. A co do zaadaptowania twojego pliku *.ld to wyskakuje mi błąd:

    Code:

    undefined reference to `_ebss'   startup_stm32f10x_md.S
    undefined reference to `_edata'   startup_stm32f10x_md.S
    undefined reference to `_sbss'   startup_stm32f10x_md.S
    undefined reference to `_sdata'   startup_stm32f10x_md.S
    undefined reference to `_sidata'   startup_stm32f10x_md.S



    Jak dobrze rozumiem nie mam zdefiniowanych tych sekcji ale nie jestem pewien. Stąd moje pytania.
    Pozdrawiam

    0
  • #15 10 Gru 2009 10:19
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Symbole "początek X" i "koniec X" w moim skrypcie nazywają się inaczej niż tego oczekuje "ich" startup. Zmień "ich" _ebss na "moje" __bss_end itd. w startupie albo "moje" na "ich" w skrypcie linkera. Możesz nawet do skryptu linkera dopisac na końcu kilka linijek typu PROVIDE(_sidata = __data_init_start); ("remapując" moje symbole na ich nazwy) i wtedy wszystko będzie kompatybilne.

    Pytanie pozostaje otwarte - po co stosujesz "ich" startup, skoro nie robi on absolutnie nic więcej niż ten mój (a nawet mniej, bo tam używany jest tylko jeden stos, a ja wykorzystuje dwa, co łatwo wyłączyć, bo jest skomentowane co-gdzie-jak-dlaczego)?

    Dlaczego się irytuję? Dlaczego chcesz wyważać drzwi, które otwarłem?

    4\/3!!

    0