OS preemptive minimum di Cortex-M3 (khususnya di papan Blue-Pill) yang ditulis dengan karat. Ini untuk tujuan meneliti dan menunjukkan bagaimana runtime mendasar dari Cortex-M3 bekerja.
Dalam komputasi, preemption adalah tindakan untuk sementara mengganggu tugas yang dilakukan oleh sistem komputer, tanpa memerlukan kerjasamanya, dan dengan maksud untuk melanjutkan tugas di kemudian hari. Perubahan tugas yang dieksekusi ini dikenal sebagai sakelar konteks. ---- Wikipedia
Di Breif, kernel OS non-preemptive tidak dapat mengganggu tugas, sedangkan kernel OS preemptive dapat mengambil kendali kembali tanpa menginformasikan tugas tersebut.
blue-pill dan penerima port serial.arm-none-eabi dan openocd yang diinstal pada platform Anda.rustc 1.37.0-nightly (17e62f77f 2019-07-01) . Proyek ini adalah koleksi beberapa tahap membangun OS preemptive pendahuluan dari sketsa. Saya akan memastikan semua kode dari setiap bab dapat dikompilasi dan dijalankan dengan blue-pill .
Chapter5-MultiTasking cd Chapter5-MultiTasking
Hubungkan blue-pill ke laptop Anda.
Hubungkan pin PA2 ke penerima serial, dengan 115200 baudrate, 8 bit data, 1 bit stop, tidak ada paritas dan tidak ada kontrol aliran.
Jalankan openocd :
> openocd
...
Info : using stlink api v2
Info : Target voltage: 3.175214
Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints
> cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.93s
Running `targetthumbv7m-none-eabidebugpreemptive`
Reading symbols from targetthumbv7m-none-eabidebugpreemptive...done.
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x080008fc msp: 0x20005000
Loading section .isr_vector, size 0x40 lma 0x8000000
Loading section .text, size 0x2a08 lma 0x8000040
Start address 0x80008fc, load size 10824
Transfer rate: 14 KB/sec, 5412 bytes/write.
(gdb) continue
Continuing.
Sebagai hasilnya, Anda akan melihat output dari penerima serial seperti ini:
Executing task1!
task1: fib(0)=1
task1: fib(1)=1
task1: fib(2)=2
Executing task2!
task2: is_prime(1)=true
task2: is_prime(2)=true
task2: is_prime(3)=true
Executing task1!
task1: fib(3)=3
task1: fib(4)=5
task1: fib(5)=8
Executing task2!
task2: is_prime(4)=false
task2: is_prime(5)=true
task2: is_prime(6)=false
...