- 博客(102)
- 收藏
- 关注
原创 基于 C 语言的多态机制的驱动架构
/ 多态的核心} device_t;点内容语言C语言,不支持类/继承,使用结构体+函数指针实现多态优点解耦、易扩展、统一接口应用操作系统设备驱动抽象、文件系统驱动、网络驱动等框架RT-Thread、rthread、LiteOS 等都采用类似模型每个多态类对象内部都有一个隐含的虚函数表指针(vptr)这个虚函数表(vtable)是一个函数指针数组当你调用一个虚函数时,实际就是通过 vtable 查找并调用具体的实现。
2025-08-07 15:12:34
799
原创 linux2.6 和 unix-v6 源码实验
你可以通过实现 Linux 2.6.x 的源码级图形调试,能看到源码、变量、寄存器,非常适合研究内核启动过程。同理,可以编译 unix-v6 (https://github.com/mit-pdos/xv6-public.git)以下是使用xv6‑public(xv6 的 x86 版本)在 Ubuntu/Linux 上安装、编译、运行、调试的详细中文指南。如果你想使用 RISC‑V 版本(xv6‑riscv),后续内容里也有说明。面向 Intel x86 架构,使用 ELF 格式。
2025-08-03 20:38:15
1262
原创 嵌入式驱动分层设计
驱动层].c -----> [上层接口].h[上层接口].h <----- [驱动层].c也就是说,驱动层不主动包含上层代码,而是由上层提供接口头文件和回调注册机制,驱动自己注册进去驱动层不依赖上层实现上层框架不关心具体驱动实现模块解耦,便于添加、替换和移植驱动对比项RT-Thread 驱动模型Linux 驱动模型模块关系上层框架暴露注册接口,驱动模块注册平台设备绑定驱动,驱动通过接口注册是否解耦✅ 完全解耦✅ 完全解耦实现方式结构体 + 回调函数注册+ 接口结构体优点。
2025-07-31 18:06:31
885
原创 使用 Docker 运行 macOS 虚拟机
配置项作用示例持久化存储映射保留虚拟机磁盘文件端口映射宿主机访问虚拟机服务(SSH),(Web UI)环境变量配置虚拟机参数祝你玩转 Docker macOS 虚拟机愉快!
2025-05-31 21:15:08
1419
原创 armbian 滚动更新锁定
H3 在armbian 滚动更新Linux nanopineo 6.12.43-current-sunxi 后,usb g_serial 用不了,只好回刷6.1.63 版本,锁定内核防止更新。
2025-10-18 22:38:57
311
原创 You Only Look Once
相比传统方法,YOLO 以“端到端”的方式一次性预测所有物体的位置和类别,速度非常快,因此被广泛用于自动驾驶、监控、机器人视觉等场景。是的,YOLOv5 提供了官方的 Docker 镜像,您可以轻松地在 Docker 容器中运行 YOLOv5,包括。好的,我们先确认你的摄像头在本地(宿主机)能正常工作,而不涉及 Docker。:为了持久化训练结果和模型,建议将容器的输出目录挂载到本地磁盘。,现在在容器内可以直接运行 YOLOv5 的训练和推理脚本。:如果您的系统支持 GPU,可以在运行容器时添加。
2025-09-11 21:05:10
1059
原创 Adafruit_nRF52_Bootloader 使用 uf2
从这个信息来看,UF2 文件被正确生成了,但你说刷入后。表示 UF2 的固件会被写入 MCU 的。
2025-09-02 19:50:01
386
原创 芯片的可编程字
→ 用,保护可撤销,但必须整片擦除。LPC1700→ 用CRP 字,分级保护,CRP3 是永久锁死。→ 用,保护可解除但需全擦。ESP32→ 用eFuse配置安全,部分位是一次性不可逆(比如禁止 JTAG、开启加密)。⚠️注意事项一旦启用了读保护/安全位,再想解除时往往要全片擦除,意味着你会失去原来的固件。对 ESP32 这类用eFuse的芯片,要特别小心,因为一旦写死,就无法恢复。→ Option Bytes(可通过 HEX 配置,但常用专门工具)。LPC1700。
2025-09-01 18:59:16
1108
原创 nrf52840 flash 分区
这个告诉 bootloader “我要升级的固件是谁”(bin + dat)。声明对硬件 / 版本 / SoftDevice的要求。提供CRC 校验确认固件是否完整。不会破坏 bootloader→ 因为 manifest 只指向应用区(不会覆盖 bootloader 区域)。如果device_type / softdevice_req 不匹配,bootloader 会拒绝升级,保证安全。官方板子现在主要是 UF2 Bootloader(拖拽更新),特别是桌面 USB 连接的板子。
2025-08-31 14:08:14
1095
原创 esp32_hid_device 调试遇到的一些问题
(特别是 HID over GATT)里,很多低版本蓝牙栈(尤其是老的 Android、一些老的蓝牙适配器)确实。是强制支持 Report ID 的,但 BLE HID 是基于。,而不是靠 Report ID 区分。
2025-08-26 12:10:13
452
原创 Bluedroid vs NimBLE
Bluedroid:功能全(支持 HID),功耗比 NimBLE 稍高,但在键盘/鼠标这种低流量场景里问题不大。NimBLE:轻量化,功耗更低,但 HID profile 不完整,兼容性差。👉 如果你要做BLE 键盘→ 用 Bluedroid(功耗已经足够低,重点是稳定性和兼容性)。👉 如果你要做低功耗传感器/广播设备→ 用 NimBLE(省电优势明显)。理论上是的 ✅——把 HID Profile 写完整,任何协议栈都能让主机识别为键盘/鼠标。
2025-08-22 23:35:07
1075
原创 构建esp32s3 docker 开发环境
特点:构建镜像在 Dockerfile 所在目录执行:运行容器(开发模式,不刷写)进入容器后可执行:运行容器(刷写固件)进入容器后执行:✅ 特点总结:适合长期在 Ubuntu 国内网络开发。保存为 :
2025-08-17 01:56:47
412
原创 使用 `epoll`同步 CapsLock 按键的状态到一个特定的 LED
在 Ubuntu 上运行的 C 程序,用于同步 CapsLock 按键的状态到一个特定的 LED。这是一个完整的、事件驱动的 C 程序示例,它使用epoll来高效地监听文件描述符,并在 CapsLock 键状态改变时,将的值同步到。
2025-08-06 17:26:36
464
原创 RT-Thread **标准版(Standard)** 和 **智能版(Smart)
1234这些宏被 libc 和内核共享,确保调用号一致。return 42;CPU 每次取指或访问内存时,都会通过 MMU 把虚拟地址转换为物理地址。你通过页表设置了这个映射,从而让 ELF 中的代码在用户虚拟地址空间“看起来可执行”,实际上只是映射到你加载的物理地址。是的,你说得完全正确。用户程序链接的“虚拟地址”是在用户空间看的地址,在加载阶段由 RT-Smart 通过页表映射到实际物理内存上,运行时 CPU 使用页表自动完成地址转换,无需用户介入。是的,
2025-08-03 14:16:19
981
原创 linux 启动流程?
CPU 上电后的第一段执行代码一定是架构相关的启动代码,放在arch目录下。这是因为启动时的硬件初始化和上下文设置紧密依赖 CPU 架构。通用内核代码则放在kernel/mm/fs/等目录。核心原因是内核启动前后环境差异巨大,必须用汇编代码做早期硬件和处理器环境初始化,才能安全可靠地进入 start_kernel。Linux 内核源码里的arch/目录是不同 CPU 架构相关代码的汇总目录。阶段作用为什么不能直接跳到CPU 上电 →_start汇编初始化 CPU 寄存器、栈、分页、特权级。
2025-08-02 22:19:49
1337
原创 串口连接 ESP8266 实现联网
项目数值串口典型波特率实际最大带宽200~700 Kbps 左右(约 20~80 KB/s)串口是主要瓶颈是(不是 Wi-Fi 本身)可否用作联网轻量 HTTP/MQTT/socket 都够用以80 Kbps(约 10 KB/s)的网络速率为基础,我们可以来分析一下它能做什么,不能做什么。
2025-08-01 12:54:40
770
原创 以太网 PHY(物理层芯片)DP83848 和 LAN8742 对比
芯片制造商接口用途DP83848TI(德州仪器)MII / RMII老牌稳定、工业级 PHYLAN8742Microchip(原 SMSC)MII / RMIIST 官方推荐,很多 STM32 开发板内置。
2025-07-31 15:53:33
884
原创 STM32 USB 设备中间件 tinyusb
步骤内容1CubeMX 生成基本工程2引入 TinyUSB 代码3添加 tusb_config.h4main.c中调用5编写描述符、回调函数6CMake 添加 TinyUSB 库很关键的问题!如果你使用中断函数(ISR)是必须配置的,否则 USB 无法正常通信。步骤内容说明中断函数名称中断函数实现调用HAL 中断是否保留?否(TinyUSB 自己处理)NVIC 中断优先级/使能必须启用,优先级可设为 0文件放在。
2025-07-31 15:45:58
1453
原创 ESP32C3 super mini 使用 ESP32-C3 FN4P5N
内置 Flash:4MB(SPI Flash 已封装在芯片里)内置 PSRAM:512KB(通常用于缓存、图像处理等)无需外部 Flash 芯片,即可启动运行封装类型:QFN,非常适合小尺寸板子,比如 ESP32-C3 Super MiniESP32-C3 通过内部 USB Serial/JTAG Controller 实现了「高集成」的 JTAG 调试,无需外置 JTAG adapter 和多余 GPIO 定义,为开发和产品化提供了极大方便。e。
2025-07-29 16:06:53
1311
原创 精简 RT-Thread 工程并查找占用空间大的模块
模块名占用情况精简建议LittleFS多个函数 > 1KB,总占用 10KB+✅ 如果不用文件系统,强烈建议关闭SFUDsf函数 > 2KB✅ 如果不用 SPI Flash,关闭FALfal函数 > 2KB✅ OTA 方案可替代实现精简版Finsh1.5KB+✅ 不需要 Shell 时禁用HAL 驱动含 UART、SPI、GPIO 等✅ 不使用的外设禁用 HAL 模块打印格式化支持✅ 如果调试信息不需要格式化,可以替换成简化版或禁用调试输出。
2025-07-28 22:52:42
1132
原创 使用 FFmpeg 实现 RTP 音频传输与播放
通过本文方法,你可以成功实现:✅ RTP 音频流从一台主机传输到另一台✅ 使用标准 SDP 描述流参数✅ 基于 FFmpeg 与 ffplay 全流程构建测试环境。
2025-07-25 20:21:45
1045
1
原创 vim与 neovim 的使用
本文介绍了使用Vim高效阅读Linux内核源码的完整方案。主要内容包括:1) 准备工作,建议克隆Linux源码并安装Vim;2) 配置Vim,推荐安装NERDTree、coc.nvim等插件提升代码导航效率;3) 代码导航工具,详细说明ctags和cscope的安装与使用;4) 实用技巧,如Tagbar查看结构、快速跳转文件等;5) 阅读建议,推荐从init/main.c入手。文中还提供了Vim快捷键速查表,并对比了原生Vim与NeoVIM的差异,最后介绍了NvChad框架的安装方法。该方案可显著提升内核源
2025-07-14 17:31:17
856
原创 std C 头文件
size_t无符号整数类型,用于表示对象大小(如 sizeof 返回值)或数组索引,通常定义为 unsigned int 或 unsigned long。// 获取int类型的字节数ptrdiff_t有符号整数类型,用于存储两个指针的差值(如数组元素间距),通常为 long int。int arr[5];// 结果为4wchar_t宽字符类型,支持 Unicode 等扩展字符集,其编码保证空字符值为 0。NULL:空指针常量。
2025-07-14 16:18:51
500
原创 FreeRTOS 特性
一、源码精简性核心文件构成FreeRTOS 移植仅需 3 个通用内核文件(tasks.c、queue.c、list.c)和 1 个硬件专用文件(如 port.c),极大简化了移植流程16。例如,针对不同微控制器只需调整 port.c 中的硬件相关代码(如任务上下文切换、中断处理),而无需修改内核逻辑67。模块化设计内核源码遵循模块化原则,MemMang 文件夹提供动态内存管理方案(如 heap_4.c),开发者可根据硬件资源选择适配的内存分配策略67。
2025-07-12 15:04:31
944
原创 ubuntu环境下调试 RT-Thread
你安装的kconfiglib在虚拟环境中,但运行scons的 Python 不是那个虚拟环境。只要确保scons是用虚拟环境里的 Python 运行的,问题就能解决。
2025-07-09 15:29:10
614
原创 在STM32 FreeRTOS环境中使用mutex和ringbuffer实现多任务的UART同步通信
在STM32 FreeRTOS环境中使用mutex和ringbuffer实现多任务的UART同步通信。
2025-07-08 15:47:47
572
原创 freertos 外设同步
是的,必须加锁或序列化访问,这是使用 RTOS 时避免“竞态条件”的基本要求。简单加osMutex;高级一点设计资源访问任务,用分发。序列化访问多个任务不直接操作某个共享资源(如 SPI/I2C/UART),而是通过“一个专门的任务”来统一访问该资源。这样做的核心目的是避免并发冲突,实现线程安全。
2025-07-08 15:26:16
862
原创 FreeRTOS 可重入
项目是否可重入说明FreeRTOS 内核(调度器等)✅内部临界保护FreeRTOS 队列/信号量 API✅多任务安全FromISR 系列 API(中断中)✅专门设计用于 ISR用户自定义回调/共享资源访问❌/✅需加锁保护STM32F4 newlib 可重入(reentrant)设置newlib是一种 C 标准库实现(比如printf()malloc()等),它默认不是线程安全(不可重入)的。但它可以通过用户提供某些钩子函数。
2025-07-08 11:21:45
782
原创 FreeRTOS 软件定时器
FreeRTOS 的软件定时器(Software Timer)是一种定时机制,可以在设定的时间后执行一个回调函数,而无需创建和运行额外的任务。这对于需要延迟执行或周期性执行某些操作但又不需要一个完整任务的场景非常合适。
2025-07-08 10:55:44
413
原创 Zephyr、FreeRTOS 和 RT-Thread
你是…更适合用嵌入式新手,刚接触 RTOSFreeRTOS(入门简单)IoT 项目开发,需要 BLE/WiFi/MQTTZephyr(协议全)想快速构建可部署的产品Zephyr(模块统一)只做单个任务或简单状态机控制FreeRTOS(轻量)做平台化、持续集成、自动测试Zephyr(CI 支持强)
2025-07-07 22:46:35
1498
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅