- 博客(34)
- 资源 (17)
- 收藏
- 关注
原创 第 4 篇:Embassy 异步运行时与事件驱动架构
摘要 本文介绍了在ESP32-C3电子墨水屏阅读器项目中使用的Embassy异步运行时框架及其事件驱动架构设计。Embassy作为嵌入式异步运行时,通过Rust的async/await语法实现轻量级协作式任务调度,避免了上下文切换开销。文章详细阐述了Embassy的核心机制,包括任务创建、.await的调度原理、select多路复用技术,并展示了项目中的9个并发任务分工。重点分析了基于发布-订阅模式的事件系统设计,包含5种事件类型和3种监听注册方式,实现了从GPIO电平变化到页面响应的完整事件传递链。该架构
2026-07-22 21:17:25
231
原创 第 3 篇:电子墨水屏驱动与渲染架构
本文介绍了使用Rust开发ESP32-C3电子墨水屏阅读器的驱动与渲染架构。电子墨水屏(EPD)通过带电粒子移动显示内容,具有断电保持特性,但刷新慢且存在鬼影问题。文章详细解析了屏幕工作原理、驱动层实现(包括SPI设备类型和初始化流程)以及创新的生产者-消费者渲染架构。该架构通过Channel解耦页面渲染与硬件操作,页面代码只需绘制到帧缓冲区并发送请求,由独立任务处理SPI通信和屏幕刷新,避免了阻塞并确保串行化访问。项目支持多种屏幕尺寸,通过条件编译实现统一抽象。
2026-07-22 21:09:22
288
原创 第 2 篇:硬件抽象与 SPI 总线共享
本文介绍了在Rust嵌入式开发中如何实现硬件抽象和SPI总线共享,重点关注ESP32-C3电子墨水屏阅读器项目的实践。主要内容包括: esp-hal硬件抽象设计 通过所有权机制确保外设唯一性 GPIO引脚配置采用Builder模式 SPI总线配置与引脚分配 SPI总线共享方案 使用CsMutex和CriticalSectionDevice实现安全共享 通过临界区互斥锁防止并发冲突 比较不同锁类型的适用场景 全局状态管理 介绍多种Rust模式处理硬件资源共享 说明如何平衡所有权与全局访问需求 该方案利用Rus
2026-07-21 21:46:38
259
原创 第 1 篇:项目全景 — 从零搭建 ESP32-C3 嵌入式 Rust 开发环境
这篇文章介绍了如何在ESP32-C3微控制器上搭建嵌入式Rust开发环境,用于构建电子墨水屏阅读器项目。主要内容包括: 使用#![no_std]和#![no_main]进行嵌入式开发,不依赖标准库和操作系统 ESP32-C3的RISC-V架构特点及Rust生态支持 工具链配置: 目标三元组riscv32imc-unknown-none-elf 安装espflash等工具 配置Cargo构建选项 项目依赖关系: ESP官方生态库(esp-hal等) Embassy异步框架 图形处理库 该项目充分利用Rust的
2026-07-21 21:26:38
569
原创 esp-idf dsi 屏幕的驱动实现原理—— 关于零拷贝和 DMA 永续刷新
本文分析了ESP-IDF中DSI屏幕DPI模式的驱动实现,主要涉及以下内容: DBI和DPI分工:DBI用于命令控制,DPI负责图像数据传输,通过DMA持续发送显示数据。 缓冲区管理: 内部已分配缓冲区,可通过num_fbs参数设置最多3个缓冲区防止画面撕裂 使用heap_caps_aligned_calloc进行缓存对齐分配 通过esp_lcd_dpi_panel_get_frame_buffer获取内部缓冲区指针 绘制流程: esp_lcd_panel_draw_bitmap调用具体面板实现 通过智能判
2026-05-29 22:24:52
382
原创 esp-idf 中 mipi dsi 使用的笔记
本文分享了基于ESP32-P4驱动ST7701 MIPI屏幕的开发笔记。重点解析了MIPI DSI接口的工作原理,包括DBI(命令模式)和DPI(视频模式)的区别,以及初始化流程的7个关键步骤:1)开启PHY电源;2)创建DSI总线;3)配置DBI接口;4)设置DPI参数;5)创建面板实例;6)硬件复位;7)初始化并开始传输数据。文章提供了详细的时序参数配置示例和初始化代码片段,特别强调了DSI速率(mbps)与像素时钟频率(MHz)的计算方法,并附有乐鑫官方文档参考链接。该实现使用了esp_lcd_st7
2026-05-29 19:30:00
366
原创 佳能g3800常见故障
佳能G3800打印机常见故障及解决方法汇总:包括打印不出墨(清洗喷头)、墨水量不足(加墨)、5200报错(加墨解决)、卡纸(直接抽出)、进纸不顺(检查异物)、B202错误(清洗废墨仓并用吹风机除湿)等。重点介绍了5B00废墨仓满错误的清零步骤:拆后盖清理废墨仓,通过特定按键组合进入维修模式完成清零。对于B202/B204主板故障,建议更换特定电阻(4.7k和2.7k)或尝试用10k电阻替代,实测有效。文章提供了详细的故障排查和维修指导。
2026-05-27 20:15:00
145
原创 Composer 私有仓库搭建
摘要:老旧PHP项目因依赖库版本过低导致冲突时,可使用Satis搭建私有Composer仓库。Satis通过配置文件生成元数据,配置需指定仓库名称、URL及要扫描的源仓库。关键配置包括require-all(是否镜像所有版本)、require(指定镜像包)、require-dependencies(是否递归镜像依赖)。构建后通过Nginx发布服务,若遇到HTTP连接问题需设置secure-http为false。Docker中使用时需确保私有库可访问。该方法有效解决依赖冲突问题。
2026-02-25 21:23:38
223
原创 opencode + playwright 实现AI编程到测试的迭代闭环
本文探讨了如何通过Playwright工具实现AI编程的自动化验证闭环。文章指出当前AI生成代码后仍需人工验证的问题,提出使用Playwright这一浏览器自动化框架,让AI能够自主验证和调试代码。详细介绍了Playwright的两种集成方式:基于skill的playwright-cli(节省token)和playwright-mcp(适合深度分析),并提供了OpenCode和ClaudeCode的具体配置方法。这种AI+自动化测试的组合将显著提升开发效率,减少人工干预。
2026-02-25 19:23:35
2207
2
原创 基于esp32p4 的掌机
硬件结构:主控 esp32p4 模组,屏幕 2.8 寸 mipi lcd, 音频使用ns4168 , 充电tp4056 再加上 dcdc。因为基于retro-go ,所以主要的工作就是驱动屏幕,retro-go 本身只支持了一个spi 的屏幕, mipi dsi 需要自己实现,又因为选用的这个屏st7701 的ic 不支持旋转处理,所以使用了esp32-p4 的ppa 进行旋转。基于esp32p4 做的一个掌机使用的2.8寸mipi 屏幕,这个玩意9月份就做完,一直没有整理笔记,今天随便发一下。
2026-01-20 19:01:12
311
原创 opencode 和claude code 配置数据库mcp 服务
使用 ai 编程过程中没和数据库打通,总是需要从数据库导出结构后拿到编辑工具中给模型,处理完后再拿着修改的sql 去数据库客户端再运行一下,让ai构建查询语句时也它自己也不能难总是要复制出来再去查询数据库,总之如果用mcp打通数据库后很多事情就不再需要人来从中再处理一次,ai可以自己连续的从数据库得到结构或数据,再生成 sql 继续到数据库中难证,这样的它可以自己迭代多次后得到一个正确的结果。,安装简单使用效果也还不错,这里记录分享一下,有同样需要的也可以参考使用。最好是直接参考 官方文档。
2026-01-20 18:43:01
3332
原创 基于esp32c3 rust embassy 的墨水屏程序
EPDReader是一款基于ESP32-C3的电子墨水屏阅读器,支持TXT阅读、天气预报、农历显示等功能。项目采用Rust no_std编程,在嵌入式开发中探索异步任务处理和低功耗设计。硬件包含4.2寸墨水屏、SD卡模块和电池供电系统,软件功能包括电子书阅读(支持分页/书签)、天气数据获取、日历显示(含农历/节假日)以及网络时间同步。目前存在同步显示、SD卡长文件名支持等技术问题待解决。该项目作为Rust嵌入式开发实践,代码已开源,体现了在有限资料环境下进行硬件编程的探索过程。
2025-09-10 20:53:54
645
原创 retro-go 1.45 编译及显示中文
本文介绍了在ESP32-S3开源掌机上适配retro-go模拟器的过程,重点解决了中文显示和性能优化问题。作者通过修改retro-go官方库(1.45版本),新增了中文字符支持,包括添加中文TTF字体转换功能,并启用了FATFS的UTF-8编码支持。针对中文列表浏览卡顿问题,深入分析了字库查询机制,提出通过建立索引数组优化字符查找效率的方案。文章详细说明了字体数据结构的改进方法,包括新增map类型支持和相关代码修改,最终实现了流畅的中文显示功能。这些优化方案已提交至作者修改后的retro-go分支(gith
2025-08-02 22:18:23
1328
10
原创 linux cups 打印服务
摘要:本文介绍了通过Linux服务器安装CUPS打印服务实现无线打印的方法。测试表明,佳能G3800(自带WiFi)和惠普1007(无WiFi)均可通过CUPS实现无线打印。关键步骤包括:安装CUPS服务,为佳能安装Gutenprint驱动、为惠普安装HPLIP驱动,配置CUPS服务并通过网页管理界面设置打印机。特别说明惠普1007需用hp-plugin-i下载固件。文章还解释了CUPS(打印系统核心)、HPLIP(惠普专用驱动)和Gutenprint(多品牌驱动)之间的关系,指出CUPS是服务框架,后两者
2025-06-27 21:35:21
1106
原创 关于内联的不确定性
摘要:Rust中的内联属性并不能保证函数一定会被内联,#[inline]仅是编译器参考建议。内联失败时可能导致自引用错误,如函数返回值在栈上被弹出后,内部自引用失效引发panic。Rust提供四种内联属性:默认由编译器决定、#[inline]建议内联、#[inline(always)]强制内联和#[inline(never)]禁止内联。注意内联是非传递性的,且不应依赖内联来实现关键功能,因其行为无法完全保证。(150字)
2025-06-27 21:11:18
907
原创 鱼缸远程、定时投饵
diy了一个鱼缸投饵的玩意,这还是年前做的,因为过年回老家,没人喂鱼了,挤了一天时间在以前远程开机的程序基础上搞了这么个东西来远程或定时投饵,一直忙,这两天没加班了整理了一下。通过这个远程控制的方法还可以做一些其他的功能,比如可以做远程开机把舵机用m3 胶粘在开机键旁,摆臂按下开关就可以开机,或者定时的做一些机械动作也挺不错的,我感觉还挺方便的有需要的可以拿去用。材料用到了esp32c3的开发板、一个sg90舵机、一个3d打印的支架和一个小可乐瓶。
2025-02-22 13:18:54
650
原创 milk-v duo 开机引导进入 rust 程序
milk-v duo 还是去年买的,又是esp32 又是rp2040 的,搞搞lcd 又搞搞墨水屏 又弄弄 memory lcd,乱得狠,啥都想玩玩,玩不过来,最近抽空看看 这块duo 想裸机跑下rust 试试。找了一圈总算是有些眉目,找到一些在 uboot 或 opensbi 后引导的方法,随即尝试了一下,成功通过串口打印出信息,记录一下。
2024-12-14 23:03:55
1010
原创 基于rp-pico 设计的MakeCode arcade 图形编程游戏机
基于rp-pico 设计的MakeCode arcade 图形编程游戏机
2024-10-19 18:07:50
1324
原创 驱动夏普1.26寸 memory lcd
买了几块 夏普的1.26寸 memory lcd 型号为 LS013B7DH07,这种屏幕显示有点像墨水屏,只是白色不是那么纯有点偏银灰的感觉,比普通墨水屏刷新快很多,在不刷新的情况下墨水屏显示更好,需要频繁刷新的情况下memory lcd 是更好的选择。
2024-10-18 19:30:00
1666
原创 严格与松散
但松散也有其优点,松散则更灵活,处理一个问题时相对严格的方法需要的步骤更少,需要的时间也就更少,可以快速按自己的想法来处理一些工作,往往一个想法都是随机性的,不可能一开始就能与严格的规则相匹配。如果一个项目超过半年则应该有强制按一定的规则约束进行,因为时间越长对之前的工作将不能很好的回忆,且时间长说明工作成果会相对更大,要查看所有的工作内容来确定某一个工作点的话会更难。但在长期的工作中如果不按照一套严格的规则约束进行,在处理一问题时如果按照严格的方法可能需要的步骤更多。这里只是记录一下自己当时当下的感受。
2023-03-10 14:32:50
228
原创 php 计算时间段内的工作日 与节假日
计算方法是取开始时间后的第一个星期一,如果结束时间大于等这一天则用第一个星期一至结束时间的时间的间隔取整周数与余数计算工作日与周末,再加上第一个周一前一周的工作日与节假日./** 计算时间段内的工作日 与节假日 * @param $begin_date \DateTime * @param $end_date \DateTime * @return array * @throws \Exception */static function computeDays($begin_dat.
2020-06-16 10:07:39
2045
原创 js 取当天、周、月、季、年 的时间段
function date_range(date_type){ let date = new Date(); if(date_type == "today"){ return [date,date]; }else if(date_type == "week"){ let week_day = date.getDay(); .
2020-06-16 10:03:48
358
原创 mysql 提示 Truncated incorrect DOUBLE value
提示如下Error Code: 1292. Truncated incorrect DOUBLE value: '2708543646-478735239'原因大多是因为where 中的某一个字段是varchar 型 ,而值存的数字,所以没有加单引号引起的。找到这个字段把值加上单引号应该就可以了,如果不可以,那抱歉你再搜搜?...
2020-05-15 16:35:36
569
原创 mysqlbench 没有output 区域
我的系统是ubuntu,windows 版本不知道是不是样,在执行sql 语句后没有返回执行时间与信息,如果是查询语句下面会显示数据列表,但是修改语句不显示任务成功与失败的信息,在菜单 view->panels->hide/show output area 切换也没用,我找了半天,才找到原因,原来是这个区域在最下没有显被拉出来,用鼠标在查询结果列表下边框附近晃动吧,鼠标会变成可拖动边框的状态,然后拖出来,真TMD坑,怪不得都宁愿用破解的 navicat 拖出来后...
2020-05-15 16:19:29
675
3
转载 informatica 学习日记整理(转)
1. INFORMATICA CLIENT的使用1.1 Repository Manager 的使用1.1.1 创建Repository。前提:a.在ODBC数据源管理器中新建一个数据源连接至你要创建Repository的数据库(例:jzjxdev)b. 要在你要连接的数据库中新建一个用户(例:name: ETL password: ETL)现在你可以创建一个Reposit
2013-12-03 14:27:56
2615
原创 编程学习习惯
<br />1.大学生活丰富多彩,会令你一生都难忘,但难忘有很多种,你可以学了很多东西而难忘,也会因为什么都没学到而难忘!<br /><br /> 2.计算机专业是一个很枯燥的专业,但即来之、则安之,只要你努力学,也会发现其中的乐趣的。<br /><br /> 3.记住:万丈高楼平地起!基础很重要,尤其是专业基础课,只有打好基础才能学得更深。<br /><br /> 4.C语言是基础,很重要,如果你不学好C语言,那么什么高级语言你都学不好。<br /><br /> 5.C语言与C++语言是两回事。就
2010-07-07 11:29:00
512
转载 CSS选择器
<br />CSS选择器<br />上节课我们讲了一下CSS通过什么方式去控制页面,如果不记得,我来帮大家回忆一 <br />下,总共有四种方式行内方式、内嵌方式、链接方式、导入方式,大家通过这四种 <br />方式就可以实现CSS对HTML页面样式的控制,如果要让这些样式对HTML页面中的元素 <br />实现一对一,一对多或者多对一的控制,这就需要用到CSS选择器,HTML页面中的元 <br />素就是通过CSS选择器进行控制的。 <br /><br />CSS选择器共有三种:标签选择器、ID选择器、类
2010-06-11 16:07:00
543
转载 jQuery插件
jQuery插件概述<br />jQuery 是继 prototype 之后又一个优秀的 Javascript 框架。其宗旨是—写更少的代码,做更多的事情。它是轻量级的 js 库(压缩后只有21k) ,这是其它的 js 库所不及的,它兼容 CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+)。 jQuery 是一个快速的,简洁的 javaScript 库,使用户能更方便地处理 HTML documents、events、实现动画效果,并且方便地为网
2010-06-10 09:55:00
412
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅