ระบบปฏิบัติการล่วงหน้าขั้นต่ำบน Cortex-M3 (โดยเฉพาะบนบอร์ดสีน้ำเงิน) ที่เขียนใน Rust มันมีไว้เพื่อวัตถุประสงค์ในการค้นคว้าและแสดงให้เห็นว่ารันไทม์พื้นฐานของ Cortex-M3 ทำงานอย่างไร
ในการคำนวณการยกเว้นเป็นการกระทำของการขัดจังหวะงานชั่วคราวที่ดำเนินการโดยระบบคอมพิวเตอร์โดยไม่ต้องใช้ความร่วมมือและด้วยความตั้งใจที่จะกลับมาทำงานในภายหลัง การเปลี่ยนแปลงของงานที่ดำเนินการดังกล่าวเรียกว่าสวิตช์บริบท ---- วิกิพีเดีย
ใน Breif เคอร์เนลของระบบปฏิบัติการที่ไม่ได้รับการยกเว้นไม่สามารถขัดจังหวะงานได้ในขณะที่เคอร์เนลของระบบปฏิบัติการล่วงหน้าสามารถนำการควบคุมกลับมาได้โดยไม่ต้องแจ้งงาน
blue-pill และเครื่องรับพอร์ตอนุกรมarm-none-eabi Toolchain และ openocd ติดตั้งบนแพลตฟอร์มของคุณrustc 1.37.0-nightly (17e62f77f 2019-07-01) โครงการนี้เป็นคอลเล็กชั่นหลายขั้นตอนของการสร้างระบบปฏิบัติการเบื้องต้นเบื้องต้นจาก Sketch ฉันจะตรวจสอบให้แน่ใจว่ารหัสทั้งหมดของแต่ละบทสามารถรวบรวมและทำงานบน blue-pill
Chapter5-MultiTasking cd Chapter5-MultiTasking
เชื่อมต่อ blue-pill เข้ากับแล็ปท็อปของคุณ
เชื่อมต่อ PIN PA2 กับเครื่องรับอนุกรมด้วย 115200 baudrate, 8 บิตข้อมูล, 1 บิตหยุดไม่มีความเท่าเทียมกันและไม่มีการควบคุมการไหล
เรียกใช้ 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.
ด้วยเหตุนี้คุณจะเห็นผลลัพธ์จากผู้ได้รับอนุกรมเช่นนี้:
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
...