Cara Melaksanakan Tugas Selari (Threads) Dalam Program Arduino

Isi kandungan:

Cara Melaksanakan Tugas Selari (Threads) Dalam Program Arduino
Cara Melaksanakan Tugas Selari (Threads) Dalam Program Arduino

Video: Cara Melaksanakan Tugas Selari (Threads) Dalam Program Arduino

Video: Cara Melaksanakan Tugas Selari (Threads) Dalam Program Arduino
Video: Как выполнять несколько задач в Arduino | Начинающие | функция millis () 2024, Mungkin
Anonim

Dalam teknologi mikropemproses, tugas yang dijalankan secara selari disebut Threads. Ini sangat mudah, kerana perlu melakukan beberapa operasi pada masa yang sama. Adakah mungkin untuk membuat mikrokontroler Arduino melakukan beberapa tugas sekaligus, seperti pemproses sebenar? Mari lihat.

Aliran selari dalam program Arduino
Aliran selari dalam program Arduino

Ia perlu

  • - Arduino;
  • - 1 LED;
  • - 1 buzzer piezo.

Arahan

Langkah 1

Secara umum, Arduino tidak menyokong paralelisasi sebenar, atau multithreading.

Tetapi anda boleh memberitahu pengawal mikro untuk memeriksa apakah sudah tiba masanya untuk melaksanakan beberapa tugas latar belakang tambahan pada setiap pengulangan kitaran "gelung ()". Dalam kes ini, nampaknya pengguna bahawa beberapa tugas sedang dilakukan secara serentak.

Sebagai contoh, mari kita berkedip LED pada frekuensi tertentu dan, secara selari, mengeluarkan bunyi yang naik dan turun seperti siren dari pemancar piezoelektrik.

Kami telah menghubungkan kedua-dua LED dan pemancar piezo ke Arduino lebih dari satu kali. Mari pasang litar seperti yang ditunjukkan dalam gambar. Sekiranya anda menyambungkan LED ke pin digital selain "13", ingatlah untuk mempunyai perintang had semasa sekitar 220 ohm.

Gambar rajah pendawaian untuk buzzer dan LED ke Arduino
Gambar rajah pendawaian untuk buzzer dan LED ke Arduino

Langkah 2

Mari tulis lakaran seperti ini dan muat naik ke Arduino.

Setelah memuatkan papan, anda dapat melihat bahawa lakaran tidak dijalankan dengan tepat seperti yang kita perlukan: sehingga siren beroperasi sepenuhnya, LED tidak akan berkedip, dan kami ingin LED berkedip SELAMA bunyi siren. Apa masalahnya di sini?

Faktanya ialah masalah ini tidak dapat diselesaikan dengan cara biasa. Tugas-tugas tersebut dilakukan oleh mikrokontroler secara berurutan. Pengendali "delay ()" menunda pelaksanaan program untuk jangka waktu yang ditentukan, dan sehingga waktu ini berakhir, perintah program berikut tidak akan dilaksanakan. Oleh kerana itu, kami tidak dapat menetapkan jangka waktu pelaksanaan yang berbeza untuk setiap tugas dalam "loop ()" program.

Oleh itu, anda perlu membuat simulasi berbilang tugas.

Beeper dan kawalan LED secara bersiri
Beeper dan kawalan LED secara bersiri

Langkah 3

Pilihan di mana Arduino akan melakukan tugas dalam pseudo-parallel disarankan oleh pembangun Arduino dalam artikel

Inti kaedahnya ialah dengan setiap pengulangan gelung "loop ()", kita memeriksa sama ada sudah tiba masanya untuk mengedipkan LED (untuk melakukan tugas latar belakang) atau tidak. Dan jika berlaku, maka kita membalikkan keadaan LED. Ini adalah sejenis pemintas operator "delay ()".

Kelemahan ketara kaedah ini ialah bahagian kod di hadapan unit kawalan LED mesti dijalankan lebih cepat daripada selang waktu LED "InterInterval" yang berkelip. Jika tidak, berkelip akan berlaku lebih jarang daripada yang diperlukan, dan kita tidak akan mendapat kesan pelaksanaan tugas yang selari. Khususnya, dalam lakaran kami, jangka masa perubahan bunyi siren adalah 200 + 200 + 200 + 200 = 800 msec, dan kami menetapkan selang berkelip LED menjadi 200 msec. Tetapi LED akan berkelip dengan jangka masa 800 msec, yang 4 kali berbeza dari yang kita tetapkan. Secara umum, jika operator "delay ()" digunakan dalam kod, maka sukar untuk mensimulasikan pseudo-parallelism, jadi disarankan untuk menghindarinya.

Dalam kes ini, perlu bagi unit kawalan suara siren untuk memeriksa sama ada waktunya telah tiba atau tidak, dan tidak menggunakan "delay ()". Tetapi ini akan meningkatkan jumlah kod dan memburukkan lagi pembacaan program.

LED berkelip tanpa berlengah () pengendali
LED berkelip tanpa berlengah () pengendali

Langkah 4

Untuk menyelesaikan masalah ini, kami akan menggunakan perpustakaan ArduinoThread yang indah, yang membolehkan anda membuat proses selari pseudo dengan mudah. Ia berfungsi dengan cara yang serupa, tetapi ia membolehkan anda tidak menulis kod untuk memeriksa waktu - sama ada anda perlu melaksanakan tugas dalam gelung ini atau tidak. Ini mengurangkan jumlah kod dan meningkatkan pembacaan lakaran. Mari lihat perpustakaan dalam tindakan.

Pertama sekali, muat turun arkib perpustakaan dari laman web rasmi https://github.com/ivanseidel/ArduinoThread/archive/master.zip dan hapus zip ke dalam direktori "perpustakaan" Arduino IDE. Kemudian ganti nama folder "ArduinoThread-master" menjadi "ArduinoThread".

Memasang pustaka ArduinoThread
Memasang pustaka ArduinoThread

Langkah 5

Gambarajah sambungan akan tetap sama. Hanya kod program yang akan berubah. Sekarang akan sama seperti di bar sisi.

Dalam program ini, kami membuat dua aliran, masing-masing melakukan operasi sendiri: satu berkelip dengan LED, yang kedua mengawal bunyi siren. Dalam setiap lelaran gelung, untuk setiap utas, kami memeriksa apakah sudah tiba masanya pelaksanaannya atau tidak. Sekiranya tiba, ia dilancarkan untuk pelaksanaan menggunakan kaedah "run ()". Perkara utama adalah tidak menggunakan pengendali "delay ()".

Penjelasan lebih terperinci diberikan dalam kod.

Mari memuatkan kod ke dalam memori Arduino, jalankan. Sekarang semuanya berfungsi dengan betul seperti yang sepatutnya!

Disyorkan: