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:
Kompilacja:
Linkowanie (sprawdzałem w dwóch wersjach i tu też będę miał pytanie):
Wersja 1:
Pytanie: Czy do tak banalnych programów wystarczy zamiast skryptu linkera wskazanie, gdzie ma wpisać sekcję .text?
Wersja 2:
Przy czym, źródła pliku linkera:
I dalej, konwersja:
Potem wgrywanie na uC (uC to STM32f103VBT6):
I teraz, leci z tego co widzę HardFault, licznik programu ustawiony na kierunkowy do nieba, a w rejestrach "coś":
Dlaczego nie chce zaskoczyć? Gdzie popełniłem błąd?
Oczywiście uC jest sprawny, testowany, programy na jakiś templatach działają poprawnie.
Pozdrawiam
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
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
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