自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(73)
  • 资源 (7)
  • 收藏
  • 关注

原创 ZYNQ 之EMMC启动(之前是SD卡)

分清楚后,参考上一篇制作SD卡启动的文章(格式化emmc和sd一摸一样,所以这部分略过,有疑问可以留言),将emmc在设备上格式成两个盘;system-top.dtb重命名为system.dtb,替换拷贝到emmc中的设备树;sd-mmcblk0p1中存放的是启动文件,直接拷贝(?板卡启动后fdisk -l 去查看那个设备是emmc,那个设备是SD卡;将SD卡的文件系统拷贝到emmc (sd-mmcblk0p2)中去。其他文件不变,拨码开关拨到emmc启动板卡进行验证;sd_1--->修改为sd_0。

2025-11-19 10:47:08 303

原创 ZYNQ下SD启动卡制作

先将带有SD卡的读卡器插入电脑,选择SD卡进入虚拟机。插入到板卡,拨码开关拨到SD卡启动,上电;将文件系统解压到rootfs即可;将对应的文件copy到boot。如图dev下会多出设备sdb。将磁盘格式化为两个盘。

2025-11-19 10:02:57 315

原创 C语言指针传参

【代码】C语言指针传参。

2025-10-15 18:20:55 267

原创 RS232和RS485区别

RS232和RS485芯片的核心区别在于,它们为实现不同的通信标准,在电平转换方式、抗干扰能力和网络拓扑结构上有着根本性的不同。下面这个表格能让你快速抓住核心差异。

2025-10-10 11:56:15 647

原创 GDB 调试 Core Dump 文件:从原理到完整应用指南

Core Dump(核心转储)是程序崩溃时,操作系统将进程当时的内存快照、寄存器状态、堆栈调用链等关键信息写入的二进制文件。它相当于程序 “崩溃瞬间的快照”,允许开发者在程序崩溃后,通过调试工具(如 GDB)还原崩溃现场,定位问题根源(如空指针、数组越界、内存泄漏导致的野指针等)。配置环境:开启 Core Dump(),自定义 Core 文件路径(编译程序:加-g生成调试信息,用-O0-Og禁用过高优化。生成 Core:运行程序触发崩溃,获取 Core 文件。GDB 调试。

2025-09-28 10:52:15 1747

原创 CANopen编程基础介绍

CANopen协议的编程实现涉及从硬件配置到应用层逻辑的多个层面。下面我们深入探讨其核心编程概念、关键通信对象的实现,并提供一个实际的开发流程指南。

2025-09-25 18:41:07 763

原创 Linux驱动设备文件节点创建

在嵌入式系统中,如果使用BusyBox,可能会使用mdev而非udev,但原理类似。如何为驱动创建设备文件节点?(手动 mknod 或自动哪个更优?

2025-09-20 17:26:25 313

原创 双向链表的增删改查

Node* head;// 头节点指针Node* tail;// 尾节点指针int length;// 链表长度。

2025-09-20 16:42:32 696

原创 C函数指针

C语言实现对一个函数的定义,并将该函数指向一个固定地址,实现对函数的调用;// 注意:如果地址不正确或目标地址函数参数不匹配,会导致严重错误。// 将函数指针指向一个固定地址(示例地址,实际使用需谨慎)// 定义匹配的函数指针类型(参数和返回值必须一致)// 声明函数指针并指向我们定义的函数。// 通过固定地址调用带参数的函数。// 通过函数指针调用(带参数)// 定义一个带参数和返回值的函数。// 打印函数的原始地址。// 打印新的函数地址。

2025-09-20 16:26:28 432

原创 RT-Thread 中避免多任务共享函数时的冲突问题

​最小化共享​:尽量设计无状态函数,使用局部变量​锁粒度控制​:// 错误示范:锁范围过大// 阻塞其他任务过久// 正确做法:只保护真正共享的部分// 非临界区操作// 快速完成​避免锁嵌套​:防止死锁​优先使用消息队列​:减少直接共享​原子操作​:简单计数使用原子变量通过合理选择同步机制,可以确保多任务安全共享函数,同时保持系统效率。

2025-09-19 22:24:03 438

原创 脚本create_upgrade_package.sh详解

echo " -r <文件> 指定根文件系统tar包 (默认: $ROOTFS_TAR)"echo " -a <文件> 指定应用程序tar包 (默认: $APPS_TAR)"echo " -p <文件> 指定私钥文件 (默认: $PRIVATE_KEY)"ROOTFS_TAR="rootfs.tar.gz" # 根文件系统tar包文件名。APPS_TAR="apps.tar.gz" # 应用程序tar包文件名。echo "无效的选项: -$OPTARG" >&2。

2025-09-17 18:33:55 746

原创 Linux 固件升级方案

双分区设计(活跃分区 / 备用分区)升级包校验与签名验证完整的回滚机制原子操作确保系统一致性详细的升级日志记录。

2025-09-17 18:04:04 1333

原创 linux下的inode_operations 和 file_operations结构体

/ 目录相关操作// 创建文件// 创建目录// 删除文件// 创建符号链接// 创建硬链接// 重命名// 设置权限// 其他操作:权限检查、set/get ACL、文件扩展属性等...// ...⚠️ 注意:上面的函数指针列表是简化 & 代表性的,实际内核中的包含更多函数,而且某些函数是可选的,如果文件系统不支持某个功能,可以设为NULL。// 读写操作// 打开和关闭// 文件定位(比如 lseek)// IO控制(ioctl)

2025-09-08 12:56:07 1280

原创 uboot下run_command调用命令

U-Boot 中的所有命令都通过(通常 typedef 为cmd_tbl_t)结构体定义,每个命令对应一个该结构体的实例。其关键成员包括:运行// 命令名称(如 "bootm"、"printenv")// 最大参数数量// 是否可重复执行(按回车重复上一条命令)// 命令执行函数// 简短帮助信息// 详细帮助信息// 其他扩展字段(如命令分组、权限等)命令的实际逻辑由cmd函数指针实现,的最终目标就是找到这个函数并调用。是 U-Boot 命令系统的调度中心,其核心是通过。

2025-09-03 12:40:44 1209

原创 U-Boot加载内核和文件系统的具体代码实现

U-Boot 加载内核和文件系统的代码实现涉及多个模块协作,从命令解析、设备驱动到最终跳转,形成完整的启动链路。不同存储设备(如 SPI Flash、NAND)的差异主要体现在底层驱动(命令(用于 zImage)在加载内核后需验证镜像有效性,代码位于。),但整体流程一致。理解这一链路需结合具体硬件平台的配置(如。U-Boot 不直接加载文件系统,但通过。跳转逻辑由汇编实现(ARM 架构位于。U-Boot 的自动启动逻辑由。

2025-09-03 11:44:22 1039

原创 linux下的uboot加载内核和文件系统过程

而文件系统的挂载则由内核根据 U-Boot 提供的参数完成。整个流程依赖于存储设备驱动、内存管理和硬件适配,不同嵌入式平台(如 ARM、PowerPC)的细节可能略有差异,但核心逻辑一致。U-Boot(Universal Bootloader)作为嵌入式系统中广泛使用的引导程序,其加载内核和文件系统的过程涉及多个阶段和复杂的交互逻辑。U-Boot 的核心职责是。

2025-09-02 20:12:53 736

原创 MCU的升级方案

下面是在原有 A/B 分区升级方案基础上,增加完整 Bootloader 实现的方案。Bootloader 负责系统启动时的分区选择、固件验证和启动控制,是整个升级方案的核心组件。带Bootloader的MCU A/B分区升级方案。

2025-09-02 18:19:40 886

原创 Linux I2C 设备驱动分析(接上上一节)

include <linux/module.h> // 模块基础接口(如module_init/exit)#include <linux/i2c.h> // I2C总线核心接口(i2c_client、i2c_driver等)#include <linux/interrupt.h> // 中断处理接口(request_irq、irqreturn_t等)#include <linux/gpio.h> // GPIO操作接口(gpio_to_irq等)

2025-09-02 17:24:43 469

原创 简述TCP/IP 协议栈

TCP/IP 协议栈的成功,源于其分层解耦、简洁实用、兼容开放分层解耦:每层独立负责特定功能,修改某一层(如从 IPv4 升级到 IPv6)不影响其他层,降低了维护难度;简洁实用:聚焦 “跨网络通信” 的核心需求,避免冗余设计,确保协议高效运行;兼容开放:支持不同类型的硬件(如电脑、手机、路由器)和操作系统(如 Windows、Linux、iOS),成为全球通用的网络标准。

2025-09-02 16:10:29 856

原创 Linux I2C 驱动及应用测试程序实现

I2C(Inter-Integrated Circuit)是一种常用的串行通信协议,以下实现一个包含中断处理的 Linux I2C 驱动,并提供对应的应用测试程序。注意:实际使用时需要根据具体的 I2C 设备规格和硬件连接情况修改驱动中的设备地址、中断引脚和数据处理逻辑。该驱动实现了基本的 I2C 设备注册、中断处理、读写操作等功能。linux I2C 驱动实现。驱动编译Makefile。I2C驱动应用测试程序。

2025-09-02 12:35:36 227

原创 linux下的基于platform驱动的框架

Platform 驱动框架是 Linux 内核中针对 “无总线设备” 的标准化解决方案,其核心是 “设备与驱动分离”,通过实现统一匹配。设备信息描述:通过设备树或手动注册,提供准确的硬件资源(地址、中断、时钟)。驱动逻辑实现:聚焦proberemove函数,完成资源申请、硬件初始化与释放。匹配机制选择:优先使用设备树compatible属性匹配,其次使用id_table或name匹配。

2025-09-02 10:58:13 759

原创 linux用户态和内核态交互的三种常见方式

其他交互方式如netlink(用于网络子系统)、信号(signals)、共享内存等也是重要的用户态-内核态通信机制,但在题目明确要求三种常见方式时,以上三种是最具代表性的。通过/dev目录下的设备文件进行交互,使用标准的文件操作接口(read/write/ioctl等)。通过虚拟文件系统(/proc和/sys)进行信息交换和配置。// 用户态调用write系统调用。// 用户态读取/proc文件。// 用户态通过设备文件交互。// 用户态配置/sys参数。

2025-09-02 10:38:40 207

原创 Linux内核驱动调试信息打印分析

在Linux内核驱动中,不能使用标准C库的printf函数,因为内核运行在内核空间,无法直接使用用户空间的库函数。

2025-09-02 10:28:17 608

原创 编写linux驱动必须包含哪两个头文件?

linux/fs.h。

2025-09-02 10:26:02 288

原创 Linux驱动模块加载工具比较:insmod vs modprobe

modprobe依赖于depmod生成的modules.dep文件来解析模块依赖关系。在开发新模块时,通常先用insmod测试基本功能,确认无误后再安装到标准位置,用modprobe测试依赖关系。modprobe通过读取/lib/modules/`uname -r`/modules.dep文件来获取模块依赖信息。这个文件由depmod命令生成,记录了模块之间的依赖关系。# 使用modprobe加载模块(自动处理依赖)# 使用insmod加载模块(需要处理依赖)

2025-08-31 21:14:22 940

原创 Linux 驱动主要分为哪三类?举例说明每类的典型设备。

这个问题考察候选人对Linux驱动架构的基本理解,是驱动开发岗位的基础知识。在现代Linux内核中,这种分类有时会变得模糊。

2025-08-31 21:12:19 602

原创 STM32 的 USB 驱动代码分析

STM32 的 USB 驱动代码是硬件操作协议解析和设备类功能的分层封装:HAL 层负责硬件控制,核心层处理 USB 协议(枚举、端点管理),类驱动层实现特定设备的功能。理解各层的交互逻辑(如中断触发→核心层解析→类驱动处理)是掌握 USB 驱动的关键。详细介绍枚举和数据通信过程在 USB 协议中,枚举过程是设备插入主机后建立通信的基础,而数据通信则是枚举完成后设备与主机通过端点传输数据的过程。下面结合 STM32 USB 驱动代码,详细解析这两个核心过程。枚举过程。

2025-08-25 17:51:07 1278

原创 linux下USB的驱动开发

Linux USB 驱动开发的核心是理解分层模型与掌握 URB 机制内核驱动(高性能、需内核权限):基于实现probedisconnect,通过 URB 处理数据传输;用户空间驱动(快速开发、跨平台):基于 libusb,适合简单场景,无需编译内核。实际开发中,建议先通过lsusb -v确认设备描述符与端点信息,再逐步实现驱动逻辑,结合dmesg和usbmon调试问题。

2025-08-25 17:44:12 902

原创 Linux进程间通信

方法适用场景优点缺点管道父子进程简单通信简单高效仅限亲缘进程,单向命名管道无亲缘关系进程简单,可跨进程单向,需文件系统信号事件通知异步,开销小数据量有限共享内存大数据传输速度最快需要同步机制消息队列异步消息传递按类型接收速度较慢信号量进程同步有效控制资源不传递数据套接字网络 / 本地通信灵活,全双工开销较大选择 IPC 方法时,需根据进程关系、数据量、同步需求和性能要求综合考虑。

2025-08-25 17:34:24 849

原创 linux下的线程间资源同步和互斥的方法

在 Linux 系统中,线程间的资源同步和互斥是多线程编程的核心问题,主要用于解决多个线程对共享资源的并发访问冲突。

2025-08-25 17:25:29 268

原创 linux内核下进行调试的方法

简单逻辑错误printkdmesg。崩溃 / Oops:分析崩溃日志 +addr2line。复杂逻辑 / 启动问题:KGDB 断点调试。性能 / 流程分析:ftrace 动态追踪。严重崩溃 / 死锁:kdump +crash工具。内核调试的核心是利用内核自带的调试框架(如printk),并结合配置调试选项),多数情况下无需依赖第三方工具。

2025-08-25 14:58:30 1005

原创 GDB进行多线程调试

用识别线程,切换线程;用break <位置> thread <id>设置线程专属断点;用锁定调度,避免线程干扰;用bt查看线程堆栈和变量,定位问题;用监控线程生命周期。通过以上命令,可有效解决多线程程序的调试难点,定位线程间同步、数据竞争、崩溃等问题。

2025-08-25 14:51:28 1040

原创 gdb编译调试功能的二进制文件

编译支持 GDB 调试的二进制文件的核心是添加 -g或-ggdb选项,并避免使用优化选项。这样生成的程序可以被 GDB 识别,支持断点设置、变量查看、堆栈跟踪等调试功能。

2025-08-25 14:50:02 307

原创 GDB常用调试实例介绍

GDB 的核心价值在于精准控制程序执行流程和深入检查运行时状态,上述实例覆盖了日常调试的大部分场景。对于复杂问题(如内存泄漏、多线程竞争),可结合watch(监视内存变化)、catch(捕获异常 / 信号)等高级命令进一步分析。熟练使用 GDB 能显著提高定位 bug 的效率。

2025-08-25 14:42:02 305

原创 任务、线程和进程

定义:进程是程序的一次执行实例,是操作系统资源分配的基本单位。核心特征拥有独立的地址空间(代码、数据、堆、栈)、文件描述符、信号处理等资源。进程间相互隔离,一个进程崩溃通常不会影响其他进程。操作系统通过进程控制块(PCB,如 Linux 的)管理进程的状态(运行、就绪、阻塞等)、优先级等信息。示例:打开一个浏览器(如 Chrome),操作系统会创建一个或多个进程来运行浏览器程序。进程是 “资源隔离的执行单元”,适合独立程序的运行,开销大但安全性高。线程是 “共享资源的执行单元。

2025-08-25 14:37:53 1020

原创 linux内存管理概述

分层管理:物理内存(伙伴系统 + Slab)与虚拟内存(页表 + VMA)分离,兼顾效率与抽象。地址隔离:每个进程独立的虚拟地址空间,通过 MMU 实现安全隔离。高效复用:多级缓存(页面缓存、Slab 缓存、页表缓存)减少磁盘 I/O 和内存分配开销。动态适应:内存紧张时通过 LRU 置换、Swap 交换、OOM 机制保证系统可用性。Linux 内存管理是 “灵活性” 与 “效率” 的平衡,既支持嵌入式设备的资源约束场景,也能满足服务器的大规模内存需求,是其跨平台能力的核心支撑。

2025-08-25 14:33:21 1062

原创 linux虚拟文件系统

Linux 的虚拟文件系统(Virtual File System,简称 VFS,也称为虚拟文件系统切换器 VFS Switch)是内核中的核心抽象层,其核心作用是,屏蔽底层文件系统的实现差异,让用户空间程序可以用相同的系统调用(如open()read()write())操作各种文件系统(如 EXT4、XFS、NFS、FAT32 等)。

2025-08-25 14:16:41 1027

原创 ucos内存管理

uC/OS(Micro-Controller Operating System)作为实时操作系统(RTOS),其内存管理设计注重和,以满足实时系统对内存分配 / 释放时间可预测的要求。它的内存管理机制与通用操作系统(如 Linux)的动态内存管理(如 malloc/free)有显著区别,核心采用固定大小内存块内存分区的管理方式。

2025-08-25 13:45:30 1021

原创 I2C核心层的match工作原理

函数通过多策略、按优先级的方式实现 I2C 设备与驱动的匹配,核心目标是:在多样化的系统架构中,准确找到 “设备 - 驱动” 的对应关系。其匹配逻辑兼顾了现代嵌入式系统(设备树)、x86 系统(ACPI)和传统系统(ID 表),是 Linux I2C 子系统灵活性的关键体现。匹配成功后,总线会调用函数,最终触发驱动的probe函数,完成设备的初始化(如硬件配置、资源申请、创建字符设备等)。

2025-08-20 20:22:24 592

原创 Linux下I2C驱动编程

数据流向设备驱动层通过核心层的接口发起通信请求 → 核心层将请求转发给对应的总线层(适配器)→ 适配器的函数完成实际硬件传输→ 结果通过核心层返回给设备驱动。依赖关系设备驱动层依赖核心层提供的 API 和总线层的传输能力。总线层依赖核心层的注册机制,将硬件能力暴露给上层。核心层是连接总线层和设备驱动层的桥梁,负责协调和管理。开发视角若需支持新的 I2C 控制器(如 SOC 内置的 I2C 模块),需开发总线层驱动(实现和若需支持新的 I2C 从设备(如某款传感器),需开发。

2025-08-20 19:53:47 790

鸿雁与九月的雪.mp3

鸿雁与九月的雪.mp3

2025-10-12

OTA升级方案上位机源码(支持整包和差分)

OTA升级方案上位机源码(支持整包和差分)

2025-08-13

差分包制作工具源码,基于QT开发

差分包制作工具源码,基于QT开发

2025-08-13

OTA升级方案源码(支持整包和差分)

OTA升级方案源码(支持整包和差分)

2025-08-13

差分升级嵌入式源码 1.若想进行差分升级,减少数据传输量则考虑该方案 2.涉及到蒜贩还原数据包过程,RAM空间20KB左右

差分升级嵌入式源码 该方法已经在项目中使用,验证可行

2025-08-13

与设备进行交互的C#上位机

与设备进行交互的C#上位机

2025-08-13

TLV通信的嵌入式组件嵌入式代码

TLV通信的嵌入式组件嵌入式代码

2025-08-13

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除