Skip to main content

xwrust/xwos/
skd.rs

1//! XWOS RUST:调度器
2//! ========
3//!
4
5use crate::types::*;
6
7/// 上下文枚举
8#[derive(Debug, Clone, Copy)]
9pub enum Context {
10    /// 启动
11    Boot,
12    /// 线程
13    Thd,
14    /// 中断(中断号)
15    Isr(XwIrq),
16    /// 中断底半部
17    Bh,
18    /// 空闲任务
19    Idle,
20}
21
22extern "C" {
23    fn xwrustffi_skd_get_context_lc(ctxbuf: *mut XwSq, irqnbuf: *mut XwIrq);
24    fn xwrustffi_skd_dspmpt_lc();
25    fn xwrustffi_skd_enpmpt_lc();
26}
27
28/// 获取当前代码的上下文
29///
30///
31/// # 示例
32///
33/// ```rust
34/// use xwrust::xwos::skd;
35///
36/// let ctx = skd::context();
37/// ```
38pub fn context() -> Context
39{
40    let mut ctx: XwSq = 0;
41    let mut irq: XwIrq = 0;
42
43    unsafe { xwrustffi_skd_get_context_lc(&mut ctx, &mut irq); }
44    match ctx {
45        0 => Context::Boot,
46        1 => Context::Thd,
47        2 => Context::Isr(irq),
48        3 => Context::Bh,
49        _ => Context::Idle,
50    }
51}
52
53/// 关闭当前CPU调度器的抢占
54///
55pub fn dspmpt() {
56    unsafe { xwrustffi_skd_dspmpt_lc(); }
57}
58
59/// 打开当前CPU调度器的抢占
60///
61pub fn enpmpt() {
62    unsafe { xwrustffi_skd_enpmpt_lc(); }
63}