Агуулгын хүснэгт:

1 -р хэсэг ARM Assembly TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo: 16 алхам
1 -р хэсэг ARM Assembly TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo: 16 алхам

Видео: 1 -р хэсэг ARM Assembly TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo: 16 алхам

Видео: 1 -р хэсэг ARM Assembly TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo: 16 алхам
Видео: OSE Developer Meeting - Sep 5, 2017 2024, Долдугаар сарын
Anonim
Image
Image

Энэхүү зааварчилгааны үндсэн чиглэл нь STM32 Nucleo микро хянагч юм. Нүцгэн яснаас угсрах төслийг бүтээх боломжтой болохын төлөөх сэдэл. Энэ нь бидэнд хэд хэдэн зааварчилгааны сэдэв болсон MSP432 Launchpad төслийг (TI-RSLK) илүү гүнзгий судалж, ойлгоход тусална.

Code Composer Studio ашиглан MSP432-д зориулж зөвхөн угсрах төсөл бий болгоход онлайн тусламж тийм ч их байдаггүй. Өнөөг хүртэл бид өмнө нь байсан угсрах төслөөс дөнгөж хуулж/буулгаж байсан. Энэ хандлага бидэнд сайн үйлчилсэн.

Гэсэн хэдий ч одоо 7 -р лабораторийн хувьд бид бага зэрэг асуудалтай тулгарлаа. Эсвэл наад зах нь түр зуурын саатал. Лабораторийн 7 нь хязгаарлагдмал төлөв байдлын машинуудыг танилцуулж байгаа бөгөөд бидний тулгардаг хамгийн эхний зүйл бол олон тооны утгыг бий болгох, ашиглах хэрэгцээ юм. TI курс нь ихэвчлэн C програмчлалыг ашигладаг тул энэ нь асуудал биш юм. Гэхдээ эдгээр зааварчилгаа нь С биш харин угсрах ажилд гол анхаарлаа хандуулсан болно.

Цаашилбал, массив нь зөвхөн уншигдах утгатай тул үүнийг RAM биш харин флэш санах ойд оруулах нь зүйтэй болов уу.

STM32 MCU ашиглан угсрах төслүүдэд онлайнаар илүү их туслалцаа байгаа мэт санагдаж байгаа тул бид сурч мэдсэн зүйлээ ашиглан MSP432 болон Code Composer Studio -д ашиглах зорилгоор энэхүү зааварчилгаанаас эхэлж байна.

Энэ зорилгод хүрэх замд бид бас нэг алдартай микро хянагчийн талаар туршлага хуримтлуулах болно.

Алхам 1: Төхөөрөмжийн анхны туршилт

Төхөөрөмжийн анхны туршилт
Төхөөрөмжийн анхны туршилт
Төхөөрөмжийн анхны туршилт
Төхөөрөмжийн анхны туршилт
Төхөөрөмжийн анхны туршилт
Төхөөрөмжийн анхны туршилт

Дахин хэлэхэд яагаад STM32 Nucleo -ийг сонгох ёстой вэ?

Үнэнийг хэлэхэд? Учир нь би ARM хянагчдад зориулсан нүцгэн төмөр угсрах төслүүдийн талаар сайн нийтлэл хайж байсан бөгөөд энэ цувралтай таарсан юм. Мөн STM32 нь алдартай MCU юм шиг санагддаг.

Би бага зэрэг судалгаа хийсэн (сонголт хийх маш олон хувилбар байдаг - дээрх зургийг үзнэ үү), гэхдээ эцэст нь би Амазоныг (АНУ -д) ашиглах гэж байсан болохоор юу олж авах боломжтой болсон.

Энэ нь энгийн боловч мэргэжлийн багцаар ирдэг бөгөөд зарим эхлэх заавартай байдаг. Хянагч руу шатсан демо нь бидний өмнөх Instructables дээр яг яг хийж байсан зүйл байсан гэдгийг харахад үнэхээр инээдтэй байсан - LED нь анивчиж, товчлуур дарсны дагуу хурдыг өөрчилдөг.

Энэхүү хөгжлийн самбар нь 2 LED, нэг хэрэглэгчийн товчлууртай тул MSP432-тэй маш төстэй юм шиг санагдаж байна. MSP432 нь 2 хэрэглэгчийн товчлууртай.

Зураг дээр харж байгаа шиг, самбар нь микро USB биш, харин мини байдаг нь надад жаахан гайхсан юм. Утас худалдаж авахын тулд гүйх хэрэгтэй болсон.

Өөр нэг сайн тест бол та үүнийг компьютер дээрээ холбохдоо (би Линукс хайрцгийг ашиглаж байгаа) энэ нь миний файлын менежер дээр "NODE_F303RE" нэртэй файлын систем хэлбэрээр гарч ирэх явдал юм. Нээлтэд хоёр файл, нэг HTML, нэг текст гарч ирнэ.

Ийм л байна, гэхдээ наад зах нь холболт нь маш хялбар юм шиг санагддаг.

Одоо бид эхлэхэд бэлэн байна.

Би IVONOMICON нүцгэн металлын цуврал нийтлэлээс гарсан сайн мэдээллийг давтахгүй, харин ч нэмэхийг хичээх болно.

Алхам 2: Үндсэн зүйлүүд

Бидэнд хэрэгтэй хамгийн эхний зүйл бол хөрвүүлэгч юм.

Тэгээд бидэнд дибаг хийгч хэрэгтэй болно:

devchu@chubox: ~ $ sudo apt-get install gdb-arm-none-eabiReading packet жагсаалтууд … Дууссан хамаарлын модыг төлөв байдлын мэдээллийг уншиж байна … Дууссан Дараах ШИНЭ багцуудыг суулгах болно: gdb-arm-none-eabi 0 сайжруулсан, 1 шинэ суулгасан, устгахын тулд 0, шинэчлэгдээгүй 8. 2, 722 кБ архив авах шаардлагатай. Энэ үйлдлийг хийсний дараа 7, 738 кБ дискний нэмэлт зай ашиглах болно. Авах: 1 https://us.archive.ubuntu.com/ubuntu xenial/Universe amd64 gdb-arm-none-eabi amd64 7.10-1ubuntu3+9 [2, 722 kB] 2, 722 кБ-ийг 1 секундын дотор авсан (1, 988) kB/s) Өмнө нь сонгогдоогүй gdb-arm-none-eabi багцыг сонгох. (Өгөгдлийн санг уншиж байна … Одоогоор 262428 файл, лавлах суулгасан байна.) Буулгахад бэлтгэж байна …/gdb-arm-none-eabi_7.10-1ubuntu3+9_amd64.deb… gdb-arm-none-eabi (7.10-1ubuntu3+9) -г задалж байна … боловсруулж байна man-db (2.7.5-1) -г идэвхжүүлдэг… gdb-arm-none-eabi (7.10-1ubuntu3+9) -ийг тохируулж байна …

Алхам 3: Essentials - Windows

Дээрх алхам нь бид Линукс ашиглаж байна гэж үзсэн. Хэрэв бид Windows ашиглаж байгаа бол яах вэ?

Та хөгжүүлэгчийн гар руу очиж үзэх боломжтой бөгөөд татаж авах хэд хэдэн сонголт байдаг. Би Windows 8 машин ашиглаж байна.

Суулгах явцад би cygwin ашиглаж байгаа тул үүнийг програмын файлын оронд "C: \" хөтөч дээр суулгахаар сонгосон бөгөөд өөрийн локал савнаас root C: фолдер руу холбоос үүсгэх нь бүх файлуудаас илүү хялбар болсон. програмын файлууд руу орох зам (хоосон зай гэх мэт).

Тиймээс миний cygwin орчин ба зам гэх мэт иймэрхүү харагдаж байна.

C: / cygwin64 / home / bin / arm-none-eabi-gcc, энд arm-none-eabi-gcc нь C: / GNUToolsArmEmbedded / 7.2018-ийн холбоос юм. Q2.update / bin / arm-none-eabi- gcc.

Дараа нь би cygwin home дор "dev" фолдер үүсгэсэн бөгөөд тэнд би core. S файлыг байрлуулж хөрвүүлэгчийн тушаалыг ажиллуулсан. (хөрвүүлэгчийг доороос үзнэ үү).

Би gdb (arm-none-eabi-gdb) дээр яг ижил зүйлийг хийсэн.

Алхам 4: Үндсэн зүйлүүд гэж юу вэ

Тэгэхээр "gcc-arm-none-eabi" гэж юу вэ?

Gnu хөрвүүлэгч (GCC) нь програмчлалын хэлийг (C гэх мэт) ажиллаж байгаа машиныхаа эх код болгон хөрвүүлэх болно. Жишээлбэл, хэрэв та Windows машин дээрээ GCC ашиглан зарим C кодыг эмхэтгэх байсан бол үүнийг Windows машин дээр ажиллуулахаар бүтээсэн болно. Үүсгэсэн гүйцэтгэх боломжтой (ихэвчлэн) ARM микроконтроллер дээр ажиллахгүй.

Тиймээс, ARM микроконтроллерт татаж авах, шатаах програмуудыг бий болгохын тулд (бидний хувьд энэ нь STM32 Nucelo байх болно) GCC-д өөр зүйл өгөх хэрэгтэй: "хөндлөн хөрвүүлэх" чадвар. Өөрөөр хэлбэл, өөрийн унаган систем (болон процессор) биш, харин зорилтот системд (ARM микро хянагч) зориулж гүйцэтгэх боломжтой програм үүсгэх чадвар юм. Энд л "gcc-arm-none-eabi" тоглодог.

Тэгвэл "gdb-arm-none-eabi" гэж юу вэ?

Бид шинээр үүсгэсэн гүйцэтгэгдэх програмыг микроконтроллерт татаж аваад шатааж (анивчсаны дараа) кодын мөр мөрөөр алхам алхмаар дибаг хийхийг хүсч магадгүй юм. GDB бол gnu дибаг хийгч бөгөөд түүнд бас өөр системд чиглэсэн ажлаа хийх арга зам хэрэгтэй.

Тиймээс, gdb-arm-none-eabi нь GDB, gcc-arm-none-eabi нь GCC-д зориулагдсан болно.

Өөр нэг санал болгож буй багц суулгах нь "libnewlib-arm-none-eabi" юм. Тэр юу вэ?

Ньюлиб бол суулгагдсан системд ашиглах зориулалттай C номын сан ба математикийн номын сан юм. Энэ нь үнэгүй номын сангийн номын сангийн хэд хэдэн хэсгүүдийн нэгдэл бөгөөд тэдгээрийг суулгагдсан бүтээгдэхүүн дээр ашиглахад хялбар болгодог.

Эцэст нь "libstdc ++-arm-none-eabi" багц. Энэ бол үнэхээр ойлгомжтой зүйл юм; Энэ бол хөндлөн хөрвүүлэгчдэд зориулсан C ++ номын сан; суулгагдсан ARM микро контроллеруудын хувьд.

Алхам 5: Холбогч файл

Холбогч файл
Холбогч файл
Холбогч файл
Холбогч файл

Холбогч скриптийг бүтээцгээе.

Энэ файлын нэг гол хэсэг буюу блок нь MEMORY команд байх болно.

--- sourceware.org дээрээс:

Холбогчийн анхдагч тохиргоо нь боломжтой бүх санах ойг хуваарилах боломжийг олгодог. MEMORY команд нь зорилтот санах ойн блокуудын байршил, хэмжээг тодорхойлдог. Та үүнийг холбогч ямар санах ойн бүсийг ашиглаж болох, ямар санах ойн бүсээс зайлсхийх ёстойг тайлбарлахад ашиглаж болно. Та дараа нь санах ойн бүс нутгуудад хэсэг хуваарилж болно, холбогч нь санах ойн бүсэд үндэслэн хэсгийн хаягийг тохируулах бөгөөд хэт дүүрсэн бүс нутгийн талаар анхааруулах болно. Холбогч скрипт нь MEMORY командын олон хэрэглээг агуулж болох боловч бүх санах ойн блокуудыг нэг MEMORY команд дотор зааж өгсөн мэтээр авч үзэх боломжтой.:

ДУРСАМЖ

{нэр [(татах)]: ОГСОН = гарал үүсэл, LENGTH = len…}

Нийтлэл дэх жишээ:

/* RAM -ийн төгсгөл ба стек санах ойн хязгаарыг тодорхойлох* //* (STM32F031x6 шугам дээрх 4KB SRAM, 4096 = 0x1000)*//* (RAM нь 0x20000000 хаягаар эхэлдэг) _estack = 0x20001000;

ДУРСАМЖ

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

Тиймээс бид тухайн самбар дээр хичнээн их FLASH (програм болон тогтмол гэх мэт), хичнээн RAM (програм ашиглахад ашиглах, овоолох, стек гэх мэт) -ийг тодорхойлох хэрэгтэй. Энэ нь жаахан сонирхолтой болж байна.

Nucleo -той хамт ирдэг сайхан бяцхан карт нь 512 Кбайт флэш санах ойтой бөгөөд SRAM нь 80 Кбайт юм. Гэсэн хэдий ч үүнийг USB -д холбосноор хоёр файлтай файлын систем болгон суулгадаг бөгөөд файлын менежер болон GParted хоёулаа 540+ Кбайт зайтай болохыг харуулж байна. (RAM?).

ГЭХДЭЭ хоёр файлыг файлын менежер ашиглан устгахыг оролдож, төхөөрөмжийг салгаад дахин холбосон ч хоёр файлыг харуулсаар байна. (мөн файл бүрт жижиг "түгжих" дүрс байдаг тул файлын менежер ямар нэг зүйлийг таньсан.

Тиймээс картан дээрх тоонуудтай хамт явцгаая. Тиймээс одоо бид дээрх жишээг авч өөрийн тусгай самбар руу хөрвүүлэв.

Та ерөнхий санах ойгоос тодорхой тооны байт руу шилжихийн тулд ийм онлайн санах ойн хөрвүүлэгч ашиглахыг хүсч магадгүй юм.

Дараа нь та онлайн аравтын тооноос зургаан өнцөгт хөрвүүлэгч ашиглахыг хүсч магадгүй юм.

/ * RAM -ийн төгсгөл ба стек санах ойн хязгаарыг тодорхойлох */

/* (STM32F031x6 шугам дээрх 4KB SRAM, 4096 = 0x1000)* //* жишээ*/

/ * алхам 1: (STM32F303RE дээр 80KB SRAM, 81920 = 0x14000) * // * манай самбар */

/* 2 -р алхам, зургаан өнцөгтийн хэмжээг зургаан өнцөгт эхлэх хаягаар нэмнэ үү (доор). */

/ * (RAM нь 0x20000000 хаягаар эхэлдэг) */

_estack = 0x20001000; / * жишээ */

_estack = 0x20014000; / * манай самбар */

ДУРСАМЖ {

FLASH (rx): ORIGIN = 0x08000000, LENGTH = 512K

RAM (rxw): ORIGIN = 0x20000000, LENGTH = 80K

}

Дээрх файлыг "linker.script.ld" гэж нэрлэе.

Алхам 6: Векторын хүснэгт

Векторын хүснэгт
Векторын хүснэгт

Одоо бид маш энгийн тасалдлыг зохицуулах жижиг угсралтын файл (заавартай) үүсгэх болно. Бид нийтлэлийн жишээг дагаж "core. S" нэртэй файл үүсгэх болно.

Дахин хэлэхэд энд жишээ файлын агуулга байна, гэхдээ би манай тусгай самбарт өөрчлөлт оруулсан.

// Эдгээр заавар нь бидний чип болон

// бидний ашиглах угсрах хэл:.syntax unified /*Энэ кодын талбарын дараа доороос үзнэ үү* //*.cpu cortex-m0* / /*жишээн дээрх энэ мөрийг тайлбарлана уу* /.cpu cortex-m4 /* Үүний оронд манай самбарын бор гадаргыг нэмнэ үү. энэ алхам дээрх дээрх зургийг үзнэ үү * / /*.fpu softvfp * / / *жишээн дээрх энэ мөрийг тайлбарлаарай * /.fpu vfpv4 / *оронд нь манай самбарыг нэмнэ үү; Энэ нь FPU */.thumb // Глобал санах ойн байршилтай..global vtable.global reset_handler / * * Бодит векторын хүснэгт. * Зөвхөн RAM болон "дахин тохируулах" зохицуулагчийн хэмжээг багтаасан болно. */.type vtable, %object vtable:.word _estack.word reset_handler. size vtable,.-vtable

Хмм.. Үгүй '.align' удирдамж

Гэсэн хэдий ч энэ нь чухал биш юм. Энэ талаар дараа нь (магадгүй) дараа нь оруулах болно.

.syntax нэгдсэн

.syntax [нэгдсэн | хуваагдсан]

Энэхүү заавар нь ARM-Instruction-Set хэсэгт тайлбарласан зааврын олонлогийн синтаксийг тогтоодог

9.4.2.1 Зааварчилгааны синтакс Бага зэрэг ялгаатай хоёр синтакс нь ARM болон THUMB зааврыг дэмждэг. Анхдагч, хуваагдсан хэлбэр нь хуучин хэв маягийг ашигладаг бөгөөд ARM болон THUMB зааврууд нь тусдаа синтаксуудтай байдаг.. Syntax удирдамжаар сонгож болох шинэ, нэгдсэн синтакс.

.fpu vfpv4

GCC хөрвүүлэгч нь хөвөх цэгийн талаар хэд хэдэн сонголттой хоёртын файлуудыг гаргаж чаддаг: зөөлөн - FPU -гүй CPU дээр ажиллахад тохиромжтой - тооцооллыг хөрвүүлэгчийн үүсгэсэн softfp програм хангамжаар хийдэг - FPU -тэй эсвэл процессоргүй ажиллахад тохиромжтой - хэрэв байгаа бол FPU -ийг ашиглах болно.. Манай тодорхой тохиолдлын хувьд (та өөрөө судалгаа хийх хэрэгтэй болно) энэхүү тусгай зөвлөлийн FPU нь vfpv4 -тэй нийцдэг. Та үүгээр тоглох хэрэгтэй болж магадгүй юм. Эсвэл softfp дээр үлдээгээрэй.

эрхий хуруу (эсрэг. гар)

Эдгээр ARM микроконтроллер нь үнэндээ холимог зааварчилгааны багцтай байдаг. Нэг нь ARM, нөгөө нь THUMB юм. Нэг ялгаа нь 16 битийн заавар ба 32 битийн заавар юм. Тиймээс энэхүү удирдамж нь эмхэтгэгчид дараагийн зааврыг THUMB эсвэл ARM гэж үзэх ёстойг хэлдэг.

Эдгээр зааварчилгаа нь тасалдалаар удирддаг угсрах програмчлалд хараахан ороогүй байгаа тул бид файлын үлдсэн хэсгийг одоо байгаагаар нь авч үзэх болно.

Алхам 7: 'Hello World' хөтөлбөрийн Ассамблейн хувилбар

Дараахь зүйлийг өмнө нь үүсгэсэн "core. S" файлд оруулах боломжтой. Энэ нь дахин нийтлэл дэх жишээнээс харагдаж байна.

/ * * Дахин тохируулах зохицуулагч. Дахин тохируулах гэж дуудсан. */.type reset_handler, %function reset_handler: // Стекийн заагчийг стекийн төгсгөлд тохируулна. // '_estack' утгыг манай холбогч скриптээр тодорхойлсон болно. LDR r0, = _estack MOV sp, r0

// Зарим дамми утгыг тохируулна уу. Эдгээр үнэт зүйлсийг бид харах үед

// манай дибаг хийгч дээр манай програм // чип дээр ачаалагдаж ажиллаж байгааг бид мэдэх болно. LDR r7, = 0xDEADBEEF MOVS r0, #0 main_loop: // 'r0' бүртгүүлэхийн тулд 1 нэмнэ үү. ADDS r0, r0, #1 // Буцах гогцоо. B main_loop. Хэмжээг reset_handler,.-Reset_handler

Дээрх програмын гол зорилго бол танигдах загварыг нэг үндсэн MCU бүртгэлд (энэ тохиолдолд R7), тэгээс эхэлж нэмэгдэх утгыг өөр нэг үндсэн MCU бүртгэлд (энэ тохиолдолд R0) ачаалах явдал юм. Хэрэв бид гүйцэтгэх кодыг судалж үзвэл R0 -ийн өгөгдлийн өсөлтийг харах ёстой.

Хэрэв та MSP432 болон TI-RSLK курс/лабораторийн талаархи зааврыг дагаж байсан бол дээр дурдсан бүх програмууд танд сайн мэддэг байх ёстой.

Миний харж байгаа цорын ганц шинэ зүйл бол R7 -ийг бүртгүүлэхийн тулд "DEADBEEF" -г ачаалахдаа "=" -г ашиглах явдал юм. Бид үүнийг ашиглаж байгаагүй.

Энд хавсаргасан "core. S" файл одоо бүрэн эх сурвалжийг агуулж байна.

Алхам 8: Кодыг эмхэтгэх

Зарим тушаалын мөрийн зүйл хийх цаг болжээ. Эцэст нь бодит зүйл.

Гэсэн хэдий ч бид тийм ч сайн биш байна. Бид дахин нийтлэлд өгсөн тушаалыг өөрчилж, өөрийн нөхцөл байдалд нийцүүлэн өөрчлөх ёстой.

Жишээ код энд байна:

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

Хэрэв бид GCC -ийн gnu.org сайт руу очвол (энэ тохиолдолд 7.3 хувилбар),

x

-X нь хэлийг зааж өгөх явдал юм. Үгүй бол -x байхгүй бол хөрвүүлэгч файлын өргөтгөлийг ашиглан таамаглахыг оролдох болно. (бидний хувьд *. S).

Өгүүллийн дээрх жишээ нь cps-тэй assembler-ийг зааж өгсөн боловч бид угсрагчийг л хийж чадна.

c

-C хэлэхдээ эмхэтгээрэй, гэхдээ бүү холбоорой.

О0

-O нь оновчлолын түвшинг тогтоох явдал юм. -O0 (oh -zero) ашиглах нь "эмхэтгэх хугацааг багасгаж, дибаг хийх нь хүлээгдэж буй үр дүнг гаргахад хүргэдэг. Энэ нь анхдагч юм" гэж хэлдэг.

mcpu = cortex-m0

-Mcpu нь зорилтот процессорын нэрийг зааж өгдөг. Манай тохиолдолд энэ нь cortex-m4 байх болно.

эрхий хуруу

-Mthumb нь ARM болон THUMB төлөвийг гүйцэтгэх код үүсгэх хоорондох сонголтыг тодорхойлдог.

Хана

-Хана нь мэдээж маш түгээмэл бөгөөд алдартай. Энэ нь бүх анхааруулах тугуудыг асаана.

Төгсгөлд нь командын төгсгөлд оролтын файлын core. S ба гаралтын файлын core.o.

Эндээс гарч ирсэн шинэ командын мөр нь бидний тодорхой тохиолдолд тохирох болно.

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

Тэгээд үүнийг эмхэтгэсэн.

Алхам 9: Хөтөлбөрийг холбох

Өгүүллийн жишээнээс бид дараахь зүйлийг олж мэдэв.

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

Дээрх зүйлсийн ихэнхийг та харж байсан. Шинэ зүйлүүдийг доор харуулав.

онцлог = nosys.specs

Үүнийг тайлбарлахад жаахан төвөгтэй юм.

Энэ нь "semihosting" ба "retargeting" -тэй холбоотой бөгөөд энэ нь оролт / гаралттай холбоотой юм. Энэ нь системийн дуудлага, номын сантай бас холбоотой.

Ихэвчлэн суулгагдсан систем нь стандарт оролт/гаралтын төхөөрөмжөөр хангадаггүй. Энэ нь систем эсвэл номын сангийн дуудлагад нөлөөлөх болно (жишээ нь: printf ()).

Semihosting гэдэг нь дибаг хийгч (улаан дугуйлсан дибаг хийх хэсэг бүхий 11 -р зургийг үзнэ үү) тусгай сувагтай бөгөөд semihosting протоколыг ашигладаг бөгөөд та хост машин дээрх printf () гаралтыг харах боломжтой (дибаг хийгчээр дамжуулан).

Нөгөө талаар дахин төлөвлөлт хийх нь ижил систем эсвэл номын сангийн дуудлага нь өөр утгатай гэсэн үг юм. Тэд суулгасан системийн хувьд утга учиртай өөр зүйл хийдэг. Нэг утгаараа printf () -ийн хувьд шинэ функц байна, энэ функцийг дахин төлөвлөсөн гэж хэлье.

Энэ бүгдийг хэлээд, --specs = nosys.specs гэдэг нь бид хагас дамжуулахгүй гэсэн үг юм. Энэ нь ихэвчлэн бид дахин төлөвлөж байна гэсэн үг юм. Энэ нь биднийг дараагийн туг руу авчирна.

нотлиб

Холбогч -nostdlib сонголтыг дангаар нь ажиллуулах зориулалттай програмыг холбоход ашигладаг. -nostdlib нь тус тусдаа сонголтуудыг илэрхийлдэг -nodefaultlibs ба -nostartfiles. Доороос бид хоёр сонголтыг тусад нь хэлэлцдэг боловч хамгийн түгээмэл хэрэглээ бол нэг цэгийн дэлгүүрт nostdlib хийх явдал юм. Хөтөлбөрийг холбоход libc гэх мэт стандарт системийн номын санг анхдагчаар холбож өгдөг бөгөөд програмд бүх стандарт функцүүдэд хандах боломжийг олгодог (printf, стрлен ба найзууд). Холбогчийн сонголт -nodefaultlibs нь эдгээр үндсэн номын сантай холбогдохыг идэвхгүй болгодог; холбосон цорын ганц номын сан бол -l туг ашиглан холбогчдод таны нэрлэсэн номын сангууд юм.

lgcc

libgcc.a бол тодорхой машинуудын дутагдлыг арилгах дотоод дэд програмуудыг өгдөг стандарт номын сан юм. Жишээлбэл, ARM процессор нь хуваах зааврыг агуулдаггүй. Libgcc.a -ийн ARM хувилбар нь хуваагдлын функцийг агуулдаг бөгөөд хөрвүүлэгч нь шаардлагатай бол тухайн функц руу дуудлага өгдөг.

Т

Энэ бол холбогчдод энэ файлыг холбогч скрипт болгон ашиглахыг хэлэх нэг арга юм. Манай тохиолдолд файлын нэр нь linker.script.ld юм.

гол нь өөрөө

Эцэст нь хэлэхэд, манай төхөөрөмжид шатах/анивчих эцсийн гаралтын зургийн файлын нэр юу болохыг холбогчдод хэлье.

Бидний тодорхой нөхцөл байдалд тохируулан өөрчлөгдсөн командын шугамын манай хувилбар энд байна.

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

Скрипт файл болон core.o файл хоёулаа нэг директор дотор байгаа эсэхийг шалгаарай, бид дээрх тушаалын мөрийг ажиллуулна.

Мөн энэ нь ямар ч асуудалгүйгээр холбогддог.

Чек

Дараа нь бид гүйдэг:

arm-none-eabi-nm main.elf

мөн бид авах болно:

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

Сайхан харагдаж байна. Arm-none-eabi-nm тушаал нь объект файл доторх тэмдгүүдийг жагсаах арга юм.

Алхам 10: STM32 Nucleo-64-тэй холболт хийх

STM32 Nucleo-64-тэй холболт хийх
STM32 Nucleo-64-тэй холболт хийх
STM32 Nucleo-64-тэй холболт хийх
STM32 Nucleo-64-тэй холболт хийх

Таны хүлээж авахаар шийдсэн бол таны анхны эрхэм зорилго бол өөрийн системийг хөгжлийн самбараа харах явдал юм.

Windows ашиглаж байна

Windows -ийн хувьд би TrueSTUDIO -ийг Atollic (үнэгүй хувилбар) -аас суулгахаар шийдсэн. Энэ бол өвдөлтгүй суурилуулалт байсан бөгөөд драйверийг автоматаар суулгасан тул би холболтыг туршихын тулд st-link ашиглаж болно. TrueSTUDIO -г суулгасны дараа төхөөрөмжийн менежер төхөөрөмжийг хараад би дагаж байсан Bare Metal нийтлэлээс санал болгосон texan/stlink хэрэгслүүдийг татаж авлаа. Би дахин фолдерыг "C: \" доор байрлуулж, өөрийн cygwin гэрийн хогийн савнаас командыг дахин холбоос үүсгэв.

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

Бид төхөөрөмжтэй үнэхээр харилцаж чадах эсэхийг шалгах анхны туршилтын хувьд би гүйсэн:

st-info-шалгалт

Тэгээд эргэж ирэв:

1 stlink програмист олсон

Тиймээс одоо бид хөгжлийн самбараа ярьж/асууж болно гэдгээ мэдэж байна.

Линукс ашиглаж байна

Линуксийн хувьд танд драйвер үнэхээр хэрэггүй. Гэхдээ Debian -ийн хувьд та st хэрэгслүүдийг эх сурвалжаас бүтээх хэрэгтэй болно.

git clone

Libusb-1.0-0-dev суулгасан эсэхээ шалгаарай.

тохиромжтой жагсаалт | grep -E "*libusb.*dev*"

Та харах ёстой:

libusb-1.0-0-dev/xenial, одоо 2: 1.0.20-1 amd64 [суулгасан]

эсвэл үүнтэй төстэй зүйл.

Үүнийг суулгахын тулд:

sudo apt-get libusb-1.0-0-dev суулгах

Дээрх нь дараахтай адил биш гэдгийг анхаарна уу.

sudo apt-get libusb-dev суулгах

Зөв алга болсон libusb dev нь cmake -д асуудал үүсгэж болзошгүй юм.

CMake Error: Дараах хувьсагчдыг энэ төсөлд ашиглаж байгаа боловч тэдгээрийг NOTFOUND гэж тохируулсан байна. Тэдгээрийг тохируулаарай эсвэл CMake файлууд дээр зөв тохируулагдсан эсэхийг шалгана уу: LIBUSB_INCLUDE_DIR (ADVANCED)

Төслийн үндсэн лавлах руу шилжих (… blah /blah /stlink). "Суллах" хийх.

Үүний дараа хэрэгслүүд нь ".. /build /Release" гэсэн хэсэгт байх ёстой.

Та дараа нь "st-info --probe" ажиллуулж болно. Nucleo холбогдсон гаралт энд байна, гэхдээ үгүй.

devchu@chubox: ~/Development/stlink $./build/Release/st-info --probeFound 1 stlink programmers serial: 303636414646353034393535363537 openocd: "\ x30 / x36 / x36 / x41 / x46 / x46 / x35 / x30 / x34 / x39 / x35 / x35 / x36 / x35 / x37 "flash: 524288 (хуудасны хэмжээ: 2048) sram: 65536 chipid: 0x0446 descr: F303 өндөр нягтралтай төхөөрөмж devchu@chubox: ~/Development/stlink $./build/Release/st- info --probe Олдлоо 0 stlink програмист devchu@chubox: ~/Development/stlink $

Алхам 11: Linux -тэй GDB -ийг ашиглацгаая

GDB -ийг Linux -тэй хамт ашиглацгаая
GDB -ийг Linux -тэй хамт ашиглацгаая
GDB -ийг Linux -тэй хамт ашиглацгаая
GDB -ийг Linux -тэй хамт ашиглацгаая

Хэрэв та энэ бүхнийг туршиж үзсэн бөгөөд өдий зэрэгтэй явсан бол гайхалтай! Маш сайн. Одоо жаахан хөгжилтэй байцгаая.

Та эдгээр ARM хөгжлийн самбарыг худалдаж авахдаа MSP432 Launchpad of Texas Instruments, эсвэл бидний одоо хэлэлцэж буй Nucleo-F303 (STM32 Nucleo-64) програмыг ажиллуулж байгаа програмтай хамт ирдэг. LED анивчих хурдыг өөрчлөхийн тулд унтраалгыг дарах зэрэг анивчдаг програм.

Үүнийг хэт хурдан бичихийн өмнө юу хийх, юу хийх хэрэгтэйг харцгаая.

Линукс дээр терминал нээж, бидний шинээр байгуулсан stlink git төслийн лавлахыг өөрчилж, st-util хэрэгслийг олоорой.

devchu@chubox: ~/Development/stlink $ find. -st-util нэр

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

Энэ хэрэгслийг ажиллуулна уу. Өмнө нь бид st-info --probe-тай холболтоо аль хэдийн туршиж үзсэн тул бид дараах үр дүнг авах ёстой.

devchu@chubox: ~/Хөгжүүлэлт/stlink $./build/Release/src/gdbserver/st-util

st-util 1.4.0-50-g7fafee2 2018-10-20T18: 33: 23 INFO common.c: Төхөөрөмжийн параметрүүдийг ачаалж байна…. 2018-10-20T18: 33: 23 INFO common.c: Холбогдсон төхөөрөмж нь: өндөр нягтралтай F303 төхөөрөмж, id 0x10036446 2018-10-20T18: 33: 23 INFO нийтлэг.c: SRAM хэмжээ: 0x10000 байт (64 KiB), Flash: 2048 байтын хуудсан дахь 0x80000 байт (512 KiB) 2018-10-20T18: 33: 23 INFO gdb-server.c: Chip ID нь 00000446, Core ID нь 2ba01477. 2018-10-20T18: 33: 23 INFO gdb-server.c: *: 4242 дээр сонсож байна …

Энэ бол одоо ажиллаж байгаа GDB сервер бөгөөд бидний хөгжлийн самбарыг хардаг бөгөөд хамгийн чухал нь 4242 порт (үндсэн порт) дээр сонсдог.

Одоо бид GDB үйлчлүүлэгчийг халахад бэлэн байна.

Линукс дээр өөр терминал нээгээд үүнийг оруулна уу.

arm-none-eabi-gdb -tui

Энэ нь gdb тушаалын мөрийг ажиллуулахтай яг ижил боловч текст дээр суурилсан терминал гаргадаг (миний таамаглаж байгаагаар энэ нь хараал хэрэглэдэг).

Бид GDB клиент болон GDB сервер ажиллаж байна. Гэсэн хэдий ч үйлчлүүлэгч сервертэй холбогдоогүй байна. Одоогийн байдлаар манай Nucleo (эсвэл таны сонгосон зөвлөл) талаар юу ч мэдэхгүй байна. Бид үүнийг хэлэх ёстой. Терминал дээр таны хүлээх мөр одоо "(gdb)" байх ёстой. Оруулах:

туслах зорилтот

Энэ нь танд жагсаалт өгөх болно. Бидний хүсч буй өргөтгөсөн алсын удирдлагатай болохыг анхаарна уу - Алсын компьютерийг цуваа шугамаар ашиглаарай.

Гэхдээ бид мөн байршлыг нь өгөх ёстой. Тиймээс, (gdb) хүлээх мөрөнд оруулна уу:

(gdb) зорилтот өргөтгөсөн алслагдсан localhost: 4242

Та иймэрхүү хариултыг буцааж авах ёстой.

(gdb) зорилтот өргөтгөсөн алслагдсан localhost: 4242

Localhost ашиглан алсын дибаг хийх: 4242 0x080028e4 in ?? ()

Үүний зэрэгцээ, st-util gdbserver ажиллаж байгаа терминал дээр бид дараахь зүйлийг олж авлаа.

2018-10-20T18: 42: 30 INFO gdb-server.c: 6 hw таслах цэгийн бүртгэлийг оллоо

2018-10-20T18: 42: 30 INFO gdb-server.c: GDB холбогдсон.

Алхам 12: Windows, Flash програмаа давтаж хийцгээе

Windows, Flash програмаа ашиглан давтаж үзье
Windows, Flash програмаа ашиглан давтаж үзье
Windows, Flash програмаа ашиглан давтаж үзье
Windows, Flash програмаа ашиглан давтаж үзье
Windows, Flash програмаа ашиглан давтаж үзье
Windows, Flash програмаа ашиглан давтаж үзье

St-util gdbserver болон arm-none-eabi-gdb клиентийг ажиллуулах алхамууд нь өмнөх алхам дээр хийсэнтэй ижил байна. Та хоёр терминал (cygwin, DOS cmd эсвэл Windows Powershell) нээж, st-util-ийн байршлыг олж, ажиллуулна уу. Нөгөө терминал дээр arm-none-eabi-gdb клиентийг ажиллуулна уу. Цорын ганц ялгаа нь -tui (терминал дээр суурилсан текст харах) горимыг дэмждэггүй.

Хэрэв дээр дурдсан зүйлс Windows дээр ажилласан бол та зөвхөн үйлчлүүлэгчийг зогсоох хэрэгтэй болно. Энэ үед та ямар нэгэн байдлаар GDB клиентийг өөрийн бүтээсэн файлыг ажиллуулах хэрэгтэй ("core.out"), эсвэл GDB клиентэд аргумент болгон тэр файлын замыг бүхэлд нь нэмэх хэрэгтэй болно.

Би cygwin -ийг ашиглан өөрийн орон нутгийн $ HOME // bin директороос эдгээр хэрэгслүүдийн аль аль нь байрладаг линкийг үүсгэснээр амьдралаа хялбаршуулсан.

За, бид өмнөх шигээ эмхэтгэж, холбосон бөгөөд main.elf файлыг нээхэд бэлэн боллоо.

Бид нэг цонхонд ажилладаг st-util програмтай. Бид GDB үйлчлүүлэгчийг дахин эхлүүлж байгаа бөгөөд энэ удаад бид:

arm-none-eabi-gdb main.elf

Бид үүнийг эхлүүлэхийг зөвшөөрч, (gdb) хүлээхийг хүлээнэ үү, GDB сервертэй ижил холболтын командыг хийнэ үү (st-util), бид гүйцэтгэгдэх файлыг асаахад бэлэн байна. Энэ нь цаг уурын эсрэг маш сайн:

(gdb) ачаалал

Cygwin терминалуудтай ажилладаг тул зарим тохиолдолд консолын команд гардаггүй. Тиймээс манай тохиолдолд сервер ажиллаж байгаа цонх бүрэн чимээгүй байв. Ачааллыг ажиллуулсан үйлчлүүлэгчийг ажиллуулж байгаа хүн үүнийг гаргадаг:

Хэсэг ачаалж байна. Текст, хэмжээ 0x1c lma 0x8000000 Эхлэх хаяг 0x8000000, ачааллын хэмжээ 28 Шилжүүлгийн хурд: 1 КБ/сек, 28 байт/бичих.

Алхам 13: Линукс ашиглан гялалзах - Илүү их шагнал: Д

Линукс ашиглан гялалзах - Илүү их шагнал: Д
Линукс ашиглан гялалзах - Илүү их шагнал: Д

Алхам 14: Бяцхан гүн рүү шумбъя

Хэрэв та энд ирсэн бол маш сайн. Цааш үргэлжлүүлье.

Main.elf файлын доторх гүйцэтгэгддэг файлыг яагаад харж болохгүй гэж? Дараахыг ажиллуулна уу.

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

Та иймэрхүү гаралтыг харах ёстой:

main.elf: файлын формат elf32-littlearm

Хэсгийг задлах. Текст:

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 нь r0, #1 8000012: e7fd b.n 8000010 8000014: 20014000.word 0x20014000 8000018: deadbeef.word 0xdeadbeef нэмнэ.

Дээрх гарцнаас бид ямар жижиг зоос авч болох вэ?

Хэрэв та linker.script.ld файлыг хэлэлцэж, үүсгэх үед та санаж байгаа бол эдгээр ARM төхөөрөмжүүд нь RAM -тай 0x20000000 -аас эхэлж, FLASH санах ой нь 0x08000000 -аас эхэлдэг гэж мэдэгдсэн.

Тиймээс, энэ програм нь бүгд FLASH санах ойд байрладаг болохыг бид харж байна.

Дараа нь дээр, гэхдээ хожим нь "Сайн уу ертөнц" хэсгийг хэлэлцэж байх үед бид MCU -ийн үндсэн бүртгэлд ("R7") шууд, тогтмол, шууд утгыг ("0xDEADBEEF") ачаалдаг гэсэн мэдэгдэл байсан.

Мэдэгдэл нь:

LDR R7, = 0xDEADBEEF

Манай кодын хувьд энэ бол DEADBEEF -ийг дурдсан цорын ганц газар юм. Өөр хаана ч байхгүй. Гэсэн хэдий ч хэрэв та дээрх задалсан/сэргээн засварласан зааварчилгаа гэх мэтийг харвал DEADBEEF -тэй бидний бодож байснаас хамаагүй олон зүйл бий.

Тиймээс хөрвүүлэгч/холбогч ямар нэгэн байдлаар DEADBEEF -ийн утгыг 0x8000018 байршилд FLASH хаяг руу бүрмөсөн асаахаар шийдсэн. Тэгээд хөрвүүлэгч нь бидний дээрх LDR зааврыг дараах байдлаар өөрчилсөн.

LDR R7, [PC, #8]

Тэр ч байтугай бидэнд тайлбар хийсэн. Ямар сайхан юм бэ. Мөн энэ нь одоо байгаа програмын тоолуурын утгыг (PC бүртгэл) аваад 0x8 -ийг энэ утга дээр нэмэхийг хэлдэг бөгөөд эндээс DEADBEEF шатсан бөгөөд энэ утгыг аваад R7 дээр бөглөнө үү.

Энэ нь програмын тоолуур (PC) нь main_loop -ийн эхлэл болох 0x8000010 хаягийг зааж өгсөн бөгөөд DEADBEEF утга нь main_loop дууссаны дараа хоёр хаяг дээр байрладаг гэсэн үг юм.

Алхам 15: Эцэст нь хөтөлбөрийн явцын товч танилцуулга

Та GDB-ээс гарсан ч гэсэн командыг дахин оруулна уу. Та түүнд ямар ч файл өгөх шаардлагагүй; Бид одоо анивчихгүй, зүгээр л ажиллуулж байна.

GDB клиентийг GDB сервер рүү дахин холбосны дараа (gdb) командын мөрөнд:

(gdb) мэдээллийн бүртгэл

Та иймэрхүү зүйлийг харах ёстой:

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 0xffffff000 42949672900 cfs

Гэхдээ дараа нь (gdb) хүлээх мөрөнд оруулна уу:

(gdb) үргэлжлүүлнэ үү

Тэгээд маш хурдан CTRL-C дарна уу. Энэ нь хөтөлбөрийг түр зогсоох ёстой. "Мэдээллийн бүртгэл" командыг дахин оруулна уу.

Энэ удаад арай өөр харагдаж байна:

(gdb) мэдээллийн бүртгэл

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 0x00 0x00 0x12 0x1200x1200 16777216

Юу болсон бэ? Яг бидний хүссэн зүйл. DEADBEEF -ийг R7 -д ачаалж, R0 -ийг (маш хурдан) нэмэгдүүлж байна. Хэрэв та давтан хэлвэл өөр утгатай R0 -ийг дахин харах болно.

Алхам 16: Бид Flash дээр зөвхөн уншигдах массив үүсгэхийг хүссэн

Ассемблей ба удирдамжийг ашиглан массивын эквивалент үүсгэх нэг арга бол дараах байдалтай байна.

.type myarray, %object // 'myarray' нэр эсвэл шошгыг объектын төрөл гэж тодорхойлдог.

myarray: // энэ бол 'myarray' тунхаглалын эхлэл // (энэ нь юунаас бүрдэх вэ)..word 0x11111111 // 'myarray' дотор орсон анхны гишүүн эсвэл утга..word 0x22222222 // хоёр дахь утга (зэргэлдээх хаягууд)..word 0x33333333 // гэх мэт..size myarray,.-myarray // хөрвүүлэгч/угсрагч одоо 'myarray' -ийн төгсгөл эсвэл // хил хязгаарыг мэддэг болсон.

Одоо бид үүнийг FLASH санах ойд суулгасан тул үүнийг програмд ашиглаж болно. Доорх хэсэг нь:

LDR R1, myarray // энэ нь 'myarray' -ийн 1 -р байршилд байгаа өгөгдлийг ачаална. ' // энэ бол бидний хүссэн зүйл биш.

LDR R1, = myarray // энэ нь байршлын утгыг өөрөө ачаалдаг (1 -р хаяг), // өгөгдөл биш.. // энэ бол бидний хүсч буй зүйл юм.

MOV R2, #0 // R2 нь биднийг орхихгүйн тулд тоолох болно

// массивын төгсгөл. LDR R3, = myarrsize // R3 нь 'myarrsize' -тай тэнцэх болно.

// R0 нь бидний өгөгдлийг хадгалах болно

main_loop:

LDR R0, [R1] // R1 ('myarray') зааж өгсөн өгөгдлийг R0 руу ачаална уу. CMP R2, R3 // Бид массивын хязгаарт байна уу? BEQ main_loop // Хэрэв тийм бол бид дууссан тул үүрд мөнхөд эргэх болно.

ADD R2, #1 // Үгүй бол бид массиваар дамжуулалтыг үргэлжлүүлж болно.

ADD R1, #4 // R1 -ийг бүртгүүлэхийн тулд 4 -ийг нэмснээр дараагийнхыг зөв зааж өгнө

// хаяг..

B main_loop // Буцах гогцоо.

Видео энэ бүхнийг даван туулж, дотор нь алдаа байна. Энэ сайн; Энэ нь ажиллуулах, дибаг хийх код чухал болохыг харуулж байна. Энэ нь массивын төгсгөлөөс гарах сонгодог тохиолдлыг харуулж байна.

Зөвлөмж болгож буй: