Un sistema operativo preventivo mínimo en Cortex-M3 (especialmente en la placa de píldoras azules) escrito en Rust. Es con el fin de investigar y mostrar cómo funciona el tiempo de ejecución fundamental de Cortex-M3.
En la informática, la preferencia es el acto de interrumpir temporalmente una tarea que lleva a cabo un sistema informático, sin requerir su cooperación, y con la intención de reanudar la tarea en un momento posterior. Tales cambios de la tarea ejecutada se conocen como interruptores de contexto. ---- Wikipedia
En Breif, el núcleo del sistema operativo no preventivo no puede interrumpir una tarea, mientras que el núcleo del sistema operativo preventivo puede recuperar el control sin informar la tarea.
blue-pill y un receptor de puertos en serie.arm-none-eabi y openocd instalado en su plataforma.rustc 1.37.0-nightly (17e62f77f 2019-07-01) . Este proyecto es colecciones de varias etapas de construcción de un sistema operativo preventivo preliminar de Sketch. Me aseguraré de que todo el código de cada capítulo pueda compilar y ejecutar en blue-pill .
Chapter5-MultiTasking cd Chapter5-MultiTasking
Conecte la blue-pill a su computadora portátil.
Conecte PIN PA2 a un receptor en serie, con 115200 Baudrate, 8 bits de datos, 1 bits de parada, sin paridad y sin control de flujo.
Ejecutar 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.
Como resultado, vería la salida del receptor en serie así:
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
...