Sadržaj:

1. dio ARM Montaža TI RSLK Robotika Kurikulum za učenje Laboratorij 7 STM32 Nucleo: 16 koraka
1. dio ARM Montaža TI RSLK Robotika Kurikulum za učenje Laboratorij 7 STM32 Nucleo: 16 koraka

Video: 1. dio ARM Montaža TI RSLK Robotika Kurikulum za učenje Laboratorij 7 STM32 Nucleo: 16 koraka

Video: 1. dio ARM Montaža TI RSLK Robotika Kurikulum za učenje Laboratorij 7 STM32 Nucleo: 16 koraka
Video: Дэниел Шмахтенбергер: Уничтожат ли нас технологии? 2024, Srpanj
Anonim
Image
Image

Fokus ovog Instructable-a je mikrokontroler STM32 Nucleo. Motivacija za to da se može izraditi montažni projekt od golih kostiju. To će nam pomoći da dublje proniknemo i razumijemo projekt MSP432 Launchpad (TI-RSLK) koji je već bio tema nekoliko Instructables.

Na mreži nema velike pomoći u stvaranju projekta samo za montažu za MSP432, koristeći Code Composer Studio. Do sada smo samo kopirali/lijepili iz već postojećeg montažnog projekta. Ovaj pristup nam je dobro poslužio.

Međutim, sada smo za Lab 7 naišli na mali problem. Ili barem privremeno štucanje. Lab 7 uvodi strojeve konačnih stanja, a prvo s čime se susrećemo je potreba za stvaranjem i korištenjem niza vrijednosti. Budući da TI kolegij uglavnom koristi C programiranje - to nije problem. Ali ti Instructables su se usredotočili na montažu, a ne na C.

Nadalje, budući da niz ima vrijednosti samo za čitanje, bilo bi dobro staviti ga u flash memoriju, a ne u RAM.

Čini se da na Internetu ima puno više pomoći za montažne projekte koji koriste STM32 MCU, pa počinjemo s ovim Instructable -om, s ciljem da iskoristimo naučeno, a zatim se primijenimo na MSP432 i Code Composer Studio.

Na putu do tog cilja također ćemo steći iskustvo s još jednim, popularnim mikrokontrolerom.

Korak 1: Početno testiranje uređaja

Početno testiranje uređaja
Početno testiranje uređaja
Početno testiranje uređaja
Početno testiranje uređaja
Početno testiranje uređaja
Početno testiranje uređaja

Opet, zašto posebno odabrati STM32 Nucleo?

Iskreno? Budući da sam tražio dobre članke o montažnim projektima od golih metala za ARM kontrolere, naišao sam na ovu seriju. A i zato što se čini da je STM32 popularan MCU.

Malo sam istraživao (postoji mnogo verzija za odabir - pogledajte gornju sliku), ali na kraju je postalo ono što zapravo mogu dobiti jer sam namjeravao koristiti Amazon (u SAD -u).

Dolazi u jednostavnom, ali profesionalnom pakiranju s nekim uputama za pokretanje. Bilo je pomalo smiješno vidjeti da je demo snimljen u kontroler bio gotovo točno ono što smo radili u prošlim Instructables - LED bljeska i mijenja brzinu prema pritisku tipke.

Čini se da je ova razvojna ploča vrlo slična MSP432 po tome što ima 2 LED diode i jedno korisničko dugme. MSP432 ima 2 korisnička gumba.

Kao što možete vidjeti na fotografijama, bio sam pomalo zatečen što ploča ima mini, a ne mikro USB. Morao sam pobjeći kupiti kabel.

Još jedan dobar test je da se, kad ga povežete s računalom (koristim Linux okvir), pojavi u mojem upravitelju datoteka, kao datotečni sustav, nazvan "NODE_F303RE". Otvaranje koje otkriva dvije datoteke, jednu HTML i jedan tekst.

To je to, ali barem kaže da se povezivanje čini prilično lakim.

Sada smo spremni za početak.

Pokušat ću ne ponoviti nijednu dobru informaciju iz serije članaka IVONOMICON Bare Metal, nego je povećati.

Korak 2: Osnove

Prvo što nam treba je prevoditelj.

Zatim nam je potreban alat za ispravljanje pogrešaka:

devchu@chubox: ~ $ sudo apt-get install gdb-arm-none-eabiČitanje popisa paketa … Gotovo Izgradnja stabla ovisnosti Čitanje informacija o stanju … Gotovo Instalirat će se sljedeći NOVI paketi: gdb-arm-none-eabi 0 nadograđeno, 1 novo instalirano, 0 za uklanjanje i 8 nije nadograđeno. Trebate nabaviti 2, 722 kB arhive. Nakon ove operacije koristit će se 7,738 kB dodatnog prostora na disku. Nabavite: 1 https://us.archive.ubuntu.com/ubuntu xenial/universe amd64 gdb-arm-none-eabi amd64 7.10-1ubuntu3+9 [2, 722 kB] Dohvaćeno 2, 722 kB u 1 s (1, 988 kB/s) Odabir prethodno neizabranog paketa gdb-arm-none-eabi. (Čitanje baze podataka … 262428 datoteka i direktorija trenutno instaliranih.) Priprema za raspakiranje …/gdb-arm-none-eabi_7.10-1ubuntu3+9_amd64.deb … Raspakiranje gdb-arm-none-eabi (7.10-1ubuntu3+9) … Obrada okidači za man-db (2.7.5-1)… Postavljanje gdb-arm-none-eabi (7.10-1ubuntu3+9)…

Korak 3: Osnove - Windows

Gornji korak je pretpostavio da koristimo Linux. Što ako koristimo Windows?

Možete otići na web mjesto za razvojne programere, a dostupno je nekoliko mogućnosti preuzimanja. Koristim stroj sa sustavom Windows 8.

Tijekom instalacije odlučio sam instalirati ga na korijenski pogon "C: \" umjesto programskih datoteka samo zato što i ja koristim cygwin i bilo je lakše stvoriti vezu iz moje lokalne kante u korijensku mapu C: nego sve nered na putu do programskih datoteka (s razmacima itd.).

Dakle, moje cygwin okruženje i put, itd., Izgleda ovako:

C: / cygwin64 / home / bin / arm-none-eabi-gcc, gdje je arm-none-eabi-gcc veza na C: / GNUToolsArmEmbedded / 7.2018.q2.update / bin / arm-none-eabi- gcc.

Zatim sam stvorio "dev" mapu pod cygwin home, i tu sam stavio datoteku core. S i pokrenuo naredbu kompajlera. (vidi dalje u nastavku za prevoditelje).

Uradio sam potpuno istu stvar za gdb (arm-none-eabi-gdb).

Korak 4: Što je bitno

Dakle, što je "gcc-arm-none-eabi"?

Prevodilac gnu (GCC) će kompajlirati programske jezike (poput C) u izvorni kod za stroj na kojem radi. Na primjer, ako biste sastavili neki C kod pomoću GCC -a na svom Windows stroju, on bi bio izgrađen za rad na Windows stroju. Generirana izvršna datoteka (obično) neće raditi na ARM mikrokontroleru.

Dakle, kako bismo izgradili programe za preuzimanje i snimanje u ARM mikrokontroler (u našem slučaju to bi bio STM32 Nucelo), moramo GCC-u dati još nešto: mogućnost "unakrsne kompilacije". To jest, mogućnost generiranja izvršne datoteke, ne za njezin izvorni sustav (i procesor), već za ciljni sustav (ARM mikrokontroler). Tu dolazi do izražaja "gcc-arm-none-eabi".

Što je onda "gdb-arm-none-eabi"?

Nakon što preuzmemo i narežemo (bljeskamo) novo generiranu izvršnu datoteku u mikrokontroler, vjerojatno ćemo je htjeti otkloniti pogreške-korak po redak koda. GDB je gnu ispravljač pogrešaka, a i njemu je potreban način da odradi svoj posao, ali cilja na drugi sustav.

Dakle, gdb-arm-none-eabi je za GDB, što je gcc-arm-none-eabi za GCC.

Druga predložena instalacija paketa bila je "libnewlib-arm-none-eabi". Što je to?

Newlib je C knjižnica i matematička knjižnica namijenjena za upotrebu na ugrađenim sustavima. To je konglomerat nekoliko knjižničnih dijelova, a sve pod licencama besplatnog softvera što ih čini lako upotrebljivima na ugrađenim proizvodima.

I na kraju, paket "libstdc ++-arm-none-eabi". Ta je prilično očita; to je C ++ knjižnica za unakrsni prevoditelj; za ugrađene ARM mikrokontrolere.

Korak 5: Datoteka povezivanja

Datoteka povezivača
Datoteka povezivača
Datoteka povezivanja
Datoteka povezivanja

Kreirajmo skriptu povezivanja.

Jedan ključni dio ili blok u ovoj datoteci bila bi naredba MEMORY.

--- s sourceware.org:

Zadana konfiguracija povezivača dopušta dodjelu sve dostupne memorije. To možete nadjačati pomoću naredbe MEMORY. Naredba MEMORY opisuje mjesto i veličinu blokova memorije u cilju. Pomoću njega možete opisati koja memorijska područja može koristiti povezivač, a koja memorijska područja mora izbjegavati. Zatim možete dodijeliti odjeljke određenim memorijskim regijama. Povezivač će postaviti adrese odjeljaka na temelju memorijskih regija i upozoriti na regije koje postaju previše pune. Povezivač neće miješati dijelove okolo kako bi se uklopio u dostupna područja. Skripta povezivača može sadržavati mnoge upotrebe naredbe MEMORY, međutim, svi definirani memorijski blokovi tretiraju se kao da su navedeni unutar jedne naredbe MEMORY. Sintaksa za MEMORY je:

MEMORIJA

{name [(attr)]: ORIGIN = ishodište, LENGTH = len…}

Primjer u članku:

/* Definirajte kraj RAM -a i ograničenje memorije steka* //* (4KB SRAM na liniji STM32F031x6, 4096 = 0x1000)*//* (RAM počinje na adresi 0x20000000) _estack = 0x20001000;

MEMORIJA

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

Stoga moramo shvatiti koliko FLASH -a (za naš program i konstante, itd.) I koliko RAM -a (za korištenje u programu; hrpa i hrpa itd.) Za našu ploču. Ovo postaje pomalo zanimljivo.

Lijepa mala kartica koja dolazi s Nucleom kaže da ima flash memoriju od 512 Kbytes, a SRAM 80 Kbytes. Međutim, povezujući ga s USB -om, postavlja se kao datotečni sustav s dvije datoteke, a i upravitelj datoteka i GParted pokazuju da ima više od 540+ Kbajta prostora. (RADNA MEMORIJA?).

ALI, pokušaj brisanja dviju datoteka pomoću upravitelja datoteka, prekidanje veze i ponovno povezivanje uređaja, i dalje prikazuje dvije datoteke. (i upravitelj datoteka je ipak prepoznao nešto jer na svakoj datoteci postoji mala ikona "zaključavanja".

Pa idemo s brojkama na kartici. Dakle, sada uzimamo gornji primjer i pretvaramo ga u našu posebnu ploču.

Možda ćete htjeti upotrijebiti nešto poput ovog mrežnog pretvarača memorije za prelazak s općeg KB na određeni broj bajtova.

Tada biste mogli htjeti upotrijebiti mrežni pretvarač decimalnog u heksadecimalni broj.

/ * Definirajte kraj RAM -a i ograničenje memorije steka */

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

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

/* korak 2, dodajte heksadecimalnu veličinu heksadecimalnoj početnoj adresi (ispod). */

/ * (RAM počinje na adresi 0x20000000) */

_estack = 0x20001000; / * primjer */

_estack = 0x20014000; / * naša ploča */

SJEĆANJE {

Bljeskalica (rx): PORIJEKLO = 0x08000000, DUŽINA = 512K

RAM (rxw): POREKLO = 0x20000000, DUŽINA = 80K

}

Nazovimo gornju datoteku "linker.script.ld".

Korak 6: Vektorska tablica

Vektorski stol
Vektorski stol

Sada ćemo stvoriti malu datoteku montaže (s direktivama) za obavljanje nekih vrlo osnovnih postupaka s prekidima. Slijedit ćemo primjer članka i stvoriti datoteku pod nazivom "core. S".

Opet, evo primjera sadržaja datoteke, ali sam napravio promjenu za našu posebnu ploču:

// Ove upute definiraju atribute našeg čipa i

// jezik montaže koji ćemo koristiti:.syntax unified /*Pogledajte ispod ovog područja koda* //*.cpu cortex-m0* / /*komentirajte ovaj redak primjera* /.cpu cortex-m4 /* umjesto toga dodajte korteks naše ploče. pogledajte gornju sliku u ovom koraku * / /*.fpu softvfp * / / *komentirajte ovaj redak primjera * /.fpu vfpv4 / *umjesto toga dodajte našu ploču; ima FPU */.thumb // Lokacije globalne memorije..global vtable.global reset_handler / * * Stvarna vektorska tablica. * Uključene su samo veličina RAM -a i 'reset' rukovatelj *, radi jednostavnosti. */.type vtable, %object vtable:.word _estack.word reset_handler.size vtable,.-vtable

Hmm.. Ne '.align' Direktiva

Međutim, to nije kritično. Više o tome (možda) kasnije.

.sintaksa objedinjena

.sintaksa [objedinjena | podijeljeno]

Ova direktiva postavlja Sintaksu skupa uputa kako je opisano u odjeljku ARM-Nabor uputa

9.4.2.1 Sintaksa skupa uputa Dvije neznatno različite sintakse podržavaju instrukcije ARM i THUMB. Zadana, podijeljena, koristi stari stil gdje su instrukcije ARM i THUMB imale vlastite, zasebne sintakse. Nova, jedinstvena sintaksa, koja se može odabrati putem.syntax direktive.

.fpu vfpv4

GCC prevoditelj može proizvesti binarne datoteke s nekoliko opcija u vezi s pomičnim zarezom: mekani - prikladni za rad na CPU -ima bez FPU -a - izračuni se rade u softveru pomoću softvera generiranog od strane kompajlera - prikladni za rad na CPU -ima sa ili bez FPU -a - ako će biti prisutni, upotrijebit će FPU. Za naš specifični slučaj (morat ćete sami obaviti istraživanje), FPU ove ploče u skladu je s vfpv4. Možda ćete se morati igrati s ovim. Ili čak ostavite na softfp.

.palac (naspram

Ovi ARM mikrokontroler zapravo imaju mješavinu skupova uputa. Jedan je ARM, drugi THUMB. Jedna razlika su 16-bitne upute u odnosu na 32-bitne. Stoga ova direktiva govori prevoditelju da slijedeće upute tretira kao THUMB ili ARM.

Ostatak datoteke ćemo uzeti onakvim kakav jest budući da se ti Instructables još nisu udubili u programiranje montaže vođeno prekidima.

Korak 7: Montažna verzija programa 'Hello World'

Sljedeće također može ući u prethodno stvorenu datoteku "core. S". Ovo je opet iz primjera u članku.

/ * * Rukovatelj Reset. Pozvano pri resetiranju. */.type reset_handler, %function reset_handler: // Postavite pokazivač steka na kraj stoga. // Vrijednost '_estack' definirana je u našoj skripti povezivanja. LDR r0, = _stack MOV sp, r0

// Postavljanje nekih lažnih vrijednosti. Kad vidimo te vrijednosti

// u našem programu za otklanjanje pogrešaka znat ćemo da je naš program // učitan na čip i da radi. LDR r7, = 0xDEADBEEF MOVS r0, #0 main_loop: // Dodajte 1 za registraciju 'r0'. DODAJA r0, r0, #1 // Petlja natrag. B main_loop.dimenzija reset_handler,.-Reset_handler

Dakle, cilj gornjeg programa je učitavanje prepoznatljivog uzorka u jedan jezgreni MCU registar (u ovom slučaju R7), a povećavajuća vrijednost koja počinje od nule u drugi MCU registar jezgre (u ovom slučaju R0). Ako prođemo kroz izvršni kôd, trebali bismo vidjeti povećanje podataka R0.

Ako ste zajedno s Instruktables slijedili MSP432 i tečaj/laboratorije TI-RSLK, tada bi vam gotovo svi gore navedeni programi trebali biti poznati.

Jedna nova stvar koju mogu vidjeti je korištenje "=" prilikom učitavanja "DEADBEEF" u za registraciju R7. To nismo koristili.

Ovdje priložena datoteka "core. S" sadrži potpuni izvor.

Korak 8: Sastavljanje Kodeksa

Vrijeme je za neke stvari iz naredbenog retka. Napokon nešto stvarno.

Međutim, nismo baš tu. Ponovno moramo prilagoditi naredbu datu u članku i prilagoditi je vlastitoj situaciji.

Evo primjera koda:

arm -none -eabi -gcc -x asembler -sa -cpp -c -O0 -mcpu = cortex -m0 -mthumb -Zidna jezgra. S -o jezgra.o

Ako posjetimo gnu.org web mjesto za GCC, (u ovom slučaju verzija 7.3),

x

-X služi za određivanje jezika. Inače, ako nema -x, prevoditelj će pokušati pogoditi pomoću nastavka datoteke. (u našem slučaju, *. S).

Gornji primjer iz članka navodi asembler-s-cpp, ali mogli bismo samo napraviti asembler.

c

-C kaže "kompajliraj, ali ne povezuj".

O0

-O treba postaviti razinu optimizacije. Korištenje -O0 (oh -nula) kaže "smanjite vrijeme kompajliranja i učinite da pogreške daju očekivane rezultate. To je zadana vrijednost".

mcpu = kora-m0

-Mcpu navodi naziv ciljnog procesora. U našem slučaju to bi bio cortex-m4.

palac

-Mthumb specificira odabir između generiranja koda koji izvršava ARM i THUMB stanja.

Zid

Zid je, naravno, vrlo uobičajen i poznat. Uključuje sve zastavice upozorenja.

Konačno, na kraju naredbe imamo ulaznu datoteku core. S i izlaznu datoteku core.o.

Evo rezultirajuće nove naredbene linije koja odgovara našem specifičnom slučaju.

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

I to je sastavljeno.

Korak 9: Povezivanje programa

Izravno iz primjera u članku imamo ovo:

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

Većinu gore navedenih ste vidjeli. Ispod je ono što je novo.

specs = nosys.specs

Ovo je malo nezgodno za objasniti.

To ima veze s "semihostingom" i "retargetingom", a ima i s ulazom / izlazom. To također ima veze sa sistemskim pozivima i knjižnicama.

Uobičajeno, ugrađeni sustavi ne pružaju standardne ulazno/izlazne uređaje. To bi utjecalo na pozive sustava ili knjižnice (primjer: printf ()).

Poluhostiranje znači da program za ispravljanje pogrešaka (vidi sliku 11. koraka s dijelom otklanjanja pogrešaka zaokruženim crvenom bojom) ima poseban kanal i koristi protokol poluhostovanja, a izlaz printf () možete vidjeti na računalu domaćinu (putem programa za otklanjanje pogrešaka).

Ponovno ciljanje, s druge strane, znači da ti isti pozivi sustava ili knjižnice znače nešto drugo. Oni rade nešto drugo, što ima smisla za ugrađeni sustav. U određenom smislu, recimo za printf (), postoji nova implementacija, ponovno ciljana implementacija te funkcije.

Rekavši sve to, --specs = nosys.specs znači da nećemo biti polugostovi. To bi obično značilo da ponovno ciljamo. To nas dovodi do sljedeće zastave.

nostdlib

Opcija povezivanja -nostdlib koristi se za povezivanje programa koji se namjerava pokrenuti samostalno. -nostdlib podrazumijeva pojedinačne opcije -nodefaultlibs i -nostartfiles. U nastavku raspravljamo o dvije opcije odvojeno, ali najčešća upotreba je samo nostdlib za kupovinu na jednom mjestu. Prilikom povezivanja hostiranog programa standardne knjižnice sustava, poput libc, zadano su povezane, dajući programu pristup svim standardnim funkcijama (printf, strlen i prijatelji). Opcija povezivanja -nodefaultlibs onemogućuje povezivanje s tim zadanim knjižnicama; jedine povezane knjižnice su upravo one koje izričito imenujete povezivaču pomoću oznake -l.

lgcc

libgcc.a standardna je knjižnica koja pruža unutarnje potprograme za prevladavanje nedostataka pojedinih strojeva. Na primjer, ARM procesor ne uključuje upute za podjelu. ARM verzija libgcc.a uključuje funkciju podjele i prevoditelj emitira pozive toj funkciji gdje je to potrebno.

T

Ovo je samo način da povezivaču povežete da koristi ovu datoteku kao skriptu povezivanja. U našem slučaju, naziv datoteke je linker.script.ld.

o glavno.elf

Na kraju, povezivaču kažemo kako će se zvati konačna izlazna slikovna datoteka koja će se snimiti/umetnuti u naš uređaj.

Evo naše verzije kompletne naredbene linije, izmijenjene za našu specifičnu situaciju:

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

Provjeravamo jesu li skriptna datoteka i core.o datoteka u istom direktoriju, gdje ćemo pokrenuti gornji naredbeni redak.

I povezuje se bez problema.

A Ček

Zatim pokrećemo:

arm-none-eabi-nm main.elf

i dobivamo:

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 dobro. Naredba arm-none-eabi-nm način je za popis simbola unutar objektnih datoteka.

Korak 10: Testiranje veze na STM32 Nucleo-64

TestiranjePovezivanje na STM32 Nucleo-64
TestiranjePovezivanje na STM32 Nucleo-64
TestiranjePovezivanje na STM32 Nucleo-64
TestiranjePovezivanje na STM32 Nucleo-64

Vaša prva misija, ako je odlučite prihvatiti, jest da vaš sustav vidi vašu razvojnu ploču.

Korištenje sustava Windows

Za Windows sam odlučio instalirati TrueSTUDIO iz Atollic -a (besplatna verzija). To je bila bezbolna instalacija i automatski je instalirao upravljački program tako da sam mogao koristiti st-link za testiranje veze. Nakon što sam instalirao TrueSTUDIO i upravitelj uređaja vidio uređaj, preuzeo sam texan/stlink alate predložene u članku Bare Metal koji smo pratili. Ponovno sam stavio mapu izravno pod "C: \" i opet stvorio neke veze iz moje lokalne cygwin kućne kante za naredbe.

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

Kao početni test da vidim da li zaista možemo komunicirati s uređajem, pokrenuo sam:

st-info-sonda

I vratio se:

Pronađeno 1 stlink programera

Dakle, sada znamo da možemo razgovarati/pitati našu razvojnu ploču.

Korištenje Linuxa

Za Linux, zapravo vam ne treba upravljački program. Ali za Debian ćete morati izgraditi st alate iz izvora.

git clone

Provjerite imate li instaliran libusb-1.0-0-dev.

prikladan popis | grep -E "*libusb.*dev*"

Trebali biste vidjeti:

libusb-1.0-0-dev/xenial, sada 2: 1.0.20-1 amd64 [instalirano]

ili tako nešto.

Da biste ga instalirali:

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

Imajte na umu da gore navedeno nije isto što i:

sudo apt-get install libusb-dev

Točan nedostajući libusb dev može uzrokovati probleme s cmakeom.

CMake pogreška: Sljedeće varijable se koriste u ovom projektu, ali su postavljene na NOTFOUND. Molimo vas da ih postavite ili provjerite jesu li ispravno postavljene i testirane u datotekama CMake: LIBUSB_INCLUDE_DIR (NAPREDNO)

Promijenite u korijenski direktorij projekta (… blah /blah /stlink). Napravite "make release".

Nakon te nadogradnje alati bi trebali biti pod ".. /build /Release".

Zatim možete pokrenuti "st-info --probe". Evo izlaza s spojenim Nucleom, a zatim ne.

devchu@chubox: ~/Development/stlink $./build/Release/st-info --probeFound 1 stlink programeri serijski: 303636414646353034393535363537 openocd: "\ x30 / x36 / x36 / x41 / x46 / x46 / x35 / x30 / x34 / x39 / x35 / x35 / x36 / x35 / x37 "blic: 524288 (veličina stranice: 2048) sram: 65536 chipid: 0x0446 descr: F303 uređaj velike gustoće devchu@chubox: ~/Development/stlink $./build/Release/st- info --probe Pronađeno 0 stlink programera devchu@chubox: ~/Development/stlink $

Korak 11: Koristimo GDB s Linuxom

Koristimo GDB s Linuxom
Koristimo GDB s Linuxom
Koristimo GDB s Linuxom
Koristimo GDB s Linuxom

Ako ste sve ovo pokušavali, a došli ste dovde - super! Izvrsno. Hajdemo se sad malo zabaviti.

Kad kupite ove razvojne ploče ARM, bilo da se radi o lansirnoj ploči MSP432 iz tvrtke Texas Instruments, ili o onoj o kojoj sada govorimo, Nucleo-F303 (STM32 Nucleo-64), one obično stižu već ispunjene programom, obično neki treptavi program koji također uključuje pritiskanje prekidača za promjenu brzine treptanja LED -a.

Prije nego što budemo toliko brzo to napisali, pogledajmo što možemo vidjeti i učiniti.

S Linuxom otvorite terminal, promijenite direktorij stlink git projekta koji smo upravo izgradili i pronađite alat st-util.

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

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

Pokrenite taj alat. Budući da smo već prethodno testirali svoju vezu sa st-info --probe, trebali bismo dobiti neke rezultate ovako:

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: Učitavanje parametara uređaja…. 2018-10-20T18: 33: 23 INFO common.c: Uređaj je spojen: F303 uređaj velike gustoće, id 0x10036446 2018-10-20T18: 33: 23 INFO common.c: SRAM veličina: 0x10000 bajtova (64 KiB), Flash: 0x80000 bajtova (512 KiB) na stranicama od 2048 bajtova 2018-10-20T18: 33: 23 INFO gdb-server.c: ID čipa je 00000446, Core ID je 2ba01477. 2018-10-20T18: 33: 23 INFO gdb-server.c: Slušanje na *: 4242…

To je GDB poslužitelj sada pokrenut i vidi našu razvojnu ploču, a što je još važnije, sluša na portu 4242 (zadani port).

Sada smo spremni za pokretanje GDB klijenta.

U Linuxu otvorite drugi terminal, unesite ovo:

arm-none-eabi-gdb -tui

To je isto kao i pokretanje gdb strogo naredbenog retka, no umjesto toga proizvodi terminal temeljen na tekstu (pretpostavljam da koristi kletve).

Imamo pokrenut GDB klijent i GDB poslužitelj. Međutim, klijent nije povezan s poslužiteljem. Trenutno ne zna ništa o našem Nucleu (ili ploči po vašem izboru). Moramo to reći. U terminalu bi vaš upit sada trebao biti "(gdb)". Unesi:

pomoć cilj

To će vam dati popis. Primijetite da je ono što želimo ciljno prošireno -daljinsko - Koristite udaljeno računalo putem serijske linije.

Ali moramo mu dati i lokaciju. Dakle, na upit (gdb) unesite:

(gdb) cilj prošireni udaljeni lokalni host: 4242

Trebali biste dobiti odgovor otprilike ovako:

(gdb) cilj prošireni udaljeni lokalni host: 4242

Daljinsko uklanjanje pogrešaka pomoću localhost -a: 4242 0x080028e4 u ?? ()

U međuvremenu, na terminalu koji pokreće st-util gdbserver dobili smo ovo:

2018-10-20T18: 42: 30 INFO gdb-server.c: Pronađeno 6 registara točaka prekida

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

Korak 12: Ponovimo, uz Windows i Flash naš program

Ponovimo, uz Windows i Flash naš program
Ponovimo, uz Windows i Flash naš program
Ponovimo, uz Windows i Flash naš program
Ponovimo, uz Windows i Flash naš program
Ponovimo, uz Windows i Flash naš program
Ponovimo, uz Windows i Flash naš program

Koraci za pokretanje st-util gdbservera i klijenta arm-none-eabi-gdb u biti su isti kao i mi u prethodnom koraku. Otvorite dva terminala (cygwin, DOS cmd ili Windows Powershell), pronađete lokaciju st-utila, pokrenite ga. Na drugom terminalu pokrenite klijent arm-none-eabi-gdb. Jedina razlika je u tome što način -tui (prikaz teksta temeljen na terminalu) najvjerojatnije nije podržan.

Ako je gore navedeno radilo u sustavu Windows, vjerojatno ćete morati prestati (samo klijent). U ovom trenutku ćete nekako morati pokrenuti GDB klijent gdje se nalazi vaša datoteka za izgradnju ("core.out") ili dodati cijeli put do te datoteke kao argument GDB klijentu.

Pojednostavio sam svoj život pomoću cygwina i stvaranjem veza iz svog lokalnog direktorija $ HOME // bin do mjesta gdje se nalaze oba alata.

U redu, sastavili smo i povezali kao i prije, a imamo datoteku main.elf spremnu za fleširanje.

Imamo st-util koji radi u jednom prozoru. Ponovno pokrećemo GDB klijenta, ovaj put radimo:

arm-none-eabi-gdb main.elf

Pustili smo da se pokrene, pričekali (gdb) upit, izvršili istu naredbu povezivanja s GDB poslužiteljem (st-util) i spremni smo za fleširanje izvršne datoteke. Vrlo je klimatski:

(gdb) opterećenje

Pokretanje s cygwin terminalima, poznat je problem s tim da se neke naredbe konzole ponekad ne emitiraju. Dakle, u našem slučaju prozor s poslužiteljem bio je potpuno tih. Ona koja pokreće klijenta, gdje smo pokrenuli učitavanje, ispisuje ovo:

Učitavanje odjeljka.tekst, veličina 0x1c lma 0x8000000Start adresa 0x8000000, veličina učitavanja 28 Brzina prijenosa: 1 KB/s, 28 bajtova/pisanje.

Korak 13: Bljeskanje s Linuxom - više nagrađivanja: D

Bljesak s Linuxom - više nagrađivanja: D
Bljesak s Linuxom - više nagrađivanja: D

Korak 14: Zaronimo malo dublje

Ako ste stigli ovdje, odlično. Idemo dalje.

Zašto ne biste pogledali unutar datoteke main.elf, izvršne datoteke? Pokrenite sljedeće:

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

Trebali biste vidjeti izlaz ovako:

main.elf: format datoteke elf32-littlearm

Rastavljanje odjeljka.teksta:

08000000:

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

08000008:

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

08000010:

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

Koje male grudice možemo dobiti iz gornjeg izlaza?

Ako se sjećate kada smo raspravljali i stvarali datoteku linker.script.ld, izjavili smo da ovi ARM uređaji imaju RAM počevši od 0x20000000, a da FLASH memorija počinje od 0x08000000.

Dakle, možemo vidjeti da je program doista takav da se sve nalazi u FLASH memoriji.

Zatim, gore, ali kasnije, kada smo raspravljali o dijelu "Hello World", došlo je do izjave u kojoj učitavamo neposrednu, konstantnu, doslovnu vrijednost ("0xDEADBEEF") u registar jezgre MCU -a ("R7").

Izjava je glasila:

LDR R7, = 0xDEADBEEF

U našem kodu to je jedino mjesto gdje uopće spominjemo DEADBEEF. Nigdje drugdje. Pa ipak, ako pogledate gornje rastavljene/rekonstruirane upute itd., Postoji više stvari povezanih s DEADBEEF -om nego što smo mislili.

Dakle, prevoditelj/povezivač je nekako odlučio trajno prenijeti vrijednost DEADBEEF -a u FLASH adresu, na lokaciji 0x8000018. A onda je prevoditelj promijenio gornju LDR uputu u:

LDR R7, [PC, #8]

Čak nam je izazvao komentar. Kako lijepo. I govori nam da uzmemo trenutnu vrijednost brojača programa (registar računala), toj vrijednosti dodamo 0x8, i tu je snimljen DEADBEEF, te dobijemo tu vrijednost i ubacimo je u R7.

Dakle, to također znači da je programski brojač (PC) pokazivao na adresu 0x8000010, koja je početak main_loop, i da vrijednost DEADBEEF stoji na dvije adrese nakon završetka main_loop.

Korak 15: Konačno, kratki pogled na program koji se izvodi

Čak i ako napustite GDB, samo ponovno unesite naredbu. Ne morate mu čak dati niti datoteku; više ne bljeskamo, samo ga pokrećemo.

Nakon što ste ponovno povezali GDB klijent s GDB poslužiteljem, u naredbenom retku (gdb):

(gdb) registri podataka

Trebali biste vidjeti ovako nešto:

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 4294900000000000000000000000000000000000000

No, zatim, u odzivu (gdb) unesite:

(gdb) nastaviti

I vrlo brzo pritisnuo CTRL-C. To bi trebalo pauzirati program. Ponovno unesite naredbu "info registri".

Ovaj put izgleda drugačije:

(gdb) info registri

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 r0 0x0 0x00x00x0000 16777216

Što se dogodilo? Upravo ono što smo htjeli. DEADBEEF je učitan u R7, a R0 se (izuzetno brzo) povećavao. Ako ponovite, ponovno ćete vidjeti R0 s drugom vrijednošću.

Korak 16: Željeli smo u Flash-u stvoriti niz samo za čitanje

Jedan od načina za stvaranje ekvivalenta niza pomoću sklopa i direktiva je sljedeći:

.type myarray, %object // naziv ili oznaka 'myarray' definirano je kao tip objekta.

myarray: // ovo je početak deklaracije 'myarray' // (od čega će se sastojati)..word 0x11111111 // prvi član ili vrijednost sadržana u 'myarray'..rijeka 0x22222222 // druga vrijednost (susjedne adrese)..riječ 0x33333333 // i tako dalje..size myarray,.-myarray // prevoditelj/asembler sada zna gdje je kraj ili // granica 'myarray'.

Sada kada smo ga postavili u FLASH memoriju, možemo ga koristiti u programu. Ispod je dio:

LDR R1, myarray // učitava podatke sadržane na 1. mjestu 'myarray'. ' // ovo nije ono što želimo.

LDR R1, = myarray // ovo učitava samu vrijednost lokacije (prva adresa), // ne podaci.. // ovo je ono što želimo.

MOV R2, #0 // R2 će voditi računa da ne odemo

// kraj niza. LDR R3, = myarrsize // R3 će biti ekvivalent „myarrsize“.

// R0 čuva naše podatke

main_loop:

LDR R0, [R1] // Učitati podatke na koje ukazuje R1 ('myarray') u R0. CMP R2, R3 // Jesmo li na granici polja? BEQ main_loop // Ako jesmo, gotovi smo, pa ćemo zauvijek samo petljati.

ADD R2, #1 // Inače možemo nastaviti ponavljati niz.

ADD R1, #4 // Dodajte 4 za registraciju R1, tako da ispravno pokazuje na sljedeći

// adresa..

B main_loop // Petlja natrag.

Videozapis prolazi kroz sve to, a u njemu je i greška. Dobro je; pokazuje da je važan kôd za pokretanje i otklanjanje pogrešaka. Prikazuje klasičan slučaj odlaska s kraja niza.

Preporučeni: