
Kohtumisel 0x0A DC7831 16. veebruaril esitlesime ettekannet binaarkoodi emuleerimise pĂ”hialustest ja meie enda arendusest â riistvaraplatvormide emulaatorist .
Artiklis anname ĂŒlevaate seadme pĂŒsivara kĂ€ivitamisest emulaatoris, nĂ€itame suhtlemist siluriga ja teeme vĂ€ikese dĂŒnaamilise analĂŒĂŒsi pĂŒsivaramudelist.
Eelalugu
A long time ago in a galaxy far far away
MĂ”ned aastad tagasi tekkis meie laboris vajadus uurida seadme pĂŒsivara. PĂŒsivara oli kompressitud, lahti pakkimise tegi bootloader. See toimus ĂŒsna keerulisel viisil, mitu korda andmeid mĂ€llu paigutades. Ning ise pĂŒsivara suhtles aktiivselt perifeeriaga. Ja kĂ”ik see MIPS-i tuumal.
Oleme pĂ”hjusel, et olemasolevad emulaatorid meid ei rahuldanud, otsustanud luua oma emulaatori, mis teeks miinimumi ja vĂ”imaldaks pĂ”hifirmavara avada. Proovisime â ja see Ă”nnestus. MĂ”tlesime, et mis siis, kui lisame perifeeria, et pĂ”hifirmavara veel kĂ€itada. See ei olnud liiga valus â ja jĂ€lle Ă”nnestus. JĂ”udsime jĂ€reldusele, et peaksime tegema tĂ€ieliku emulaatori.
LĂ”puks saime emulaatori arvutus sĂŒsteemide jaoks. .

Miks Kopycat?
Siin on sÔnamÀng.
- copycat (ingl., nim. [ËkÉpÉȘkĂŠt]) â jĂ€ljendaja, imiteerija
- cat (ingl., nim. [ËkĂŠt]) â kass, kassipoeg â ĂŒks projekti looja lemmikloomadest
- TĂ€ht «K» â programmeerimiskeel Kotlin'i jĂ€rgi
Kopycat
Emulaatori loomisel seati tÀielikult kindlad eesmÀrgid:
- vÔimalus kiiresti luua uus perifeeria, moodul, protsessorituum;
- vÔimalus kokku panna virtuaalne seade erinevatest moodulitest;
- vÔimalus laadida virtuaalse seadme mÀllu mis tahes binaardata (firmavara);
- vĂ”imalus töötada hetkepiltidega (sĂŒsteemi seisundi pildistamine);
- vÔimalus suhelda emulaatoriga sisseehitatud veaparandaja kaudu;
- mugav ja kaasaegne arenduskeel.
LĂ”puks valiti teostuseks Kotlin, bussiarhitektuur (see on, kui moodulid ĂŒhendatakse omavahel lĂ€bi virtuaalsete andmebusside), JSON seadme kirjeldusvorminguks ning GDB RSP protokolliks suhtlemiseks debuggeriga.
Arendus on kestnud juba ĂŒle kahe aasta ja jĂ€tkub aktiivselt. Selle aja jooksul on teostatud MIPS, x86, V850ES, ARM ja PowerPC protsessorituumad.
Projekt kasvab ning on aeg esitleda seda laiemale publikule. Projekti ĂŒksikasjaliku kirjelduse anname hiljem, praegu keskendume Kopycati kasutamisele.
KĂ”ige kannatamatumatele â emulaatori promoversiooni saab alla laadida .
Norsule emulaatoris
KĂ€ remindersime, et varem loodi konverentsile SMARTRHINO-2018 testseade nimega âNorsuâ tagasiregistreerimise oskuste Ă”ppimiseks. Firmware'i staatilist analĂŒĂŒsi on kirjeldatud .
NĂŒĂŒd proovime lisada "dĂŒnaamikat" ja kĂ€ivitame firmware emulaatoris.
Meil on vaja:
1) Java 1.8
2) Python ja moodul Python'i kasutamiseks emulaatori sees. Windowsi jaoks saab WHL paketti Jep moodulist .
Windowsi jaoks:
1)
2)
Linuxi jaoks:
1) socat
GDB-klientina saab kasutada Eclipse'i, IDA Pro'd vÔi radare2.
Kuidas see töötab?
Emulaatori vahetamiseks tuleb luua virtuaalne seade, mis esindab reaalset seadet.
Reaalset seadet (âninasarvikâ) saab nĂ€idata struktuuri scheemina:

Emulaatoril on modulaarsestruktuur ning lÔplikku virtuaalset seadet saab kirjeldada JSON-failis.
JSON 105 rida
{
"top": true,
// Plugina nime peaks olema sama, mis faili nimi (vÔi tÀispikk tee raamatukogust)
"plugin": "rhino",
// Kaust, kuhu plugin salvestatakse
"library": "user",
// Plugina parameetrid (konstruktoriparameetrid, kui jar-plugin versioon)
"params": [
{ "name": "tty_dbg", "type": "String"},
{ "name": "tty_bt", "type": "String"},
{ "name": "firmware", "type": "String", "default": "NUL"}
],
// Plugina vÀlist sadamat
"ports": [ ],
// Plugina sisebussid
"buses": [
{ "name": "mem", "size": "BUS30" },
{ "name": "nand", "size": "4" },
{ "name": "gpio", "size": "BUS32" }
],
// Plugina sisekomponendid
"modules": [
{
"name": "u1_stm32",
"plugin": "STM32F042",
"library": "mcu",
"params": {
"firmware:String": "params.firmware"
}
},
{
"name": "usart_debug",
"plugin": "UartSerialTerminal",
"library": "terminals",
"params": {
"tty": "params.tty_dbg"
}
},
{
"name": "term_bt",
"plugin": "UartSerialTerminal",
"library": "terminals",
"params": {
"tty": "params.tty_bt"
}
},
{
"name": "bluetooth",
"plugin": "BT",
"library": "mcu"
},
{ "name": "led_0", "plugin": "LED", "library": "mcu" },
{ "name": "led_1", "plugin": "LED", "library": "mcu" },
{ "name": "led_2", "plugin": "LED", "library": "mcu" },
{ "name": "led_3", "plugin": "LED", "library": "mcu" },
{ "name": "led_4", "plugin": "LED", "library": "mcu" },
{ "name": "led_5", "plugin": "LED", "library": "mcu" },
{ "name": "led_6", "plugin": "LED", "library": "mcu" },
{ "name": "led_7", "plugin": "LED", "library": "mcu" },
{ "name": "led_8", "plugin": "LED", "library": "mcu" },
{ "name": "led_9", "plugin": "LED", "library": "mcu" },
{ "name": "led_10", "plugin": "LED", "library": "mcu" },
{ "name": "led_11", "plugin": "LED", "library": "mcu" },
{ "name": "led_12", "plugin": "LED", "library": "mcu" },
{ "name": "led_13", "plugin": "LED", "library": "mcu" },
{ "name": "led_14", "plugin": "LED", "library": "mcu" },
{ "name": "led_15", "plugin": "LED", "library": "mcu" }
],
// Plugina ĂŒhendused komponentide vahel
"connections": [
[ "u1_stm32.ports.usart1_m", "usart_debug.ports.term_s"],
[ "u1_stm32.ports.usart1_s", "usart_debug.ports.term_m"],
[ "u1_stm32.ports.usart2_m", "bluetooth.ports.usart_m"],
[ "u1_stm32.ports.usart2_s", "bluetooth.ports.usart_s"],
[ "bluetooth.ports.bt_s", "term_bt.ports.term_m"],
[ "bluetooth.ports.bt_m", "term_bt.ports.term_s"],
[ "led_0.ports.pin", "u1_stm32.buses.pin_output_a", "0x00"],
[ "led_1.ports.pin", "u1_stm32.buses.pin_output_a", "0x01"],
[ "led_2.ports.pin", "u1_stm32.buses.pin_output_a", "0x02"],
[ "led_3.ports.pin", "u1_stm32.buses.pin_output_a", "0x03"],
[ "led_4.ports.pin", "u1_stm32.buses.pin_output_a", "0x04"],
[ "led_5.ports.pin", "u1_stm32.buses.pin_output_a", "0x05"],
[ "led_6.ports.pin", "u1_stm32.buses.pin_output_a", "0x06"],
[ "led_7.ports.pin", "u1_stm32.buses.pin_output_a", "0x07"],
[ "led_8.ports.pin", "u1_stm32.buses.pin_output_a", "0x08"],
[ "led_9.ports.pin", "u1_stm32.buses.pin_output_a", "0x09"],
[ "led_10.ports.pin", "u1_stm32.buses.pin_output_a", "0x0A"],
[ "led_11.ports.pin", "u1_stm32.buses.pin_output_a", "0x0B"],
[ "led_12.ports.pin", "u1_stm32.buses.pin_output_a", "0x0C"],
[ "led_13.ports.pin", "u1_stm32.buses.pin_output_a", "0x0D"],
[ "led_14.ports.pin", "u1_stm32.buses.pin_output_a", "0x0E"],
[ "led_15.ports.pin", "u1_stm32.buses.pin_output_a", "0x0F"]
]
}Pöörake tĂ€helepanu parameetrile firmware jaotises params â see on faili nimi, mida saab laadida virtuaalsesse seadmesse tarkvara vĂ€rskendamiseks.
Virtuaalset seadet ja selle suhtlemist peamise operatsioonisĂŒsteemiga saab kujutada jĂ€rgmise skeemi abil:

Praegune emulaatori testimise nĂ€idis hĂ”lmab suhtlemist pĂ”hiosa COM-portidega (debug UART ja Bluetooth-mooduli UART). Need vĂ”ivad olla reaalsed portid, kuhu on ĂŒhendatud seadmed, vĂ”i virtuaalsed COM-portid (selleks on vajalik com0com / socat).
Emulaatoriga vÀljastpoolt suhtlemiseks on praegu kaks peamist meetodit:
- GDB RSP protokoll (vastavad tööriistad â Eclipse / IDA / radare2);
- emulaatori sisemine kÀsurea liides (Argparse vÔi Python).
Virtuaalsed COM-portid
Kuna virtuaalse seadme UART-iga suhtlemiseks kohaliku masina terminalist on vaja luua paar omavahel seotud virtuaalseid COM-porte. Meie juhul kasutab ĂŒks port emulaatorit ja teine â terminaliprogramm (PuTTY vĂ”i screen):

com0com kasutamine
Virtuaalsed COM-portid seadistatakse komplekti com0com setup-utility abil (konsooliversioon â C:Program Files (x86)com0comsetupŃ.exe, vĂ”i GUI-versioon â C:Program Files (x86)com0comsetupg.exe):

Samuti tuleb mÀrkida ruudud enable buffer overrun kÔigi loodud virtuaalsete portide jaoks, vastasel juhul ootab emulaator COM-porti vastust.
socat'i kasutamine
UNIX-sĂŒsteemides luuakse virtuaalsed COM-portid automaatselt emulaatori abil kasutades utiliiti socat, selleks piisab, kui emulaatori kĂ€ivitamisel portide nimedes kasutada prefiksit socat:.
Sisemine kÀsurea liides (Argparse vÔi Python)
Kuna Kopycat on konsoolirakendus, pakub emulaator oma objektidega ja muutujatega suhtlemiseks kahte kÀsurea liidest: Argparse ja Python.
Argparse â see on Kopycati sisseehitatud CLI, mis on alati ja kĂ”igile saadaval.
Alternatiivne CLI â Python'i tĂ”lgendaja. Selle kasutamiseks tuleb installida Python'i moodul Jep ja seadistada emulaator töötama Python'iga (kasutatakse kasutaja pĂ”hissĂŒsteemis installitud Python'i tĂ”lgendajat).
Python'i mooduli Jep installimine
Linuxis saab Jep'i installida lÀbi pip:
pip install jepJep-i installimiseks Windowsi all on vajalik eelnevalt paigaldada Windows SDK ja sobiv Microsoft Visual Studio. Oleme teie ĂŒlesannet veidi lihtsustanud ja teinud JEP viimaste Python versioonide jaoks Windowsis, mistĂ”ttu saab mooduli paigaldada failist:
pip install jep-3.8.2-cp27-cp27m-win_amd64.whlJep-i paigaldamise kontrollimiseks tuleb kÀivitada jÀrgnev kÀsk kÀsureas:
python -c "import jep"Vastuseks peaks saama sÔnum:
ImportError: Jep ei ole iseseisvas Pythoni versioonis toetatud, see peab olema Java-sse sisse ehitatud.Teie sĂŒsteemi emulatori kĂ€skfailis (kopycat.bat â Windowsi jaoks, kopycat â Linuxi jaoks) lisage parameetrite nimekirja DEFAULT_JVM_OPTS tĂ€iendav parameeter Djava.library.path â see peaks sisaldama teed paigaldatud Jep moodulini.
Seega peaks Windowsi jaoks moodustuma jÀrgmine rida:
set DEFAULT_JVM_OPTS="-XX:MaxMetaspaceSize=256m" "-XX:+UseParallelGC" "-XX:SurvivorRatio=6" "-XX:-UseGCOverheadLimit" "-Djava.library.path=C:/Python27/Lib/site-packages/jep"Kopycat-i kÀivitamine
Emulaator on konsooli JVM-rakendus. KĂ€ivitamine toimub operatsioonisĂŒsteemi kĂ€sureas (sh/cmd).
KÀsk Windowsi all kÀivitamiseks:
binkopycat -g 23946 -n rhino -l user -y library -p firmware=firmwarerhino_pass.bin,tty_dbg=COM26,tty_bt=COM28KÀsk Linuxis kÀivitamiseks kasutades utiliiti socat:
./bin/kopycat -g 23946 -n rhino -l user -y library -p firmware=./firmware/rhino_pass.bin, tty_dbg=socat:./COM26,tty_bt=socat:./COM28-g 23646â TCP-port, mis avatakse GDB-serverile juurdepÀÀsuks;-n rhinoâ sĂŒsteemi pĂ”hikomponendi nimi (seade koosseisus);-l userâ pĂ”hikomponendi otsimiseks kasutatav teek;-y libraryâ tee, kust otsitakse seadmes olevaid komponente;firmwarerhino_pass.binâ lĂ€htefaili tee;- COM26 ja COM28 â virtuaalsed COM-portid.
Tulemuseks kuvatakse kÀskluste tÀitmine Python > (vÔi Argparse >):
18:07:59 INFO [eFactoryBuilder.create ]: Moodul top on edukalt loodud
18:07:59 INFO [ Module.initializeAndRes]: Seadistatakse tuum top.u1_stm32.cortexm0.arm jaoks
18:07:59 INFO [ Module.initializeAndRes]: Seadistatakse debugeerija top.u1_stm32.dbg jaoks
18:07:59 WARN [ Module.initializeAndRes]: JĂ€lgijat ei leitud...
18:07:59 INFO [ Module.initializeAndRes]: Portide ja busside initsialiseerimine...
18:07:59 WARN [ Module.initializePortsA]: TĂHELEPANU: MĂ”ne porti puhul on hoiatus, kasuta printModulesPortsWarnings, et nĂ€ha...
18:07:59 FINE [ ARMv6CPU.reset ]: MÀÀratud sisenemispunkt 08006A75
18:07:59 INFO [ Module.initializeAndRes]: Moodul top on edukalt initsialiseeritud ja lÀhtestatud!
18:07:59 INFO [ Kopycat.open ]: Alustatakse alusena top[rhino] virtuaalsust arm[ARMv6Core] jaoks
18:07:59 INFO [ GDBServer.debuggerModule ]: Seadistatud uus debugeerija moodul top.u1_stm32.dbg GDB_SERVER jaoks (port=23946,alive=true)
Python >Koostoime IDA Pro-ga
AnalĂŒĂŒsimiseks kasutame IDA-s lihtsustatud testimiseks "Norsukaru" tarkvara (seal on meta information).
Saate kasutada ka pÔhifirmavara ilma metaandmeteta.
PĂ€rast Kopycat kĂ€ivitamist IDA Pro-s lĂ€heme Debugger menĂŒĂŒs punkti «Switch debuggerâŠÂ» ja valime «Remote GDB debugger«. Edasi seadistame ĂŒhenduse: menĂŒĂŒst Debugger â Process optionsâŠ
Seame vÀÀrtused:
- Application â mis tahes vÀÀrtus
- Hostname: 127.0.0.1 (vÔi IP-aadress kaugtöötlusmasinast, kus Kopycat töötab)
- Port: 23946

NĂŒĂŒd on juurdepÀÀs silumise kĂ€ivitamise nupule (klahv F9):
![]()
Vajutame sellele â toimub ĂŒhendamine debuggermooduli ja emulaatoriga. IDA lĂ€heb silumisse ja muutuvad kergesti kĂ€ttesaadavaks lisakujud: registrite teave, virna teave.
NĂŒĂŒd saame kasutada kĂ”iki standardseid silumise vĂ”imalusi:
- juhendi lĂ€bi viimist (Step into ja Step over â klahvid F7 ja F8, vastavalt);
- kÀivitus ja tÔkestamine;
- murdpunktide loomine nii koodile kui andmetele (klahv F2).
Ăhendamine debugeerijaga ei tĂ€henda, et firmavara kood kĂ€ivitatakse. KĂ€ivituskoht peab olema aadressil 0x08006A74 â funktsiooni algus Reset_Handler. Kui kerite loendi alla, siis nĂ€ete funktsiooni kutset main. Kursorit saab sellel real (aadress) 0x08006ABE) ja teostada toiming KĂ€ita kuni kursori (klahv F4).

SeejÀrel saab vajutada F7, et siseneda funktsiooni main.
Kui kĂ€ivitada kĂ€sk JĂ€tka protsessi (klahv F9), siis kuvatakse aken âPalun ootaâ ainsa nupuga Peata:

Nupu vajutamisel Peata koodide tÀitmine peatub ja seda saab jÀtkata samalt aadressilt koodis, kus see katkestati.
Kui koodi tĂ€itmist jĂ€tkata, siis virtuaalsete COM-portidega ĂŒhendatud terminalides vĂ”ib nĂ€ha jĂ€rgmisi ridu:


Rida âstate bypassâ nĂ€itab, et virtuaalne Bluetooth-modul on lĂ€inud andmete vastuvĂ”tu reĆŸiimi kasutaja COM-portidelt.
NĂŒĂŒd saab Bluetooth-terminalis (pildil â COM29) sisestada kĂ€ske vastavalt âNorsukaruâ protokollile. NĂ€iteks kĂ€sule âMEOWâ tagastatakse Bluetooth-terminalis rida âmur-murâ:

Emuleeri mind mitte tÀielikult
Emulaatori ehitamisel saab valida, kui detailne/ĂŒle kantud on see vĂ”i see seade. NĂ€iteks Bluetooth-modulit saab emuleerida erinevalt:
- emuleeritakse tÀielikult seade koos kÔigi kÀskudega;
- AT-kĂ€sud emuleeritakse ja andmevoog vĂ”etakse peamise sĂŒsteemi COM-portist;
- virtuaalne seade tagab tÀieliku andmete suunamise reaalsele seadmele;
- lihtsa pistikuga, mis alati tagastab "OK".
Praeguses emulaatori versioonis kasutatakse teist lĂ€henemist â virtuaalne Bluetooth-moodul konfigureerib, seejĂ€rel lĂŒlitub "proksimise" reĆŸiimi, edastades andmeid peamise sĂŒsteemi COM-portist emulaatori UART-porti.

Vaatame koodi lihtsat instrumenteerimist, juhul kui mÔni periferiaseade ei ole rakendatud. NÀiteks, kui ajastit, mis kontrollib andmete edastamist DMA-s, ei ole loodud (kontroll teostatakse funktsioonis ws2812b_wait, mis asub aadressil 0x08006840), siis tarkvara ootab alati, kuni lipp "busy" , mis asub aadressil0x200004C4 , nÀitab DMA andmejoone hÔivamist:Sellisest olukorrast saame mööda hiilida "manuaalse" lipu resettimisega

vahetult pÀrast selle seadmist. IDA Pro-s on vÔimalik luua Python-funktsioon ja kutsuda see esile hetkel, kui breakpoint on seadistatud, paigaldades selle koodi pÀrast vÀÀrtuse 1 kirjutamist lipule , mis asub aadressil Breakpoint-i töötleja , mis asub aadressil.
Esmalt loome IDA-s Python-funktsiooni. MenĂŒĂŒs
Alustame Python-funktsiooni loomisega IDA-s. MenĂŒĂŒs Fail â Skripti kĂ€skâŠ
Lisame uue snipeti vasakpoolsesse nimekirja, anname selle nime (nÀiteks, BPT),
parempoolsesse teksti vÀljasse sisestame funktsiooni koodi:
def skip_dma():
print "Skipping wait ws2812..."
value = Byte(0x200004C4)
if value == 1:
PatchDbgByte(0x200004C4, 0)
return False 
PĂ€rast seda vajutame Run ja sulgeme skripti akna.
NĂŒĂŒd liigume koodi aadressile 0x0800688A, seadistame breakpoint (klahv F2), toimetame seda (kontekstimenĂŒĂŒ Muuda breakpointiâŠ), Ă€rge unustage mÀÀrata skripti tĂŒĂŒpi â Python:


Kui praegune lipu vÀÀrtus , mis asub aadressil on 1, siis tuleks kÀivitada funktsioon skip_dma skripti rida:

Kui laadida ĂŒlekande kĂ€ivitamiseks, siis breakpointi töötleja koodi aktiveerumist saab nĂ€ha IDAs aknas VĂ€ljund rea jĂ€rgi Skipping wait ws2812.... NĂŒĂŒd ei ootata lipu lĂ€htestamist. , mis asub aadressil.
Koostoime emulaatoriga
Emuleerimine emuleerimise nimel ei kutsu tÔenÀoliselt esile rÔÔmu ja elevust. Palju huvitavam on, kui emulaator aitab teadlasel nÀha mÀlus andmeid vÔi luua voogude koostoimeid.
NĂ€itame, kuidas dĂŒnaamiliselt luua RTOS-ĂŒlesannete koostoime. Eelnevalt tuleks peatada koodi tĂ€itmine, kui see on kĂ€ivitatud. Kui minna funktsiooni bluetooth_task_entry LED kĂ€skluse töötlemise haru (aadress 0x080057B8), siis vĂ”ib nĂ€ha, et esmalt luuakse ja seejĂ€rel saadetakse sĂŒsteemi jĂ€rjekorda ledControlQueueHandle mingi sĂ”num.

Peaksite seadma katkestuse, kui juurdepÀÀsete muutuja ledControlQueueHandle, mis asub aadressil 0x20000624 ja jÀtkama koodi tÀitmisega:

Tulemusena peatub esmalt aadressil 0x080057CA enne funktsiooni vĂ€ljakutset osMailAlloc, edasi â aadressil 0x08005806 enne funktsiooni vĂ€ljakutset osMailPut, seejĂ€rel mĂ”ne aja pĂ€rast â aadressil 0x08005BD4 (enne funktsiooni vĂ€ljakutset osMailGet), mis kuulub funktsioonile leds_task_entry (LED-ĂŒlesanne), st toimus ĂŒlesannete vahetus, ja nĂŒĂŒd on juhtimine saanud LED-ĂŒlesanne.

Nii lihtsa meetodi abil saab paika panna, kuidas RTOS-ĂŒlesanded omavahel suhtlevad.
Muidugi vĂ”ib ĂŒlesannete vaheline suhtlemine reaalsuses olla keerulisem, kuid emulatori kasutamine muudab selle jĂ€lgimise vĂ€hem vaevarikkaks.
vÔite vaadata vÀikest videot emulatori kÀivitamisest ja suhtlemisest IDA Pro-ga.
KĂ€ivitamine Radare2-ga
Ei saa mööda minna sellisest universaalsest tööriistast nagu Radare2.
Emulaatoriga ĂŒhendamiseks r2 abil nĂ€eb kĂ€sk vĂ€lja selline:
radare2 -A -a arm -b 16 -d gdb://localhost:23946 rhino_fw42k6.elfPraegu on saadaval kÀivitamine (dc) ja tÀitmise peatamine (Ctrl+C).
Kahjuks on r2-l hetkel probleeme riistvaralise gdb-serveri ja mÀlu kaardistamisega, mistÔttu ei tööta murdepunkid ja sammud (kÀsk ds). Loodame, et see probleem lahendatakse lÀhitulevikus.
KĂ€ivitamine Eclipse'ist
Ăks viis emulaatori kasutamiseks on arendatava seadme tarkvara silumine. NĂ€itlikkuse huvides kasutame ka «Nohik» tarkvara. Tarkvara allikakoodid on saadaval .
IDE-na kasutame Eclipse'i komplektist .
Et emulaatorisse laadida Eclipse'is koostatud tarkvara, tuleb lisada parameeter firmware=null emulaatori kÀivituskÀskemesse:
binkopycat -g 23946 -n rhino -l user -y modules -p firmware=null,tty_dbg=COM26,tty_bt=COM28Debug-konfiguratsiooni seadistamine
Eclipse'is valige menĂŒĂŒ Run â Debug Configurations⊠Avanevas aknas tuleb jaotises GDB Hardware Debugging lisada uus konfiguratsioon, seejĂ€rel tuleb vahekaardil «Main» mÀÀrata praegune projekt ja silumisprogramm:

Vahekaardil «Debugger» tuleb mÀrkida GDB-kÀsk:
${openstm32_compiler_path}arm-none-eabi-gdb
Ja ka sisestada ĂŒhenduse parameetrid GDB-serveriga (host ja port):

Vahe âStartupâ all tuleb mĂ€rkida jĂ€rgmised sĂ€tted:
- mÀÀrake linnuke Laadi pilt (et laadimine toimuks emulaatorisse kokku pandud pildifailist);
- mÀÀrake linnuke Laadi sĂŒmbolid;
- lisage kÀivitamiskÀsk:
set $pc = *0x08000004(mÀÀrake registri PC vÀÀrtuseks mĂ€lu aadressilt0x08000004â seal hoitakse aadressi ResetHandlerâile).
Pange tĂ€hele, kui te ei soovi Eclipseâist pildifaili laadida, siis sĂ€tteid Laadi pilt ja KĂ€ivita kĂ€sk ei pea mÀÀrama.

PĂ€rast nupu Debug vajutamist saab töötada silumise reĆŸiimis:
- koodi samm-sammuline tÀitmine

- kohtumistega suhtlemine

MĂ€rkus. Eclipseâis on, hmm⊠mĂ”ned eripĂ€rad⊠ja nendega tuleb elada. NĂ€iteks, kui silumisse sisenemisel kuvatakse teade âNo source available for â0x0ââ, siis tĂ€itke kĂ€sk Step (F5)

KokkuvÔtte asemel
Kohaliku koodi emuleerimine on vĂ€ga huvitav tegevus. Seadmese arendajale avaneb vĂ”imalus siluda saadetisi ilma reaalse seadmeta. Uurijale - vĂ”imalus teha dĂŒnaamilist koodianalĂŒĂŒsi, mis ei ole alati vĂ”imalik isegi seadme olemasolul.
Soovime pakkuda spetsialistidele tööriista, mis oleks mugav, suhteliselt lihtne ja ei nÔuaks palju aega ja vaeva seadistamiseks ja kÀivitamiseks.
Jagage oma kogemustest riistvaraemulaatorite kasutamisel kommentaarides. Ootame arutelu ja vastame hea meelega kĂŒsimustele.
Ainult registreeritud kasutajad saavad kĂŒsitluses osaleda. , palun.
Miks te kasutate emulaatorit?
arendan (teisendan) pĂŒsivara
uurin pĂŒsivara
kÀitan mÀnge (Dendi, Sega, PSP)
midagi muud (kirjutage kommentaaridesse)
HÀÀletas 7 kasutajat. 2 kasutajat ei hÀÀletanud.
Millist tarkvara te kasutate natiivkoodi emuleerimiseks?
QEMU
Unicorn engine
Proteus
midagi muud (kirjutage kommentaaridesse)
HÀÀletas 6 kasutajat. 2 kasutajat jÀtsid hÀÀletamata.
Mida sooviksite emulaatoris parandada?
sooviksin kiirus
sooviksin mugavust seadistamisel/kÀivitamisel
sooviksin rohkem interaktsiooni vÔimalusi emulaatoriga (API, hook'id)
olen rahul kÔigega
midagi muud (kirjutage kommentaaridesse)
Olenenud 8 kasutajalt. 1 kasutaja hoidub.
Allikas: habr.com


