Citat:
gocha990:
E pa ljudi vako:
Interesuje me konkretno sta je bootloader,ono sto sam procitao(eng. literatura pa verovatno ne tumacim najbolje) je da je to mali programcic koji se upise se u memoriju tacinije flesh.Kada se dobije napajanje na kotroleru ili reset bootloader odredjuje da li ce krenuti sa citanjem vec naprzenog programa ili ce preko ISP-a da naprzi nov(ovo sam razumeo kao generalno :) ) . Sada me zanima sta jos moze da radi taj bootloader,netreba objasnjenja vec samo da mi pomenete neke primere...
bootloader radi bukvalno ovo:
STARTPROGRAMONPOWER:
- proveri da li je stecen uslov da se startuje bootloader (zavisi od bl do bl, negde treba prespojis 2 pina, negde neki pin treba bude high ili low, negde mora "Razlog za reset" da bude stagod etc, cesto uslov, posebno kod atmela, je npr da se u x ms od startovanja mcu-a posalje odredjeni kod na uart)
- ako nije stecen uslov da se startuje bootloader uradi JMP na mesto gde pocinje "pravi" kod
- ako je stecen uslov da se startuje bootloader nastavi dalje sa izvrsavanjem
- uspostavi konekciju sa klijent programom (setapuj komunikacioni kanal preko IR, UART, USB, SPI, 1Wire, WIFI .. stagod)
GLAVNABLPETLJA:
- cekaj komande od klijenta
- kad stigne komanda od klijenta izvrsi je
- goto GLAVNABLPETLJA
i to ti je to ...
sada "sta" sam BL radi zavisi od BL do BL, "svi" imaju opciju da
- obrisu cip (deo koji ne zauzima bootloader)
- upisu odredjenu vrednost na odredjenu adresu (tako se upisuje novi program preko starog)
- procita odredjenu vrednost sa odredjene adrese
sto mogu "jos" da rade, mogu svasta, mozes preko BL cesto da menjas konfig parametre samog BL-a, nekad mozes da updateujes i sam BL, mozes da menjas eeprom te na taj nacin menjas konfig parametre aplikacije, mozes da uradis neki (ili celu bateriju) test etc etc .... takodje zavisi od toga koji je mcu u pitanju bootloader je taj koji radi inicijalno konfigurisanje cipa i perfierije a u 99% slucajeva fuse bitovi se setuju pri przenju bootloadera i ne mogu se menjati kasnije (osim pri novom przenju bootloadera)
no osnovne 2 funkcije su - obrisi cip i uprogramiram mem lokaciju
sa klijent strane to izgleda otprilike
- cekaj da se ukonektujes sa bl-om
- posalji komandu da obrise cip
- posalji komandu da na pocetak program flash-a upise bajt X i pomeri pointer za 1
- dok postoji programa koji treba se upuca u cip posalji komandu da upise bajt X na poziciju pointera i poveca pointer za 1
- postavi pointer na pocetak prog memorije
- koliko ti je velik flash koji si upucavao, procitaj bajt po bajt (i pomeri svaki put pointer za jedan) i uporedi sa fajlom koji si upucao, ako naletis na gresku reci "greskaaa" i prestani
e sad, neki, moderniji (32bita, arm ...) imaju poseban bootloader u zasticenom delu cipa kome ti uopste ne mozes da pristupis, tu je fabricki i takav je kakav je, ne mozes ga obrisati, promeniti, ali se ponasa identicno kao i ovaj "obican" ... takodje neki "hobi" mcu-i imaju posebnu memoriju za bootloader i posebnu memoriju za program, pa sad ako ne koristis bootloader taj flash ti je bacen, neiskoristen, neki malo moderniji hobi cipovi mogu da fuse bitovima iskonfigurisu koliki je taj chunk date koja je odvojena za bootloader ... fora kod ovih koji imaju poseban bootloader (factory) ili imaju odvojen bootloader prostor je sto je u samom cipu napeceno kako se ponasa (npr na power on uvek ide i starta program, zaobilazi bootloader, ili ima specijalan B0 pin npr koji kad pipnes on startuje bootloader, ili uvek na reset cipa starta bootloader etc etc .. ima milion kombinacija)
Citat:
mst.petrovic:
Drugo,sta se desava ako program napecem direktno bez bootloader(znam da moze ali ne znam sta onda :) ) ?
ne zna mcu dal je taj kod koji on izvrsava "bootloader" ili "aplikacija" njemu je to sve isto ... on krece da izvrsava kod od neke adrese u memoriji, kaze "odavde mi je kod" i to puca u cpu i izvrsava, sta se tu nalazi njega ne zanima, on to izvrsava, ako se od te adrese (recimo 0x00000) nalazi bootloader on ce izvrsiti bootloader, ako se nalazi tvoj kod izvrsice tvoj kod... ti kad napeces direkt tvoj hex na cip programator ga napece od "pocetka", kada ga pucas kroz bootloader, bootloader je na pocetku a on shiftuje tvoj kod na neku "novu" adresu sa nekim malim ofsetom (cesto zbog tog ofseta bootloader moze da se gurne na kraj samog flash-a a na pocetku na adresi 0x00 imas samo jedan jmp tamo gde je pravi bootloader ... ) e sad, tu postoje neke "zackoljice" ... zavisi kako pises taj program tj generisani kod moze da ima absolutne i relativne reference (jmp npr moze da bude na +x bajtova od "trenutne lokacije" ili na adresu X), ako tvoj kod ima absolutne reference (jmp na adresu X) i ti ga pomeris bootloaderom da krece sa nekim ofsetom a ne od 0x0000 taj kod nece raditi .. postoje 2 resenja za taj problem
1. kompajliras kod (ili pises asm kod) koji ima iskljucivo relativne reference
2. u startu kazes kompajleru (tj kazes linkeru ali rekao si da te ne zanimaju detalji, tome sluze oni lkr fajlovi iliti linker skripte) da ce tvoj kod biti smesten na "drugo mesto" a ne na 0x00
Citat:
mst.petrovic:
Trece fuse i lock bitovi,njihova svrha i objasnjenje na srpskom ako moze,malo se gubim sa egleskim objasnjenjem....?
sluze za konfiguraciju cipa, svaki mcu ima svoje konfig bitove i oni se zovu ovako ili onako i sluze za razne stvari, postavljaju inicijalno ponasanje cipa (da li ce da koristi interni ili externi oscilator, da li opterecuje hf ili lf oscilator, dal mu je na ulazi rc kolo ili kristal, da li ima oscout ili ne, dal koristi reset pin, dal dozvoljava lv programiranje, dal ce na pinu X da bude funkcija Y ili funkcija Z, dal ce se samoresetuje ili ugasi ili ako napon padne ispod x, dal su u sumi ili u bunaru...) .. sta tacno koji fuse radi moras za tacno odredjeni cip da procitas u datasheet-u ... svi su pisani uber jednostavnim engleskim... ako se za neki zabodes, pitaj
lock bitovi su fuse bitovi kao i svaki drugi fuse bitovi samo su obicno malo "zasticeni" hardwerski (kada ogolis cip kiselinom ne mozes tek tako da ih vidis obicno imaju metal iznad sebe) i sluze kao i ostali fuse bitovi da postave ponasanje cipa, u ovom slucaju zovu se "lock" posto njima kazes cipu koje delove cipa dozvoljava da se citaju i pisu te mozes da zabranis da cip moze da se procita kada se stavi u programator setovanjem odgovarajucih lock bitova (te onda neko ko hoce da iskopira tvoj mcu mora plati 300eur kinezu da mu izvadi taj hex umesto da ga samo turi u programator i iscita)
Citat:
mst.petrovic:
Cetvrto,eeprom,zasta ga koristim ako naprimer program ceo napecem na flesh?
ako pitas, ne treba ti :)
Citat:
mst.petrovic:
Da li ce nrp naredbom #define pi 3,182........ ovu konstantu smestiti u eeprom ili flesh(ako samo to napisem,tj. ne napisem na koju lokaciju da je stavi)?
nece je smestiti nigde, #define ne definise konstantu vec makro te svuda u kodu gde pise pi on ce upise 3.141..
konstantne koje definises sa const idu u flash
citanje i pisanje iz eproma se radi posebnim komandama (ee_read() i ee_write() obicno) i eprom se obicno koristi za cuvanje konfiguracionih podataka za aplikaciju koji mogu da se menjaju iz aplikacije... npr ako pogledas moj sid.crsndoo.com source videces da se u epromu cuva
- default temperatura
- P koeficijent
- I koeficijent
- D koeficijent
- tip senzora i podaci o istom
dakle to su vrednosti koje se citaju "ponekad" (kad se upali sprava uglavnom) i menjaju retko (kada konfigurises novu drsku u ovom slucaju)
Citat:
mst.petrovic:
Peto,interrupt,da li on sluzi kao klasicna "uslovna pauza ili reset" u zavisnosti kako se isprogramira ili nesto drugo?
ne, ne, da
nikakva to nije pauza, niti je to kakav reset, to je nesto potpuno drugo, ali "svrha" interapta i sta je "interapt" prevazilaze pisanije unutar jednog ovakvog posta ..
Citat:
mst.petrovic:
Govorim konkretno o uC atmega328pu.
BOOTLOADER:
"Depending on the embedded system, bootloaders can begin their operation upon receiving a boot signal from a human (i.e., manual reset) or a peripheral device (i.e., the system host). This bootloader signal will first validate whether the bootloader itself is valid, determine whether the current device application is valid or not, communicate with the host to load the new application being presented, and then execute the application Flash rewrite as directed. "
Nasao sam ovo na jednom od tutoriala na netu,i ovde kaze da on prvo proverava sebe da li je validan,zatim prijavu samog uredjaja da li je validna,na sta se to odnosi?
da 328pu ARDUINO BOOTLOADER (pazi, postoje i DRUGI bootloaderi za 328pu!!! ne samo taj) onu prvu stvar koju radi (proveri da li je stecen uslov da se startuje bootloader) radi tako sto proveri
- da li si uradio manualni reset (kada se butne cip zna dal se butno iz reseta na reset pin, reseta od wdt-a, ili se butno na power on)
i onda krene da radi ... pri tome arduino bootloader ce da ceka onda neko vreme komandu od klijenta i ako je ne dobije odradice jmp direkt na tvoj kod
ovo oko validacije je nebitno, generalno on ce procita sam sebe i svoj checksum da proveri dal je ok (da nije slucajno "pokvaren") ali time ne moras da se zanimas
Citat:
mst.petrovic:
Da li uC moze da komunicira sa drugim uredjajima npr lcd bez bootloader?
naravno
Citat:
mst.petrovic:
Dalje,sa avrdude sam ubacio hex file arduinovog bootloadera.
HIGH FUSE BIT: 0xDA Sto znaci da je za memoriju bootloader-a odvojeno 2KB.E sada bootloader od arduina je 5.4KB i on se ucitao bez problema,a u datasheet-u pise hfuse bits 4KB(2024 words) max, a takodje pise da nije moguce smestiti bootloader u memoriju namenjenu za aplikaciju,kako je ucitao tih 5.4KB ?
krenes uvek od datasheet-a
citaj od stranice 331 :) ja nisam neki atmel ljubitelj da znam napamet a da ja citam pa da prepricavam nema smisla, posebno sto su atmel datasheetovi pisani idiotski :( (za pocetak u datasheet-u kaze da ima 32k flash-a a onda na grafu pokaze da mu se flash zavrsava na 16k a nigde ne kaze explicitno da su to adrese "word" vrednosti a ne "byte" vrednosti)