- 博客(487)
- 资源 (6)
- 收藏
- 关注
原创 Linux Kernel 4.4 `printk` 源码分析与使用详解
本文分析了Linux Kernel 4.4中printk的实现机制与使用方法。重点介绍了printk的8个日志级别及其控制策略,通过/proc/sys/kernel/printk可动态调整打印级别。文章详细剖析了printk的数据流架构,包括驱动层调用、内核缓冲区存储、控制台过滤和硬件输出四个阶段。在源码层面,解析了printk入口函数、NMI安全机制、核心处理函数vprintk_emit以及控制台输出逻辑console_unlock的实现细节,揭示了消息过滤和分发的底层机制。
2026-01-07 21:45:48
563
原创 在 Ubuntu 18.04 (WSL) 上配置 LazyVim
摘要: 在Ubuntu 18.04(WSL)上配置LazyVim面临GLIBC版本过低(2.27)和Tree-sitter依赖问题。解决方案包括:1)使用Homebrew替代apt管理软件包,安装新版Neovim(≥0.10);2)通过Rust手动编译兼容的Tree-sitter-cli(v0.22.6),并创建软链接覆盖Mason自动安装的版本;3)安装LazyVim并修复Locale和字体设置。该方法成功绕过了系统限制,实现了现代化Neovim体验,尽管checkhealth可能显示版本警告,但功能完全
2026-01-07 19:09:49
456
原创 【嵌入式开发】WSL2 终极环境搭建:Windows TFTP + WSL NFS 挂载指南
摘要:WSL2嵌入式开发环境搭建指南(Windows TFTP + WSL NFS) 本文介绍了一种高效的嵌入式Linux开发方案,利用Windows 11的WSL2"镜像网络模式"实现混合架构开发环境: 内核传输:通过Windows端的Tftpd64实现TFTP服务 根文件系统:通过WSL2(Ubuntu)搭建NFS服务器,保持完整Linux权限 网络配置:详细说明了镜像网络设置、防火墙配置和IP共享方法 开发板配置:提供完整的U-Boot环境变量设置方案 问题排查:总结了常见问题的解
2026-01-07 11:57:29
576
原创 在 Ubuntu 18.04 旧系统上部署新版 GitHub Actions Runner 的终极方案
本文分享了在Ubuntu 18.04旧系统上部署新版GitHub Actions Runner的解决方案。针对GLIBC版本冲突问题,采用Docker+SSH分离架构:Runner运行在Ubuntu 20.04容器中,通过SSH连接宿主机执行编译任务。文章详细记录了网络配置、容器化部署、SSH免密登录、脚本化管理及内存优化等关键步骤,最终实现了旧编译环境与新Runner的兼容共存,解决了嵌入式项目CI/CD的部署难题。该方案无需重构项目或升级硬件,通过容器化和资源优化实现了低成本自动化。
2026-01-06 17:21:09
796
原创 Android 12 RK3588平台电源菜单深度定制指南
Android 12 RK3588电源菜单定制指南摘要 本文详细介绍了在Android 12 RK3588平台上深度定制电源菜单的全过程。首先分析了定制电源菜单的必要性(品牌差异化、功能扩展等)和技术挑战(系统组件修改复杂度)。通过逆向工程定位到核心源码文件GlobalActionsDialogLite.java和布局文件global_actions_grid_lite.xml。
2025-12-26 15:37:34
1061
原创 在安卓设备上测试 AWS S3 下载速度的完整指南
本文详细介绍了在安卓设备上测试AWS S3下载速度的方法。通过Termux和AWS CLI的组合,无需Root即可搭建轻量级测试环境。步骤包括:安装Termux、配置AWS CLI、编写测速脚本、执行测试并分析结果。文章还提供了常见问题解决方法及优化建议,如使用大文件测试、多次运行取平均值等。该方法成本低、易复现,适用于移动开发、边缘计算和网络性能调优等场景,能有效验证特定网络环境下AWS S3的实际访问性能。
2025-12-19 09:41:34
600
原创 Godot GDExtension 4.5 windows编译记录
本文记录了将Godot GDExtension插件从Mac移植到Windows(MSVC)时遇到的编译问题及解决方案。主要问题包括:1) reinterpret_cast转换失败和_gde_UnexistingClass报错,原因是MSVC成员指针优化;2) Windows头文件污染;3) 链接器找不到库文件。解决方案:1) 使用PIMPL模式隔离核心逻辑;2) 添加MSVC的/vmg编译选项解决成员指针问题;3) 调整SCons构建脚本处理库文件名。最终提供了精简的SConstruct配置、采用PIMPL
2025-12-15 10:57:58
788
原创 画画抓型学习总结
抓型艺术是绘画的基础技能,本文总结了从工具使用到进阶技巧的完整方法。关键点包括:利用九宫格和转折点简化形状,按一二三级型逐步细化,采用红线检查等纠错方法,并强调手臂发力绘制长线条。建议通过2-4小时的日常练习,结合正确的心理预期,循序渐进地提升抓型能力。持续实践是掌握这项核心技能的关键。
2025-12-11 11:42:30
245
原创 在 RK3588 上彻底禁用 HDMI 音频输出
摘要: 本文详细介绍了在RK3588平台上彻底禁用HDMI音频输出的完整解决方案。首先通过分析audio_policy_configuration.xml文件定位问题根源,手动修改验证后删除HDMI相关配置。随后将修改固化到AOSP源码,重点说明了正确的编译刷机方法(必须使用update.img而非fastboot)。文章总结了常见错误及解决方法,并强调该方案仅影响音频输出,不影响HDMI视频功能。这套从临时调试到源码固化的完整流程,特别适用于数字标牌等需要强制使用板载喇叭的嵌入式场景。
2025-12-11 08:21:12
746
原创 如何解包 Android boot.img 并检查 UART 是否启用
本文详细介绍了如何解包 Android 设备的 boot.img 并检查 UART 是否启用(以 RK3588 为例)。主要内容包括:使用 AOSP 工具 unpack_bootimg 解包 boot.img
2025-12-10 14:38:44
680
原创 修复 macOS 下 Godot-CPP 链接丢失 TLS 符号 (__ZTW) 问题记录
记录修复 macOS 下 Godot-CPP 插件因 TLS 符号缺失导致的加载崩溃问题。当使用 Clang 编译 Godot 4.5.1 GDExtension 插件时,静态库优化会剔除未显式调用的 TLS Wrapper 函数(__ZTW符号),导致动态库加载失败。
2025-12-03 21:29:58
446
原创 AOSP多板卡配置修改过程记录
本文介绍了基于同一AOSP代码仓库适配多款硬件设备的策略。核心思路是通过构建系统的"配置三角"机制实现差异化定制:1)通过AndroidProducts.mk注册新产品;2)在BoardConfig.mk中定义硬件参数;3)在产品配置.mk文件中定制软件内容。该方案通过继承通用配置并覆盖差异化配置,避免了代码重复维护,特别适用于同平台不同外设的硬件变种。文中以RK3588平台为例,展示了如何通过修改设备树、WiFi驱动等关键配置来适配新硬件Apollo。
2025-11-26 19:31:21
39
原创 GDExtension学习
本文介绍了Godot引擎与原生共享库交互的三种方法,并详细展示了使用godot-cpp创建GDExtension的完整流程。首先说明了gdextension_interface.h、extension_api.json和*.gdextension三种交互方式,然后逐步演示了从环境配置到实际开发的步骤:确定Godot版本号、安装SCons编译工具、创建项目目录、下载和编译godot-cpp库、创建空Godot项目,最后实现了简单的Sprite2D扩展类GDExample。通过这个示例可以了解如何将C++代码编
2025-11-14 08:22:46
900
原创 WSL2 安装失败终极排查:安全软件静默拦截 vmcompute 服务
最近我在 Windows 上尝试安装 Windows Subsystem for Linux 2(WSL2),用于日常开发。安全管家在后台阻止了 vmcompute 服务的启动,导致 WSL2 无法创建轻量级虚拟机,从而报错 HCS_E_SERVICE_NOT_AVAILABLE。DISM /RestoreHealth → 失败(错误 0x800f0915),因预览版无公开修复源,可忽略。这不是系统损坏,也不是配置错误,而是安全管家主动拦截(我哪天发神经关掉了)。服务存在,但无法启动,且无详细错误码;
2025-11-07 19:12:49
1025
2
原创 3588 AP6275s的Wifi驱动升级记录
从瑞芯微的厂商那要到了新的 bcmdhd_101.10.591.91.39.tar.gz 解压发现。检查 Makefile 确认编译文件夹是 bcmdhd。编译通过后替换 wifi 供应商提供的固件。搜索相关的编译参数,并移除后重新编译。在我的 3588 的镜像里搜索。重新烧录后,wifi 固件从。
2025-10-30 13:18:09
100
原创 nvim的cpp代码里使用cpplint提醒
conform.nvim 的一个非常好的功能是,当使用像 prettier 这样的格式化程序时,它会检查你的 node_modules 中是否存在该版本,并改用该版本。如果你使用的是 Mac 或 Linux,配置应该在 ~/.config/nvim 在 Windows 上它应该位于 ~/AppData/Local/nvim/在 ~/.config/nvim/lua/[name]/plugins/lsp/ 下添加 mason.lua 文件。还有其他可能的原因,例如格式化程序未安装。
2025-09-08 09:10:48
826
原创 ubuntu24下keychorn键盘连接不了的改建页面的问题修复
网页:https://launcher.keychron.com/#/keymap。chrome 没有访问权限,打开chrome://device-log/发现/dev/hidraw4 无法连接,没有权限。刷新连接网页后能正常连接。
2025-08-12 21:53:57
305
原创 Android系统启动流程学习(五).MainActivity启动过程
这里的 mH 指的是H,它是 ActivityThread 的内部类并继承自 Handler,是应用程序进程中主线程的消息管理类。因此,虽然 ApplicationThread 的存在是为了让应用进程能够与 AMS 通信,但它并不是在 Zygote 初始化阶段创建的,而是在应用进程启动之后,由该进程内部自行创建并初始化的。根 Activity 启动过程中涉及 4 个进程,分别是 Zygote 进程、Launcher 进程、AMS 所在的进程(SystemServer 进程)、应用程序进程。
2025-04-18 14:01:03
1084
原创 ubuntu1804服务器开启ftp,局域网共享特定文件给匿名用户
可以使用vsftpd(Very Secure FTP Daemon)来实现。首先,安装vsftpd编辑vsftpd指定匿名用户的根目录为(你可以根据需要更改此路径)。假设你希望共享设置目录的所有者和组如果你的系统启用了防火墙(如ufw),需要开放 FTP 相关端口。从另一台设备(例如 Windows 或其他 Linux 设备)访问 FTP 服务器。可以使用浏览器、命令行工具或 FTP 客户端。
2025-04-16 10:20:12
879
原创 Android系统启动流程学习(四)应用程序进程启动过程
想要启动一个应用程序,必须先启动应用程序进程。AMS 启动应用程序时先检查需要的进程是否存在,不存在就请求 Zygote 进程启动进程。Zygote 启动时的 Socket 就是用来等待 AMS 的新建应用进程的请求的。Zygote 通过 fork 自身创建应用程序进程,这样就能继承 Zygote 启动时的虚拟机实例,同事也创建了 Binder 线程池和消息循环,这样就能方便的进行 Binder 进行进程间通信以及处理消息了。
2025-03-27 11:50:24
951
原创 Android系统Launcher启动流程学习(三)Launcher启动流程
系统启动的最后一步是启动一个应用程序用来显示系统中已经安装的应用程序,并作为这些安装程序的启动入口,这个应用程序就是Launcher。上面得知SystemServer 进程启动中会启动很多其他的服务,其中一个就是 ActivityManagerService,在 startOtherServices 中会调用 AMS 的 systemReady() 方法将 Lanuncher 启动起来。
2025-03-26 11:26:35
867
原创 Kotlin标准函数库学习
apply:apply 函数可看作一个配置函数:你可以传入一个接收者,然后调用一系列函数来配置它以便使用。takeUnless 和takeIf 唯一的区别是:只有判断你给定的条件结果是false 时,takeUnless 才会返回原始接收者对象。它们的功能行为是一样的,但with 的调用方式不同。takeIf:和其他标准函数有点不一样,takeIf 函数需要判断lambda中提供的条件表达式(叫predicate),给出true 或false 结果。apply 可以用在初始化时,的不断引用的情况。
2025-03-18 14:02:14
422
原创 使用tslib调试触摸问题
执行命令脚本,或把下面这些环境变量添加进当前用户。然后在/etc/ld.so.conf里添加。然后就可以使用ts_print进行调试了。一、在开发板上下载tslib。并运行ldconfig更新库。
2025-03-12 15:21:24
330
原创 编译aws-sdk-cpp的s3库 windows和mac
windows下使用cmake和msvc2017x64来编译aws sdk cpp库
2024-10-24 14:33:45
1154
2
原创 qtcreator的vim模式下commit快捷键ctrl+g,ctrl+c没有反应的问题
qtcreator在vim模式下ctrl快捷键没反应,修改办法
2024-08-24 10:13:35
541
原创 RK3588 AB镜像升级学习(一)
这里的步骤跟生成system.img基本一致,宏函数build-userdataimage-target内通过build_image.py来将$(PRODUCT_OUT)/data目录内容打包生成userdata.img,不同的是,这里不再需要放入ramdisk的内容。对比A/B系统下boot.img生成方式和非A/B系统下recovery.img的生成方式,基本上是一样的,所以A/B系统下的boot.img相当于非A/B系统下的recovery.img。
2024-05-31 15:00:33
2979
原创 ADIL简单测试实例
这个连接是Java的代码,我根据它的链接写了一个kotlin版本的。(Android Interface Definition Language)是Android平台上用于进程间通信(IPC)的一种接口定义语言。它允许不同进程中的组件(如服务和服务、服务和活动等)相互通信。AIDL是Android平台上实现跨进程通信的重要工具,它为开发者提供了一种方便、高效的方式来实现不同进程间的数据交换和方法调用。
2024-05-28 18:50:59
1596
1
原创 香橙派 AIpro使用评测
在本项目中,我们通过使用Sysbench这一强大的性能测试工具,对OrangePi AIpro AI芯片和RK3399芯片进行了深入的性能对比。测试配置为32个线程,持续时间为30秒,每2秒报告一次结果,以确保获得详尽且准确的性能数据。通过对比分析,我们发现了OrangePi AIpro AI芯片在CPU性能方面的一些显著优势,这些优势使其在处理多线程和高负载任务时表现更为出色。
2024-05-28 08:50:33
1413
原创 kotlin 编写一个简单的天气预报app (七)使用material design
更新了(六)中的代码,增加了搜索显示城市列表,点击城市显示对应的天气
2024-04-27 14:26:45
1386
2
原创 qtcreator使用远程服务器编译代码
我并没有找到很好的windows上可以用的rsync工具,最后是装了wsl来调用rsync同步到代码后,在用ssh调用linux命令来编译的。安装wsl安装ubuntu启动wsl然后把windows里的ssh文件证书和配置复制到wsl里同时config的key目录需要改一下,这样就可以登录服务器了然后在home目录创建build.sh进行远程编译。
2024-03-20 19:25:39
1121
原创 Docker启动时出错问题记录
检查 net start com.docker.service 是否启动。检查windows的Hyper-V是否启动。
2024-01-27 11:13:03
1250
原创 android软件全屏时,输入法显示的输入框位置代码
在输入密码框时,点击密码输入框,会跳出软键盘,同时附带一个输入框:这个输入框并不随输入法设置,而是一个系统自带的配置。当这个密码以明文的方式显示时,输入网址或者ip,长按后能够打开浏览器。这是我不希望出现的。
2024-01-18 17:05:03
463
STM32F4xx_DSP_StdPeriph_Lib_V1.4.0.zip
2020-07-26
template_FWLib.zip
2020-07-26
正则表达式判断sda1和sda
2022-08-13
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅