< 返回版块

gqf2008 发表于 2022-05-15 16:11

Tags:rtos,riscv,arm

xtask

github

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

说明

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

主要功能

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

移植的芯片

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

快速开始

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

多任务调试1 多任务调试2

  1. 打开一个终端

    • cd debug/gd32vf103
    • ./openocd.sh
  2. 串口调试

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

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

目录结构

.
|____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);
}


Ext Link: https://github.com/gqf2008/xtask/blob/master/debug/gd32vf103/debug1.png

评论区

写评论

还没有评论

1 共 0 条评论, 1 页