RISC-V 应用核的启动链路: 从 Reset_Handler 到调度器启动
从复位到第一个线程执行,启动过程分成四段,每段都有前置条件。本文按段说明每一段在做什么、为什么顺序不能换、这些段和它们的地址从哪里来,并给出启动失败时的判断顺序。
从复位到第一个线程执行,启动过程分成四段,每段都有前置条件。本文按段说明每一段在做什么、为什么顺序不能换、这些段和它们的地址从哪里来,并给出启动失败时的判断顺序。
FPGA 采集到的数据由 DMA 写进 DDR,用户态程序用 /dev/mem 映射同一块物理内存把它读出来。这条通路上没有数据拷贝,双方能对上靠的是事先约定的物理地址。无锁则来自另一处设计:环形队列把读写状态拆成两个各自单向递增的计数器,锁就没有存在的必要。
相机芯片上的 RTSP 服务不建线程,由应用线程反复调用,画面只传地址不复制。全文围绕三件事:定时任务共用一个到期时刻、一帧画面被多个客户端共用时的复用时机、一条连接上控制命令与视频的发送顺序,最后与服务器上的实现逐项对照。
上电时已插入的 SD 卡不会产生检测跳变,驱动需主动查询 CDETECT,再通过检测线程、识别线程与文件系统完成挂载。
一台嵌入式设备通过同一个 USB 控制器输出两路 UVC 视频:IAD 负责让主机看到两个摄像头,内部视频链负责分别产生两路帧,环形缓冲保证单路稳定,时间戳和上位机逻辑完成最终配对。
一次写入要经过四层地址翻译:字节偏移、扇区、设备块号、命令。多数人以为数据在这四层里被拷了四遍,实际一次都没有。
用采集与发送任务的例子,说明心跳应在哪里上报、正常等待怎样与卡死区分,以及如何汇总检查结果后再喂硬件看门狗。
对一套已经基于「中断 + 线程 + IPC」自洽的嵌入式模块群,引入 Reactor 事件循环(libev)在大多数模块上是净成本,本质是「第二套并发模型叠第一套」。是否值得,取决于两个先决条件:数据源能否映射成 fd、模块是否已有完整的并发机制。
libev 是一个单线程的事件循环库(Reactor 模式)。使用时把要等待的事件(文件描述符可读、定时器到期、跨线程通知)注册进去,事件发生后由库调用回调函数处理。在嵌入式系统中,它可以作为一个 RT-Thread 线程运行,STM32F407 上已用 select 后端验证了 ev_io、e
双份状态并非问题根源,失控的写入口才是;通过写穿、受控旁路、版本失效、脏标记和集中同步可让缓存与硬件重新收敛。
DVP 输出由并行像素数据、PCLK、HSYNC 和 VSYNC 共同组成,图像经 DDR 与 VIDEO_O 送入 VOC,实际缺口可能位于框架接入层。
同源像素走 UVC 时以描述符和 endpoint 面向 PC,走 CSI-2 时以 data type 和 VC 面向板级接收端,两者的封装、物理层与带宽边界不同。
SRAM 面向 DMA 与外设,CCM 面向 CPU 热数据;根据访问者、执行需求和访问频率分配内存,避免 DMA 不可见与 CCM 溢出。
设计模式、分层架构、可扩展性在桌面/服务器领域是最佳实践,但搬到资源受限的 MCU 上时,每个抽象层都有可量化的代价。本文通过一次信号处理 pipeline 重构的量化分析,提炼出三个典型的过度设计模式 (为不存在的动态性付费、凭直觉拆锁、为假想需求预留架构),并给出四维评估框架 (RAM/ROM/CPU/栈) 和轻量替代方案。
面向工业嵌入式的 A/B 分区固件升级引擎。osp::StateMachine 驱动 8 阶段流程,raw 分区状态持久化、U-Boot 冗余环境变量切换与 bootcount 回滚三层保护实现掉电安全,全程零堆分配 (~10KB 栈/静态),适合 32-256MB RAM 设备。