自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(61)
  • 收藏
  • 关注

原创 【项目实战】从IMX6ULL环境监测到N647 AI视觉加速

从IMX6ULL的系统级构建到N647的算法加速,这两个项目让我深刻理解了嵌入式开发的“软硬结合”之道。Linux驱动与应用:不仅是写代码,更是对操作系统机制(如VFS、IPC、中断)的深度理解。AIoT落地:算法不仅仅在服务器上跑,在资源受限的边缘端通过量化和异构计算落地,才更具实战价值。未来,我将继续探索Linux内核裁剪、RT实时性优化以及更复杂的端侧大模型部署技术。**#嵌入式Linux #IMX6ULL #LVGL #MQTT #NPU #AI加速 #优快云原创。

2026-10-27 16:19:48 168

原创 嵌入式 Linux 实战:i.MX6ULL 上的 CAN 通信与摄像头采集

CAN 是一种差分串行总线,具有较好的抗干扰能力和多节点通信能力。支持多主通信;具备错误检测与重传机制;适合工业现场、车载、机器人等场景;Linux 下通过SocketCAN将 CAN 设备抽象为网络接口。硬件上,CAN 控制器通常集成在 SoC 内部,外部通过 CAN 收发器连接到 CANH、CANL。总线两端一般需要接入120Ω 终端电阻,否则容易出现通信不稳定。CAN 不通:优先检查 120Ω 终端电阻、波特率、CANH/CANL 是否接反。摄像头 I2C 扫描不到。

2026-10-22 16:51:46 260

原创 i.MX6ULL 开发板 GT9147 触摸屏驱动加载与 tslib 移植测试

最近在 i.MX6ULL 开发板上调试 GT9147 电容触摸屏,主要完成了内核驱动加载、tslib 编译部署、环境变量配置以及触摸功能测试。不过需要注意的是,GT9147 属于电容触摸屏,通常不需要像电阻屏那样进行严格校准。GT9147、i.MX6ULL、tslib、触摸屏、Linux 驱动、嵌入式 Linux、ts_calibrate、ts_test。指定的是 tslib 安装到 Ubuntu 上的输出目录,后续需要把该目录下的文件部署到开发板根文件系统中。安装完成后,可以直接在终端中执行。

2026-10-17 17:37:38 66

原创 ​​​​​​​嵌入式 Linux 驱动入门:从设备树、驱动到应用,走通一个完整闭环

设备树回答“硬件在哪”;驱动回答“怎么操作硬件”;应用回答“数据怎么用”;内核自带部分负责总线、控制器和文件系统抽象。改设备树 → 写驱动 → 匹配 compatible → probe → 注册设备节点→ 写应用 → insmod 加载驱动 → 运行应用验证当你用 SPI 驱动和 GPIO 驱动各走通一遍后,就会发现驱动开发并不是每换一个芯片都要从零开始,而是在同一个框架下替换“和硬件对话”的部分。这个闭环一旦打通,后面学习更多总线、更多外设都会轻松很多。

2026-10-16 17:25:26 502

原创 Linux 驱动开发:基于 platform 总线 + misc 设备的 DS18B20 单总线温度驱动

负责设备匹配;probe负责初始化硬件;提供用户空间接口;GPIO 子系统控制引脚电平;udelaymsleep配合单总线时序;完成内核态到用户态的数据传递。驱动层如何把硬件协议、内核框架和用户空间接口串起来。

2026-10-15 16:37:51 607

原创 Linux 驱动实战:ADXL345 驱动

最近整理嵌入式 Linux 驱动时,把串成了一个完整例子:用 SPI 读取 ADXL345 三轴加速度数据,并通过字符设备提供readioctl和mmap接口。

2026-10-14 21:05:47 251

原创 Linux 驱动学习笔记(部分)

最近在整理嵌入式 Linux 驱动时,把几个容易混淆的点串了一遍:SPI 驱动里的,内核模块里的module和,字符设备驱动里的ioctlmmap,以及 LCD 时序。下面按“从外设驱动到用户空间接口”的顺序整理一下。

2026-10-14 21:02:42 306

原创 Linux 内核定时器与 DHT11

中断处理函数是操作系统和嵌入式系统中响应硬件事件的核心机制。当外设产生中断请求时,CPU 暂停当前程序,保存现场,跳转到预先注册的中断处理函数执行,处理完成后再恢复现场并继续执行。正常执行 ──► 中断发生 ──► 保存现场 ──► 执行 ISR ──► 恢复现场 ──► 继续执行在 Linux 内核中,ISR 运行在中断上下文,不能睡眠、不能阻塞,也不能执行可能引发调度的操作。主题核心要点中断处理函数短、不阻塞、清标志、下半部进程 vs 线程资源隔离 vs 执行共享文件描述符。

2026-10-12 19:14:43 493

原创 IMX6ULL 杂项设备 LED 驱动

misc 框架简化字符设备注册;设备树实现硬件描述与驱动代码解耦;of_iomap完成物理地址到虚拟地址的安全映射;通过函数指针建立用户空间与驱动的交互通道;保证内核态与用户态之间的数据安全拷贝。

2026-10-11 15:31:17 474

原创 嵌入式 Linux 启动程序文件

嵌入式 Linux 启动四件套:U-Boot、zImage、DTB、Rootfs。它们像接力赛一样,从设备上电开始,一步步把硬件初始化、内核加载、设备识别、文件系统挂载完成,最终让我们看到终端登录界面。如果把这四个组件拆开看,会发现它们各自承担的职责非常清晰。

2026-10-09 16:56:25 352

原创 Linux系统移植

使用生成内核配置;通过menuconfig修改内核功能;使用交叉编译内核;生成zImage和;通过 TFTP 加载内核和设备树;通过 NFS 挂载根文件系统;最终在 i.MX6ULL Mini 开发板上成功启动 Linux 系统。后续可以在此基础上继续移植驱动、修改设备树、裁剪根文件系统,或者将系统烧写到 eMMC/SD 卡中,实现脱机启动。

2026-10-07 18:16:58 476

原创 SPI通信

ADXL345 是 ADI 推出的一款低功耗、高分辨率三轴数字加速度传感器,支持 I²C 和 SPI 两种接口。SPI 模式下它的最高时钟可达 5MHz,全双工、时序确定,很适合做实时加速度采集、振动检测、姿态识别等嵌入式项目。SPI 是全双工总线,主机每发送一个字节都会同时收到一个字节。把这些点理顺后,后续接 FIFO、中断、DMA 或者做姿态解算都会更顺手。通信开始时拉低,结束时拉高。ADXL345 的三轴数据是小端格式:低字节在前,高字节在后。如果配置为 ±2g,灵敏度会不同,需要根据。

2026-09-29 18:29:23 229

原创 嵌入式 ADC 从入门到实战:基于 i.MX6ULL 的裸机驱动开发

即模数转换器。它的核心作用是将连续变化的模拟信号(如电压、电流、温度、压力、光强等)转换为离散的数字信号,使 MCU、CPU、DSP 等数字系统能够处理和分析这些物理量。现实世界:模拟的(连续的电压波形)数字系统:离散的(0 和 1)ADC:两者之间的翻译官例如:热敏电阻随温度变化输出电压 → ADC 采样 → MCU 得到数字值 → 软件计算温度。基准电压(Reference Voltage),通常记作Vref,是 ADC 进行模数转换时的"标尺"。定义量程范围。

2026-09-28 18:15:27 261

原创 i.MX6ULL裸机LCD驱动开发

/ 水平分辨率// 垂直分辨率// 每像素字节数(32位ARGB)// 垂直同步脉宽// 垂直前肩(VFP)// 垂直后肩(VBP)// 水平同步脉宽// 水平前肩(HFP)// 水平后肩(HBP)这些时序参数必须与LCD屏幕规格书完全一致,否则会出现画面偏移、撕裂或黑屏。LCD驱动开发是嵌入式底层能力的综合考验——它要求你同时理解时钟树、引脚复用、硬件时序、DMA传输、内存映射等多个维度的知识。

2026-09-27 18:42:26 316

原创 今日重点(I2C通信)

这是 GPIO 的两种输出模式,核心区别在于内部 MOS 管结构不同。对比项推挽输出(Push-Pull)开漏输出(Open-Drain)内部结构上管(P-MOS)+ 下管(N-MOS)互补只有下管(N-MOS),无上管输出高电平P-MOS 导通,主动推高到 VCCN-MOS 截止,引脚高阻态,必须靠外部上拉电阻输出低电平N-MOS 导通,主动拉低到 GNDN-MOS 导通,主动拉低到 GND驱动能力强(±20mA 级),边沿陡峭弱(高电平靠电阻充电,上升沿慢)能否并联绝对不能,会短路烧毁。

2026-09-23 18:19:25 281

原创 从寄存器到总线:一个嵌入式新手的 I2C 调试手记

/ I2CR - 控制寄存器#define I2CR_IEN (1 << 7) // I2C 使能#define I2CR_MSTA (1 << 5) // 主机模式(写1产生START)#define I2CR_MTX (1 << 4) // 发送模式#define I2CR_TXAK (1 << 3) // 发送 ACK/NACK#define I2CR_RSTA (1 << 2) // 重复起始// I2SR - 状态寄存器。

2026-09-23 18:16:13 195

原创 今日学习重点

这三个概念描述的是数据在通信信道上的传输方向。类型定义典型例子单工数据只能沿一个固定方向传输,发送端和接收端角色固定,无法反向广播电台、电视信号、红外遥控器半双工数据可以双向传输,但同一时刻只能单向,需要轮流切换方向对讲机、RS-485 总线全双工数据可以同时双向传输,收发互不干扰,相当于两条独立的单工信道电话通话、RS-232、以太网简单记忆:单工 = 单行道;半双工 = 单车道双向交替通行;全双工 = 双向多车道同时通行。这两个概念描述的是数据在传输线上的排列方式。特性串行通信并行通信。

2026-09-22 18:52:19 268

原创 i.MX6ULL裸机开发:UART通信原理与寄存器配置详解

问题原因解决方法完全没输出时钟没使能检查 CCM_CCGR5输出乱码波特率不对重新计算 UBIR/UBMR,检查误差只能发不能收DAISY 寄存器没配配置中断不触发GIC 没配置检查中断号、优先级、使能位只能收 1 个字节中断标志没清除读取 URXD 后自动清除,或用 DREN 替代 RRDYEN硬件层:时钟、引脚复用、DAISY 寄存器协议层:波特率、数据帧格式、8-N-1软件层:寄存器配置、查询/中断收发代码里写的是"结果",参考手册里写的是"原因"。

2026-09-22 18:39:12 484

原创 i.MX6ULL裸机开发:GPT通用定时器原理与高精度延时实战

项目说明GPT 定位i.MX6ULL 的全能型定时器,适合高精度延时、PWM、输入捕获计数方向32 位向上计数,溢出后回滚到 0时钟源常用ipg_clk(66MHz),配合 66 分频实现 1MHz 计数(1 tick = 1μs)运行模式高精度延时必须用Free-Run 模式(FRR=1)初始化关键先软件复位 → 配时钟源/模式 → 配分频 → 使能延时核心读取CNT差值,必须处理 32 位溢出最大单次延时约 72 分钟(1MHz 计数频率下)

2026-09-21 18:25:53 514

原创 从按键到CPU:i.MX6ULL中断链路全景解析

│ 你的C代码 │││ 头文件 .h ││ 宏定义 / 结构体 / 函数声明 │││ │ ││ GPIO外设 │ │ GIC控制器 │ │ CP15协处理器││ 事件发起者 │ │ 调度中心 │ │ CBAR(c15) ││ ││ CPU内核(Cortex-A7) ││ 异常向量表 → irq_handler ││ CMP + CPSR标志位 → 条件分支决策 │学嵌入式,最怕"只见树木不见森林"。

2026-09-20 18:12:56 137

原创 从零开始点亮第一颗LED:IMX6ULL裸机开发踩坑全记录

最近开始学嵌入式裸机开发,用的是正点原子的IMX6ULL开发板。说实话,刚拿到板子的时候挺懵的——之前在学校学的都是C语言跑在操作系统上,突然要直接操作寄存器、写汇编启动代码,感觉像从开自动挡车一下子换成了手动挡,还得自己搭发动机。

2026-09-17 18:48:47 272

原创 ARM汇编入门:从零开始编写启动代码,为C语言铺路

ARM汇编虽看似底层,但其逻辑清晰、指令精简。掌握启动代码的编写,不仅有助于理解嵌入式系统的启动流程,也为后续驱动开发、Bootloader编写打下坚实基础。📌学习建议从“复位→初始化→跳转C”主线出发,避免陷入指令细节;多用Keil或QEMU仿真验证;结合C语言理解寄存器传递参数(R0-R3)和返回值(R0)的AAPCS规范。当你成功看到")在串口输出时,你会明白:这段汇编,正是通往C世界的桥梁。

2026-09-16 20:43:55 293

原创 【嵌入式基础】深入理解 ARM 体系结构与核心原理:从 SOC 到流水线

本文基于 ARM 体系结构的学习笔记,系统梳理了从计算机组成原理到 ARM 核心内部机制的关键知识点。内容涵盖 SOC 架构、CISC 与 RISC 的区别、ARM 处理器内核分类、寄存器组详解、内存管理(MMU)以及三级流水线原理,是嵌入式开发入门与进阶的必备参考。

2026-09-15 20:07:40 530

原创 51单片机UART串口通信全解析:从底层原理到代码实战

UART(Universal Asynchronous Receiver/Transmitter)即通用异步收发器。它是一种全双工、异步的串行通信协议。

2026-09-13 17:41:29 332

原创 51单片机入门指南:从硬件基础到代码实战

CPU在执行当前任务时,被内部或外部的紧急事件打断,转而去处理该事件,处理完后返回原断点继续执行。最小系统(硬件基础)、中断系统(软件逻辑)、I/O控制(外设交互)。掌握了这些,你就具备了开发简单智能小车、电子钟、温控风扇的能力。定时器/计数器:学习如何利用Timer0/1实现精准的定时(比延时函数更高级)。串口通信 (UART):让单片机能与电脑或其他模块(如蓝牙、WiFi)对话。模块化编程:将LCD驱动、按键扫描封装成.c和.h文件,养成良好的工程习惯。

2026-09-11 18:04:31 191

原创 Linux 数据库开发实战:使用 C 语言与 SQLite3 构建轻量级终端词典

为了保持代码的整洁,我们使用结构体来承载数据,并封装一个回调函数用于处理SELECT查询的结果。} dict_t;// 查询结果回调函数i < colnum;// 返回 0 表示继续处理下一行。

2026-09-04 18:05:54 512

原创 深入理解 Linux 网络编程:TCP 并发模型与 IO 多路复用详解

/ 将文件描述符 fd 从集合中清除// 判断文件描述符 fd 是否仍在集合中// 将文件描述符 fd 加入集合中// 将文件描述符集合清 0。

2026-09-03 17:31:59 752

原创 零基础吃透HTTP协议:核心原理、传输流程与实战实操详解

HTTP 全称超文本传输协议(Hyper Text Transfer Protocol),是运行在TCP协议之上的应用层协议,也是Web通信的核心规范。它的核心作用:统一规定网络中超文本内容(文字、图片、视频、接口数据等)的传输规则、交互流程和数据格式,让客户端和服务器之间可以规范、高效地完成数据通信。简单理解:HTTP就是客户端和服务器之间的“对话规则”,双方必须按照这个规则发送、接收数据,才能正常完成网络交互。

2026-09-02 20:38:00 838

原创 TCP通信

TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在 TCP 通信中,客户端与服务器在正式传输数据前,必须先经历一个被称为“三次握手”的过程来建立连接。这种机制确保了通信双方都具备正常的发送和接收能力,从而为后续的数据可靠传输奠定基础。在 Linux 网络编程中,TCP 通信依赖于一组标准的 Socket API 函数。下面我们将详细解析这些核心函数接口的功能、参数及返回值。

2026-09-01 20:58:56 418

原创 深入浅出 UDP 网络编程:从核心原理到全双工聊天实战

通过这篇文章,我们不仅理解了 UDP 的底层原理,还亲手搭建了一个跨主机的全双工通信模型。UDP 编程虽然简单,但在高并发、弱网环境下,如何保证数据的完整性?这就需要我们在应用层自己实现序列号(Sequence Number)和确认机制(ACK),或者借助 QUIC 等现代协议。网络编程的世界广阔无垠,掌握了 UDP 这把利器,你离高级后端工程师又近了一步!

2026-08-31 18:33:43 771

原创 Linux 进程间通信(IPC)核心机制:消息队列、共享内存与信号量详解

特性消息队列共享内存信号量核心用途结构化数据异步传递海量数据极速共享进程同步与互斥控制通信速度较慢(需内核态拷贝)最快(零拷贝)不适用作数据传输同步机制自带阻塞等待无(需配合信号量)核心机制适用场景命令下发、事件通知图像处理、高频交易保护共享资源、流水线同步在实际的系统编程中,这三者往往不是孤立存在的。“共享内存 + 信号量”构成了高性能数据交换的黄金组合,而消息队列则更适合轻量级的控制指令流转。掌握它们的底层原理与 API 规范,是迈向高级 Linux 系统开发的必经之路。

2026-08-30 13:43:26 287

原创 C语言进程间通信(IPC)全解析

在Linux系统编程中,进程间通信(Inter-Process Communication,简称IPC)是构建多进程协作系统的基石。由于操作系统为每个进程分配了独立的虚拟地址空间,进程之间无法直接访问彼此的数据。为了实现数据交换与协同工作,内核提供了一系列标准化的IPC机制。本文将带你系统梳理C语言中常用的IPC方式,并结合代码示例深入理解其底层原理与工程实践。

2026-08-28 18:11:14 753

原创 Linux C 多线程编程基础:从内存模型到生命周期管理

理解线程,首先需要明确其与进程在资源分配上的本质区别。

2026-08-26 17:44:55 193

原创 Linux 进程管理详解:从概念到实战

进程是程序动态运行实例,拥有独立虚拟地址空间;Linux 依靠时间片轮转调度,实现宏观并行、微观串行;fork()创建子进程,借助写时复制 COW 兼顾性能与内存隔离;日常运维熟练使用pstopkilljobs等命令;开发中要重点防范僵尸进程、D 状态阻塞进程这类异常。

2026-08-25 18:50:17 403

原创 文件IO与目录IO

防御性编程:所有的fopenopendirread等返回值都必须检查。善用perror()和errno快速定位是权限不足(EACCES)、文件不存在(ENOENT)还是磁盘满(ENOSPC资源闭环:遵循“打开-检查-操作-错误检测-关闭”的五步法。在复杂逻辑中,确保每个return或goto分支前都有对应的fclose或closedir,防止文件描述符耗尽。性能权衡:处理海量小文件读写时,优先使用标准IO()利用其缓冲机制;处理网络通信或需要精确控制IO时机时,降级使用系统调用(read/write。

2026-08-23 16:12:58 526

原创 Linux软件编程(3)

在C语言编程中,文件操作是实现数据持久化、程序配置读取以及复杂数据管理的基础。通过标准I/O库(stdio.h),C语言提供了一套强大且灵活的文件操作函数接口。本文将深入解析fputsfgetsfprintffwritefreadfseekftell和rewind这几个核心函数,帮助你彻底掌握C语言的文件读写与定位机制。

2026-08-21 19:18:27 640

原创 Linux软件编程(2)

在C语言中,并没有内置的输入输出语句,所有的I/O操作都是通过调用标准库函数来实现的。这些函数主要定义在<stdio.h>头文件中,构成了C语言标准I/O库(Standard I/O Library)。它们不仅用于控制台(终端)的交互,也是进行磁盘文件读写的基础。

2026-08-20 18:54:36 312

原创 Shell脚本入门与实践

Shell脚本是一种用Shell命令编写的脚本程序,它通过解释器(如Bash、Zsh)执行,能够自动化完成一系列系统操作任务。Shell脚本在Linux/Unix系统中广泛应用,是系统管理、软件部署、数据处理等场景的必备技能。# 定义函数调用函数log_message "应用程序启动"官方文档:GNU Bash手册在线教程:Shell脚本编程30分钟入门实战书籍:《Linux命令行与Shell脚本编程大全》社区资源:Stack Overflow、优快云博客。

2026-08-19 18:57:32 689

原创 哈希表、排序和查找

哈希表也叫散列表,它的核心逻辑非常好理解:我们提前准备一批“存储筐”,通过一个自定义的哈希函数(散列函数),把输入的关键字转换成一个0到“筐总数-1”之间的整数,这个整数就是数据对应的“筐编号”,也就是散列地址。但现实里,我们很难设计出一个完美的哈希函数,让不同的关键字都映射到完全不同的地址——当两个不同的关键字通过哈希函数算出同一个散列地址时,这种情况就叫做“哈希碰撞”,这两个互为同义词的数据,就不得不被放进同一个“筐”里。如果目标值小于中间元素,就把查找区间缩小到左半部分,反复迭代直到找到目标。

2026-08-18 18:33:48 590

原创 数据结构:二叉树

结合你正在做的电力系统仿真场景,你可以把电网的层级化故障索引存储为二叉树,利用中序遍历快速检索不同电压等级的故障记录,比线性遍历效率提升非常明显。它是递归定义的:一棵非空二叉树由根节点、左子树、右子树组成,而左右子树本身也都是二叉树。- 对于n个节点的完全二叉树,按数组从0开始编号时,下标为i的节点左孩子下标为`2*i+1`,右孩子下标为`2*i+2`,父节点下标为`(i-1)/2`1. **满二叉树**:每一层的节点数都达到最大值,深度为k的满二叉树总节点数为`2^k - 1`,没有任何空位。

2026-08-17 19:18:56 497

1_数据结构与手撕代码面试精讲.pdf

1_数据结构与手撕代码面试精讲.pdf

2026-10-16

空空如也

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

TA关注的人

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