Bisakah saya memiliki 1 inti prosesor hanya untuk program saya?

12

Saya harus menghitung waktu perbedaan antara tinggi -> rendah dan rendah -> tepi sinyal tinggi pada pin GPIO. Saya telah menulis program sederhana yang melakukan ini. Setelah menjalankannya selama beberapa waktu saya cukup senang dengan hasilnya (variasi 0,01). Tetapi dari waktu ke waktu ada kesalahan seperti 0,5 s. Saya berpikir bahwa ini mungkin karena beberapa proses sistem lain yang berjalan pada saat itu. Jadi pertanyaan saya adalah:

Dapatkah saya memesan satu inti prosesor hanya untuk program saya dan membiarkan 3 core lainnya untuk sistem?

Saya menggunakan Raspbian Jessie Lite, jadi saya pikir 3 core akan cukup untuk menjalankannya.

Model NonStandard
sumber
4
Saya berasumsi Anda sedang melakukan polling untuk mengetahui status pin GPIO. Ini sangat rentan terhadap bagaimana sistem operasi memutuskan untuk menjalankan program Anda, yang akan menghabiskan sebagian besar waktunya menjaga CPU sibuk sementara tidak melakukan apa pun yang benar-benar berguna. Anda mungkin ingin melihat cara untuk mengatur interupsi pada pin GPIO yang diberikan, yang dapat Anda gunakan untuk membiarkan program Anda tidur di antara tepi sinyal pada pin GPIO.
Florian Castellane
4
Tidak yakin apa proyek Anda, tetapi kadang-kadang Microcontroller lebih cocok, terutama ketika Anda membutuhkan lebih banyak sistem yang mirip waktu nyata. Arduino menawarkan banyak opsi, dan Anda dapat menulis program Anda dalam C / C ++.
SnakeDoc
@Florian Ada fungsi di RPi.GPIO yang mirip dengan interupsi. Ini akan memblokir program sampai tepi terdeteksi (sumber: sourceforge.net/p/raspberry-gpio-python/wiki/Inputs ).
NonStandardModel
@SnakeDoc Saya tahu bahwa mikrokontroler lebih baik. Saya berharap untuk menghindarinya, karena saya tidak membutuhkan ketelitian mikrodetik. 1/100 detik lebih dari cukup. Juga saya hanya perlu perbedaan waktu, jadi jika ada penundaan saya berharap itu akan sama untuk memulai dan berhenti. Jika ini tidak berhasil, saya harus menggunakan mikrokontroler yang terhubung ke RPi untuk menyimpan data.
NonStandardModel
1
Atau menjalankan OS Realtime pada PI. Masalah dengan pengaturan Anda, apakah itu tergantung pada "upaya terbaik" oleh OS. Tergantung apa lagi yang terjadi pada saat yang sama, program Anda meminta akses istimewa ke GPIO, program itu mungkin akan mengantri di balik tugas-tugas lain yang sedang dilakukan OS saat itu. Program userland Anda akan mendapatkan prioritas yang lebih rendah daripada tugas sistem. Ada juga preemption, yang berarti selama runtime program Anda mungkin "dijeda dan" sisihkan "oleh OS untuk menjalankan proses lain, yang berarti pengamatan waktu Anda mungkin miring.
SnakeDoc

Jawaban:

13

Mendedikasikan sebuah inti mungkin berlebihan.

Saya sarankan Anda mencoba perpustakaan pigpio saya . Secara default sudah saatnya tingkat GPIO berubah menjadi dalam 10μs.

Sebagai tes cepat saya sarankan Anda melihat contoh Python ini , yang akan mencetak setiap transisi tingkat GPIO dan waktu dalam mikrodetik sejak transisi terakhir pada GPIO itu.

pigpio tidak diinstal secara default di Jessie Lite. Baik instal yang terbaru dari situs tertaut atau instal versi yang lebih lama di repositori.

sudo apt-get install pigpio python-pigpio python3-pigpio

pigpio - Library for Raspberry Pi GPIO control
python-pigpio - Python module which talks to the pigpio daemon (Python 2)
python3-pigpio - Python module which talks to the pigpio daemon (Python 3)
joan
sumber
Saya akan mencoba perpustakaan pigpio Anda. Saat ini saya harus menyelesaikan proyek lain, tetapi saya akan kembali ke ini. Saya akan melaporkan kembali dalam beberapa minggu. Terima kasih!
NonStandardModel
4

Anda dapat mengunci program Anda ke satu inti menggunakan schedutilsseperti yang dijelaskan dalam artikel Cyberciti ini :

sudo apt-get install schedutils
sudo taskset -c 3 -p 13545  # Lock PID 13545 to core 3

Namun, proses lain masih dapat dijadwalkan pada inti yang sama. Jadi hal kedua yang harus dilakukan adalah memastikan perintah Anda berjalan dengan prioritas tertinggi menggunakan perintah yang bagus (ini akan memberi tahu kernel Linux bahwa proses lain harus dilakukan terlebih dahulu jika perlu). Mulai program Anda dengan cara ini:

nice -n -20 your-program

Ada beberapa kemungkinan alasan lain untuk masalah waktu Anda. Ini tidak mudah untuk dilakukan:

  • Jika Anda memprogram dengan Python ada pemulung yang terkadang menjeda program Anda untuk membebaskan memori yang tidak digunakan.
  • Interupsi membuat CPU menangani sesuatu yang lain dari yang Anda inginkan. Misalnya, paket jaringan atau input / output lainnya.
  • Jika program Anda banyak tidur mungkin ada proses lain yang mengisi cache CPU (L1 / L2 cache). Ini memaksa Anda untuk menunggu akses RAM.
    • Lebih buruk lagi jika RAM Anda penuh sehingga proses Anda akan ditukar ke disk karena kartu SD sloooow.

Ada beberapa cara untuk membuat proses Anda realtime , yang artinya akan berjalan dengan jaminan waktu tertentu. Masalah dengan ini adalah bahwa segala sesuatu yang lain mungkin lebih lambat, dan itu adalah topik yang kompleks. Jika Anda ingin turun ke lubang kelinci ini, saya sarankan Anda mulai membaca tentang proses waktu nyata di Linux .

Emil Vikström
sumber
2
Daripada menyenangkan, akan lebih baik untuk memberikan prioritas proses waktu nyata yang akan memastikan proses berjalan dalam preferensi terhadap proses non-waktu nyata.
joan
Poin bagus, saya akan menambahkan catatan tentang itu.
Emil Vikström
1
"gc.disable ()" apa yang terjadi jika Anda menonaktifkan pengumpul sampah?
Keine
@Keine Anda bisa mendapatkan kebocoran memori. Katakanlah Anda memiliki objek A yang memiliki variabel yang mengarah ke B. Python akan melacak referensi ini sebagai angka, ia tahu bahwa B memiliki 1 objek yang mengarah ke sana. Hapus A saat Anda tidak membutuhkannya lagi. Jumlah referensi untuk B akan berkurang, dan jika mencapai 0 Python dapat membebaskan B juga. Ini disebut penghitungan referensi. Tetapi sekarang katakan bahwa B memiliki referensi kembali ke A. Sekarang Anda memiliki sekelompok objek yang saling menunjuk. Tak satu pun dari mereka akan mencapai 0 dan dibebaskan. GC dapat menemukan cluster seperti itu dan menghapusnya ketika program utama tidak menunjuk "ke" cluster.
Emil Vikström
1
Saya akan menambahkan saran yang Anda buat ke proyek saya. Tetapi saya berharap untuk menghindari topik yang terlalu rumit. Dalam hal ini saya kira lebih baik membuat deteksi interupsi mikrokontroler dan menghubungkannya ke RPi hanya untuk menyimpan data. Terima kasih!
NonStandardModel
2

Karena Anda memiliki persyaratan waktu, Raspberry Pi bukan lagi platform yang tepat untuk ini. Ini bukan platform waktu nyata dan waktu dapat dibuang oleh banyak sumber gangguan yang berbeda.

Sebagai gantinya Anda harus menggunakan mikrokontroler untuk mengukur waktu ini, lebih disukai menggunakan interupsi, dan meneruskan informasi tersebut ke Pi nanti.

Maxthon Chan
sumber
1
Bukankah mungkin untuk mendapatkan interupsi pada pin GPIO pada Raspberry Pi?
Florian Castellane
Tentunya ini tergantung pada apakah ada bagian lain dari persyaratan desain yang membuat mesin linux lebih tepat daripada MCU. RPi mampu menangani tugas ini dengan baik, seperti MCU yang bekerja pada 10 MHz.
Sean Houlihane
1

Sesuai kebutuhan Anda, saya tidak berpikir Anda perlu menggunakan prosesor inti tunggal. Yang Anda butuhkan adalah memastikan program Anda berjalan setiap saat. Untuk mencapai itu, Anda dapat mengatur prioritas program Anda sangat tinggi, sehingga tidak terganggu oleh proses lain.

Sejauh yang saya tahu OS (General Purpose OS), yang kami gunakan tidak dirancang untuk digunakan dalam sistem waktu nyata, jadi jika Anda ingin menjalankan proses Anda secara real time sehingga tidak ada proses lain yang mengganggu itu, Anda harus pergi untuk Real Time OS (RTOS). Mungkin mereka akan datang dengan seleksi inti. :)

Vishwajeet Vishu
sumber
1
Apakah ada RTOS gratis yang bagus di luar sana?
Keine
RTLinux dan Vxworks adalah contoh RTOS dan mereka juga bagus. Tetapi Anda perlu mempelajari tentang OS (apa fokus pembuatannya) sebelum menginstal, sehingga dapat memenuhi kebutuhan Anda.
Vishwajeet Vishu