u-boot 学习笔记
u-boot 学习笔记 u-boot分类 1.1. api 1.1.1. api.md 1.2. arch 1.2.1. arm 1.2.1.1. arm.md 1.2.1.2. assembly.md 1.2.2. arch.md 1.3. boot 1.3.1. bootm.md 1.3.2. bootretry.md 1.3.3. bootz.md 1.3.4. image.md 1.4. cmd 1.4.1. cmd.md 1.5. common 1.5.1. autoboot.md 1.5.2. board.md 1.5.3. cli.md 1.5.4. command.md 1.5.5. console.md 1.5.6. dmalloc.md 1.5.7. event.md 1.5.8. export.md 1.5.9. log.md 1.5.10. main.md 1.6. dm 1.6.1. adc.md 1.6.2. button.md 1.6.3. clock.md 1.6.4. core.md 1.6.5. dts.md 1....
RT-Thread 学习笔记
RT-Thread 学习笔记 其他资料 1.1. fatfs 1.1.1. fatfs.md 2. ARM指针寄存器.md 3. CAN驱动.md 4. completion.md 5. condvar.md 6. dataqueue.md 7. DFS.md 8. fal.md 9. fatfs.md 10. FINSH模块.md 11. I2C驱动.md 12. IDLE线程.md 13. IPC.md 14. littlefs.md 15. map文件分析.md 16. pipe.md 17. PM电源管理.md 18. readme.md 19. ringblock.md 20. ringbuffer.md 21. romfs.md 22. RTC.md 23. RT-LINK.md 24. RTT系统初始化.md 25. SDMMC.md 26. SIGNAL.md 27. SPI驱动.md 28. tmpfs.md 29. ULOG.md 30. USB.md 31. waitqueue.md 32. 串口驱动.md 33. 调度.md 34. 工作队列...
固定周期后台事件导致实时链路瞬态扰动的定位与自动化测试
嵌入式面试真题第 03 题:固定周期后台事件导致实时链路瞬态扰动的定位与自动化测试 问题 在一个长时间连续运行的实时数据流系统中,前台数据链路需要按稳定节奏完成输入、缓冲、处理和输出。测试发现,系统整体没有死机、没有重启,普通业务也能继续运行,但实时输出链路每隔一个相对固定的时间间隔就会出现一次极短暂的质量劣化,例如瞬时噪声、卡顿、丢帧、控制抖动、采样尖峰、输出断点或数据不连续。面对这种固定周期、短持续时间、低频复现的瞬态异常,你首先怀疑哪类软件模块或系统行为?又会如何设计自动化测试环境,把异常发生点与系统内部事件对齐,从而定位根因? 回答 结论:这类问题本质上不是某一个业务模块的孤立异常,而是“长时间运行的实时数据流系统中,固定周期后台事件对前台实时链路造成瞬态扰动”。排查时不应先陷入具体表现,例如音频 Pop/Click、视频丢帧、马达抖动或传感器尖峰,而应先把问题提升到系统层面:前台实时链路需要稳定、连续、低抖动地处理数据;后台周期事件在某个固定时间点触发;两者在 CPU、总线、存储、锁、内存、时钟、电源或调度资源上发生了短时间冲突,最终表现为一次很短的输出...
多源信号时间戳偏差的补偿与重同步架构
嵌入式面试真题第 02 题:多源信号时间戳偏差的补偿与重同步架构 问题在一个通用的分布式系统或嵌入式系统中,多个独立信号源会通过有线或无线链路把数据发送到同一个接收端或业务终端,例如手机、网关、主控 MCU、边缘计算节点、上位机、机器人主机、工业控制器或车载域控制器。 这些信号源可以是多个穿戴设备、传感器节点、摄像头、IMU、定位模块、工业采集节点、车载节点、控制器、音频/振动/压力/生理信号采集器,或其他需要按照时间关系组合处理的数据源。链路也不限定于无线,可以是 BLE、Wi-Fi、UWB、私有 2.4G、以太网、CAN、RS485、UART、SPI、I2C、USB、PCIe 或多级网关转发链路。 由于射频干扰、链路重传、调度抖动、时钟漂移、包乱序、短时丢包、链路拥塞、DMA/中断延迟、网关排队、低功耗唤醒延迟或多任务抢占,同一时间段产生的数据到达接收端时可能出现明显时间偏差。偏差可能达到几十毫秒级,导致业务层出现融合错误、左右偏移、梳状滤波、控制滞后、误触发、短暂卡顿、波形失真、状态误判或时序相关算法失效。 如果让你设计一套通用...
低速 Flash 与 1MB SRAM 下的通用缓存架构设计
嵌入式面试真题第 01 题:低速 Flash 与 1MB SRAM 下的通用缓存架构设计 问题在一款资源受限的嵌入式设备中,系统只有 1MB SRAM 和一块读延迟不稳定的低速 SPI Flash。业务需要从 Flash 中持续或按需读取资源包、配置表、字库、语音片段、模型分块、日志回放数据或其他离线资源,并供应用线程实时或准实时消费。 如果应用线程直接等待 Flash 读取,系统可能因为低速 I/O、随机访问、文件碎片、擦写干扰或后台任务抢占而出现卡顿、超时或数据供应不连续。你会如何设计一套通用 Buffer/Cache 机制,使应用线程尽量读取 SRAM 中已经准备好的数据,而不是直接阻塞等待 Flash? 回答结论:不要让应用线程直接等待低速 Flash。更合理的设计是在应用和 Flash 之间增加一层 SRAM Cache/Buffer Manager:应用优先读 SRAM 中已经准备好的数据;后台 I/O Worker 根据访问模式、缓存水位和请求压力提前把 Flash 数据搬入 SRAM;缓存层再用 Ring Buffer、...
CANopen CiA 协议全景:核心内容、重点与组合关系
CANopen CiA 协议全景:重点规范、核心内容与组合关系 @[toc] 本文面向 CANopen 工程学习、设备选型、对象字典设计和协议组合判断。本版按你的要求移除了原文末尾的项目建议和评审清单类章节。图片均为 PNG,不包含 SVG;交付格式为 Markdown + images 目录。 1. 结论CANopen 的协议体系可以按三层理解: 通信基础层:以 CiA 301 / CiA 1301 为核心,定义对象字典、通信服务和网络管理。 横向功能层:例如 CiA 320 处理 sleep/wake-up,CiA 710 处理 bootloader,CiA 305 处理 LSS,CiA 306 处理 EDS/DCF。 设备与应用 Profile 层:例如 CiA 401、402、406、445、461、434 等,为某类设备定义应用对象、过程数据、配置参数、诊断信息和默认 PDO 思路。 本版重点单独展开 8 个规范:CiA 320、CiA 710、CiA 401、CiA 402、CiA 445、CiA 406、CiA 461、Ci...
CANopenEditor 从新建工程到导出 EDS OD
CANopenEditor 从新建工程到导出 EDS / OD.c / OD.h 从新建工程开始先新建空工程执行: 1File -> New 此时左侧显示 New Product,Object Dictionary 里还没有完整的 CiA 301 通信对象。不要直接在空工程里逐个手写 0x1000、0x1018、0x1200、0x1800、0x1A00 等标准对象,容易漏子索引、数据类型、访问权限和 CANopenNode 导出属性。 插入 DS301 profile执行: 1Insert Profile -> DS301_profile.xpd 这里的含义是: 项目 含义 DS301_profile.xpd CiA 301 通信对象 profile,提供标准通信对象候选项 DS301_profile_old.xpd 旧版本 profile,除非兼容旧工程,否则不优先使用 DS401_profile.xpd I/O 类设备 profile,只有做对应设备类型时再插入 DSP302-NMTMaster.xp...
由于 Cortex-M 栈未满足 8 字节对齐导致的问题与原因分析
# 由于 Cortex-M 栈未满足 8 字节对齐导致的问题与原因分析 @[toc] 嵌入式工程中,栈对齐通常不会被单独拿出来讨论。很多 Cortex-M 工程长期使用 4 字节对齐的内存访问,也能正常启动、跑任务、处理中断,因此“栈必须 8 字节对齐”看起来不像一个硬性问题。真正容易暴露问题的场景,往往出现在变参函数、64 位数据、浮点参数、启动阶段 C 代码、异常入口,以及手写汇编与编译器生成代码混用的边界上。 这篇文章从规定开始,解释为什么 Cortex-M 工程需要关心栈的 8 字节对齐;再说明不满足时可能出现什么现象;最后给出不同工具链脚本的查看方法和修改方法。 一、规定:公开接口处 SP 必须 8 字节对齐AAPCS32 是 Arm 32 位架构的过程调用标准。它规定函数之间如何传参、如何返回、哪些寄存器由调用者保存、哪些寄存器由被调用者保存,以及栈指针需要满足什么约束。 在 AAPCS32 中,栈有两层约束: 位置 要求 含义 任意时刻 SP mod 4 = 0 栈指针至少按字对齐 函数公开调用边界 SP mod 8 = 0 栈指针必须按双字对...
CANopen PDO 运行流程
CANopen PDO 运行流程 @[toc] PDO 不是“带 index/sub-index 的小 SDO”,也不是“谁发给谁的一问一答报文”。它更像一条预先约定好格式的实时数据通道:发送方把对象字典里的几个变量按固定顺序塞进一个 CAN 数据帧,接收方再按自己的 PDO 映射表把这些字节拆回本地对象字典变量。 理解 PDO 时要先把两个问题分开: 协议规定 PDO 应该是什么样。 包括它为什么只有过程数据、为什么要靠对象字典配置、为什么要区分 RPDO/TPDO、为什么 transmission type 会影响触发时机。 CANopenNode 源码怎样实现这些规定。 包括 CO_CANopenInitPDO() 如何初始化每个 PDO,CO_PDO_receive() 为什么只缓存,CO_RPDO_process() 为什么等到主循环才写 OD,CO_TPDO_process() 又为什么要同时看 SYNC、event timer、inhibit timer 和 sendRequest。 本文按这个顺序讲。前半部分先把协议模型讲清楚,后半部分...
CANopen TIME/SYNC 运行流程
CANopen TIME/SYNC 运行流程 @[toc] 1. 先把 TIME 和 SYNC 分开TIME 和 SYNC 都属于 CANopen 的特殊功能通信对象,但它们解决的问题不同: 对象 核心问题 默认 CAN-ID 数据长度 典型用途 SYNC “什么时候进入一个同步周期?” 0x080 0 或 1 同步 TPDO/RPDO、周期采样、周期控制 TIME “网络当前时间是多少?” 0x100 6 网络时间校准、时间戳、日志时间基准 一句话区分: 1SYNC 是节拍;TIME 是时钟。 SYNC 不携带实际过程数据,它只广播一个同步事件。同步 PDO 在这个事件前后按配置动作。TIME 也不携带过程数据,它只携带“当天毫秒数 + 自 1984-01-01 起的天数”。 2. 协议侧:SYNC 规定了什么2.1 SYNC 的角色SYNC 使用 producer/consumer 模型: 1234567flowchart LR P["SYNC producer<br/>周期发送同步对象&q...






