Kazalo:

1. del ARM Assembly TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo: 16 korakov
1. del ARM Assembly TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo: 16 korakov

Video: 1. del ARM Assembly TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo: 16 korakov

Video: 1. del ARM Assembly TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo: 16 korakov
Video: Learn Some ARM Assembly - MSP432 - TI-RSLK - Texas Instruments Robotics System Learning Kit - Lab 3 2024, Julij
Anonim
Image
Image

Poudarek tega Instructable je mikrokrmilnik STM32 Nucleo. Motivacija za to, da bi lahko ustvaril montažni projekt iz golih kosti. To nam bo pomagalo poglobiti in razumeti projekt Launchpad MSP432 (TI-RSLK), ki je bil že tema več Instructables.

Pri ustvarjanju projekta samo za montažo za MSP432 s programom Code Composer Studio ni veliko pomoči. Do sedaj smo samo kopirali/prilepili iz že obstoječega montažnega projekta. Ta pristop nam je dobro služil.

Vendar smo zdaj za laboratorij 7 naleteli na malo težave. Ali vsaj začasno kolcanje. Lab 7 uvaja stroje s končnim stanjem in prva stvar, na katero naletimo, je potreba po ustvarjanju in uporabi niza vrednosti. Ker tečaj TI uporablja predvsem programiranje C - to ni problem. Toda ti Instructables so se osredotočili na montažo, ne na C.

Nadalje, ker je matrika samo za branje, bi bilo dobro, če bi jo dali v pomnilnik flash, ne v RAM.

Zdi se, da je na spletu veliko več pomoči za montažne projekte, ki uporabljajo MCU STM32, zato začenjamo s tem navodilom, katerega cilj je uporabiti naučeno, nato pa uporabiti za MSP432 in Studio Composer Studio.

Na poti do tega cilja bomo imeli tudi izkušnje s še enim, priljubljenim mikro krmilnikom.

1. korak: Začetni preskus naprave

Začetni preskus naprave
Začetni preskus naprave
Začetni preskus naprave
Začetni preskus naprave
Začetni preskus naprave
Začetni preskus naprave

Še enkrat, zakaj izbrati zlasti STM32 Nucleo?

Iskreno? Ker sem iskal dobre članke o projektih montaže golih kovin za krmilnike ARM, sem naletel na to serijo. In tudi zato, ker se zdi, da je STM32 priljubljen MCU.

Delal sem nekaj raziskav (na izbiro je veliko različic - glej sliko zgoraj), vendar je na koncu postalo tisto, kar lahko dejansko dobim, saj sem nameraval uporabljati Amazon (v ZDA).

Na voljo je v preprostem, a profesionalnem paketu z nekaj zagonskimi navodili. Malo smešno je bilo videti, da je demo, zapisan v krmilnik, skoraj to, kar smo počeli v preteklih Instructables - LED utripa in spreminja hitrost glede na pritisk gumba.

Zdi se, da je ta razvojna plošča zelo podobna MSP432, saj ima 2 LED in en uporabniški gumb. MSP432 ima 2 uporabniška gumba.

Kot lahko vidite na fotografijah, sem bil malo presenečen, da ima plošča mini in ne mikro USB. Moral je zmanjkati za nakup kabla.

Še en dober test je, da se, ko ga povežete z računalnikom (uporabljam polje Linux), prikaže v mojem upravitelju datotek kot datotečni sistem, imenovan "NODE_F303RE". Odprtje, ki razkrije dve datoteki, eno HTML in eno besedilo.

To je to, vendar vsaj pravi, da se zdi povezljivost precej enostavna.

Zdaj smo pripravljeni na začetek.

Poskušal bom ne ponoviti nobenih dobrih informacij iz serije člankov IVONOMICON Bare Metal, ampak jih raje razširiti.

2. korak: Osnove

Prva stvar, ki jo potrebujemo, je prevajalnik.

Nato potrebujemo razhroščevalnik:

devchu@chubox: ~ $ sudo apt-get install gdb-arm-none-eabi Branje seznamov paketov … Končano Gradnja drevesa odvisnosti Branje informacij o stanju … Končano Nameščeni bodo naslednji NOVI paketi: gdb-arm-none-eabi 0 nadgrajeno, 1 na novo nameščen, 0 za odstranitev in 8 ne nadgrajen. Morate dobiti 2, 722 kB arhivov. Po tej operaciji bo porabljenih 7, 738 kB dodatnega prostora na disku. Pridobite: 1 https://us.archive.ubuntu.com/ubuntu xenial/universe amd64 gdb-arm-none-eabi amd64 7.10-1ubuntu3+9 [2, 722 kB] Pridobljeno 2, 722 kB v 1 s (1, 988 kB/s) Izbira prej neizbranega paketa gdb-arm-none-eabi. (Branje zbirke podatkov … 262428 datotek in imenikov, ki so trenutno nameščeni.) Priprava na razpakiranje…/gdb-arm-none-eabi_7.10-1ubuntu3+9_amd64.deb… Razpakiranje gdb-arm-none-eabi (7.10-1ubuntu3+9)… Obdelava sprožilci za man-db (2.7.5-1)… Nastavitev gdb-arm-none-eabi (7.10-1ubuntu3+9)…

3. korak: Osnove - Windows

Zgornji korak je predpostavil, da uporabljamo Linux. Kaj pa, če uporabljamo Windows?

Obiščete lahko spletno mesto za razvijalce, na voljo pa je več možnosti za prenos. Uporabljam računalnik z operacijskim sistemom Windows 8.

Med namestitvijo sem se odločil, da ga namestim v korenski pogon "C: \" namesto v programske datoteke samo zato, ker uporabljam tudi cygwin, zato je bilo lažje ustvariti povezavo iz lokalnega koša do korenske mape C: kot vse nered na poti do programskih datotek (s presledki itd.).

Tako moje okolje in pot cygwina itd izgleda tako:

C: / cygwin64 / home / bin / arm-none-eabi-gcc, kjer je arm-none-eabi-gcc povezava do C: / GNUToolsArmEmbedded / 7.2018.q2.update / bin / arm-none-eabi- gcc.

Nato sem pod cygwin home ustvaril mapo "dev", kamor sem postavil datoteko core. S in zagnal ukaz prevajalnika. (glej spodaj za stvari prevajalnika).

Enako sem naredil za gdb (arm-none-eabi-gdb).

4. korak: Kaj je bistveno

Kaj je torej "gcc-arm-none-eabi"?

Prevajalnik gnu (GCC) bo programske jezike (na primer C) prevedel v izvorno kodo za stroj, na katerem deluje. Na primer, če bi na svojem računalniku z operacijskim sistemom Windows z uporabo GCC sestavili nekaj kode C, bi bila ta zgrajena za delovanje na napravi Windows. Ustvarjena izvedljiva datoteka (običajno) ne bo delovala na mikrokrmilniku ARM.

Zato moramo za izdelavo programov za prenos in zapisovanje v mikrokrmilnik ARM (v našem primeru bi to bil STM32 Nucelo) dati GCC-ju nekaj drugega: zmožnost "navzkrižnega prevajanja". Se pravi, sposobnost ustvarjanja izvedljivega programa, ne za njegov izvorni sistem (in procesor), ampak za ciljni sistem (mikrokrmilnik ARM). Tam pride v poštev "gcc-arm-none-eabi".

Kaj je torej "gdb-arm-none-eabi"?

Ko naložimo in zapisujemo (utripamo) novo ustvarjeno izvedljivo datoteko v mikrokrmilnik, jo bomo verjetno želeli odpraviti-korak za vrstico kode. GDB je iskalnik napak gnu in tudi on potrebuje način, da opravi svoje delo, vendar cilja na drug sistem.

Tako je gdb-arm-none-eabi za GDB, kar je gcc-arm-none-eabi za GCC.

Druga predlagana namestitev paketa je bila "libnewlib-arm-none-eabi". Kaj je to?

Newlib je knjižnica C in matematična knjižnica, namenjena uporabi v vgrajenih sistemih. Gre za konglomeracijo več knjižničnih delov, vse pod licencami brezplačne programske opreme, zaradi česar jih je mogoče enostavno uporabljati na vdelanih izdelkih.

In končno, paket "libstdc ++-arm-none-eabi". Ta je precej očiten; to je knjižnica C ++ za navzkrižni prevajalnik; za vgrajene mikro krmilnike ARM.

5. korak: Datoteka povezovalca

Povezovalna datoteka
Povezovalna datoteka
Povezovalna datoteka
Povezovalna datoteka

Ustvarimo povezovalni skript.

Eden ključnih delov ali blokov v tej datoteki bi bil ukaz MEMORY.

--- iz sourceware.org:

Privzeta konfiguracija povezovalnika omogoča dodelitev vsega razpoložljivega pomnilnika. To lahko preglasite z ukazom MEMORY. Ukaz MEMORY opisuje lokacijo in velikost blokov pomnilnika v cilju. Z njim lahko opišete, katera pomnilniška območja lahko povezovalnik uporablja in katerim se mora izogibati. Nato lahko razdelke dodelite določenim območjem pomnilnika. Povezovalnik bo nastavil naslove odsekov glede na pomnilniške regije in opozoril na regije, ki so preveč polne. Povezovalnik ne bo premešal razdelkov, da bi se prilegal razpoložljivim regijam. Skript povezovalnika lahko vsebuje veliko uporab ukaza MEMORY, vendar se vsi definirani pomnilniški bloki obravnavajo, kot da so podani v enem ukazu MEMORY. Sintaksa za MEMORY je:

SPOMIN

{name [(attr)]: ORIGIN = izvor, LENGTH = len…}

Primer v članku:

/* Določite konec RAM -a in omejitev pomnilnika sklada* //* (4KB SRAM na liniji STM32F031x6, 4096 = 0x1000)*//* (RAM se začne na naslovu 0x20000000) _estack = 0x20001000;

SPOMIN

{FLASH (rx): ORIGIN = 0x08000000, LENGTH = 32K RAM (rxw): ORIGIN = 0x20000000, LENGTH = 4K}

Zato moramo ugotoviti, koliko FLASH -a (za naš program in konstante itd.) In koliko RAM -a (za uporabo v programu; kup in sklad itd.) Za našo posebno ploščo. To postane malo zanimivo.

Lepa majhna kartica, ki je priložena Nucleu, pravi, da ima pomnilnik flash 512 Kbytes, SRAM pa 80 Kbytes. Ko pa ga priključite na USB, se namesti kot datotečni sistem z dvema datotekama, tako upravitelj datotek kot GParted nakazujeta, da ima več kot 540+ Kbajtov prostora. (OVEN?).

Toda, ko poskušate izbrisati dve datoteki z upraviteljem datotek, odklopite in nato znova povežete napravo, še vedno prikazuje dve datoteki. (in upravitelj datotek je nekaj prepoznal, ker je na vsaki datoteki majhna ikona »zaklepanje«.

Pa pojdimo s številkami na kartici. Zdaj vzamemo zgornji primer in ga pretvorimo v našo posebno ploščo.

Morda boste želeli uporabiti nekaj takega kot ta spletni pretvornik pomnilnika, da se pomaknete od splošnega KB do določenega števila bajtov.

Potem boste morda želeli uporabiti spletni pretvornik decimalk v šestnajstiko.

/ * Določite konec RAM -a in omejitev nabora pomnilnika */

/* (4KB SRAM na liniji STM32F031x6, 4096 = 0x1000)* //* primer*/

/ * korak 1: (80KB SRAM na STM32F303RE, 81920 = 0x14000) * // * naša plošča */

/* 2. korak, dodajte šestnajstiško velikost na šestnajstiški začetni naslov (spodaj). */

/ * (RAM se začne na naslovu 0x20000000) */

_estack = 0x20001000; / * primer */

_estack = 0x20014000; / * naš odbor */

SPOMIN {

FLASH (rx): IZVOR = 0x08000000, DOLŽINA = 512K

RAM (rxw): IZVOR = 0x20000000, DOLŽINA = 80K

}

Pokličimo zgornjo datoteko "linker.script.ld".

6. korak: vektorska miza

Vektorska miza
Vektorska miza

Zdaj bomo ustvarili majhno datoteko montaže (z direktivami), ki bo naredila nekaj zelo preprostega ravnanja s prekinitvami. Sledili bomo zgledu članka in ustvarili datoteko z imenom "core. S".

Še enkrat, tukaj je primer vsebine datoteke, vendar sem spremenil našo posebno ploščo:

// Ta navodila določajo lastnosti našega čipa in

// jezik montaže, ki ga bomo uporabljali:.syntax unified /*Glej spodaj za tem kodnim področjem* //*.cpu cortex-m0* / /*komentiraj to vrstico primera* /.cpu cortex-m4 /* namesto tega dodajte skorjo naše deske. glej zgornjo sliko v tem koraku * / /*.fpu softvfp * / / *komentiraj to vrstico primera * /.fpu vfpv4 / *namesto tega dodaj našo tablo; ima FPU */.thumb // Lokacije globalnega pomnilnika..global vtable.global reset_handler / * * Dejanska vektorska tabela. * Za poenostavitev sta vključeni samo velikost RAM -a in upravljalnik za ponastavitev *. */.type vtable, %object vtable:.word _estack.word reset_handler.size vtable,.-vtable

Hmm.. Ne '.align' direktive

Vendar to ni kritično. Več o tem (morda) kasneje.

.poenotena sintaksa

.sintaksa [poenoteno | razdeljeno]

Ta direktiva določa sintakso nabora navodil, kot je opisano v razdelku ARM-Nabor navodil

9.4.2.1 Sintaksa nabora navodil Dve nekoliko drugačni sintaksi podpirata navodila ARM in THUMB. Privzeto, razdeljeno, uporablja stari slog, kjer sta imela navodila ARM in THUMB svoje, ločene sintakse. Nova, enotna skladnja, ki jo lahko izberete s pomočjo.syntax direktive.

.fpu vfpv4

Prevajalnik GCC lahko ustvari binarne datoteke z več možnostmi glede na plavajočo vejico: mehka - primerna za delovanje na procesorjih brez FPU - izračuni se izvajajo v programski opremi s programsko opremo, ki jo ustvari prevajalnik softfp - primerna za izvajanje na procesorjih z ali brez FPU - če bo prisotna, bo uporabljena FPU. Za naš poseben primer (sami boste morali raziskati) je FPU te plošče v skladu z vfpv4. Morda se boste morali s tem igrati. Ali pa celo pustite pri softfp.

.thumb (proti. roki)

Ti mikrokrmilniki ARM imajo dejansko kombinacijo naborov navodil. Eno je ARM, drugo THUMB. Ena razlika so 16-bitna navodila v primerjavi z 32-bitnimi navodili. Tako ta direktiva pove prevajalcu, naj naslednja navodila obravnava kot THUMB ali ARM.

Preostanek datoteke bomo vzeli takšen, kot je, saj se ti Instructables še niso poglobili v programiranje montaže, ki ga poganja prekinitev.

7. korak: montažna različica programa "Hello World"

V predhodno ustvarjeno datoteko "core. S" lahko gre tudi naslednje. To je spet iz primera v članku.

/ * * Vodnik za ponastavitev. Klicano ob ponastavitvi. */.type reset_handler, %function reset_handler: // Kazalec sklada nastavimo na konec sklada. // Vrednost '_estack' je določena v našem povezovalnem skriptu. LDR r0, = _ostack MOV sp, r0

// Nastavite nekaj lažnih vrednosti. Ko vidimo te vrednosti

// v našem iskalniku napak bomo vedeli, da je naš program // naložen na čip in deluje. LDR r7, = 0xDEADBEEF MOVS r0, #0 main_loop: // Dodajte 1, da registrirate 'r0'. ADDS r0, r0, #1 // Zanka nazaj. B main_loop.size reset_handler,.-Reset_handler

Torej, cilj zgornjega programa je naložiti prepoznaven vzorec v en jedrni register MCU (v tem primeru R7) in naraščajočo vrednost, ki se začne pri nič, v drug register jedra MCU (v tem primeru R0). Če stopimo skozi izvršilno kodo, bi morali videti prirastek podatkov R0.

Če ste skupaj z navodili v zvezi z MSP432 in tečaji/laboratoriji TI-RSLK sledili, bi vam morali biti znani skoraj vsi zgornji programi.

Ena nova stvar, ki jo vidim, je uporaba "=" pri nalaganju "DEADBEEF" v register R7. Tega nismo uporabili.

Tukaj priložena datoteka "core. S" vsebuje celoten vir.

8. korak: Sestavljanje kodeksa

Čas je, da naredite nekaj stvari iz ukazne vrstice. Končno nekaj resničnega.

Vendar nismo čisto tam. Ponovno moramo prilagoditi ukaz iz članka in ga spremeniti v svojo situacijo.

Tu je primer kode:

arm -none -eabi -gcc -x assembler -with -cpp -c -O0 -mcpu = cortex -m0 -mthumb -Wall core. S -o core.o

Če gremo na spletno mesto gnu.org za GCC (v tem primeru različica 7.3),

x

-X je, da določite jezik. V nasprotnem primeru, če ni -x, bo prevajalnik poskušal uganiti z razširitvijo datoteke. (v našem primeru *. S).

Zgornji primer iz članka navaja assembler-with-cpp, lahko pa naredimo samo assembler.

c

-C pravi prevajaj, vendar ne povezuj.

O0

-O mora nastaviti raven optimizacije. Uporaba -O0 (oh -nič) pravi "skrajšajte čas prevajanja in omogočite, da odpravljanje napak prinese pričakovane rezultate. To je privzeto".

mcpu = skorja-m0

-Mcpu podaja ime ciljnega procesorja. V našem primeru bi bila cortex-m4.

mthumb

-Mthumb podaja izbiro med ustvarjanjem kode, ki izvaja stanja ARM in THUMB.

Zid

Stena je seveda zelo pogosta in znana. Vklopi vse opozorilne zastavice.

Na koncu ukaza imamo vhodno datoteko core. S in izhodno datoteko core.o.

Tu je nastala nova ukazna vrstica, ki ustreza našemu posebnemu primeru.

arm -none -eabi -gcc -x asembler -c -O0 -mcpu = cortex -m4 -mthumb -Stensko jedro. S -o jedro.o

In to je sestavljeno.

9. korak: Povezovanje programa

Neposredno iz primera v članku imamo naslednje:

arm -none -eabi -gcc core.o -mcpu = cortex -m0 -mthumb -Wall --specs = nosys.specs -nostdlib -lgcc -T./STM32F031K6T6.ld -o main.elf

Večino zgoraj navedenega ste videli. Spodaj je kaj novega.

-specs = nosys.specs

Tole je malo težko razložiti.

To je povezano s "semihosting" in "retargeting", povezano pa je tudi z input / output. To je povezano tudi s sistemskimi klici in knjižnicami.

Običajno vgrajeni sistemi ne ponujajo standardnih vhodno/izhodnih naprav. To bi vplivalo na sistemske ali knjižnične klice (primer: printf ()).

Semihosting pomeni, da ima razhroščevalnik (glej sliko 11. koraka z obročem razhroščevalnika, obkroženim z rdečo barvo) poseben kanal in uporablja protokol semihosting, izpis printf () pa si lahko ogledate na gostiteljskem stroju (prek razhroščevalnika).

Ponovno ciljanje pa pomeni, da ti isti sistemski ali knjižnični klici pomenijo nekaj drugega. Naredijo nekaj drugega, kar je smiselno za vgrajeni sistem. V nekem smislu, recimo za printf (), obstaja nova izvedba, ponovna ciljna izvedba te funkcije.

Ob vsem tem --specs = nosys.specs pomeni, da ne bomo polgostovali. To bi običajno pomenilo, da ponovno ciljamo. To nas pripelje do naslednje zastave.

nostdlib

Možnost povezovalnika -nostdlib se uporablja za povezavo programa, namenjenega samostojnemu izvajanju. -nostdlib pomeni posamezne možnosti -nodefaultlibs in -nostartfiles. Spodaj obravnavamo dve možnosti ločeno, vendar je najpogostejša uporaba samo nostdlib za nakupe na enem mestu. Pri povezovanju gostujočega programa so standardne sistemske knjižnice, kot je libc, privzeto povezane, kar daje programu dostop do vseh standardnih funkcij (printf, strlen in prijatelji). Možnost povezovalnika -nodefaultlibs onemogoči povezovanje s temi privzetimi knjižnicami; edine povezane knjižnice so točno tiste, ki jih povezovalniku izrecno poimenujete z zastavico -l.

lgcc

libgcc.a je standardna knjižnica, ki ponuja notranje podprograme za premagovanje pomanjkljivosti določenih strojev. Na primer, procesor ARM ne vsebuje navodil za delitev. Različica ARM libgcc.a vključuje funkcijo deljenja in prevajalnik po potrebi oddaja klice v to funkcijo.

T

To je samo način, da povezovalcu povemo, naj uporabi to datoteko kot povezovalni skript. V našem primeru je ime datoteke linker.script.ld.

o main.elf

Nazadnje povezovalcu povemo, kako bo ime končne izhodne slikovne datoteke, ki se bo zapisal/utripal v našo napravo.

Tu je naša različica celotne ukazne vrstice, spremenjena za našo specifično situacijo:

arm -none -eabi -gcc core.o -mcpu = cortex -m4 -mthumb -Wall --specs = nosys.specs -nostdlib -lgcc -T./linker.script.ld -o main.elf

Poskrbimo, da sta datoteka skripta in datoteka core.o v istem imeniku, kjer bomo zagnali zgornjo ukazno vrstico.

In brez težav se poveže.

A Ček

Nato tečemo:

arm-none-eabi-nm main.elf

in dobimo:

devchu@chubox: ~/Development/Atollic/TrueSTUDIO/STM32_workspace_9.1 $ arm-none-eabi-nm main.elf 20014000 A _estack 08000010 t main_loop 08000008 T reset_handler 08000000 T vtable

Izgleda v redu. Ukaz arm-none-eabi-nm je način za seznam simbolov v datotekah objektov.

10. korak: Preizkusite povezavo s STM32 Nucleo-64

Preizkusna povezava s STM32 Nucleo-64
Preizkusna povezava s STM32 Nucleo-64
Preizkusna povezava s STM32 Nucleo-64
Preizkusna povezava s STM32 Nucleo-64

Vaše prvo poslanstvo, če se ga odločite sprejeti, je, da vaš sistem vidi vašo razvojno ploščo.

Uporaba sistema Windows

Za Windows sem se odločil namestiti TrueSTUDIO iz Atollic (brezplačna različica). Namestitev je bila neboleča in samodejno je namestila gonilnik, tako da sem lahko uporabil st-link za preizkušanje povezave. Ko sem namestil TrueSTUDIO in upravitelj naprav videl napravo, sem prenesel orodja texan/stlink, ki jih predlaga članek Bare Metal, ki smo mu sledili. Mapo sem spet postavil neposredno pod "C: \" in spet ustvaril nekaj povezav iz mojega domačega koša cygwin do ukazov.

ln -s /c/STM32. MCU/stlink-1.3.0-win64/bin/st-info.exe ~/bin/st-info

Kot začetni preizkus, da vidim, ali res lahko komuniciramo z napravo, sem tekel:

st-info-sonda

In se vrnil:

Najdeno 1 programer za stlink

Zdaj vemo, da se lahko pogovorimo/poizvedujemo o naši razvojni plošči.

Uporaba Linuxa

Za linux v resnici ne potrebujete gonilnika. Toda za Debian boste morali orodja st zgraditi iz vira.

git clone

Prepričajte se, da imate nameščen libusb-1.0-0-dev.

primeren seznam | grep -E "*libusb.*dev*"

Morali bi videti:

libusb-1.0-0-dev/xenial, zdaj 2: 1.0.20-1 amd64 [nameščeno]

ali nekaj takega.

Če ga želite namestiti:

sudo apt-get install libusb-1.0-0-dev

Upoštevajte, da zgoraj navedeno ni isto kot:

sudo apt-get install libusb-dev

Pravilno manjkajoči libusb dev lahko povzroči težave pri cmake.

Napaka CMake: V tem projektu se uporabljajo naslednje spremenljivke, ki pa so nastavljene na NOTFOUND. Prosimo, nastavite jih ali se prepričajte, da so pravilno nastavljene in preizkušene v datotekah CMake: LIBUSB_INCLUDE_DIR (NAPREDNO)

Preklopite v korenski imenik projekta (… blah /blah /stlink). Naredite "make release".

Po tem, ko se sestavi, morajo biti orodja pod ".. /build /Release".

Nato lahko zaženete "st-info --probe". Tukaj je izhod s priključenim Nucleom, potem pa ne.

devchu@chubox: ~/Development/stlink $./build/Release/st-info --probeFound 1 stlink programerji serijski: 303636414646353034393535363537 openocd: "\ x30 / x36 / x36 / x41 / x46 / x46 / x35 / x30 / x34 / x39 / x35 / x35 / x36 / x35 / x37 "bliskavica: 524288 (velikost strani: 2048) sram: 65536 čipid: 0x0446 descr: F303 naprava z visoko gostoto devchu@chubox: ~/Development/stlink $./build/Release/st- info --probe Najdeno 0 programov stlink devchu@chubox: ~/Development/stlink $

11. korak: Uporabimo GDB z Linuxom

Uporabimo GDB z Linuxom
Uporabimo GDB z Linuxom
Uporabimo GDB z Linuxom
Uporabimo GDB z Linuxom

Če ste vse to poskušali in ste prišli tako daleč - super! Odlično. Zdaj se malo zabavajmo.

Ko kupite te razvojne plošče ARM, ne glede na to, ali gre za lansirno ploščo MSP432 podjetja Texas Instruments ali za to, o kateri zdaj razpravljamo, Nucleo-F303 (STM32 Nucleo-64), običajno pridejo že z bliskovitim zagonom programa, običajno kakšen utripajoč program, ki vključuje tudi pritisk stikala za spreminjanje hitrosti utripanja LED (-ov).

Preden bomo tako hitro prepisali, poglejmo, kaj je treba videti in narediti.

V Linuxu odprite terminal, spremenite imenik projekta stlink git, ki smo ga pravkar zgradili, in poiščite orodje st-util.

devchu@chubox: ~/Development/stlink $ find. -ime st-util

./build/Release/src/gdbserver/st-util

Zaženite to orodje. Ker smo že prej preizkusili našo povezavo s st-info --probe, bi morali dobiti nekaj izhodov, kot je ta:

devchu@chubox: ~/Development/stlink $./build/Release/src/gdbserver/st-util

st-util 1.4.0-50-g7fafee2 2018-10-20T18: 33: 23 INFO common.c: Nalaganje parametrov naprave…. 2018-10-20T18: 33: 23 INFO common.c: Priključena naprava je: naprava F303 z visoko gostoto, id 0x10036446 2018-10-20T18: 33: 23 INFO common.c: velikost SRAM: 0x10000 bajtov (64 KiB), Flash: 0x80000 bajtov (512 KiB) na straneh po 2048 bajtov 2018-10-20T18: 33: 23 INFO gdb-server.c: ID čipa je 00000446, jedrni ID je 2ba01477. 2018-10-20T18: 33: 23 INFO gdb-server.c: Poslušanje na *: 4242…

To je strežnik GDB, ki trenutno deluje in vidi našo razvojno ploščo, še pomembneje pa je, da posluša na vratih 4242 (privzeta vrata).

Zdaj smo pripravljeni odpreti odjemalca GDB.

V Linuxu odprite drug terminal in vnesite to:

arm-none-eabi-gdb -tui

To je enako kot zagon gdb strogo ukazne vrstice, vendar namesto tega proizvaja besedilni terminal (predvidevam, da uporablja prekletstva).

Odjemalec GDB in strežnik GDB delujeta. Odjemalec pa ni povezan s strežnikom. Trenutno ne ve ničesar o našem Nucleu (ali plošči po vaši izbiri). To moramo povedati. V terminalu bi moral biti vaš poziv zdaj "(gdb)". Vnesite:

pomoč pri ciljanju

Prikazal vam bo seznam. Upoštevajte, da je tisti, ki ga želimo, ciljno razširjen -oddaljen - uporabite oddaljeni računalnik prek serijske linije.

Moramo pa mu dati tudi lokacijo. Torej, v pozivu (gdb) vnesite:

(gdb) cilj razširjeni oddaljeni lokalni gostitelj: 4242

Odgovor bi morali dobiti takole:

(gdb) ciljni razširjeni oddaljeni lokalni gostitelj: 4242

Oddaljeno odpravljanje napak z uporabo localhost: 4242 0x080028e4 v ?? ()

Medtem smo na terminalu, ki izvaja st-util gdbserver, dobili tole:

2018-10-20T18: 42: 30 INFO gdb-server.c: Najdenih 6 registrov prelomnih točk hw

2018-10-20T18: 42: 30 INFO gdb-server.c: GDB povezan.

12. korak: Ponovimo, z Windows in Flash naš program

Ponovimo, z Windows in Flash naš program
Ponovimo, z Windows in Flash naš program
Ponovimo, z Windows in Flash naš program
Ponovimo, z Windows in Flash naš program
Ponovimo, z Windows in Flash naš program
Ponovimo, z Windows in Flash naš program

Koraki za zagon st-util gdbserver in odjemalca arm-none-eabi-gdb so v bistvu enaki kot v prejšnjem koraku. Odprete dva terminala (cygwin, DOS cmd ali Windows Powershell), poiščete lokacijo st-utila in ga zaženete. V drugem terminalu zaženite odjemalca arm-none-eabi-gdb. Edina razlika je v tem, da način -tui (pogled na besedilo na osnovi terminala) najverjetneje ni podprt.

Če je zgoraj navedeno delovalo v sistemu Windows, se boste verjetno morali ustaviti (samo odjemalec). Na tej točki boste morali nekako zagnati odjemalca GDB, kjer je vaša datoteka gradnje ("core.out"), ali dodati celotno pot do te datoteke kot argument odjemalcu GDB.

Poenostavil sem si življenje z uporabo cygwina in ustvarjanjem povezav iz svojega lokalnega imenika $ HOME // bin, kamor prebivata oba orodja.

V redu, tako kot prej smo sestavili in povezali in imamo datoteko main.elf pripravljeno za bliskanje.

St-util deluje v enem oknu. Ponovno zaženemo odjemalca GDB, tokrat naredimo:

arm-none-eabi-gdb main.elf

Pustimo, da se zažene, počakamo na poziv (gdb), izvedemo isti ukaz za povezavo s strežnikom GDB (st-util) in pripravljeni smo utripati izvedljivo datoteko. Je zelo protiklimatsko:

(gdb) obremenitev

Če uporabljate terminale cygwin, obstaja znana težava, da se ukazi ukazne mize včasih ne prikažejo. V našem primeru je bilo okno s strežnikom popolnoma tiho. Tisti, ki izvaja odjemalca, kjer smo izvajali obremenitev, izpiše to:

Nalaganje razdelka.tekst, velikost 0x1c lma 0x8000000 Začetni naslov 0x8000000, velikost nalaganja 28 Hitrost prenosa: 1 KB/s, 28 bajtov/zapis.

13. korak: utripanje z Linuxom - več nagrad: D

Utripanje z Linuxom - več nagrad: D
Utripanje z Linuxom - več nagrad: D

14. korak: Potopimo se nekoliko globlje

Če ste prišli sem, odlično. Gremo naprej.

Zakaj ne bi pogledali v datoteko main.elf, izvedljivo datoteko? Zaženite naslednje:

arm-none-eabi-objdump -d main.elf

Izhod bi moral videti nekaj takega:

main.elf: oblika datoteke elf32-littlearm

Demontaža razdelka.text:

08000000:

8000000: 00 40 01 20 09 00 00 08.@. ….

08000008:

8000008: 4802 ldr r0, [pc, #8]; (8000014) 800000a: 4685 mov sp, r0 800000c: 4f02 ldr r7, [pc, #8]; (8000018) 800000e: 2000 mov r0, #0

08000010:

8000010: 3001 doda r0, #1 8000012: e7fd b.n 8000010 8000014: 20014000.besedo 0x20014000 8000018: deadbeef.word 0xdeadbeef

Kakšne majhne drobce lahko dobimo iz zgornjega rezultata?

Če se spomnite, ko smo razpravljali in ustvarjali datoteko linker.script.ld, smo izjavili, da imajo te naprave ARM RAM od 0x20000000 in da se pomnilnik FLASH začne pri 0x08000000.

Tako lahko vidimo, da je program res tak, da je ves v pomnilniku FLASH.

Nato zgoraj, vendar pozneje, ko smo razpravljali o delu "Hello World", je prišlo do stavka, v katerem naložimo takojšnjo, konstantno, dobesedno vrednost ("0xDEADBEEF") v register jedra MCU ("R7").

Izjava je bila:

LDR R7, = 0xDEADBEEF

V naši kodi je to edino mesto, kjer sploh omenjamo DEADBEEF. Nikjer drugje. In vendar, če pogledate zgornja razstavljena/rekonstruirana navodila itd., Je o DEADBEEF povezanih več, kot smo mislili.

Tako se je prevajalnik/povezovalec nekako odločil, da bo vrednost DEADBEEF trajno utripal v naslov FLASH, na lokaciji 0x8000018. Nato je prevajalnik naše zgornje LDR navodilo spremenil v:

LDR R7, [PC, št. 8]

To nam je celo ustvarilo komentar. Kako lepo. In pove nam, da vzamemo trenutno vrednost števca programa (register računalnika), tej vrednosti dodamo 0x8 in tam je zapisan DEADBEEF ter to vrednost dobimo in jo vstavimo v R7.

To pomeni tudi, da je programski števec (PC) kazal na naslov 0x8000010, ki je začetek main_loop, in da vrednost DEADBEEF sedi na dveh naslovih po koncu main_loop.

15. korak: Na koncu še kratek pogled na program, ki se izvaja

Tudi če zaprete GDB, znova vnesite ukaz. Sploh vam ni treba dati nobene datoteke; ne utripamo več, samo izvajamo.

Ko znova povežete odjemalca GDB s strežnikom GDB, v ukaznem pozivu (gdb):

(gdb) registri podatkov

Morali bi videti nekaj takega:

r0 0x0 0

r1 0x0 0 r2 0x0 0 r3 0x0 0 r4 0x0 0 r5 0x0 0 r6 0x0 0 r7 0x0 0 r8 0x0 0 r9 0x0 0 r10 0x0 0 r11 0x0 0 r12 0x0 0 sp 0x20014000 0x20014000 lr 0xffffffff 429498008000

Nato v pozivu (gdb) vnesite:

(gdb) nadaljevanje

In zelo hitro pritisnil CTRL-C. To bi moralo zaustaviti program. Ponovno vnesite ukaz "info registri".

Tokrat je videti drugače:

(gdb) registri podatkov

r0 0x350ffa 3477498 r1 0x0 0 r2 0x0 0 r3 0x0 0 r4 0x0 0 r5 0x0 0 r6 0x0 0 r7 0xdeadbeef 3735928559 r8 0x0 0 r9 0x0 0 r10 0x0 0 r11 0x0 0 r12 0x0 0x00x00x00x00000000000000000000000000000000 16777216

Kaj se je zgodilo? Točno to, kar smo želeli. DEADBEEF je bil naložen v R7, R0 pa se je (izredno hitro) povečeval. Če ponovite, boste znova videli R0 z drugo vrednostjo.

Korak 16: Želeli smo ustvariti matriko samo za branje v Flash-u

Eden od načinov za ustvarjanje enakovrednega niza z uporabo montaže in direktiv je naslednji:

.type myarray, %object // ime ali oznaka 'myarray' je opredeljena kot vrsta objekta.

myarray: // to je začetek deklaracije 'myarray' // (iz česa bo sestavljen)..word 0x11111111 // prvi član ali vrednost v "myarray"..word 0x22222222 // druga vrednost (sosednji naslovi)..word 0x33333333 // in tako naprej..size myarray,.-myarray // prevajalnik/sestavljalec zdaj ve, kje je konec ali // meja 'myarray'.

Zdaj, ko smo ga nastavili v pomnilnik FLASH, ga lahko uporabimo v programu. Spodaj je del:

LDR R1, miarray // to naloži podatke na 1. mestu 'myarray'. ' // tega ne želimo.

LDR R1, = myarray // to naloži samo vrednost lokacije (prvi naslov), // ne podatki.. // to je tisto, kar želimo.

MOV R2, #0 // R2 bo štel, da ne bova odšla

// konec matrike. LDR R3, = myarrsize // R3 bo enakovreden „myarrsize“.

// R0 bo hranil naše podatke

main_loop:

LDR R0, [R1] // Podatke, na katere kaže R1 ('myarray'), naložimo v R0. CMP R2, R3 // Ali smo na meji polja? BEQ main_loop // Če smo, smo končali, zato se bomo za vedno vrteli v zanko.

ADD R2, #1 // V nasprotnem primeru lahko nadaljujemo s ponavljanjem po matriki.

ADD R1, #4 // Dodajte 4 za registracijo R1, tako da pravilno kaže na naslednjo

// naslov..

B main_loop // Zanka nazaj.

Video gre skozi vse to in v njem je napaka. V redu je; kaže, da je pomembna koda za zagon in odpravljanje napak. Prikazuje klasičen primer odhoda s konca matrike.

Priporočena: