littlebot
Published on 2025-04-03 / 0 Visits
0

【源码】基于Arduino的轻量级多线程协程库

项目简介

本项目基于Adam Dunkels的Protothreads库扩展开发,借助pt - timer和pt - signal实现轻量级多线程编程方案。主要解决单线程任务处理的阻塞问题,使多个任务能在无竞争环境中并行工作,提升程序执行效率和性能。项目包含基础pt库、pt - timer扩展、pt - signal扩展及示例程序,适用于嵌入式系统、微控制器、资源受限环境及快速响应场景。

项目的主要特性和功能

主要特性

  • 协程支持多线程,任务间无竞争。
  • 采用简单的控制流指令,如PT_YIELD。
  • 具备时间触发和任务间通信机制。

主要功能

  • 通过协程管理多任务处理,每个任务有独立的代码流和控制权。
  • 利用pt - timer实现任务延时处理。
  • 借助pt - signal实现任务间通信和同步。

安装使用步骤(假设用户已经下载了本项目的源码文件)

基于“switch - case”技巧(缺省)

  1. 将lc.h、lc - switch.h、pt.h拷到项目文件夹;若在Arduino平台,可将整个解压缩后的目录changer_pt _for_arduino,拷贝到文件夹C:\Users\ch\Documents\Arduino\libraries(WIN7系统)。
  2. 项目文件中添加#include "pt.h"

基于gcc的标签指针

  1. 准备lc.h、lc - addrlabel.h、pt.h三个文件。
  2. 用户程序在#include "pt.h"之前,加入#define lc_include "lc - addrlabels.h"

使用信号量

在包含pt.h之前加入#define PT_USE_SEM

使用等延时

在包含pt.h之前加入#define PT_USE_TIMER

使用等信号标志

在包含pt.h之前加入#define PT_USE_SIGNAL

通用步骤

  1. 定义协程任务函数,函数返回char类型,并使用struct pt作为参数,如PT_THREAD(myTask(struct pt *pt)) { ... },可在函数内使用该指针发送信号或设置定时器。
  2. 程序初始化时,使用PT_INIT初始化协程任务变量,并在需要处使用PT_BEGIN启动任务。
  3. 根据需求在任务中使用PT_WAIT_MSPT_WAIT_US进行延时等待,使用PT_WAIT_SIGNAL等待信号标志。
  4. 编译并运行程序,根据实际环境配置编译选项和链接选项。若遇到问题,可参考相关文档和教程解决。

下载地址

点击下载 【提取码: 4003】【解压密码: www.makuang.net】