Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

LPC2124 - problem z timerem

directx11 13 Dec 2010 22:07 1836 10
  • #1
    directx11
    Level 17  
    Zapoznaję się powoli z tematem ARM-ów i korzystam z fajnej (tak mi się dotychczas wydawało :) strony Link. Generalnie najprostszy kod obsługi timera przepisałem stamtąd i niby wszystko działa ale z jednym mankamentem. Wypisuję na LCD numer kolejnego wywołania obsługi timera (zmienna globalna, zwiększana za każdym wywołaniem procedury obsługi przerwania timera) no i po dokładnie 256 + 8 wywołaniach program się zawiesza :/. Zmiana wartości do której liczy timer nie ma znaczenia. Ktoś zetknął się może z czymś takim? Myślałem pierwotnie, że zmienna globalna (char) coś miała z tym wspólnego ale int liczy grzecznie do 264-ech i to samo.
  • #3
    directx11
    Level 17  
    Załączam mój projekt, wiele się nie różni od tego przykładowego prócz paru prostych procedur do sterowania diodami i wyświetlaczem. Pracuję na zestawie ZL1ARM.
  • #4
    Freddie Chopin
    MCUs specialist
    Proponuję zacząć używać kompilatora CodeSourcery G++ - najnowszej wersji. Stare kompilatory czasem mają problemy z przerwaniami na ARM7.

    https://www.elektroda.pl/rtvforum/topic1313509.html
    https://www.elektroda.pl/rtvforum/topic1339518.html

    To po pierwsze - jak wciąż będzie źle to będziemy myśleć dalej, tylko może zamieść projekt w takiej postaci jak być powinien, a nie 10 plików od timera, część dla FreeRTOSa a my musimy się zastanawiać które są właściwe i używane.

    EDIT - OMG, WinARM sprzed tysiąca lat zainstalowany pod Cygwinem... Proponuje jeszcze związać sobie kciuki i założyć opaskę na jedno oko żeby było jeszcze trudniej... Tutorial lewy, napisany w 2010 roku, a na stronie WinARMa nawet pisze, że nie jest zalecany, bo zbyt stary:

    Quote:
    While the WinARM package might still be useful because of the included examples and tools the GNU tools (Compiler, binutils etc) in the WinARM package are rather outdated. Packages with more recent versions of the GNU ARM-cross-toolchain for MS Windows hosts:
    Codesourcery's Sourcery G++ Lite Edition for ARM
    Dave Murphy's devkitARM - part of devkitPro
    Michael Fischer's Yagarto

    Ale kto by to czytał...

    4\/3!!
  • #5
    directx11
    Level 17  
    Projekt jest taki jaki jest, przez make kompiluje się co trzeba, część funkcjonalności została tymczasowo zakomentowana (ta z FreeRTOS) w ramach poszukiwania źródła problemu. Z CodeSourcery walczyłem i walczę, ale problem mam ze skryptem linkera Twoja strona bardzo pożyteczna i ciekawa, przydałby się jakiś artykuł o skryptach linkera (podobny do tego z ustawianiem toolchain'a w dziale z artykułami). Próbowałem przerobić Makefile z mojego projektu pod CodeSourcery, ale dostaję błąd kompilacji:

    Code:
    e:/apps/sourcery g++ lite/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-non
    
    e-eabi/lib\libc.a(lib_a-init.o): In function `__libc_init_array':
    init.c:(.text+0x40): undefined reference to `_init'
    collect2: ld returned 1 exit status
    make: *** [out.elf] Błąd 1


    Kompiluję tylko plik main2124.c z przykładowym kodem z dokumentacji Sourcery:

    Code:
    #include <stdio.h>
    

    int factorial( int n )
    {
       if( n == 0 )
          return 1;
          
       return n * factorial (n - 1);
    }
    int main ()
    {
       int i;
       int n;
       for (i = 0; i < 10; ++i)
       {
          n = factorial (i);
          printf ("factorial(%d) = %d\n", i, n);
       }
       
       return 0;
    }
  • #6
    Freddie Chopin
    MCUs specialist
    Zamiast przerabiać skrypty linkera, poprawiać Makefile, dopasowywać startupy itp. to weź te pliki z mojego przykładu (tego dla LPC2103) - wystarczy że w skrypcie linkera ustawisz właściwą dla Twojego układu wielkość pamięci flash i RAM oraz rozmiary stosów. Skrypt Makefile skompiluje wszystkie pliki które są w głównym katalogu, jesli chcesz kompilować coś w podfolderach, to po prostu w odpowiednim miejscu trzeba dopisać te podfoldery.

    4\/3!!
  • #7
    directx11
    Level 17  
    Czy ten Twój makefile poprawnie generuje pliki *.hex, których można użyć we FlashMagic-u? Bo w moim przypadku się nie udało, nie widzę w logach budowania, żeby się tworzył (w makefile-u jest zdaje się nawet log pokazujący, że gdy stworzy się hex, to wypisze to w output-cie).
  • #8
    Freddie Chopin
    MCUs specialist
    Oczywiście że tworzy... Jeśli w Twoim przypadku się tak nie stało, to proponuję po prostu przeczytać logi, ewentualnie je zamieścić. No i zawsze w razie wątpliwości dobrze zrobić clean'a. Tak w ogóle to wiesz ile problemów mniej jest gdy się ma JTAGa zamiast zabawiania się FlashMagic i zworkami? <;

    4\/3!!
  • #9
    directx11
    Level 17  
    Code:
    D:\projects\arm\lp2124>make
    
    Compiling file: main.c
    arm-none-eabi-gcc -c -mcpu=arm7tdmi-s -O0 -ffunction-sections -fdata-sections -W
    all -Wstrict-prototypes -Wextra -std=gnu89 -g -ggdb3 -fverbose-asm -Wa,-ahlms=ou
    t/main.lst  -MD -MP -MF out/main.d -I.  -I./include/ main.c -o out/main.o

    Linking target: out/lpc2103_blink_led.elf
    arm-none-eabi-g++ -mcpu=arm7tdmi-s -Tlpc2103_rom.ld -g -Wl,-Map=out/lpc2103_blin
    k_led.map,--cref,--no-warn-mismatch -Wl,--gc-sections -nostartfiles   out/main.o
        -o out/lpc2103_blink_led.elf
    e:/apps/sourcery g++ lite/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-non
    e-eabi/bin/ld.exe: warning: cannot find entry symbol Reset_Handler; defaulting t
    o 00000000

    Creating extended listing: out/lpc2103_blink_led.lss
    arm-none-eabi-objdump -S out/lpc2103_blink_led.elf > out/lpc2103_blink_led.lss

    Creating memory dump: out/lpc2103_blink_led.dmp
    arm-none-eabi-objdump -x --syms out/lpc2103_blink_led.elf > out/lpc2103_blink_le
    d.dmp

    Creating IHEX image: out/lpc2103_blink_led.hex
    arm-none-eabi-objcopy -O ihex out/lpc2103_blink_led.elf out/lpc2103_blink_led.he
    x

    Creating binary image: out/lpc2103_blink_led.bin
    arm-none-eabi-objcopy -O binary out/lpc2103_blink_led.elf out/lpc2103_blink_led.
    bin

    Size of modules:
    arm-none-eabi-size -B -t --common  out/main.o
       text    data     bss     dec     hex filename
        772       0      24     796 begin_of_the_skype_highlighting              772 0 24 796      end_of_the_skype_highlighting     31c out/main.o
        772       0      24     796     31c (TOTALS)

    Size of target .elf file:
    arm-none-eabi-size -B out/lpc2103_blink_led.elf
       text    data     bss     dec     hex filename
          0       0    1024    1024     400 out/lpc2103_blink_led.elf


    No niby stworzył, ale jakiś dziwny jest dla mnie ten *.hex (wklejam zawartość), w każdym razie FlashMagic-owi się on absolutnie nie podoba:

    Code:
    :00000001FF


    Co do JTAG-a to powoli się przymierzam ;).
  • Helpful post
    #10
    Freddie Chopin
    MCUs specialist
    Pisałem przecież, żebyś wziął WSZYSTKIE pliki, a nie tylko makefile i skrypt linkera. "Wszystkie" czyli:
    1. lpc2103_rom.ld
    2. Makefile
    3. startup.S
    4. vectors.S
    5. hdr\hdr_cpsr.h

    Tym samym możesz ze swojego projektu wywalić następujące dwa pliki:
    1. boot.s
    2. lpc2124-rom.ld

    4\/3!!
  • #11
    directx11
    Level 17  
    Chyba faktycznie była to sprawa starego kompilatora. Na najnowszym CodeSourcery działa jak trzeba. Podziękowania dla kolegi Freddiego, temat uważam za wyczerpany.