Pengembangan Firmware: Pendahuluan

Halo, Habr! Saya hadir untuk Anda terjemahan artikel oleh Chris Svec, aslinya ada di sini . Diterbitkan dengan izin penulis di bawah lisensi CC-A-NC-ND .

Rekayasa perangkat lunak tertanam 101: pengantar


Saya meluncurkan serangkaian tutorial tentang pengembangan firmware. Kami akan mulai dengan menjelaskan mikrokontroler sederhana, dan setelah Anda memahami cara kerjanya, kami akan mengembangkannya untuk memahami cara kerjanya berkenaan dengan sistem yang kompleks seperti Fitbit atau Nest.
Saya menyebut seri ini Embedded Software Engineering 101, dan mulai minggu ini di sini di blog ini.

Baca terus untuk penjelasan dan perincian lebih lanjut.


Beberapa blok bangunan di blok bangunan lain.

Saya telah bekerja dengan sistem tertanam dan mengembangkan microchip selama lebih dari 14 tahun. Saya suka embedded system - perangkat keras, perangkat lunak, dan batasan yang mengikatnya.
Elektronik dan ide-ide amatir seperti Arduino , Adafruit dan Sparkfun memungkinkan untuk dengan mudah membuang sesuatu dari perangkat keras dan perangkat lunak selama akhir pekan (atau sebulan, atau satu semester), menciptakan sesuatu yang baru, menarik dan bahkan dapat berguna.

Itu bagus! Memberi orang kesempatan untuk menciptakan adalah hal yang luar biasa; jika saya ingin mengekspresikan diri saya dengan keras, saya akan dengan aspirasi menyebutnya "teknologi demokratisasi."

Sebagian besar proyek amatir adalah satu kali. Anda mengumpulkan sesuatu, menjadikannya sebaik Anda punya cukup waktu atau energi, dan melanjutkan.
Saya menghabiskan karir saya di ujung yang berlawanan dari spektrum - menciptakan produk yang ratusan ribu atau jutaan salinan - dan ini membutuhkan cara berpikir yang sangat berbeda dan pendekatan sistematis.

Saya ingin mengajari orang cara menulis firmware untuk sistem semacam ini. Saya telah lama memelihara ide ini untuk kursus / panduan / buku / blog Rekayasa Perangkat Lunak Embedded 101, dan berkat blog Embedded.fm, saya mulai menerapkannya sekarang.

Saya adalah tipe orang yang mendasar, jadi rencana saya adalah memulai dengan dasar-dasar, dengan deskripsi sederhana tentang mikroprosesor sederhana, dan mengembangkan fondasi ini hingga Anda memahami bagaimana sistem tertanam yang relatif kompleks bekerja.

Tujuan saya adalah bahwa pada akhir siklus ini Anda dapat mengetahui cara kerja Fitbit, termostat Nest, atau sistem tertanam serupa. Anda dapat mulai bekerja dengan sistem perangkat lunak tertanam menggunakan pengalaman profesional.

Rekayasa Perangkat Lunak Tertanam 101 dirancang untuk:

  1. Lulusan universitas di bidang ilmu komputer, teknik komputer atau elektronik, tertarik pada sistem embedded.
  2. Penggemar elektronik amatir yang ingin lebih memahami bagaimana sistem mereka bekerja pada Arduino, dan mencari tahu bagaimana mereka bergerak (dan apakah itu perlu!).
  3. , , .
  4. , , -.

Apa yang saya maksud dengan mengatakan bahwa saya adalah "orang yang tipe fundamental"? Richard Feynman , ahli fisika pemenang Hadiah Nobel dan pendongeng yang sangat baik, mengatakannya dengan cara terbaik: "Apa yang tidak bisa saya buat ulang, saya tidak mengerti."

Jadi, saya bukan Feynman, tetapi saya yakin bahwa cara terbaik untuk memahami sistem adalah memulai dengan dasar-dasarnya. Berbekal pemahaman ini, Anda dapat membuat sistem tertanam sederhana dengan perangkat lunak sederhana. Dan setelah memahami pada awalnya program yang sangat sederhana, Anda dapat mengembangkannya dengan membuat perangkat lunak yang lebih kompleks seiring dengan meningkatnya pengalaman.

Dasar-dasar di tempat pertama - ini tentu saja hanya keyakinan pribadi saya. Banyak orang membuat hal-hal berguna dengan Arduino tanpa memahami dasar-dasarnya. Seri artikel ini adalah untuk mereka yang masih ingin memahami dasar-dasar dan segala sesuatu yang dibangun di atasnya.

Tentu saja, kita harus bertanya pada diri sendiri - di mana level yang tepat untuk memulai dengan "dasar" yang sangat ini? Transistor dan gerbang logika? Tidak, ini terlalu rendah untuk memulai dengan firmware. Terhubung ke sensor umum? Tidak, ini level yang terlalu tinggi, butuh terlalu banyak pengetahuan untuk memulai dengan ini.

Saya pikir level dasar yang tepat adalah mikroprosesor bawaan. Tidak perlu memahami fisika atau elektronik untuk menggunakan mikroprosesor bawaan, juga tidak perlu menjadi ahli dalam pemrograman.

Jadi disinilah kita akan mulai pada artikel selanjutnya.

Peringatan Prasangka: Dalam kehidupan sebelumnya, saya adalah seorang arsitek / pengembang prosesor. Memulai siklus ini dengan memahami cara kerja CPU mungkin bukan cara terbaik untuk memahami sistem tertanam, tetapi itulah cara otak saya bekerja. Pastikan untuk mencoba kursus / manual lain, dll., Jika Anda tidak mengerti ini setelah beberapa artikel.

Rekayasa perangkat lunak tertanam 101: dasar-dasar mikrokontroler


Kita akan memulai perjalanan Embedded Software Egineering 101 dengan mikrokontroler sederhana. Sebuah mikrokontroler (atau mikroprosesor) adalah blok bangunan utama dari semua sistem komputasi, tertanam dan lain-lain.

MK tampaknya agak rumit, tetapi terdiri dari tiga hal sederhana: instruksi, register, dan memori. Instruksi adalah hal-hal yang mikrokontroler tahu bagaimana melakukan. Sebuah MK sederhana mampu melakukan tidak terlalu banyak - ia dapat memiliki, misalnya, 20 atau 30 instruksi. Kemudian dalam siklus ini saya akan menggunakan mikrokontroler MSP430 dari Texas Instruments, yang hanya memiliki 27 instruksi.


Hanya foto MK (TI MSP430F5529)

27 instruksi ini adalah satu-satunya hal yang dapat dilakukan MSP430. Dia dapat menambahkan dua angka, mengurangi yang lain dari satu angka, memindahkan angka dari satu tempat ke tempat lain, atau melakukan 24 operasi sederhana lainnya. 27 operasi mungkin tampaknya tidak cukup untuk melakukan sesuatu yang bermanfaat, tetapi dalam kenyataannya mereka akan cukup berlebih untuk melaksanakan program yang mungkin.

Nah, itu berarti mikrokontroler memiliki instruksi yang melakukan sesuatu dengan angka. Tapi di mana angka-angka ini? Daftar dan memori! Instruksi beroperasi dengan nomor yang disimpan dalam register dan memori.

Register adalah repositori yang sangat cepat berisi angka yang beroperasi berdasarkan instruksi. Anda dapat menganggapnya sebagai notepad yang digunakan oleh instruksi. MK mengandung beberapa register, biasanya 8-32. Misalnya, MSP430 memiliki 16 register.

Memori juga penyimpanan untuk angka-angka, tetapi jauh lebih besar dan lebih lambat dari register. Mikrokontroler dapat memiliki 64 kB, 256 kB atau bahkan lebih dari 1 MB memori. MSP430F5529 memiliki memori sekitar 128 kB; ini lebih dari 8.000 kali jumlah registernya!

Sebelum kita mulai melihat contoh-contoh, saya mendorong Anda untuk mengambil selembar kertas dan pena atau pensil dan mempelajari contoh-contoh ini ketika Anda membaca. Lebih sulit mempelajarinya di atas kertas daripada hanya membaca apa yang saya tulis. Dengan demikian, Anda akan dengan cermat mendekati prosesnya, dan kemungkinan menghafal yang dipelajari akan lebih tinggi.

Mari kita lihat contoh fiktif, tetapi khas dari mikrokontroler.

Katakanlah MK kami memiliki 4 register dan 8 sel memori. Register biasanya dipanggil secara kreatif, misalnya, "R0", "R1", dll., Dan kami akan melakukan hal yang sama. Sel-sel memori biasanya dirujuk oleh angka-angka mereka, juga disebut alamat memori, mulai dari penomoran 0. Beginilah tampilan register dan memori kita:



Dan sekarang saya akan menaruh beberapa nilai di dalamnya:



Sekarang mikrokontroler fiktif kita memerlukan beberapa instruksi.
Serangkaian instruksi yang diketahui MK disebut set instruksinya. Katakanlah dalam set akan ada tiga instruksi: ADD (tambah), SUB (kependekan dari "kurangi" - kurangi) dan MOVE (pindah). Instruksi harus mendapatkan angka dari mana mereka beroperasi dari suatu tempat, dan juga meletakkan hasilnya di suatu tempat, sehingga beberapa dari mereka berisi informasi tentang di mana data input dan output berada.

Misalnya, biarkan instruksi ADD kami memiliki dua sumber dan satu penerima data, dan semuanya harus register. Manual dapat menggambarkan instruksi ini seperti ini:
ADD register, regPrm
Instruksi ADD menambahkan nilai register regGist ke nilai register regPrm dan menyimpan hasilnya di register regPrm
Ringkasan: regPrm = regGist + regPrm
Contoh: ADD R1, R2 melakukan operasi R2 = R1 + R2
Secara umum diterima dalam instruksi untuk menggunakan salah satu sumber juga sebagai penerima, seperti instruksi ADD, menggunakan regPrm sebagai sumber dan penerima data.

"ADD R1, R2" adalah bahasa assembler untuk mikrokontroler, ini adalah bahasa pemrograman asli MK.

Mari kita mendefinisikan SUB dengan gaya yang sama:
SUB regist, regrpm
Instruksi SUB mengurangi nilai register register dari nilai register regprm dan menyimpan hasilnya dalam register regprm
Ringkasan: regPrm = regPrm - reggist
Contoh: SUB R3, R0 melakukan operasi R0 = R0 - R3
Akhirnya, biarkan instruksi MOVE memiliki satu sumber dan satu penerima, dan:

  • kedua argumen itu adalah register
  • satu adalah register dan satu adalah lokasi memori.

Panduan set instruksi akan membaca:
1. MOVE register, register
2. MOVE register, reg
3. register MOVE, rem
Instruksi MOVE menyalin data dari argumen Timur ke argumen Prm.
Ringkasan: Ada tiga jenis instruksi MOVE
1. regPrm = regist
2.regPm = memist
3. memPm = reg
Contoh: Saya akan menunjukkan contoh instruksi MOVE nanti di postingan ini.
Satu catatan tentang kata "pindah" yang digunakan untuk instruksi ini: sebagian besar set instruksi menggunakannya, meskipun dalam kenyataannya data disalin, tidak dipindahkan.

Nama "bergerak" mungkin memberi kesan bahwa sumber operand instruksi dihancurkan atau dihapus, tetapi pada kenyataannya itu tetap saja, hanya penerima yang dimodifikasi.
Mari kita telusuri beberapa contoh menggunakan mikrokontroler fiksi kami.
Pada awalnya, register dan memori kami terlihat seperti ini:



Sekarang kami menjalankan instruksi berikut pada MK:

ADD R1, R2

Dibutuhkan nilai R1, menambahkannya ke nilai R2, dan menyimpan hasilnya dalam R2. Prosesor menjalankan sebagian besar instruksi dalam satu operasi, tetapi saya akan membagi eksekusi setiap instruksi ADD, SUB, dan MOVE menjadi beberapa langkah dengan panah "=>" yang mengarah melalui penggantian (register / memori => nilai):

R2 = R1 + R2 =>
R2 = 37 + 100 =>
R2 = 137

Setelah menjalankan instruksi ini, memori tidak berubah, tetapi register sekarang terlihat sebagai berikut, dengan nilai yang diubah ditulis dengan warna merah:



Perhatikan bahwa R1 tidak berubah; hanya register penerima R2 yang telah berubah.
Selanjutnya mari kita coba pernyataan SUB:

SUB R3, R0

Dia mengambil nilai R3, mengurangi dari nilai R0, dan menyimpan hasilnya dalam R0:

R0 = R0 - R3 =>
R0 = 42 - 2 =>
R0 = 40

Setelah menjalankan instruksi ini, memori tidak berubah, tetapi register sekarang terlihat seperti ini:



Akhirnya, mari kita coba beberapa versi dari instruksi MOVE:

MOVE R2, R0

Instruksi MOVE ini menyalin nilai R2 ke R0:

R0 = R2 =>
R0 = 137

Dan sekarang register terlihat seperti ini:



Selanjutnya, kami menyalin register ke dalam memori:

MOVE R3, [3]

Instruksi MOVE ini menyalin R3 ke lokasi memori 3. Kurung kotak dalam set instruksi kami adalah sel memori.

[3] = R3 =>
[3] = 2

Register tidak berubah, tetapi memori berubah:



Dan untuk contoh terakhir kami, kami menyalin nilai dari memori untuk mendaftar:

MOVE [6], R0

Di sini, nilai sel memori 6 disalin ke register R0:

R0 = [6] =>
R0 = 1

Memori tidak dapat diubah, dan register sekarang terlihat seperti ini:



Percaya atau tidak, tetapi jika Anda memahami sebagian besar dari apa yang baru saja kita bahas tentang instruksi, register, dan memori, maka Anda memahami dasar-dasar mikrokontroler dan bahasa rakitan.

Tentu saja saya telah menghilangkan banyak detail. Misalnya, bagaimana MK mendapat instruksi untuk dieksekusi?

Apakah ada instruksi yang lebih menarik dari sekadar matematika dan instruksi salin? Apakah memori sama dengan RAM atau flash, atau tidak?

Kami akan menjawab pertanyaan-pertanyaan ini di artikel selanjutnya.

All Articles