Raspberry Pi RP2040 Realtime OS
Proyek Pembelajaran untuk membuat dukungan OS pre-emptive, real-time untuk RP2040. Kode Penjadwal ditulis dalam C untuk memungkinkan eksperimen yang mudah. Kemampuan saat ini meliputi:
Pre-emptive
Prioritas utas
Menunggu/menunda
Hasil kooperatif
Mutex
Stack Checks (masalah breakpoint)
Waktu sakelar konteks pada pico 125MHz dengan empat utas adalah:
Tidak ada optimasi
| Waktu konteks |
|---|
| Tidak ada koleksi statistik: | 5.8 AS |
| Dengan statistik Collecton: | 9.3 AS |
| Dengan statistik/tumpukan cek: | 9.9 AS |
Contoh kode memiliki "atas" sederhana seperti output setiap dua detik ke port serial. Nilai CTX = adalah persentase waktu yang dihabiskan dalam sakelar konteks. Util = adalah persentase waktu yang dihabiskan dalam utas dan idle = persen yang dihabiskan di salah satu core idle utas.
Indikator S atau status hanya: w-waiting, r-running, z-zombied atau thread dikembalikan.
Waktu dinding 0:56:38
CPU0 CTX = 0,095%, util = 1,229% idle = 98,771%
CPU1 CTX = 0,074%, util = 0,081% idle = 99,919%
Nama thd s pri cpu lastcpu
0 LED Merah W 100 0,001% 1
1 LED hijau W 100 0,011% 0
2 Laporan R 255 1.115% 0
3 spinner z 150 0,000% 0
Implementasi saat ini terdiri dari tiga file dan contoh utama:
header OS RP2040OS.h
RP2040OS.c Implementasi di C
Fungsi Implementasi FUNC dalam perakitan
Contoh utama.c
Kasing penggunaan sederhana untuk memulai dua utas:
#include "rp2040.h"
static uint32_t blink1stack [128];
void blink1 () {
while (true) {
setgpio (led_pin1);
delayms (300);
clrgpio (led_pin1);
delayms (300);
}
}
static uint32_t blink2stack [128];
void blink2 () {
while (true) {
setgpio (led_pin2);
delayms (300);
clrgpio (led_pin2);
delayms (300);
}
}
int main () {
stdio_init_all ();
gpio_init (led_pin1);
gpio_set_dir (led_pin1, gpio_out);
gpio_init (led_pin2);
gpio_set_dir (led_pin2, gpio_out);
addThread ("LED merah", Blink1, Blink1Stack, sizeof (Blink1Stack), 100);
addThread ("LED hijau", blink2, blink2stack, sizeof (blink2stack), 100);
setupsched (); // tidak ada pengembalian
}
Ukuran tumpukan ###
Ketahuilah bahwa semakin banyak fungsi perpustakaan yang Anda sebut, semakin banyak ruang tumpukan yang mungkin Anda butuhkan. Misalnya, menggunakan fungsi printf akan membutuhkan lebih dari 256 nilai 32bit dalam tumpukan untuk menangani persyaratan memori fungsi. Jika unit yang dites dilampirkan ke debugger, Stack_Watch dapat dihidupkan dan akan memicu BKPT (breakpoint) di debugger jika salah satu nilai stack guard dimodifikasi, menunjukkan kemungkinan kondisi overflow.
### osconfig.h
File ini memungkinkan Anda menyesuaikan cara kerja penjadwal. Secara default, diatur ke spesifikasi RP2040 atau dua core. Mengatur user_tasks ke jumlah yang benar untuk aplikasi Anda akan meminimalkan jumlah memori yang digunakan. Informasi utas tambahan seperti penamaan, statistik dan pemantauan tumpukan juga mengkonsumsi sedikit lebih banyak memori, tetapi bisa sangat membantu dengan debugging.
ContextSW_Pin dapat digunakan dengan osiloskop untuk melihat sakelar konteks secara real-time.
Bangunan
Ekspor pico_sdk_path = jalur ke pico-sdk Anda
Salin $ pico_sdk_path/eksternal/pico_sdk_import.cmake ke direktori utama.
$> MKDIR Build
$> CD build
$> cmake .. -dcmake_build_type = debug
$> Make