0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【ioqueue】 IO序列化操作全解析

合宙LuatOS 来源:合宙LuatOS 作者:合宙LuatOS 2026-02-24 19:22 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

从内存对象到可存储或可传输的字节流,IO序列化操作完成了数据形态的转化。这一过程不仅涉及编码与解码逻辑,还需处理版本兼容、安全性与性能开销等问题。全面掌握这一技术路径,有助于构建更加健壮的应用系统。

一、概述

ioqueue 模块提供了 IO 序列操作的功能,可以通过硬件定时器精确控制 GPIO 的操作时序。

注意事项:

对于 Air700EXX 系列、Air780EXX 系列、Air8000 系列模组,硬件定时器有如下要求:

硬件定时器 id:0-5,六个硬件定时器,

定时器精度:20 微秒,为硬件支持的最小时间单位。

3 和 5 固定被底层占用不可使用

pwm 功能依赖硬件定时器,ioqueue 不可与 pwm 功能同时使用

pwm0 对应 0

pwm4 对应 4

以此类推

注意:Air6101/Air8101 不支持此功能

1.1 使用场景

ioqueue 主要是输出一些特殊的电平序列,捕获自定义协议。

如果有以下需要就可以使用该库:

精确控制多个 GPIO 的开关时序

循环执行固定的 GPIO 操作序列

捕获 GPIO 边沿变化的精确时间戳

模拟非标准通信协议

1.1.1 输入捕获场景(以 DHT11 数据读取为例)

单总线协议要求严格的时序控制、主机需要先发送特定启动信号传感器响应时间精确到微秒级、数据通过脉冲宽度编码

使用流程:

wKgZPGmdh0yAFKFhAAE68rZIxqQ333.png

下面演示使用硬件定时器精确控制 DHT11 通信时序,通过捕获下降沿时间戳解码温湿度数据,实现微秒级精确通信:

dht11 通讯协议介绍:

数据分为小数部分和整数部分,一次完整的数据传输为 40bit,高位先出

数据格式:8bit 湿度整数数据 +8bit 湿度小数数据 +8bit 温度整数数据 +8bit 温度小数数据 +8bit 校验

8bit 校验 = 8bit 湿度整数数据 +8bit 湿度小数数据 +8bit 温度整数数据 +8bit 温度小数数据

校验可以判断数据是否正确发送

DHT11 工作时序:

主机发送起始信号以后,DHT11 发送响应信号,然后发送 40bit 的数据,高位在前

总时序图如下:

wKgZPGmdh5KAJXzDAAH9gg6zCYY212.png

起始信号:总线空闲状态由 DHT11 内置上拉电阻拉高,主机拉低总线至少 18ms释放总线 20-40us

DHT11 响应:存在的 DHT11 会及时响应主机,同时拉低总线 80us 后,释放总线 80us,然后拉低总线,表示开始传送数据

wKgZPGmdh_6AMhzsAAIgx_fZ7aw067.png

发送数据:当总线是低电平是表示开始发送数据,同时存在 50us 低电平时隙,之后拉高总线,高电平的持续时间表示发送 0 或者 1,当高电平持续时间为 26us-28us 表示发送 0,高电平持续时间为 70us 时,表示发送 1

数据发送完毕,由上拉电阻拉高,置回空闲高电平状态

wKgZO2mdiCOAc5QPAAZHD43t0do013.pngwKgZPGmdiEuAaXClABD-Rjn8z_0963.png

具体波形如下:

wKgZO2mdiHGAQtHSAAGuwaFZ4eg935.pngwKgZPGmdiIuAVu1KAAHMskpm_qY479.pngwKgZO2mdiJiAUZ6zAASOrpCsZ7o967.pngwKgZO2mdiKOAMMVnAAH28PQ01eA791.png

1.1.2 输出精确脉冲场景

需要不同的脉冲宽度、软件循环无法满足精度要求、需要连续输出大量脉冲

使用流程:

wKgZPGmdiQCAH8OlAAFniBE1aRw531.png

下面演示利用硬件定时器生成固定频率或可变宽度的精确脉冲序列,支持连续和单次延时模式,实现微秒级脉冲控制:

固定间隔脉冲

wKgZPGmemT2AMW75AAOLw23kFFo801.pngwKgZO2memY6AEkKkAAFaiAOdo5s964.png

可变宽度脉冲序列

wKgZPGmembaALzlKAAQ__GUmg34855.pngwKgZO2memdCAQslUAAFlmcSnPmQ991.png

二、核心示例

示例可参考 1.1.1 章节具体使用分析。

三、常量详解

核心库常量,顾名思义是由 LuatOS 内核固件中定义的、不可重新赋值或修改的固定值,在脚本代码中不需要声明,可直接调用;

ioqueue 模块没有常量。

四、函数详解

ioqueue.init(hwtimer_id, cmd_cnt, repeat_cnt)

功能

初始化一个 io 操作队列。

参数

hwtimer_id

wKgZO2memjmAJK9XAAHNyxwotE8289.png

cmd_cnt

wKgZO2memlSABz_cAAF_rvEtOOU628.png

repeat_cnt

wKgZPGmemm-AdiDqAAC5ufrwFt0221.png

返回值

无返回值。

示例

wKgZPGmemqCAFt7DAABqjbrEqF4938.png

ioqueue.setdelay(hwtimer_id, time_us, time_tick, continue)

功能

对 io 操作队列增加延时命令。

参数

hwtimer_id

wKgZPGmemseAB4xVAAC3guTmCC0380.png

time_us

wKgZPGmemuSASAxUAACp4yrjSE4279.png

time_tick

wKgZO2memv-AVOTXAAFvyJr2bz4172.png

continue

wKgZO2memxqAWSu1AAH5X8fIgkE877.png

返回值

无返回值。

示例

wKgZPGmemz6AcwZVAAF_3_kKyRw268.png

ioqueue.delay(hwtimer_id)

功能

对 io 操作队列增加一次重复延时,在前面必须有 setdelay 并且是连续延时。

注意事项

必须在前面的 ioqueue.setdelay 设置 continue=true

参数

hwtimer_id

wKgZPGmemseAB4xVAAC3guTmCC0380.png

返回值

无返回值。

示例

wKgZPGmem8iAI3XmAADjqFeLTKw641.png

ioqueue.setgpio(hwtimer_id, pin, is_input, pull_mode, init_level)

功能

对 io 操作队列增加设置 gpio 命令。

参数

hwtimer_id

wKgZPGmemseAB4xVAAC3guTmCC0380.png

pin

wKgZPGmenC6AdPnjAACuxCrszac672.png

is_input

wKgZO2menEyABCP8AADBOmfzreI096.png

pull_mode

wKgZO2menMmADbh_AADyHqc2sng900.png

init_level

wKgZPGmenNmAMSRSAAC2viheLww748.png

返回值

无返回值。

示例

wKgZPGmenPyAOs-GAACkiFwWTeg249.png

ioqueue.input(hwtimer_id, pin)

功能

对 io 操作队列增加读取 gpio 命令。

应用场景:在精确时序点读取 GPIO 电平状态

使用时必须先调用 ioqueue.setgpio 设置输入模式,然后通过 ioqueue.get()读取输入数据

参数

hwtimer_id

wKgZPGmemseAB4xVAAC3guTmCC0380.png

pin

wKgZPGmenXSAfAv4AADISK908Rg340.png

返回值

无返回值。读取的数据需要通过 ioqueue.get 获取。

示例

wKgZPGmenYuAQ5VSAAZFgXvXhAo414.png

ioqueue.output(hwtimer_id, pin, level)

功能

对 io 操作队列增加输出 GPIO 命令。

参数

hwtimer_id

wKgZPGmemseAB4xVAAC3guTmCC0380.png

pin

wKgZO2menkyAO6pOAADJrhwh-5A841.png

level

wKgZPGmenmKAZHXlAACcIWe6s1Y291.png

返回值

无返回值。

示例

wKgZO2mennOAWISPAABEQngRiNo568.png


ioqueue.set_cap(hwtimer_id, pin, pull_mode, irq_mode, max_tick)

功能

对 io 操作队列增加设置捕获某个 IO 命令。

捕获的配置命令

参数

hwtimer_id

wKgZPGmemseAB4xVAAC3guTmCC0380.png

pin

wKgZPGmenC6AdPnjAACuxCrszac672.png

pull_mode

wKgZO2menqOAMVA0AADGhc1XZ0k696.png

irq_mode

wKgZPGmenrOAYRbvAADwzkMfTSM420.png

max_tick

wKgZPGmensKAfxNLAAHlQgVWB04466.png

返回值

无返回值。

示例

wKgZO2mentSAT7y2AAIVhZKSgPQ973.png

ioqueue.capture(hwtimer_id)

功能

对 io 操作队列增加捕获一次 IO 状态命令。

捕获的执行命令,必须先经过 ioqueue.set_cap 配置后才能使用 ioqueue.capture 来捕获,一个 set_cap 配置可以被多个 capture 命令复用

参数

hwtimer_id

wKgZO2menz-ARfYoAADcnUdsbg4622.png

返回值

无返回值。捕获的数据需要通过 ioqueue.get 获取。

示例

wKgZPGmen0-ANKpJAAAmvyWFqOg648.png


ioqueue.cap_done(hwtimer_id, pin)

功能

对 io 操作队列结束捕获某个 IO 命令。

使用场景:

1.捕获任务完成时 :主动结束,告诉系统数据读取完成,停止 gpio 捕获

2.切换捕获目标时:比如从捕获 gpio1 切换到捕获 gpio2,需要先结束捕获 gpio1。

3.错误处理或者提前退出时调用。

参数

hwtimer_id

wKgZPGmemseAB4xVAAC3guTmCC0380.png

pin

wKgZPGmenC6AdPnjAACuxCrszac672.png

返回值

无返回值。

示例

wKgZPGmen4SAdlZ8AAA7A-yGSlM447.png

ioqueue.get(hwtimer_id, input_buff, capture_buff)

功能

获取 io 操作队列中输入和捕获的数据。

注意事项

input,set_cap,capture 这三个配置接口配置的功能,缓存到的输入数据和捕获数据,都是通过 get 接口来读取出来

input_buff ← 存储 ioqueue.input() 的即时电平采样结果

capture_buff ← 存储 ioqueue.capture() 的边沿事件 + 时间戳

input_cnt = 成功的 ioqueue.input() 操作数量

capture_cnt = 成功的 ioqueue.icapture() 操作数量(可能因超时而小于计划数)

参数

hwtimer_id

wKgZPGmemseAB4xVAAC3guTmCC0380.png

input_buff

wKgZO2meoLyAYHDnAAEFs_4x3KE233.png

capture_buff

wKgZO2meoMyAZMi0AAEJElU_tBg594.png

返回值

local input_cnt, capture_cnt = ioqueue.get(hwtimer_id, input_buff, capture_buff)

input_cnt

wKgZO2meoOKAGaN5AABzNIC6xDM624.png

capture_cnt

wKgZPGmeoPKAP9wYAABzvILJ0Vo416.png

示例

wKgZPGmeoQSAHpVzAABLNegMC8w442.png

ioqueue.start(hwtimer_id)

功能

启动 io 操作队列。

参数

hwtimer_id

wKgZPGmemseAB4xVAAC3guTmCC0380.png

返回值

无返回值。

示例

wKgZPGmeoW2APevgAAAl7U8ahuo615.png


ioqueue.stop(hwtimer_id)

功能

停止 io 操作队列,可以通过 start 从头开始。

参数

hwtimer_id

wKgZPGmemseAB4xVAAC3guTmCC0380.png

返回值

local loop_cnt, cmd_cnt = ioqueue.stop(hwtimer_id)

loop_cnt

wKgZO2meoY-AI-WgAACCMsnAiHU370.png

cmd_cnt

wKgZPGmeoaCAWp1kAADJEUZgAtc651.png

示例

wKgZPGmeobWACAncAAB0I2JYXu4534.png

ioqueue.release(hwtimer_id)

功能

释放 io 操作队列的资源,下次使用必须重新 init。

参数

hwtimer_id

wKgZPGmemseAB4xVAAC3guTmCC0380.png

返回值

无返回值。

示例

wKgZPGmeoo6AGn-RAAAl3phtFgE927.png


ioqueue.clear(hwtimer_id)

功能

清空 io 操作队列。

此接口重置了命令队列但保留了硬件定时器资源,可以直接添加新的命令。前提是你确信之前队列的状态完全被清空,且新的命令序列与之前的结构兼容。

参数

hwtimer_id

wKgZPGmemseAB4xVAAC3guTmCC0380.png

返回值

无返回值。

示例

wKgZPGmeoraAMPv4AAAlj7Myy1Y955.png


ioqueue.done(hwtimer_id)

功能

检测 io 操作队列是否已经执行完成。

参数

hwtimer_id

wKgZPGmemseAB4xVAAC3guTmCC0380.png

返回值

local is_done = ioqueue.done(hwtimer_id)

is_done

wKgZPGmeot-AQ5FoAABs4C4zxps860.png

示例

wKgZPGmeou2AXmEBAACa1FRgBfQ671.png

ioqueue.exti(pin, pull_mode, irq_mode, onoff)

功能

启动/停止一个带系统 tick 返回的外部中断。

ioqueue.exti 是一个独立的外部中断接口,与 ioqueue 队列系统完全分离,提供简单的 GPIO 边沿事件捕获功能。

使用场景:简单的按键检测、传感器状态监控、旋转编码器计数

参数

pin

wKgZPGmenC6AdPnjAACuxCrszac672.png

pull_mode

wKgZO2mepY2AF1p9AADEvpwMe9I475.png

irq_mode

wKgZO2mepZyAchscAADvAwqzrHY186.png

onoff

wKgZO2mepayAeZbeAACrMWOHUB4938.png

返回值

无返回值。

示例

wKgZPGmepb-ALWiYAAGfZJHHmdI870.png

五、模组支持说明

仅支持 Air700EXX 系列、Air780EXX 系列、Air8000 系列模组,Air6101/Air8101 不支持此功能。


今天的内容就分享到这里了~

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • IO
    IO
    +关注

    关注

    0

    文章

    510

    浏览量

    42861
  • 存储
    +关注

    关注

    13

    文章

    4881

    浏览量

    90251
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    华大九天Liberal IO精准K库解决方案介绍

    在芯片先进工艺持续迭代、接口场景日趋复杂的当下,IO单元已成为决定信号完整性、传输效率与设计可靠性的核心载体。从基础IO到高速IO、Flash IO等,多样
    的头像 发表于 04-13 16:11 156次阅读
    华大九天Liberal <b class='flag-5'>IO</b>精准K库解决方案介绍

    深度解析DS1830/A复位序列器:特性、操作与应用

    深度解析DS1830/A复位序列器:特性、操作与应用 在电子系统设计中,复位序列器是确保系统稳定启动和可靠运行的关键组件。今天我们就来深入探讨DALLAS SEMICONDUCTOR(
    的头像 发表于 02-28 15:10 271次阅读

    JSON:简洁代码高效搞定序列化与反序列化

    面对频繁的数据交互需求,用最简方式实现JSON序列化与反序列化已成为开发者必备技能,借助主流库,轻松实现零负担数据转换。JSON(JavaScriptObjectNotation)是一种轻量级
    的头像 发表于 02-25 19:04 211次阅读
    JSON:简洁代码高效搞定<b class='flag-5'>序列化</b>与反<b class='flag-5'>序列化</b>

    IO序列化操作:提升系统互操作性的关键技术

    在异构系统并存的今天,IO序列化操作成为实现系统间互操作性的核心技术。通过标准的数据格式(如JSON、Protobuf、Hessian等)
    的头像 发表于 02-25 16:02 182次阅读
    <b class='flag-5'>IO</b><b class='flag-5'>序列化</b><b class='flag-5'>操作</b>:提升系统互<b class='flag-5'>操作</b>性的关键技术

    极简代码,搞定JSON序列化与反序列化

    快速实现JSON数据的生成(序列化)与解析(反序列化)。 目前json库已全面支持LuatOS开发系列产品,开发者可根据项目实际需求,灵活选用并进行快速集成与开发。 一、 JSON基础要点 在
    的头像 发表于 02-23 21:46 429次阅读
    极简代码,搞定JSON<b class='flag-5'>序列化</b>与反<b class='flag-5'>序列化</b>

    掌握 LuatIO:GPIO 复用模式初始配置流程解析

    在使用 LuatIO 进行嵌入式应用开发时,合理配置 GPIO 的复用功能是实现外设控制的前提。本文全面解析 GPIO 引脚由普通 IO 转换为复用功能引脚的初始流程,包括时钟使能、模式选择、速度
    的头像 发表于 01-23 15:28 2264次阅读
    掌握 LuatIO:GPIO 复用模式初始<b class='flag-5'>化</b>配置<b class='flag-5'>全</b>流程<b class='flag-5'>解析</b>

    深入剖析LMH0030:SMPTE标准数字视频序列化器的卓越之选

    深入剖析LMH0030:SMPTE标准数字视频序列化器的卓越之选 在当今数字的时代,数字视频处理技术日新月异。对于电子工程师而言,选择一款性能卓越、功能丰富的数字视频序列化器至关重要。今天,我们
    的头像 发表于 12-30 14:00 409次阅读

    深入解析LM2512A:高性能RGB显示接口序列化

    深入解析LM2512A:高性能RGB显示接口序列化器 在电子设备的显示领域,如何高效、稳定地传输高质量的图像数据是一个关键问题。TI的LM2512A作为一款专门的移动像素链路(MPL - 1)24位
    的头像 发表于 12-26 11:30 549次阅读

    SN65HVS885:工业自动的理想数字输入序列化

    SN65HVS885:工业自动的理想数字输入序列化器 在工业和建筑自动领域,对于高通道密度数字输入模块的需求日益增长。德州仪器(TI)的SN65HVS885作为一款八通道数字输入序列化
    的头像 发表于 12-25 11:00 570次阅读

    深度解析DS90UH929-Q1:720p HDMI 到 FPD-Link III 桥接序列化

    深度解析DS90UH929-Q1:720p HDMI 到 FPD-Link III 桥接序列化器 在电子工程师的日常工作中,选择一款合适的器件来实现特定功能至关重要。今天,我们聚焦于德州仪器(TI
    的头像 发表于 12-22 15:50 530次阅读

    DS90UH947-Q1:1080p OpenLDI至FPD - Link III序列化器的深度解析

    DS90UH947-Q1:1080p OpenLDI 至 FPD - Link III 序列化器的深度解析 在当今的电子设备领域,视频传输技术的发展日新月异,对于高质量、高速率视频传输的需求也越来越
    的头像 发表于 12-22 15:40 467次阅读

    GraniStudio:IO初始以及IO资源配置例程

    IO资源配置.gsp文件,点击打开,完成导入。 2.功能说明 实现连接格拉尼控制器IO块以及配置输入输出IO点。 2.1通过初始IO算子连
    的头像 发表于 08-22 17:34 1045次阅读
    GraniStudio:<b class='flag-5'>IO</b>初始<b class='flag-5'>化</b>以及<b class='flag-5'>IO</b>资源配置例程

    TaskPool和Worker的对比分析

    TaskPoolWorker内存模型线程间隔离,内存不共享。线程间隔离,内存不共享。 参数传递机制采用标准的结构克隆算法(Structured Clone)进行序列化、反序列化,完成参数传递。 支持ArrayBuffer
    发表于 06-18 06:43

    鸿蒙5开发宝藏案例分享---跨线程性能优化指南

    程直接卡住! 二、宝藏工具:DevEco Profiler 序列化检测 1️⃣开启步骤 打开DevEco Studio → Profiler → 选择Frame模板 点击录制 → 操作应用触发跨线程通信
    发表于 06-12 17:13

    快手上线鸿蒙应用高性能解决方案:数据反序列化性能提升90%

    普通对象(如 JSON 数据)与类实例进行互转,是实现面向对象编程与数据序列化解耦的核心工具。随着业务复杂度的提升,该库在反序列化过程中逐渐暴露出性能瓶颈,影响用户核心体验。因此
    发表于 05-15 10:01