ITPub博客

首页 > 数据库 > 数据库开发技术 > [大家的项目] RUST多任务调度系统

[大家的项目] RUST多任务调度系统

原创 数据库开发技术 作者:Rust语言中文社区 时间:2022-05-15 23:00:19 0 删除 编辑

xtask

github:https://github.com/gqf2008/xtask
可移植多任务调度中间件,用于嵌入式环境,与应用程序一起编译打包,参考FreeRTOS实现。

说明

  1. 软件还在开发中,API也相当原始且不稳定
  2. 关于工作原理,代码(包括汇编)中有详细的说明,请先阅读下
  3. 如果您有任何建议、想法可以通过提交issues或者通过邮箱(gao.qingfeng#gmail.com)联系到我
  4. 如果您有兴趣参与这个项目请提交您的PR

主要功能

  • 单物理线程任务优先级+时间片调度机制
  • 堆内存分配器
  • 二值信号量
  • 计数信号量
  • 信号广播
  • mpmc队列
  • 临界区
  • 互斥锁
  • 软件定时器

移植的芯片

  • GD32VF103xx
  • STM32F40x
  • STM32F10x
  • CH32V3
  • CH32V2
  • CH32V1

快速开始

如果您有一块longan-nano最小系统板,那么example中的例子直接可以跑起来

 
  1. 打开一个终端
  • cd debug/gd32vf103
  • ./openocd.sh
  • 串口调试
    • 把调试器插到usb口
    • window平台需要你找一款串口助手连接串口即可
    • linux或者mac平台执行 screen /dev/$串口设备 57600
  • 打开另外一个终端
    • ./run.sh
  • 如果您能在终端看到任务工作时的日志输出,恭喜您已经成功了
  • 目录结构

    .
    |____src 源码目录
    |
    |____lib.rs
    |
    |____chip 芯片移植目录
    |
    | |____gd32vf103 gd32vf103vf103移植代码
    | | | |____mod.rs
    | | | |____port.S 汇编代码,中断上下文保存
    | | | |____port.rs 中断处理函数
    | | | |____restore_ctx.S 首次启动恢复任务汇编代码
    | | | |____stdout.rs 串口输出
    | | | |____memory.x 内存布局链接脚本
    | | |____env.rs 移植环境参数
    |
    | |____mod.rs
    | |____port.rs port接口定义
    | |____task.rs 任务定义
    | |____allocator.rs 内存分配器
    | |____timer.rs
    | |____arch 指令集架构,官方嵌入式工程组项目重新导出
    | | |____x86_64
    |
    | | |____mod.rs
    |
    | |____mod.rs
    | | |____riscv
    |
    | | |____mod.rs
    |
    | |____cortex_m
    | | | |____mod.rs
    | |____task
    | | |____executor.rs 单物理线程执行器实现
    |
    | |____scheduler 调度器实现
    | | | |____xtask.rs
    | | | |____idle.rs
    | | | |____xworker.rs
    | | | |____misc.rs
    | | |____scheduler.rs
    |
    |____sync 信号量、通知、队列、临界段等
    |
    | |____semaphore.rs
    | | |____queue.rs
    |
    | |____mod.rs
    | | |____mutex.rs
    |
    | |____notifier.rs
    | | |____broadcast.rs
    |
    |____bsp 板级支持包
    |
    | |____mod.rs
    | | |____longan_nano longan_nano最小系统板
    |
    | | |____mod.rs
    |
    | | |____led.rs
    |
    | | |____lcd.rs
    |
    | | |____hcsr04.rs
    |
    | | |____epd27b.rs
    |
    | | |____kalman.rs
    |
    |____io.rs io读写之类
    |
    |____prelude.rs
    |
    |____time.rs 时间相关函数
    |
    ____.vscode
    | |____settings.json
    |____Cargo.lock
    |
    ____Cargo.toml
    |____hal 依赖的hal库

    移植层接口


    /// 移植层接口定义
    pub trait Portable {
    /// 完全内存屏障
    /// 保证在屏障之前的任何存储操作先于屏障之后的代码执行。
    fn barrier();
    /// 临界区保护函数
    fn free<F, R>(f: F) -> R
    where
    F: FnOnce(&CriticalSection) -> R;
    /// 开全局中断
    fn enable_interrupt();
    /// 关全局中断
    fn disable_interrupt();
    /// 启动调度器
    fn start_scheduler() -> !;
    /// 软中断
    fn irq();
    /// 关闭软中断
    fn disable_irq();
    /// 重置下一次中断时间
    fn reset_systick();
    /// 获取systick
    fn systick() -> u64;
    /// 硬件延时,单位us
    fn delay_us(us: u64);
    /// 保存任务环境到任务栈
    fn save_context(task: &mut Task);
    /// 打印文本函数
    fn printf(str: &str);
    }

    原文作者:Rust语言中文社区;如有侵权,请联系管理员删除。

    请登录后发表评论 登录
    全部评论

    注册时间:2020-06-11

    • 博文量
      1769
    • 访问量
      719017