前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[大家的项目] RUST多任务调度系统

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

作者头像
MikeLoveRust
发布2022-06-10 15:09:39
8960
发布2022-06-10 15:09:39
举报
文章被收录于专栏:Rust语言学习交流

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中的例子直接可以跑起来

打开一个终端

  • cd debug/gd32vf103
  • ./openocd.sh

串口调试

  • 把调试器插到usb口
  • window平台需要你找一款串口助手连接串口即可
  • linux或者mac平台执行 screen /dev/$串口设备 57600

打开另外一个终端

  • ./run.sh

如果您能在终端看到任务工作时的日志输出,恭喜您已经成功了

目录结构

代码语言:javascript
复制
.
|____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库

移植层接口

代码语言:javascript
复制
/// 移植层接口定义
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);
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rust语言学习交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • xtask
    • 说明
      • 主要功能
        • 移植的芯片
          • 快速开始
            • 目录结构
              • 移植层接口
              相关产品与服务
              消息队列 TDMQ
              消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档