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

[STM32f1x] [STM32f1x][ASM] Wgrywanie binarki - dziwne zachowanie po wgraniu programu

tyrreus 23 Lut 2012 21:14 1848 7
REKLAMA
  • #1 10589439
    tyrreus
    Poziom 9  
    Posty: 43
    Ocena: 1
    Hej,

    Napisałem (chyba) najprostszy program w assemblerze który ma szanse zadziałać (no dobra prostsze było by ustawienie jednego rejestru - lecz nie w tym rzecz ;) ).

    Po skompilowaniu, zlinkowaniu i przekonwertowaniu na format binarny, wgrywam na uC i dzieją się dziwne rzeczy.

    Otóż,

    program:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Kompilacja:

    
    arm-none-eabi-as -mcpu=cortex-m3 -mthumb -mapcs-32 -gstabs -ahls=hello.lst -o hello.o hello.s
    


    Linkowanie (sprawdzałem w dwóch wersjach i tu też będę miał pytanie):

    Wersja 1:
    
    arm-none-eabi-ld -Ttext=0x0 -o hello.elf hello.o
    


    Pytanie: Czy do tak banalnych programów wystarczy zamiast skryptu linkera wskazanie, gdzie ma wpisać sekcję .text?

    REKLAMA


    Wersja 2:
    
    arm-none-eabi-ld -v -T stm32.ld -nostartfiles -o hello.elf hello.o
    


    Przy czym, źródła pliku linkera:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    I dalej, konwersja:

    
    arm-none-eabi-objcopy -O binary hello.elf hello.bin
    


    Potem wgrywanie na uC (uC to STM32f103VBT6):
    
    > reset halt
    JTAG tap: stm32f1x.cpu tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x3)
    JTAG tap: stm32f1x.bs tap/device found: 0x16410041 (mfg: 0x020, part: 0x6410, ver: 0x1)
    target state: halted
    target halted due to debug-request, current mode: Thread 
    xPSR: 00000000 pc: 0xe3a01004 msp: 0xe3a00004
    
    > flash write_bank 0 ~/hello.bin 0
    device id = 0x20036410
    flash size = 128kbytes
    wrote 40 bytes from file ~/hello.bin to flash bank 0 at offset 0x00000000 in 0.672028s (0.058 KiB/s)
    
    > reset
    JTAG tap: stm32f1x.cpu tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x3)
    JTAG tap: stm32f1x.bs tap/device found: 0x16410041 (mfg: 0x020, part: 0x6410, ver: 0x1)
    stm32f1x.cpu -- clearing lockup after double fault
    target state: halted
    target halted due to debug-request, current mode: Handler HardFault
    xPSR: 0x00000003 pc: 0xeafffffe msp: 0xe39fffe4
    Polling target failed, GDB will be halted. Polling again in 100ms
    Polling succeeded again
    


    I teraz, leci z tego co widzę HardFault, licznik programu ustawiony na kierunkowy do nieba, a w rejestrach "coś":

    
    > reg
    ===== arm v7m registers
    (0) r0 (/32): 0x00000004
    (1) r1 (/32): 0x00000014
    (2) r2 (/32): 0x20000040
    (3) r3 (/32): 0x20002040
    (4) r4 (/32): 0x08000002
    (5) r5 (/32): 0x2000004A
    (6) r6 (/32): 0x00000004
    (7) r7 (/32): 0x00000014
    (8) r8 (/32): 0xFFBFFFFF
    (9) r9 (/32): 0xFFFFFFFD
    (10) r10 (/32): 0xD997E854
    (11) r11 (/32): 0xD83567F1
    (12) r12 (/32): 0xFFFFFFFF
    (13) sp (/32): 0xE39FFFE4
    (14) lr (/32): 0xFFFFFFF9
    (15) pc (/32): 0xEAFFFFFE
    (16) xPSR (/32): 0x00000003
    (17) msp (/32): 0xE39FFFE4
    (18) psp (/32): 0xE2626D64
    (19) primask (/1): 0x00
    (20) basepri (/8): 0x00
    (21) faultmask (/1): 0x00
    (22) control (/2): 0x00
    ===== cortex-m3 dwt registers
    (23) dwt_ctrl (/32)
    (24) dwt_cyccnt (/32)
    (25) dwt_0_comp (/32)
    (26) dwt_0_mask (/4)
    (27) dwt_0_function (/32)
    (28) dwt_1_comp (/32)
    (29) dwt_1_mask (/4)
    (30) dwt_1_function (/32)
    (31) dwt_2_comp (/32)
    (32) dwt_2_mask (/4)
    (33) dwt_2_function (/32)
    (34) dwt_3_comp (/32)
    (35) dwt_3_mask (/4)
    (36) dwt_3_function (/32)
    


    Dlaczego nie chce zaskoczyć? Gdzie popełniłem błąd?

    Oczywiście uC jest sprawny, testowany, programy na jakiś templatach działają poprawnie.

    Pozdrawiam
  • REKLAMA
  • REKLAMA
  • #3 10605758
    tyrreus
    Poziom 9  
    Posty: 43
    Ocena: 1
    Ok, wszystko pięknie ładnie, ale jak to przenieść do ASM ? Może jakieś tutoriale ktoś zna? Takie, które ładnie opisują wszystko po kolei? Kod, kompilacja, linker (co z czym, po co) etc.? Znalazłem jeden - zgodnie z którym napisałem to co jest wyżej, ale jak widać nie wszystko tam jest objaśnione i kod jest nie pełny.

    Większość z materiałów które znalazłem, to pisanie w C z użyciem dostarczonych libów.

    Albo, "użyj templata freddiego - tak będzie lepiej" - który de facto też jest napisany w C a w skrypcie linkera jest tyle linii, że nie sposób się w tym połapać zaczynając przygodę z programowaniem ARMów (generalnie uC).

    A to co napisał albertb nie wiele wyjaśnia. Ktoś może powiedzieć coś więcej?

    Pozdrawiam
  • #4 10605827
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Weź więc "template freddiego", skompiluj i obejrzyj magiczny plik z rozszerzeniem lss, który jest pełną i skomentowaną dezassemblacją całego programu - będziesz wiedział co ma być gdzie (;

    Co do odpowiedzi na Twoje pytanie główne (powód problemu) - przejrzyj sobie tablicę wektorów z wiadomego template'u, pamiętając o "samym początku", który wspomniał Albert.

    4\/3!!
  • REKLAMA
  • #5 10608382
    gaskoin
    Poziom 38  
    Posty: 4159
    Pomógł: 436
    Ocena: 102
    tyrreus napisał:
    Albo, "użyj templata freddiego - tak będzie lepiej" - który de facto też jest napisany w C a w skrypcie linkera jest tyle linii, że nie sposób się w tym połapać zaczynając przygodę z programowaniem ARMów (generalnie uC).


    Od złej strony zaczynasz. Najpierw ogarnij co i jak a potem pisze a nie na odwrót. Jak się uczę survivalu to nie rzucam się od razu do gęstej dżungli tylko najpierw chodzę po trawie.
  • #6 10608485
    tyrreus
    Poziom 9  
    Posty: 43
    Ocena: 1
    Nie zgadzam się ;)

    Pisałem kiedyś coś na AVRa, w C ale było to dawno, małoskomplikowanie i dodatkowo napisałem ostatnio w C soft do detekcji kolorów na STM32 (na przetworniku TCS3200D) opierałem się na templacie Freddiego (skrypty linkera oraz makefile (bez używania libów)) więc "nie zaglądałem głęboko pod maskę" i myślę, że w końcu powinienem - więc napisałem, że "zaczynam przygodę z programowaniem ARMów" - nie mam za dużo na koncie.

    Dzień w dzień programuje w pracy - ale zdecydowanie wyżej niż ASM no i zdecydowanie "bardziej objektowo" ale od nadmiaru bujania w chmurach ciągnie mnie do ziemi.

    Cytat:
    obejrzyj magiczny plik z rozszerzeniem lss


    Przeglądam i widzę podział na sekcję, (inicjalizację pierwszego i drugiego stosu, skok do "low level init, inicjalizację sekcji .data i .bss) ale jest kilka instrukcji (np. strcc.w) których nie rozumiem. Muszę dokładnie to przeanalizować i pewnie jak to sobie usystematyzuję to będę dalej pytał.

    A co rozumiesz jako alegorię trawy? ;)

    Uważam, że najlepiej się uczyć na przykładach.

    P.S. Może zamiast krytyki jakaś podpowiedź? ;)
  • REKLAMA
  • #7 10608856
    gaskoin
    Poziom 38  
    Posty: 4159
    Pomógł: 436
    Ocena: 102
    Freddie napisał chyba wszystko więc podpowiedź byłaby powtórką. Generalnie na początku układ musi mieć zainicjalizowany któryś ze stosów i chociaż część wektora przerwań żeby działał.

    Podpowiem tylko, że Twój typ nauki wymaga sięgania do źródeł, tzn dokumentacji. Bo raczej tutoriala nie znajdziesz.

    Moja "teoria trawy" polega na tym, że błądzisz w dżungli, nie znając najprostszych podstaw jej działania.

    Po asemblera musisz sięgnąć do dwóch dokumentów - opisu cortexa i opisu arma, ponieważ Ten procesor to taka hybryda :)

    STRCC taka unstrukcja to warunkowy store (CC - Carry Clear, czyli C - 0), jeżeli warunek nie zachodzi to instrukcja jest traktowana jak nop. Jeżeli masz samego store'a to ma on flagę AL (always - czyli wykonuje się zawsze)
  • #8 10609340
    tyrreus
    Poziom 9  
    Posty: 43
    Ocena: 1
    No, ok dziekuje Panowie za podpowiedzi.

Podsumowanie tematu

✨ Użytkownik napotkał problemy po wgraniu programu napisanego w assemblerze na mikrokontroler STM32. W odpowiedziach zasugerowano, aby zwrócił uwagę na tablicę wektorów oraz zainicjalizował stosy, co jest kluczowe dla działania programu. Wskazano również na potrzebę przestudiowania dokumentacji ARM oraz Cortex, aby lepiej zrozumieć działanie procesora. Użytkownik poszukiwał tutoriali dotyczących programowania w assemblerze, jednak większość dostępnych materiałów dotyczyła języka C. Wskazano na przydatność plików z rozszerzeniem .lss, które zawierają dezassemblację programu, co może pomóc w nauce.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA