- 博客(96)
- 收藏
- 关注
原创 Linux 调度类(sched_class)
Linux 内核把不同调度策略的实现抽象为若干调度类(sched_class),系统按固定顺序遍历这些类来选择下一个运行任务。
2025-12-19 14:18:25
1305
原创 进程、线程、内核线程与用户线程
应用并发(普通程序):使用 pthread(用户线程)或更高层并发框架(线程池、协程);高并发 I/O 或短时任务:用户线程 + 异步 I/O / 事件驱动 / 协程通常效率高;内核任务、驱动、需要直接访问内核资源或长期后台任务:使用内核线程。
2025-12-19 11:01:30
936
原创 fork, vfork, clone 与写时拷贝
特性fork()vfork()clone()地址空间写时拷贝 (COW)共享(父进程阻塞)可配置(CLONE_VM)父进程状态并发执行阻塞,直到子进程 exec/exit并发执行主要用途创建新进程无 MMU 系统或极度追求性能创建线程 (pthread)底层调用do_fork(SIGCHLD)do_forkdo_fork(自定义 flags)
2025-12-18 19:58:50
758
原创 进程描述符 (task_struct) 与任务结构
想象一下,如果你是学校的教务处主任,你需要管理全校几千名学生。你不可能记住每个人的长相和名字,所以你会为每个学生建立一份档案。这份档案里记录了学号、班级、成绩、家庭住址等信息。在 Linux 内核中,进程就是“学生”,而进程描述符()就是这份“档案”。内核通过来感知进程的存在。无论进程处于什么状态(运行、睡眠、僵死),内核都是通过操作这个结构体来管理它的。它是 Linux 内核中最复杂、最重要的数据结构之一。是 Linux 内核管理进程的核心,它记录了进程的一切(状态、优先级、内存、文件等)。
2025-12-18 19:56:02
728
原创 Linux内高端内存
要理解高端内存,必须回到32 位 Linux 系统的背景下。特性32 位 (ARM32/x86)64 位 (AArch64/x86_64)内核虚拟空间只有 1GB (通常)128 TB 或更大物理内存瓶颈物理内存很容易超过 1GB物理内存远小于虚拟空间映射方式LowMem: 线性映射HighMem: 动态映射 (kmap)全部物理内存均为线性映射性能影响访问高端内存需要建立/解除页表映射,慢直接访问,快是否存在 HighMem存在不存在(所有内存都是 ZONE_NORMAL)
2025-12-10 10:21:01
695
原创 spi驱动
和spi_driver是并行的、服务于不同总线类型的驱动。它们通过设备树的父子关系和内核的分步初始化流程联系在一起。作为基础设施提供者(房东),负责准备好 SPI 总线。spi_driver作为设备使用者(租客),在总线就绪后,负责与具体的 SPI 从设备通信。
2025-12-10 10:13:56
315
原创 Linux 内核驱动加载机制
Platform 总线是一种虚拟总线,用于管理集成在 SoC 内部的设备(如 GPIO、I2C 控制器、SPI 控制器等),这些设备无法通过标准总线(如 PCI、USB)自动发现。特点不依赖物理总线设备信息通过设备树(DTS)或平台数据传递自动匹配设备和驱动// 设备树节点││ Subsystems (子系统层) ││ │ │ │ ││ │ ││ Device Driver Model (设备驱动模型) ││ │ (Platform 总线框架 - 核心基础) │ ││ │。
2025-11-12 20:24:40
956
原创 Linux 中断处理机制详解:上下半部、内核线程与中断线程化
1. GPIO 按键、简单 UART:→ 传统中断 + Tasklet2. I2C/SPI 传感器:→ 线程化中断 (request_threaded_irq)3. 网卡、块设备:→ 传统中断 + NAPI/Softirq4. 复杂后台任务:→ 工作队列 或 内核线程5. 实时性要求高:→ 传统中断 + 高优先级内核线程中断上半部:快速、不睡眠、禁止中断中断下半部:延迟、可睡眠(work queue)、允许中断Softirq:最底层机制,网络/块设备使用Tasklet。
2025-11-12 20:06:31
1026
原创 U-Boot 启动流程与参数
ATAGS (ARM32 传统方式): 通过内存中的标签结构传递参数: 通过设备树二进制文件传递硬件信息和启动参数: 源文件,人类可读的文本格式: 二进制文件,编译后的设备树: 编译器,将 DTS 转换为 DTBOP-TEE (Open Portable Trusted Execution Environment) 是一个开源的可信执行环境,实现 ARM TrustZone 技术。命令说明设置内核命令行参数启动内核 (addr1=kernel, addr2=initrd, addr3=fdt)
2025-11-12 19:54:02
971
原创 嵌入式开发中的 Git CI/CD
在不运行代码的情况下检测潜在问题。: 评估代码复杂度和可维护性。: 验证各个模块功能正确性。: 识别安全漏洞和危险函数。: 检测循环依赖和多余包含。: 确保代码有充分文档。
2025-11-12 19:38:49
698
原创 MMU(内存管理单元)分析
MMU(Memory Management Unit,内存管理单元)是 CPU 中的硬件模块,负责将虚拟地址(Virtual Address, VA)转换为物理地址(Physical Address, PA),并提供内存保护功能。功能描述应用地址转换虚拟地址 → 物理地址所有内存访问内存保护访问权限检查(R/W/X)防止越界、权限提升TLB 加速缓存地址映射提高转换速度(99%+ 命中率)多级页表按需分配页表节省内存(稀疏地址空间)缓存控制定义缓存策略优化性能,正确处理 MMIO。
2025-10-22 14:28:03
1444
原创 Linux 线程调度策略
应用类型推荐策略优先级说明硬实时控制SCHED_FIFO80-99工业控制、电机驱动软实时音视频SCHED_RR50-79音频处理、视频编码周期实时任务确定性周期任务GUI 应用nice -5快速响应后台服务nice 0默认策略CPU 密集计算nice 5编译、科学计算后台清理SCHED_IDLE日志清理、垃圾回收。
2025-10-22 14:26:50
880
原创 Cortex-M 调试技术详解:DWT、ETM、ITM 与断点机制
工具用途硬件支持典型场景DWT性能测量、数据监视所有 Cortex-M3/M4/M7定位瓶颈、追踪野指针ITM实时日志输出所有 Cortex-M3/M4/M7替代 UART 调试ETM指令流跟踪部分高端芯片代码覆盖率、深度分析FPB硬件断点所有 Cortex-M3/M4/M7Flash 代码调试。
2025-10-07 16:47:50
1125
原创 Cortex-M 中断挂起、丢中断与 EXC_RETURN 机制详解
挂起(Pending)优先级不足:当前正在处理更高优先级的中断全局中断被禁止:通过PRIMASKFAULTMASKBASEPRI屏蔽中断未使能:通过 NVIC 的NVIC_ICERx禁止了该中断EXC_RETURN是一个特殊的返回地址,存储在链接寄存器(LR)中,用于触发异常返回流程。关键特性当处理器进入异常(中断或其他异常)时,硬件自动将 EXC_RETURN 写入 LR。当 ISR 执行返回指令(如BX LR)时,若 LR 的值是 EXC_RETURN,处理器会触发异常返回。问题原因。
2025-10-07 16:09:35
1233
原创 向量表与重定位(Cortex‑M 系列)
向量表重定位是启动引导、运行时升级与 RAM 执行常用技术。核心要点是:确保拷贝完整、地址对齐、在安全(中断受控)环境下更新 VTOR,并考虑缓存一致性与多核场景。按上述步骤实现后,系统能够在运行时灵活切换中断向量,支持 Bootloader、温跃式升级、运行时代码替换等功能。注意:务必先拷贝并设置好 vector entries(MSP、Reset 不必修改,通常保留),再开启中断。不要盲目固定为 128 字节。参考:ARM Cortex‑M 权威指南(向量表章节)、设备参考手册(VTOR 对齐要求)。
2025-10-07 16:00:50
881
1
原创 ART 加速器、流水线与指令预测的关系详解
ART 加速器为流水线提供连续的指令流(避免停顿)分支预测器依赖快速取指(由 ART 保证)流水线效率 = f(缓存命中率, 预测准确率)
2025-10-07 15:06:08
2003
原创 多级流水线与指令预测
总体流程(高层):顺序(in-order)内核的处理:乱序(out-of-order)内核的处理:寄存器与物理资源恢复:异常与内存模型:降低误判惩罚的硬件技术:软件层面的缓解:Cortex-M 与 Cortex-A 的实际差异:实践要点(工程师提示):
2025-10-07 14:47:25
717
原创 STM32 Flash 访问加速器详解(ART Accelerator)
ART 加速器通过指令缓存、数据缓存和预取机制,将 Flash 访问性能提升至接近 0 等待状态。必须在启动代码中启用,否则无法发挥 CPU 全部性能。代码优化:保持局部性、减少跳转、内联小函数、循环展开。数据优化:常量放 Flash、对齐结构体、利用 D-Cache。编译器配置:使用-O2-O3+ LTO,生成高效的 Thumb-2 代码。
2025-10-07 14:46:30
1420
原创 个人写HTOS移植shell
完成移植后,Letter Shell 能为 HTOS 提供强大的交互入口,适合调试与演示使用。丰富命令集合与权限管理;支持文件系统的命令(upload/download);改进串口驱动,提高并发性能。最后附上最新仓库代码。
2025-10-07 14:10:47
1052
原创 Cortex‑M3 的饱和运算(有符号与无符号)
本文汇总 Cortex‑M3(ARMv7‑M / Thumb‑2)关于饱和运算的行为、指令与常用实现方式,便于在嵌入式 DSP/控制代码中正确使用。
2025-09-27 13:57:32
711
原创 Cortex-M 位段(Bit-Banding)简介、作用与 C 实现
位段(Bit-Banding)是 ARM Cortex-M(如 Cortex-M3/M4,基于 ARMv7-M)提供的一种硬件机制。它把内存或外设寄存器中每个位映射为别名区(alias region)中的一个 32 位字,从而可以用一次 32 位写操作对单个位进行原子地置位或复位。
2025-09-27 13:51:24
1141
原创 valgrind与coredump调试
本文对比并详述两条常用的 Native Linux 调试流程:一是用 Valgrind 帮助发现内存错误并结合 gdb 进一步定位;二是通过生成 core dump 再用 gdb 离线分析崩溃现场。注意:Valgrind 只在 Linux/WSL 等类 Unix 环境可用;Windows 上请使用 WSL/虚拟机 或等效工具。
2025-09-25 20:55:29
995
原创 strace / ltrace / ptrace / ftrace
跟踪对象:ptrace:接口(用于实现跟踪/调试)。strace:系统调用(内核边界)。ltrace:用户态库函数调用(动态库)。ftrace:内核函数与事件(内核空间)。运行层次:ltrace/strace 在用户空间与内核交互点;ftrace 在内核空间;ptrace 为实现机制。权限:ftrace 通常需 root;strace/ltrace 可能需与目标同一用户或受 ptrace_scope 限制。可见性:strace 看不到函数内部逻辑;ltrace 看不到内核态细节。
2025-09-25 20:50:41
1048
原创 U‑Boot 结构
概述U‑Boot(Universal Bootloader)是嵌入式系统的通用引导器,负责上电后最低层硬件初始化、加载并启动操作系统。对复杂 SoC(以 Rockchip 为例),U‑Boot 通常由多个阶段组成(SPL/TPL、主 U‑Boot、可选的 TEE/ATF),并支持多种镜像格式(FIT、RK 原生、Android boot)。
2025-09-25 20:49:57
1303
原创 rk系列U-BOOT移植
本文总结 RK 系列 SoC 的典型启动流程、常见镜像格式与打包方法,结合 OK3506(RK3506,ARMv7)移植的实际经验给出要点与注意事项。
2025-09-25 20:15:55
1217
原创 FIT镜像格式详解与编译方法
images {kernel {// 二进制文件包含// 镜像类型// 目标架构// 操作系统// 压缩方式// 加载地址// 入口地址hash-1 { // 校验和signature-1 { // 数字签名fdt-1 {hash-1 {hash-1 {kernel {// 自定义加载地址// 自定义入口地址ITS文件:人类可读的源文件,定义镜像结构ITB/FIT文件:编译后的二进制镜像,U-Boot直接使用。
2025-09-12 20:22:18
1274
原创 UBOOT启动流程详解-现代FIT设备加载
设备树是描述硬件信息的数据结构,以扁平化格式存储。FDT Overlay允许在运行时动态修改设备树,无需重新编译整个设备树。模块化硬件设计可选外设支持不同硬件版本兼容动态功能启用/禁用传统方式:简单直接,适合开发调试SPL/TPL:适合存储受限和复杂初始化场景FDT启动:现代Linux系统的标准方式FIT启动:安全启动和产品化部署的首选。
2025-09-12 20:01:24
1001
原创 嵌入式 Linux 启动流程详解 (以 ARM + U-Boot 为例)
对于嵌入式开发者而言,深入理解系统的启动流程至关重要。这不仅有助于进行底层驱动开发和系统移植,还能在遇到启动失败等问题时,快速定位和解决。。过段时间仔细研究一下Uboot,看看能不能给手上这块3506移植个Uboot试试。
2025-09-03 19:33:54
1381
原创 TLSF内存算法适配HTOS
TLSF(Two-Level Segregated Fit)是一种面向实时系统的动态内存分配器设计,旨在在分配(malloc)和释放(free)操作上提供恒定时间复杂度 O(1) 的响应时间,同时保持较低的内部/外部碎片。TLSF 由 Matthew Wilson 等人提出,常用于嵌入式或实时系统中对延迟有严格要求的场景。核心思想:通过两级分离空闲列表(一级按区间级别划分,二级按子区间细分)并结合位图(bitmap)快速定位合适的空闲块,从而将查找时间限定为常数级别。这是从网上找的一个示例。
2025-09-03 19:23:24
872
原创 ELF文件格式解析
未初始化的内存(.bss)以 NOBITS 形式存在,ELF 文件中没有占用空间,但运行时会在 RAM 中分配并清零。当你在嵌入式设备上遇到崩溃、要调试现场问题或从 core 恢复现场时,ELF(尤其是带符号的 AXF)决定了 GDB 能恢复多少信息:是否有源代码行号、变量名、内存映射是否能对应到运行时地址等。的节里,该节的运行时地址是 0x08000000(典型的 MCU Flash 起始地址)。文件类型与目标、段/节的运行时含义、DWARF/符号表的重要性、如何用。中,链接器把可执行代码放在名为。
2025-09-02 20:35:13
1110
原创 CAN和CAN FD协议
CAN(Controller Area Network)是由德国Bosch公司开发的现场总线通信协议,最初用于汽车电子系统,现已广泛应用于工业自动化、医疗设备等领域。关键特性多主机架构:任意节点都可以发起通信非破坏性仲裁:基于ID优先级的总线仲裁实时性好:确定性的数据传输延迟高可靠性:多层错误检测和处理机制成本低:简单的双线差分信号仲裁机制CAN帧格式详解标准帧格式(CAN 2.0A)扩展帧格式(CAN 2.0B)CAN扩展帧格式详解(29位ID)让我详细解释CAN扩展帧格式
2025-09-02 20:16:29
993
原创 LWIP的Socket API 与实现关系
由于本人使用的方式原因,只打算了解socket模式,其余两种方式。适合裸机的RAW模式和基础的CONNECT模式不适合面向对象的编程方式,不打算看。
2025-08-20 14:56:27
1035
原创 LWIP实现UDP协议
序列(raw API):udp_send / udp_sendto → udp_sendto_if_src → 构造 UDP 头(pbuf_add_header)→ 校验/设置 udphdr → ip_output_if_src/ip_output_if → netif->linkoutput(low_level_output)全局头:udp_pcbs(链表头)。序列:ethernet_input → ip4_input → udp_input → udp_input 内部匹配/校验 → 回调 recv。
2025-08-20 10:58:05
1423
原创 LWIP的TCP协议
输入链路:NIC_ISR (中断/DMA) → ethernetif_input (low_level_input) → netif->input (tcpip_input) → tcpip_thread (message) → ethernet_input → ip4_input → tcp_input → tcp_process → tcp_receive。状态机分发(对应你的“流程方框:tcp_input→tcp_process→tcp_receive()”)
2025-08-20 10:07:50
929
原创 LWIP的IP 协议栈
下面的分析把上文对 IPv4 概念的说明与 lwIP 中的具体实现代码对应起来,便于将理论与实现对照理解。分析覆盖:输入处理、路由与转发、输出与报文构建、分片/重组、校验和与各种配置点(hook、选项、统计等)。
2025-08-19 20:41:38
1297
原创 基于zephyr使用stm32的LTDC点亮ARGB8888LCD触摸屏
首先使用的是GT1151芯片,要做input子系统里面完成其驱动代码,实话实说zephyr的驱动架构和linux实际上是完全不一样的,它的驱动与dts绑定不是用的probe函数,而是直接在编译时确定的,用的是DEVICE_DT_INST_DEFINE宏定义,通过dts的yaml文件和驱动绑定的,至于怎么写可以模仿里面的GT911。接下来就需要修改dts内的input子系统的yaml文件来实现映射。
2025-08-19 20:13:01
406
1
原创 LWIP流程全解
本文系统分析了lwIP网络协议栈的数据接收处理流程,重点阐述了从网卡驱动到协议栈核心线程tcpip_thread的完整数据路径。文章详细说明了硬件中断处理、驱动层接收线程、tcpip_thread消息处理等关键环节的交互机制,包括pbuf内存管理约定、线程间通信方式(邮箱投递)和不同锁策略的配置影响。同时提供了驱动实现建议、常见问题排查方法和系统参数调优指导,涵盖了零拷贝、缓存一致性、消息队列深度等实际工程问题。通过解析tcpip_thread处理TCPIP_MSG_INPKT消息的流程,阐明了协议栈内部的
2025-08-19 16:58:39
926
原创 网络数据包
* 简要示例:将 DMA RX 缓冲封装为自定义 pbuf(释放时归还 DMA 缓冲) *//* 归还 rx->dma 给 RX 环,并置 OWN 给 DMA *//* ... */pbuf_alloced_custom(PBUF_RAW, rx->len, PBUF_POOL /*标记用途*/, &pc,/* 上送栈:netif->input(&pc.pbuf, netif);*/payload_mem 必须满足对齐要求自定义 pbuf 释放后不可再访问 DMA 缓冲。
2025-08-19 16:22:34
1112
原创 LWIP内存管理
本文把 LWIP 的内存管理做结构化、可操作化的说明:涵盖三种内存策略(内存池 memp、堆 mem、以及标准 C malloc)、相关配置项、常用 API 及常见陷阱与调优建议,便于移植与排错。
2025-08-19 14:45:08
851
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅