Un système d'exploitation préemptif minimum sur le cortex-M3 (spécialement sur la planche bleue) écrit en rouille. C'est dans le but de rechercher et de montrer comment fonctionne l'exécution fondamentale du cortex-M3.
Dans l'informatique, la préemption est l'acte d'interrompre temporairement une tâche effectuée par un système informatique, sans nécessiter sa coopération, et avec l'intention de reprendre la tâche ultérieurement. De tels changements de la tâche exécutée sont appelés commutateurs de contexte. ---- Wikipedia
À Breif, le noyau du système d'exploitation non préemptif ne peut pas interrompre une tâche, tandis que le noyau du système d'exploitation préventif peut reprendre le contrôle sans informer la tâche.
blue-pill et un récepteur de port en série.arm-none-eabi et openocd sont installées sur votre plate-forme.rustc 1.37.0-nightly (17e62f77f 2019-07-01) . Ce projet est des collections de plusieurs étapes de la construction d'un système d'exploitation préemptif préliminaire de Sketch. Je vais m'assurer que tout le code de chaque chapitre peut compiler et exécuter sur blue-pill .
Chapter5-MultiTasking cd Chapter5-MultiTasking
Connectez le blue-pill à votre ordinateur portable.
Connectez PIN PA2 à un récepteur en série, avec 115200 baudrate, 8 bits de données, 1 bits d'arrêt, pas de parité et sans contrôle de débit.
Exécutez 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.
En conséquence, vous verriez la sortie du récepteur en série comme ceci:
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
...