Skip to content

A stupid C++11 eventloop framework library for AVR8 microchips

License

Notifications You must be signed in to change notification settings

glass-panel/EventLoopAVR

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

31 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

EventLoopAVR

该项目受 NodeJS 事件循环启发,旨在使用 C++11 或以上版本 在 AVR 8 单片机上实现一套简单的事件循环框架,如:

  • eventloop.setTimeout()
  • eventloop.nextTick()
  • eventloop.bindEventHandler()

Requirements

  1. avr-g++ 至少支持编译 C++11 的版本

该项目使用了部分 stdc++ 库中的元编程模板,为此本项目自带了对所需模板非常粗糙的实现 (no_stdcpp_lib.h 污染 std 命名空间注意!)

如需完整的 stdc++ 库,可以考虑该项目曾采用的 modm-io 的 stdc++ 库,并取消 EventLoopAVR.hUSE_STDCPP_LIB 宏的注释,你也可以在 modm-io 组织下找到预编译的高版本 avr-g++

Features

  1. 零动态内存分配
  2. 支持将自定义参数传入延迟执行的任务,而不需借助动态内存分配,如 eventloop.nextTick(make_task(some_function).setArgs(some_args_tuple)) 或更为接近 js 的语法 eventloop.nextTick([](int arg1, double arg2){ someWorkHere(); }, 114, 5.14)
  3. 支持设置超时任务,并可使用所计划的函数指针取消该超时任务
  4. 可为按键回调函数保存参数,实现类似闭包的效果
  5. (部分)简化IO设置,可在编译期确定引脚与按键的绑定、为串口提供流输出操作符等
  6. 支持 Arduino IDE

Description

该项目由 Task<>CircularTaskQueue<>EventLoop<>Time 类为核心,实现了事件循环的框架,辅以 PinT<>Keys<>PipeIO<> 类提供对单片机IO的抽象

  • Task<> 类实现了对 某一函数的 函数指针 及 函数参数 的打包并进行类型擦除,为事件循环对函数的延迟执行提供了基础
  • CircularTaskQueue<> 类实现了栈上对 Task<> 对象的存储,避免了动态内存申请,并被设计为循环队列以配合事件循环的特性
  • EventLoop<> 类实现了事件循环的主要功能,并使用 CircularTaskQueue<> 类存储事件循环中的任务
  • Time 类实现了一个紧凑的(48bit)时间格式,并具有全局时间等的静态成员与对其的操作,为事件循环提供时间标准
  • PinT<> 模板类使得在模板中对任意端口的某一个引脚的操作成为了可能
  • Keys<> 模板类在 PinT<> 基础上更近一步,使得在编译期即可绑定引脚与按键,并生成对应的状态机函数,同时提供 onClick onDoubleClick onPress 的回调(推荐 C++17, C++11 下效率不高)
  • PipeIO<> 类对诸如 UART 等的外设提供了抽象,提供 onData 等的回调

该项目的平台依赖性不强,兴许 可以移植至 STM32 等平台

Usage

引入 EventLoopAVR.h 即可,不过 Time 类的静态成员在编译时编译器会尝试加入线程安全相关代码,但 avr-libc 并没有提供,且也不需要,需使用 -fno-threadsafe-statics 编译器flag 关闭此功能

Examples

参考 examples/ 文件夹

Notice

  1. 如需要在中断中调用 nextTicksetTimeout,请务必务必注意这些函数的重入冲突问题;目前建议使用事件循环前会调用的 preQueueProcess 函数根据事件所设置的 flag 再推入任务
  2. Keys 对象提供 .executeHandlers() 的成员函数完成对事件所设置 flag 的检查与更新,并在其中直接调用用户定义的回调函数,而不会使用 nextTick 推迟执行,需考虑可能的阻塞问题
  3. 事件循环在队列中没有任何任务与timeout队列也为空时会退出,可在 postQueueProcess 中加入队列空判断推入一个不做任何事的任务保活
  4. 该项目仍在建设中

About

A stupid C++11 eventloop framework library for AVR8 microchips

Resources

License

Stars

Watchers

Forks

Releases

No releases published