Apakah setiap baris mikrokontroler memiliki bahasa / sintaksis pemrograman sendiri?

10

Saya sudah memprogram Arduino dan sudah mulai memprogram Teensy. Mereka mirip dengan C tetapi ada sedikit nuansa dalam bahasa pemrograman.

Misalnya, dalam Arduino C Anda memanggil fungsi pinMode (pin #, Output / Input) untuk menunjuk pin digital baik untuk sinyal output atau menerima sinyal. Dalam Teensy's C, Anda mengatur register "DDR" yang terkait dengan salah satu dari empat port (masing-masing mewakili koleksi pin) yang Anda tunjuk secara kolektif sebagai input atau output ( sintaksis Teensy IO ).

Saya ingin tahu apakah itu kasus ketika Anda menggunakan mikrokontroler yang baru bagi Anda, Anda perlu secara efektif mempelajari "bahasa" baru. Saya menempatkan kata "bahasa" dalam tanda kutip karena meskipun ada nuansa dalam sintaksis, komponen dan bagaimana mereka diatur dalam perangkat lunak secara fundamental setara misalnya, pengertian port dan pin masih merujuk ke terminal dari mana Anda dapat output / input digital sinyal.

Dalam wacana yang sama sia-sia: apakah ada mikrokontroler yang tidak diprogram dalam perangkat lunak atau akan selalu ada lapisan perangkat lunak yang digunakan untuk memprogram uController? Jika yang terakhir, siapa yang menulis / memberikan dokumentasi untuk mereka?

Minh Tran
sumber
2
Bahasa pemrograman untuk Arduino adalah C ++ (bukan (hanya) C) - atau mungkin hanya sebagian dari C ++ (atau bahkan Pemrosesan ). Tidak sepenuhnya jelas, tetapi jelas lebih dari C; misalnya memiliki kelas dan operator yang dapat ditentukan pengguna + = .
Peter Mortensen
1
Ini adalah C ++, kompilasi menggunakan g ++ - avr. Secara teknis ini akan menjadi implementasi C ++ yang berdiri sendiri, dan itu tidak termasuk perpustakaan standar C ++ (karena hal-hal seperti alokasi memori dinamis dan pengecualian yang diperlukan). Anda dapat menggunakan fitur bahasa seperti kelas dan templat, saya telah melihat pengganti digitalWrite () berbasis templat yang mencapai kinerja yang sama dengan mengakses register secara langsung, metode Arduino memiliki biaya overhead yang cukup besar.
r_ahlskog
1
Bahasanya sama. Itu API yang berbeda. Jika Anda menjauh dari mikrokontroler dan mulai menulis aplikasi desktop, Anda akan menghadapi masalah yang persis sama saat menulis program C untuk Windows, Linux dan Mac. Bahkan jika Anda menggunakan API POSIX murni (yang didukung oleh ketiga platform), Anda masih akan menemukan perbedaan spesifik platform saat Anda ingin menyimpan pengaturan / preferensi pengguna.
Slebetman

Jawaban:

3

Mikroprosesor dan Mikrokontroler biasanya akan menggunakan arsitektur bersama antara lini produk dan pabrikan yang berbeda. Arsitektur ini biasanya mendefinisikan set perintah tingkat rendah ( set instruksi ) yang umum untuk semua implementasi. Kompiler AC atau C ++ akan dapat menghasilkan bytecode yang dapat dieksekusi pada semua prosesor ARM misalnya.

Namun, arsitekturnya hanya setengah dari gambar. Karena ada banyak alamat memori tertentu, di papan periferal, manajemen memori dan detail implementasi lainnya yang arsitekturnya tidak alamat

Pabrikan atau pihak ketiga biasanya akan menyediakan koleksi file sumber ( HDK ) yang akan memberikan definisi, pemetaan port, dan contoh kode. Biasanya HDK adalah untuk C dan C ++ . Biasanya HDK akan memiliki papan demonstrasi yang terkait dengannya (pikirkan $ 500 Arduino). Banyak pekerjaan konfigurasi terperinci seringkali diperlukan untuk menyesuaikan platform pengembangan / sampel dengan perangkat yang Anda desain

Arduino didasarkan pada arsitektur AVR dan terutama didukung oleh Atmel. Arduino telah membuat platform bootloader dan pustaka fungsi dan objek C ++ yang disederhanakan agar Anda dapat menggunakan platform dengan upaya minimal. Platform Arduino dan IDE dirancang untuk penggemar dengan peralatan minimal. Sebelum Arduino, PIC memenuhi peran serupa dengan lingkungan BASIC yang mudah digunakan dan murah.

Dalam lingkungan profesional biasanya dukungan ini diberikan oleh vendor / pabrikan atau dikontrakkan kepada pihak ketiga. Mereka memberikan kode tingkat rendah dan header dan Anda menulis aplikasi Anda dengan HDK itu, di organisasi yang lebih besar ini bisa dilakukan sendiri. Ada tren baru-baru ini bagi pabrikan untuk membangun ekosistem API / Perangkat Lunak terbuka di sekitar platform mereka yang menjadikannya mudah digunakan begitu saja seperti arduino. Masih ada banyak chip dengan dukungan pemrograman yang sangat sedikit, dan sebagian besar pengetahuan platform terkunci di dunia usaha.

crasic
sumber
14

Bahasa dalam kasus ini persis sama. Lingkungan Arduino memiliki beberapa pustaka tambahan (hanya lebih banyak kode C) yang 'membungkus' akses ke register perangkat keras yang sebenarnya (DDRx, PORTx, INx, dll.) Dengan fungsi yang sedikit lebih ramah pengguna. Ini meningkatkan overhead (instruksi lebih lanjut perlu dijalankan untuk operasi yang sama) tetapi meningkatkan fleksibilitas karena "sederhana" untuk menulis sebuah program yang hanya menggunakan panggilan ini, kemudian menargetkan ulang untuk chip yang berbeda (katakanlah, mega arduino) dan perpustakaan akan menangani pemetaan yang tepat secara internal.

Sebenarnya tidak ada API 'standar' untuk akses tingkat rendah yang sesungguhnya di seluruh chip dari vendor yang berbeda. Namun, semua akses tingkat rendah dilakukan dengan cara yang sama - membaca dan menulis ke alamat memori tetap - sehingga metode akses keseluruhan akan sama antara bagian yang berbeda, hanya detail dan nama akan berbeda. Mungkin orang hanya akan memberikan file header dengan daftar #defines register alamat yang sangat besar yang dilemparkan ke pointer. Atau mungkin file header akan menggunakan struktur untuk menjaga hal-hal terorganisir dengan sedikit hierarki. Beberapa produsen juga dapat menyediakan API tingkat lebih tinggi. Ini bisa sangat berguna untuk periferal yang kompleks dan sulit dikonfigurasikan. GPIO sangat sederhana, tetapi sesuatu seperti pengontrol USB dengan dukungan DMA dapat memiliki ratusan register.

Jadi intinya adalah ya, Anda perlu mempelajari beberapa nama register baru, tetapi bahasanya masih C ++ (atau C, assembly, atau mungkin sesuatu yang lebih esoteris).

alex.forencich
sumber
4
Arduino bukan hanya C (sebenarnya, C ++) - ia punya preprocessor yang membuat beberapa perubahan sebelum memasukkannya ke kompiler C.
Nick Johnson
Sebenarnya, untuk Arduino, lebih dari C. Ini adalah C ++ (atau mungkin bagian dari C ++).
Peter Mortensen
Apakah itu hanya C ++ asli dengan perpustakaan Arduino, atau sesuatu yang lebih?
kayleeFrye_onDeck
Arduino IDE tampaknya melakukan sedikit pra-pemrosesan tambahan selain C ++ standar. Sebagian besar IDE tidak melakukan ini.
alex.forencich
Ini pada dasarnya C ++ tetapi dengan yang main()telah ditentukan untuk Anda. Alih-alih, Anda mendapatkan dua titik masuk: init()dan loop()(koreksi saya jika saya salah tetapi saya hanya menyentuh Arduino dengan tiang 20 kaki)
slebetman
5

Anda membingungkan mikrokontroler dan kompiler. Bahasa tingkat tinggi yang dapat Anda programkan mikro tertentu adalah fungsi dari kompiler apa yang tersedia untuk mikro itu.

Pada level rendah, mikro menjalankan instruksi mesin, yang berasal dari kompiler untuk file teks yang Anda berikan yang Anda anggap sebagai "program". Anda benar-benar menentukan beberapa logika untuk dilakukan, dan kompiler mencari cara untuk menggunakan instruksi mesin yang tersedia untuk mengimplementasikan logika itu. Dalam hal ini, apa yang Anda programkan adalah fungsi dari kompiler, bukan set instruksi asli mikro.

Anda dapat memprogram mikro dengan menentukan instruksi asli secara langsung. Ini dilakukan dengan menggunakan bahasa assembly. Seperti kompiler, assembler adalah penerjemah yang mengambil file teks yang Anda tulis dan menghasilkan instruksi mesin sebagai hasilnya. Perbedaannya adalah bahwa dalam hal ini Anda menentukan instruksi mesin tersebut secara langsung. Setiap instruksi diberi nama, dan Anda menulis nama-nama ini alih-alih binary opcodes, tetapi Anda masih menentukan instruksi secara langsung. Assembler hanya melakukan pekerjaan kasar mencari tahu pengkodean biner yang tepat dari setiap instruksi dari nama dan opsi yang Anda tulis dalam file teks.

Sementara bahasa tingkat tinggi bisa sama di mik yang sangat berbeda, instruksi mesin biasanya hanya serupa dalam keluarga mik terkait. Sebagai contoh, semua Microchip PIC 18 memiliki set instruksi yang sama (kebanyakan), yang berbeda dari PIC 16 dasar, dan berbeda lagi dari bagian 16 bit seperti PIC 24 dan dsPIC 30 dan 33.

Olin Lathrop
sumber
1
Assembler juga menyelesaikan label untuk pernyataan lompatan, yang sangat rawan kesalahan saat dilakukan dengan tangan.
Pete Becker
2

Bahasa pemrogramannya masih C. Namun perpustakaan pabrikan untuk mengakses perangkat kerasnya berbeda. Sejauh yang saya tahu tidak ada standar sehingga setiap produsen memiliki API sendiri. Jika Anda ingin portabel antara produsen yang berbeda, Anda mungkin ingin memperkenalkan API abstrak Anda sendiri untuk mengakses perangkat keras dengan implementasi spesifik yang memetakan API Anda ke metode khusus produsen.

MrSmith42
sumber
Sebenarnya, ini lebih dari C. Ini adalah C ++ (atau mungkin bagian dari C ++).
Peter Mortensen
2

Jawaban lain telah membuat perbedaan antara bahasa tingkat tinggi (seperti C ++) dan kode mesin, meskipun saya tidak percaya itu membuat pernyataan Anda tidak benar bahwa setiap mikrokontroler memiliki 'bahasa' yang terkait.

Perbedaan implementasi bahasa tidak cukup besar untuk diklasifikasikan sebagai bahasa yang berbeda, meskipun saya tidak akan ragu untuk membedakannya menjadi 'dialek'. Dua lapisan perubahan bisa ada di sini.

  1. Perpustakaan pembungkus tingkat tinggi mungkin tersedia dari pabrikan atau pihak ketiga
  2. Compiler tertentu mungkin tidak memancarkan kode yang memenuhi standar

Mari kita ambil poin-poin ini sambil mengamati platform Arduino.

  • Komunitas Arduino menyediakan pustaka C ++ yang sangat abstrak untuk chip arsitektur AVR. Pustaka-pustaka ini menyarankan aliran kontrol yang berbeda dari apa yang mungkin diharapkan dari program C ++ khas (misalnya menyembunyikan main ()).
  • Di bawah tenda, Arduino mengkompilasi kodenya menggunakan avr-gcc, yang memancarkan kode C / C ++. Namun, pengecualian tidak didukung dengan baik pada chip AVR, dan hampir selalu dinonaktifkan. Dengan fitur besar yang hilang, program yang dihasilkan mungkin tidak bertindak seperti bagaimana program C ++ 'biasa'.

Mengetahui hal ini, bagaimana Anda memutuskan bagaimana memprogram mikrokontroler sembarang? Anda memiliki beberapa opsi:

  1. Cari pustaka dan IDE buatan komunitas untuk chip spesifik Anda. Keripik AVR kadang-kadang dikembangkan hanya menggunakan C, tetapi proyek Arduino memberikan pengalaman yang lebih ramah pengguna bagi penggemar.
  2. Temukan kompiler yang dapat dikompilasi untuk chip spesifik Anda. Dengan kompiler yang tepat, lembar data chip Anda, dan sejumlah kesabaran, Anda akan dapat menulis kode yang sangat dekat dengan logam.

Untuk referensi, berikut adalah daftar backend yang didukung untuk GCC. Anda akan melihat ada dukungan untuk ARM, AVR, MIPS, dan beberapa lainnya.

Tentang chip yang tidak diprogram dengan 'perangkat lunak' ...

Anda mungkin ingin melihat array gerbang yang dapat diprogram bidang (FPGA)! FPGA dikontrol dengan mengubah nilai-nilai tabel pencarian untuk meniru gerbang logika. Ini tidak memiliki bentuk perangkat lunak yang sesuai, tetapi masih dikembangkan menggunakan bahasa deskripsi perangkat keras seperti VHDL dan Verilog.

Strangework
sumber
1

Saya melihat satu pcboard dan melihat beberapa perangkat mount permukaan, beberapa resistor dan kapasitor dan led. Apakah itu berarti bahwa karena salah satu papan itu adalah kartu video, semua papan dengan resistor dan kapasitor serta beberapa lapisan dan jejak adalah semua kartu video? Nggak.

Berikut adalah contoh lain, halaman web ini menggunakan alfabet dan kata-kata bahasa Inggris. Jadi, apakah situs web new york times, apakah itu membuat situs web ini new york times? Tidak, mereka hanya berbagi alfabet dan bahasa yang sama tetapi sebaliknya sama sekali berbeda.

C adalah bahasa pemrograman tujuan umum yang mengabstraksi set instruksi di bawahnya. Dapat digunakan untuk bare metal, dapat digunakan untuk membuat sistem operasi yang berbeda dan tidak kompatibel satu sama lain, dapat digunakan untuk membuat video game, dll. Semua yang menggunakan bahasa C dasar yang sama, beberapa fungsi dan konstruksi C yang umum serta panggilan fungsi yang telah mereka buat yang khusus untuk aplikasi target. Untuk masing-masing platform yang Anda sebutkan atau yang lain mungkin ada serangkaian fungsi yang dipilih seseorang untuk dibuat. Sama seperti segelintir orang sejauh ini termasuk saya telah memberi Anda jawaban yang sama tetapi menuliskannya dengan cara yang berbeda. Ambil 100 programmer dan isolasi mereka satu sama lain dan beri mereka tugas pemrograman untuk menyelesaikan masalah tertentu, tanpa sepenuhnya membatasi kebebasan pemrograman mereka, dan Anda akan mendapatkan dari 1 hingga 100 solusi yang berbeda, tidak kompatibel satu sama lain, kemungkinan bukan 1 tetapi beberapa tema umum tergantung pada pelatihan dan pengalaman mereka, dan kemudian nama variabel dan nama fungsi yang sebagai satu set cenderung unik untuk setiap individu. Ambil papan yang sama yang sudah Anda bicarakan dan Anda akan menemukan bahwa saya pasti memiliki kode C saya sendiri yang tidak kompatibel (dengan fungsi arduino) untuk dijalankan pada mereka, seperti halnya dengan banyak orang lain, serta tidak kompatibel dengan platform lain. Itulah keindahan dari pemrograman tertanam logam, Anda tidak dibatasi dengan cara apa pun, Anda tidak harus hidup dalam sistem operasi panggilan perpustakaan standar atau seperangkat aturan terbatas guis, dll. Kebebasan penuh. kemungkinan bukan 1 tetapi beberapa tema umum tergantung pada pelatihan dan pengalaman mereka, dan kemudian nama variabel dan nama fungsi yang sebagai satu set cenderung unik untuk setiap individu. Ambil papan yang sama yang sudah Anda bicarakan dan Anda akan menemukan bahwa saya pasti memiliki kode C saya sendiri yang tidak kompatibel (dengan fungsi arduino) untuk dijalankan pada mereka, seperti halnya dengan banyak orang lain, serta tidak kompatibel dengan platform lain. Itulah keindahan dari pemrograman tertanam logam, Anda tidak dibatasi dengan cara apa pun, Anda tidak harus hidup dalam sistem operasi panggilan perpustakaan standar atau seperangkat aturan terbatas guis, dll. Kebebasan penuh. kemungkinan bukan 1 tetapi beberapa tema umum tergantung pada pelatihan dan pengalaman mereka, dan kemudian nama variabel dan nama fungsi yang sebagai satu set cenderung unik untuk setiap individu. Ambil papan yang sama yang sudah Anda bicarakan dan Anda akan menemukan bahwa saya pasti memiliki kode C saya sendiri yang tidak kompatibel (dengan fungsi arduino) untuk dijalankan pada mereka, seperti halnya dengan banyak orang lain, serta tidak kompatibel dengan platform lain. Itulah keindahan dari pemrograman tertanam logam, Anda tidak dibatasi dengan cara apa pun, Anda tidak harus hidup dalam sistem operasi panggilan perpustakaan standar atau seperangkat aturan terbatas guis, dll. Kebebasan penuh. Ambil papan yang sama yang sudah Anda bicarakan dan Anda akan menemukan bahwa saya pasti memiliki kode C saya sendiri yang tidak kompatibel (dengan fungsi arduino) untuk dijalankan pada mereka, seperti halnya dengan banyak orang lain, serta tidak kompatibel dengan platform lain. Itulah keindahan dari pemrograman tertanam logam, Anda tidak dibatasi dengan cara apa pun, Anda tidak harus hidup dalam sistem operasi panggilan perpustakaan standar atau seperangkat aturan terbatas guis, dll. Kebebasan penuh. Ambil papan yang sama yang sudah Anda bicarakan dan Anda akan menemukan bahwa saya pasti memiliki kode C saya sendiri yang tidak kompatibel (dengan fungsi arduino) untuk dijalankan pada mereka, seperti halnya dengan banyak orang lain, serta tidak kompatibel dengan platform lain. Itulah keindahan dari pemrograman tertanam logam, Anda tidak dibatasi dengan cara apa pun, Anda tidak harus hidup dalam sistem operasi panggilan perpustakaan standar atau seperangkat aturan terbatas guis, dll. Kebebasan penuh.

Anda dapat memilih, dan sebagian besar orang melakukannya, untuk bermain di kotak pasir seseorang daripada membangun sendiri, artinya gunakan arduino gui dan perpustakaan C mereka.

Anda dapat mengambil pc yang sama dan menjalankan versi windows yang berbeda, linux, bsd, dan daftar cucian sistem operasi lain yang pada tingkat tertentu menggunakan C tetapi panggilan fungsi yang tidak kompatibel satu sama lain. Perangkat keras yang sama dan C yang tidak kompatibel, yang meluas ke perangkat keras yang berbeda, bahasa yang sama, dapat memiliki kode yang kompatibel atau tidak kompatibel. Bahasa sama sekali tidak membuatnya kompatibel.

C digunakan pada platform tertanam ini karena itu adalah praktik umum, tidak ada bahasa lain yang dapat menggantikan C untuk ini. Langkah pertama untuk prosesor baru adalah perakitan tentu saja maka hampir selalu adalah C berikutnya, maka mungkin orang lain jika cukup kuat untuk menjalankan sistem operasi (linux, bsd, dll). C diciptakan dan diharapkan dapat memecahkan masalah pada saat porting code di seluruh platform, dan selama Anda memiliki sistem operasi yang merupakan kasus pembuat kode kompiler C yang berjalan pada SISTEM OPERASI, akan melakukan file C standar operasi dan printf dan hal-hal semacam itu. Tetapi bare metal adalah cerita yang berbeda. Tidak ada sistem operasi. Seringkali tidak ada gagasan tentang sistem file atau tampilan, tetapi dengan praktik umum ada kemungkinan kompiler C yang pada akarnya mengubah C menjadi bahasa target perakitan khusus.

old_timer
sumber
Sebenarnya, untuk Arduino, lebih dari C. Ini adalah C ++ (atau mungkin bagian dari C ++).
Peter Mortensen
1

Untuk menjawab pertanyaan kedua Anda, istilah "mikrokontroler" menyiratkan bahwa chip memiliki CPU dan RAM (dan mungkin ROM) di papan tulis. Semua mikrokontroler menjalankan perangkat lunak - itu sebabnya kami menyukainya.

Menuju lebih dalam ke pertanyaan pertama, perhatikan bahwa sementara (hampir?) Semua MCU memiliki kompiler C, bahasa C dasar tidak mendukung setiap instruksi pada setiap prosesor. Misalnya, C memiliki operator kiri / kanan bergeser, tetapi tidak ada operator kiri / kanan putar. Sistem pointer C secara alami tidak mendukung ruang program dan alamat data yang terpisah (seperti dalam beberapa Arsitektur Harvard). C tidak memiliki dukungan SIMD langsung.

Compiler memiliki beberapa opsi untuk menangani fitur-fitur ini:

  1. Perpanjang bahasa dasar, biasanya dengan kata kunci baru (mis. Dekat dan jauh untuk memori halaman).

  2. Berikan fungsi intrinsik (mis. __Ror () dan __rol () untuk rotasi).

  3. Masukkan mereka ke dalam optimizer sehingga urutan operasi C dikompilasi menjadi satu instruksi yang efisien (mis. Multiply / akumulasi).

  4. Abaikan dan buat pengguna menulis kode rakitan jika mereka menginginkan fitur non-C-standar.

Level berikutnya adalah file header yang disediakan pabrikan yang utamanya mendefinisikan semua register untuk Anda. Anda bisa membuatnya sendiri, tetapi ini menyusahkan kecuali Anda ahli dalam MCU itu.

Terakhir, ada fungsi pustaka yang disediakan oleh pabrikan, yang menangani barang-barang rendah seperti register register untuk Anda.

Contoh Anda mencampur dua level. DDR adalah makro yang mengacu pada register. Ini diterapkan baik sebagai akses pointer atau fungsi intrinsik kompiler (saya lupa yang mana). pinMode () adalah fungsi yang menulis ke register DDR untuk Anda.

Saat Anda berpindah dari satu baris MCU ke yang lain, Anda harus mempelajari register baru dan kebiasaan kompiler baru. Jika Anda tetap berada di perusahaan yang sama, Anda mungkin mendapatkan API serupa. Perusahaan yang berbeda tidak membagikan API; mengapa kami membantu Anda beralih ke pesaing kami? :-)

Adam Haun
sumber
1

Mikrokontroler sering memiliki mikrokode yang berbeda di tingkat perangkat keras. Untuk menyelamatkan kita dari memasukkan kode mesin (yaitu instruksi dalam bentuk angka - masing-masing mewakili mikrokode mentah mikrokontroler) atau dalam assembler simbolik (yang menyediakan label mnemonik untuk setiap instruksi kode mesin), bahasa tingkat tinggi portabel digunakan.

C dan Forth dirancang dengan sengaja agar mudah dibawa-bawa di set kode mesin yang berbeda.

Jadi jika Anda menggunakan C pada Arduino, dan C pada Teensy, Anda menggunakan C dalam kedua kasus.

Jika Anda menggunakan Forth pada Arduino, dan Forth pada Teensy, Anda akan menggunakan Forth pada kedua kasus.

Kadang-kadang, fasilitas perangkat keras tambahan akan meminta orang (atau kelompok) memindahkan bahasa ke perangkat keras baru untuk menulis beberapa kode pra-fabrikasi agar Anda dapat mengakses fasilitas baru platform perangkat keras, tanpa harus menulis banyak kode tingkat rendah dirimu sendiri.

Perpustakaan-perpustakaan ini (dalam C) atau kamus (dalam Forth) dapat memiliki beberapa fungsi atau kata-kata khusus perangkat keras di dalamnya.

Euan M
sumber