MIKROKONTROLERY - ŁADOWANIE KODU

Transkrypt

MIKROKONTROLERY - ŁADOWANIE KODU
MIKROKONTROLERY - ŁADOWANIE KODU
DOSYĆ POWSZECHNYM STANDARDEM DLA FORMY ZBIORU WYNIKOWEGO
ASEMBLERA JEST TZW. HEXFILE, CZASEM ZWANY IBM HEX-File
WIELE KOMPILATORÓW, ZWŁASZCZA C i C++ POTRAFI RÓWNIEŻ DOSTARCZAĆ WYNIKU
KOMPILACJI I KONSOLIDACJI W FORMACIE .hex
N.B. UŻYTKOWNICY MIKROKONTROLERÓW (M. IN. AVR i ARM),
A RÓWNOCZEŚNIE ZWOLENNICY LINUXA SĄ OBDAROWANI WIELOMA PREZENTAMI,
KTÓRE WARTO POZNAĆ !
WEŹMY PRZYKŁAD DYSTRYBUCJI FEDORA (F14) ORAZ ARM:
BEZ WIĘKSZEGO WYSIŁKU MOŻNA ZAUWAŻYĆ GRUPĘ PAKIETÓW,
Z KTÓRYCH WYBIERAMY NP.:
- arm-gp2x-linux-binutils
- arm-gp2x-linux-gcc
- arm-gp2x-linux-glibc
- arm-gp2x-linux-kernel-headers
BINUTILS TO MOŻE NAJWIĘKSZE ZASKOCZENIE:
OBECNIE CROSS KOMPILATORY C I C++ ZWYKLE SĄ ZDOLNE DO ASEMBLACJI
WSTAWEK LUB WRĘCZ AUTONOMICZNYCH PROGRAMÓW W JĘZYKU WEWNĘTRZNYM.
OTOŻ BINUTILS POZWALAJĄ OBEJŚĆ SIĘ BEZ TYCH WIELKICH NARZĘDZI
Piotr Malecki
1/9
MIKROKONTROLERY - ŁADOWANIE KODU
WEŹMY PRZYKŁAD PROGRAMU, KTÓRY JEST TRYWIALNY, BO NIE O PROGRAM TU CHODZI:
.globl _start
_start:
mov r0,#1
mov r1,r0
str r1,[r2]
arm-gp2x-linux-as -o hello.o hello.s
arm-gp2x-linux-ld -o hello.elf hello.o
arm-gp2x-linux-objdump -D hello.elf > hello.lst
hello.elf:
file format elf32-littlearm
Disassembly of section .text:
00008074 <_start>:
8074: e3a00001
8078: e1a01000
807c: e5821000
Piotr Malecki
mov r0, #1
mov r1, r0
str r1, [r2]
; 0x1
2/9
MIKROKONTROLERY - ŁADOWANIE KODU
MAMY TEŻ I TAKĄ FUNKCJĘ (ALE TO PEWNIE WAŻNE DLA BILL'A) :
arm-gp2x-linux-objcopy -O binary hello.elf hello.bin
ZAŚ SUPER PREZENT DLA NAS, TO:
arm-gp2x-linux-objcopy -O ihex hello.elf hello.hex
NASZ PRZYKŁAD POKAŻE SIĘ W FORMIE:
:0C8074000100A0E30010A0E1001082E574
:040000030000807405
:00000001FF
Piotr Malecki
3/9
MIKROKONTROLERY - ŁADOWANIE KODU
JESZCZE RAZ, BARDZIEJ KOMPLETNIE O .hex :
:llaaaatt[dd...]cc
* : is the colon that starts every Intel HEX record.
* ll is the record-length field that represents the number of data bytes (dd) in the record.
* aaaa is the address field that represents the starting address for subsequent data
in the record.
* tt is the field that represents the HEX record type, which may be one of the following:
00 - data record
01 - end-of-file record
02 - extended segment address record
04 - extended linear address record
* dd is a data field that represents one byte of data. A record may have multiple data bytes.
The number of data bytes in the record must match the number specified by the ll field.
* cc is the checksum field that represents the checksum of the record. The checksum is
calculated by summing the values of all hexadecimal digit pairs in the record modulo 256
and taking the two's complement.
Piotr Malecki
4/9
MIKROKONTROLERY - ŁADOWANIE KODU
NIBY ZGODA, ALE ...
.hex JEST ISTOTNIE POWSZECHNYM STANDARDEM ALE „POŚREDNIM”
KIEDY PRZYCHODZI DO DIALOGU Z „BOOT LOADER'AMI” TO PRAWIE KAŻDY
PRODUCENT MA SWOJE WŁASNE POMYSŁY.
ZWYKLE ZAKAMUFLOWANE W FIRMOWYCH NARZĘDZIACH ŁADUJĄCYCH KODY
DO PAMIĘCI MIKROKONTROLERÓW.
GDY JEDNAK POTRZEBUJEMY ZROZUMIEĆ DIALOG „ZASZYTEGO” W MIKROKONTROLERZE
„BOOT-LOADER'A”, „MINILOADER'A”, „BOOTSTRAP LOADER'A” ... ,
BO JESTEŚMY OSZCZĘDNI, LUB DOCIEKLIWI, LUB MAMY INNE WAŻNE POWODY, TO
OKAZUJE SIĘ, ŻE
„POMYSŁOWOŚĆ LUDZKA NIE MA GRANIC”
TEN TON JEST ISTOTNIE KRYTYCZNY, BO WYSTARCZY ZDAĆ SOBIE SPRAWĘ
Z TEGO, ŻE JAKKOLWIEK „UPIĘKSZONY” JEST DIALOG, TO NIE WNOSI ON
ABSOLUTNIE NICZEGO, CZEGO NIE MA JUŻ W FORMACIE .hex !
JEST TO TŁUMACZENIE .hex „W LOCIE”, ZWYKLE LINIA W LINIĘ.
NAJPIERW PRZYKŁAD DLA „8051” OD ANALOG DEVICES
======>
Piotr Malecki
./812/Uc004_v30.pdf
5/9
MIKROKONTROLERY - ŁADOWANIE KODU
A JAK TO ROBIĄ DLA ARM?
ARM MA WIELU PRODUCENTÓW,
A KAŻDY MOŻE PRODUKOWAĆ SZEREG TYPÓW ARM ...
WEŹMY PRZYKŁAD PHILIPS LPC2114 / 2124 / 2212 / 2214
CHIP MA FABRYCZNIE WGRANY OK 8k BOOT LOADER, KTÓRY REZYDUJE
W REGIONIE 0x0001 E000 : 0x0001 FFFF.
PRZY KAŻDYM RESET JEST ODWZOROWYWANY PONADTO W NAJWYŻSZYCH ADRESACH
CZYLI OD 0x7FFF E000.
BOOT LOADER SŁUŻY PROGRAMOWANIU CZY REPROGRAMOWANIU MIKROKONTROLERA,
(FUNKCJA „IN_SYSTEM_PROGRAMMING”),
A TAKŻE WYMAZYWANIU I ZAPISYWANIU FLASH MEMORY PRZEZ APLIKACJE UŻYTKOWNIKA (FUNKCJA „IN APPLICATION PROGRAMMING”).
TU ZAJMIEMY SIĘ ISP
KAŻDE WŁĄCZENIE ZASILANIA LUB RESET LOADER MOŻE PRZEJŚĆ DO FUNKCJI ISP.
DLA TEGO MUSZĄ BYĆ SPEŁNIONE WARUNKI:
- „TECHNICZNO-CZASOWE” : PO ODPOWIEDNIO DŁUGIM OKRESIE LOW , PIN RESET
P0.14, NASTĘPNIE PRÓBKOWANE ZEGAREM (X1). PO OK. 3 ms – JEŚLI P0.14 JEST
HIGH TO OZNACZA, ŻE „NIE MA ZAPOTRZEBOWANIA” NA ISP.
- ZATEM, TRZEBA SPRAWDZIĆ, CZY JEST WGRANA POPRAWNA POPRAWNA APLIKACJA
- I CZY JEST UAKTYWNIONY WATCHDOG.
Piotr Malecki
6/9
MIKROKONTROLERY - ŁADOWANIE KODU
Piotr Malecki
7/9
MIKROKONTROLERY - ŁADOWANIE KODU
KRYTERIUM „POPRAWNA APLIKACJA” MA SWOJĄ LITURGIĘ:
JAK ZWYKLE W PROCESORACH CYFROWYCH PRZESTRZEŃ NAJNIŻSZYCH ADRESÓW
(W ZASADZIE PAMIĘCI KODU, ALE TU MAMY ARCHITEKTURĘ VON NEUMANN'A ...)
ZAJMUJĄ „WEKTORY” PRZERWAŃ.
W NASZYM PRZYPADKU WŚRÓD NICH, W LOKACJI 0x000 0014 MA ZNAJDOWAĆ SIĘ
SUMA KONTROLNA ( RACZEJ JEJ 2'S COMPLEMENT) WSZYSTKICH WEKTORÓW.
WŚRÓD NICH POD ADRSEM 0x0000 0000 POWINIEN BYĆ SKOK DO STARTU APLIKACJI
(TO JEST JAK PRZERWANIE OD RESET CZYLI PRZERWANIE O NAJWYŻSZYM PRIORYTECIE).
JEŚLI KRYTERIU TO NIE JEST SPEŁNIONE, PROCESOR ROZPOCZYNA PROCEDURĘ
AUTO-BAUD
JEST TO SPECJALNY DIALOG HOST'A Z MIKROKONTROLEREM. PROWADZONY PRZEZ PORT
SZEREGOWY (COM0, 8 BITÓW DANYCH, 1 STOP, NO PARITY)
HOST WYSYŁA „?”. DOBRY ZNAK DLA SYNCHRONIZACJI: 0x3F.
A MIKROKONTROLER PRÓBKUJE CZAS SWOIM ZEGAREM I „UCZY SIĘ” ILE ZAJMUJE
JEDEN BIT. NASTĘPNIE WYSYŁA ŁAŃCUCH „Synchronized<CR><LF>”. TAKIM TEŻ ŁAŃCUCHEM
ODPOWIADA PC.
PO CZYM NASTĘPUJE REALIZACJA ISP COMMUNICATION PROTOCOL
=====>
Piotr Malecki
8/9
MIKROKONTROLERY - ŁADOWANIE KODU
ISP COMMUNICATION PROTOCOL
KAŻDA KOMENDA TO POJEDYNCZY CIĄG ZNAKÓW ASCII ZAKOŃCZONY <CR> <LF>
DANE SĄ PRZESYŁANE I ODBIERANE W „UU-ENCODED” FORMAT
(3 BAJTY DANYCH KONWEROWANE SĄ W 4 BAJTY ZNAKÓW ASCII, KTÓRE MAJĄ
„REPREZENTACJĘ” DRUKARSKĄ)
ISP COMMAND FORMAT:
„COMMAND PARAMETER_0, PARAMETER_1 .... PARAMETER_N<CR>>LF>” „DATA” - JEŚLI SĄ
ISP RESPONSE FORMAT:
RETURN_CODE<CR><LF>RESPONSE_0<CR><LF>RESPONSE_1<CR><LF> ...
REPERTUAR KOMEND:
UNLOCK
SET BAUD RATE
ECHO
WRITE TO RAM
READ MEMORY
PREPARE SECTOR
COPY RAM
GO
ERASE SECTOR
BLANK CHECK
Piotr Malecki
U
B
A
W
R
P
C
G
E
I
-”-
READ PART ID
READ BOOT CODE VER.
COMPARE
J
K
M
9/9