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

LPC2124 - Zawieszanie programu po 264 wywołaniach timera, co robić?

directx11 13 Gru 2010 22:07 1944 10
REKLAMA
  • #1 8865412
    directx11
    Poziom 17  
    Posty: 250
    Pomógł: 25
    Ocena: 14
    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.
  • REKLAMA
  • REKLAMA
  • #3 8865779
    directx11
    Poziom 17  
    Posty: 250
    Pomógł: 25
    Ocena: 14
    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.
    Załączniki:
    • lpc2124.zip (19.96 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #4 8865824
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    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:

    Cytat:
    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 8867023
    directx11
    Poziom 17  
    Posty: 250
    Pomógł: 25
    Ocena: 14
    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:

    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:

    #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;
    }
  • REKLAMA
  • #6 8867262
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    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!!
  • REKLAMA
  • #7 8867431
    directx11
    Poziom 17  
    Posty: 250
    Pomógł: 25
    Ocena: 14
    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 8867552
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    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 8868319
    directx11
    Poziom 17  
    Posty: 250
    Pomógł: 25
    Ocena: 14
    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:



    Co do JTAG-a to powoli się przymierzam ;).
  • Pomocny post
    #10 8868436
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    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 8869302
    directx11
    Poziom 17  
    Posty: 250
    Pomógł: 25
    Ocena: 14
    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.

Podsumowanie tematu

✨ Użytkownik napotkał problem z zawieszaniem się programu po 264 wywołaniach timera w projekcie opartym na mikrokontrolerze LPC2124. Po wymianie doświadczeń z innymi uczestnikami forum, zasugerowano aktualizację kompilatora do CodeSourcery G++, ponieważ starsze wersje mogą mieć problemy z obsługą przerwań na ARM7. Użytkownik przesłał swój projekt, który zawierał m.in. pliki Makefile i skrypty linkera, a także próbował dostosować je do nowego kompilatora. Ostatecznie problem został rozwiązany po przejściu na nowszą wersję CodeSourcery, co potwierdził użytkownik.
Wygenerowane przez model językowy.
REKLAMA