#thread #cortex-m #arm #priority #sleep #微处理器 #上下文切换

cortexm-threads

一个用于ARM Cortex-M ( 0, 0+, 3, 4, 4F ) 微处理器的上下文切换简单库

2个版本

0.1.1 2020年10月4日
0.1.0 2020年9月27日

#570 in 并发

MIT 许可证

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