2个版本
0.1.1 | 2020年10月4日 |
---|---|
0.1.0 | 2020年9月27日 |
#570 in 并发
20KB
371 行
CORTEXM_THREADS
一个用于ARM Cortex-M ( 0, 0+, 3, 4, 4F ) 微处理器的上下文切换简单库
支持抢占式、基于优先级的切换
该项目旨在学习,应仅由用户自行承担风险使用。对于实际成熟的Rust替代方案,请参阅Awesome Embedded Rust
当前状态
处理器支持
- Cortex-M0
- Cortex-M0+
- Cortex-M3
- Cortex-M4
- Cortex-M4F
功能
- 抢占式、基于优先级的切换
- 高效睡眠
- 接受堆栈内存区域作为vec(arrayvec?,smallvec?)而不是&[]
- 非特权模式
- 互斥锁实现了解线程调度
示例
在example_crates
文件夹中包含了一些Crates,展示了如何在不同板上使用cortexm-threads。
可用示例
- stm32f3 - 2个线程,一个线程运行LED轮盘,另一个定期打印磁力计读数。当前编译为target thumbv7m-none-eabi而不是thumbv7em-none-eabihf。请参阅Roadmap#1
- microbit - 2个线程使用协作上下文切换打印消息
- qemu-m4 - (配置在qemu上运行) 2个线程通过半托管打印消息。从
example_crates/qemu-m4
目录中运行cargo run
以查看其运行。您必须在系统PATH上安装qemu-system-arm。
示例
#![no_std]
#![no_main]
extern crate panic_semihosting;
use cortex_m::peripheral::syst::SystClkSource;
use cortex_m_rt::{entry, exception};
use cortex_m_semihosting::{hprintln};
use cortexm_threads::{init, create_thread, create_thread_with_config, sleep};
#[entry]
fn main() -> ! {
let cp = cortex_m::Peripherals::take().unwrap();
let mut syst = cp.SYST;
syst.set_clock_source(SystClkSource::Core);
syst.set_reload(80_000);
syst.enable_counter();
syst.enable_interrupt();
let mut stack1 = [0xDEADBEEF; 512];
let mut stack2 = [0xDEADBEEF; 512];
let _ = create_thread(
&mut stack1,
|| {
loop {
let _ = hprintln!("in task 1 !!");
sleep(50); // sleep for 50 ticks
}
});
let _ = create_thread_with_config(
&mut stack2,
|| {
loop {
let _ = hprintln!("in task 2 !!");
sleep(30); // sleep for 30 ticks
}
},
0x01, // priority, higher numeric value means higher priority
true // privileged thread
);
init();
}
许可证
请参阅LICENSE.md
无运行时依赖
~185KB