- 博客(99)
- 收藏
- 关注
原创 LVGL 普通函数指针与结构体函数指针原理
在 LVGL 事件开发中,开发者经常使用绑定回调函数。多数初学者无法理解:回调函数如何被控件保存、事件参数从何而来、两种函数指针的区别是什么。本文从零、零基础、标准化讲解整套原理。不依赖任何结构体、独立存在的函数指针,称为普通函数指针。该类型仅规定函数格式,不属于任何结构体,属于标准普通函数指针类型。将函数指针作为结构体成员进行保存,该指针称为结构体函数指针。普通函数指针是“裸函数地址”,结构体函数指针是“被结构体收纳保存的函数地址”。1. 普通函数指针:用户编写的回调函数,独立存在,无归属。
2026-09-05 09:04:12
4
原创 Linux exec函数族
作用:fork 创建子进程后,子进程默认与父进程代码一致,通过 exec 函数可以覆盖当前进程程序,执行全新的可执行文件。核心特性进程 PID 不变,仅替换代码段、数据段;继承已打开的文件描述符成功无返回,exec 后续代码永不执行失败返回 -1,继续执行后续代码标准流程:fork() 创建子进程 → 子进程调用 exec → 父进程 wait() 回收子进程。
2026-09-05 09:03:09
5
原创 Linux系统编程:fcntl 与 ioctl
在 Linux 系统编程中,和都是用于对文件描述符进行二次控制的系统调用。:POSIX 标准,(文件、管道、socket、设备):设备私有接口,本文按学习顺序:先 fcntl、后 ioctl,结构清爽、重点突出,适合入门与复习。
2026-09-05 09:02:32
18
原创 Linux COW 写时复制机制
COW(Copy On Write,写时复制)是 Linux 针对fork()的核心性能优化机制。读共享、写复制、延迟拷贝、按需分配。虚拟地址相同,物理地址不同:fork 后虚拟地址一致,COW 触发后物理内存相互独立代码段永不拷贝:只读代码段永久共享,仅数据段、栈、堆触发 COW只读零开销:读取数据不会产生任何内存拷贝,性能极高COW 写时复制是 Linux 优化 fork 性能的核心机制,遵循读共享、写复制的原则。fork 创建子进程时,内核仅复制页表,父子进程共享物理内存并将可写页面设为只读;
2026-09-05 09:00:27
73
原创 Linux fork() 工作原理
fork()是 Linux 内核提供的系统调用,核心作用是基于当前父进程,创建一个全新的子进程,是 Linux 实现多进程并发的底层基础。它与普通用户态函数有本质区别:普通函数仅在当前进程内执行,而fork()会向内核申请资源,完成进程分裂,实现单进程变双进程的效果。进程数量变化: 调用 fork 前:系统仅存在1 个父进程调用 fork 后:保留原父进程,新增1 个子进程fork()是 Linux 创建子进程的核心系统调用,通过复刻父进程运行快照生成独立子进程,依靠返回值区分父子执行流。
2026-09-05 08:58:48
108
原创 共享内存(shared memory)
共享内存允许多个进程访问同一块物理地址区域 在Linux下最快的进程间通信(IPC)方式,数据不要在进程间复制,而是直接读写公共内存机制:在内核的物理内存中开辟一块区域,这块区域作为共享内存映射:通过页表将这块物理内存映射到多个进程的虚拟地址空间中访问操作:进程像操作普通指针一样读写这块内存即可,已经实现了内核的物理内存映射到进程地址空间中,无需调用系统接口(read/write) ,物理内存由内核管理。
2026-09-04 17:23:13
108
原创 进程间的通信---信号(signal)
将信号与用户编写的函数绑定,收到信号时则执行用户自定义函数(eg:ctrl+c 默认行为终止 可以选择用户捕获信号 信号到达时采用自定义函数)注意:SIGKILL(9) 和 SIGSTOP(19)无法捕获-这是内核超级用户保留的"终极管控手段" 确保进程可以被强制终止/暂停。
2026-09-04 17:17:41
228
原创 C语言全局区非法调用函数---问题总结
在全局作用域直接调用执行类函数、初始化函数,是典型的低级语法错误。示例错误代码:二、错误本质C语言程序执行分为两个阶段:1. 编译加载阶段:先初始化所有全局变量,只允许常量赋值,不支持任何代码执行、函数调用、动态内存操作。2. 运行阶段:进入 main 函数后,才可以执行函数、循环、malloc 等逻辑。全局区没有运行上下文,只能定义变量,不能执行代码。方式二:将所有初始化、函数调用放到 main 内部四、核心口诀(永久避坑)全局只定义,不执行;所有逻辑,全部进函数。越是学高阶
2026-09-04 15:58:53
209
原创 LVGL 事件回调 核心知识点总结
通过绑定回调函数指针,触发事件后系统填充lv_event_t 结构体;在回调内部通过 get_user_data / get_target拿到父对象,再通过 lv_obj_get_child反向查找子控件,完成界面操作。
2026-09-04 08:48:59
262
原创 Linux mmap 内存映射深度解析:基于帧缓冲 /dev/fb0
1.mmap 是本文核心主体,用于将内核显存映射到用户空间,实现无系统调用高速绘图。2. 帧缓冲是 mmap 的操作对象,MMU 是 mmap 的硬件辅助机制。3. mmap 提供固定虚拟地址,MMU 实现物理区域动态切换,共同构成「地址编号一样,但操作区域不一样」的底层能力。
2026-09-04 08:47:46
353
原创 Ubuntu嵌入式开发 export环境变量
嵌入式新手在 Ubuntu 配置交叉编译工具链时,几乎只会看到这一种写法,对老师讲的通用公式export 变量名=值非常困惑。为什么别的变量可以直接赋值,唯独 PATH 要拼接?引号什么时候加、什么时候不用?永久配置到底用.bashrc还是profile?export 变量=值是所有环境变量的通用语法。PATH 不能直接覆盖,必须用拼接,防止系统命令报废。临时命令可不带引号,永久配置必须双引号 "",禁止单引号 ''。个人开发用~/.bashrc,多人服务器统一用。
2026-09-03 08:52:48
665
原创 LVGL 界面黑屏终极原因:分清「内存对象」和「屏幕显示」
创建界面:仅开辟内存,界面驻留后台,不显示。切换界面:必须调用,这是唯一刷新屏幕的方式。删除时机先加载新界面,再删除旧界面。顺序颠倒必黑屏。
2026-09-03 08:51:53
352
原创 C语言高危越界函数:gets / getwd 漏洞与替换方案
无长度参数、无边界校验,必然内存越界,标准废弃;强制携带长度参数,超长截断/报错,杜绝非法内存访问;所有缓冲区读写,必须指定有效长度,禁止无边界操作。
2026-09-02 08:51:57
212
原创 TFTP 权限规范:777 隐患与标准配置解析
嵌入式 TFTP 搭建存在两种主流配置:新手普遍使用0777权限快速避坑,工程环境统一使用chown+775规范配置。777 明明最简单,为什么工程坚决不用?chown 到底是不是多余命令?本文精炼讲透 TFTP 权限本质、777 流行原因、安全隐患、标准规范。所有者|所属组|其他用户775 = 内部全权操作,外部只读不可改tftp 用户:完整读写、上传、删除本机用户:完全操作局域网设备:仅下载、禁止篡改、禁止上传775 完美平衡调试便利性 + 安全性,是行业统一标准。1、
2026-09-02 08:51:14
271
原创 RK3568 开发板基于 SecureCRT 串口 Zmodem 协议文件传输
Windows 主机运行 SecureCRT 串口终端软件,通过 CH340 USB 转 TTL 串口线(TX、RX、GND)连接 RK3568 开发板。开发板执行该命令,SecureCRT 弹出保存对话框,将开发板内文件保存到 Windows 主机。开发板正常启动并进入 Linux 系统,系统预装 lrzsz 工具包,文件传输功能由该工具实现。当开发板当前目录存在同名文件时,直接覆盖原有文件,省去交互确认步骤。,并非 SecureCRT 软件自带命令。示例:sz test.log。
2026-09-01 08:51:19
200
原创 LVGL 两种 style样式写法 区别、Static 底层原理、跨平台使用规范
自定义静态复用样式 lv_style_t与对象快捷样式接口 lv_obj_set_style_xxx。两种写法渲染效果完全一致,但底层内存机制、复用能力、跨平台适配要求完全不同。本文结合窗口实操案例、static 核心原理、各平台使用场景做最终规整总结,可直接作为工程开发规范文档。
2026-09-01 08:49:30
390
原创 Ubuntu TFTP 万能工程模板(全开发板通用)
网上 90% 的 TFTP 教程要么参数残缺、要么只下载不上传、要么命令混乱。本文给出的是嵌入式行业通用、所有开发板通吃、可永久复用的 TFTP 最终配置。适配:Ubuntu18/20/22 全系、所有 U‑Boot 开发板(瑞芯微、全志、i.MX、STM32、FPGA)
2026-08-31 08:41:48
468
原创 C语言 随机数 rand()/srand() 函数
rand():随机数生成器,无自主随机能力,依赖种子srand():种子设置器,决定随机数序列默认效果:无 srand,种子固定为1,随机数永久重复最优写法:srand(time(NULL)) 实现动态真随机。
2026-08-30 14:42:45
230
原创 C语言 static函数与头文件封装规范
公共功能:无static修饰,声明写.h、实现写.c,对外提供调用内部逻辑:回调函数、工具函数全部加static,仅保留在.c内优势:内部代码可随意修改,只要接口不变,上层业务代码无需改动,实现解耦。
2026-08-30 14:41:11
295
原创 C语言 标准输入 / 输出缓冲区
1. stdout 与 stdin 是两块完全独立的内存缓冲区,各司其职,底层运行逻辑互不干扰。2. 无换行 printf 搭配死循环无输出的核心原因:stdout 行缓冲未满足刷新条件,数据滞留缓冲区。3. 单次 getchar() 仅能清除单个残留字符,= '\n');循环可彻底清空输入缓冲区所有垃圾字符。4. 两大缓冲区唯一交集:输入读取函数可隐式刷新 stdout,可临时解决无换行打印不显示的问题,属于特殊系统机制。5.统一工程编码规范需要即时打印的内容,优先添加\n换行,特殊场景使用。
2026-08-29 08:38:10
511
原创 BMP像素偏移 读取 代码说明
BMP 文件内部数值统一以小端序存放,这段代码直接把文件 4 字节拷贝到无符号整型变量,位或运算满足交换律,,仅书写顺序有区别。
2026-08-28 08:34:04
337
原创 24位、32位 BMP 图像格式概念
BMP 是一种无损、无压缩的标准位图图像格式,结构简单、解析逻辑固定,是嵌入式开发、底层图像学习中最基础的图片格式。24位 BMP与32位 BMP。二者最大的区别在于像素存储空间、色彩通道构成以及是否支持透明效果。24位 BMP 是纯真彩色位图,结构精简、通用性强,仅保存色彩信息,不具备透明能力。32位 BMP 在三色基础上增加了透明通道,功能更丰富,可实现透明叠加显示。在常规图像开发中,绝大多数普通画面显示优先使用24位 BMP,仅在需要透明效果时选用32位 BMP。
2026-08-28 08:32:29
253
原创 BMP 图片 LCD 显示函数完整解析
变量作用width图片横向像素总数,负数代表图像需要水平翻转height图片纵向像素总数,正数代表图像上下倒置存储depth色深,仅支持 24 位(无透明)、32 位(带透明通道)buf[4]临时缓冲区,读取文件头零散字节数据以只读模式打开 BMP 图片,打开失败直接退出;移动文件光标读取文件头固定偏移,解析图片宽、高、色深;根据 BMP4 字节对齐规则,计算每行填充字节数量;动态分配内存缓冲区,内存分配失败则关闭文件退出;
2026-08-27 08:32:04
329
原创 解惑:为什么 BMP 像素是从下到上、从左到右保存?
通常,像素是从下到上、从左到右保存的。绝大多数初学者看到这句话都会心生疑惑:肉眼观看图片是从上至下排布,为何文件存储顺序恰好相反?多数老师仅补充规则height>0 图像倒置,height<0 图像正置,但这只是对现象的复述,并未解释底层设计根源。造成困惑的核心,是计算机图形领域存在两套走向完全相反的坐标系,授课与教材未做区分对比,两套逻辑混杂讲解,导致理解出现偏差。两套坐标系是行业针对不同应用场景制定的规范,无对错之分。
2026-08-27 08:31:20
334
原创 Linux lseek+read 原生 API 读取 BMP 基础参数(实操代码篇)
像素点:图像最小成像单位,单点显示一种颜色分辨率:width × height,代表整张图行列像素数量width /height:单位 像素,描述图像横向、纵向像素数量;depth(色深):单位 bit,单个像素存储色彩占用的二进制位数。核心疑问:解析 BMP 宽、高、色深等不同字段时,为什么可以统一直接使用 int 变量读取?各字段字节长度并不完全相同,为何读取结果不会出错?全局统一核心规则:x86 架构下int 固定占用 4 字节,适配 BMP 绝大多数整型字段存储长度;
2026-08-26 08:43:55
169
原创 BMP 像素数组行对齐规则与像素数据计算(进阶计算篇)
单行有效像素字节无法被 4 整除时,行尾自动填充 Padding 字节补齐,填充字节无有效图像信息,仅用于适配内存寻址。参数定义:width(图像宽度,单位:像素)、depth(图像色深,单位:bit)、height(图像高度,单位:像素)2. 单行对齐判定:30 不是 4 的整数倍,向上补齐至最近 4 的倍数,真实行宽 = 32 字节。2. 单行对齐判定:5760 是 4 的整数倍,无需补齐,真实行宽 = 5760 字节。:忽略小端特性、按 RGB 顺序解析,会直接导致红蓝通道互换,图像色彩失真。
2026-08-26 08:41:04
408
原创 Windows 标准 BMP 磁盘存储结构详解(理论篇)
内存读取后自动拼接为完整数值 0x00000036,完全符合小端寻址规则,这也是代码中可直接用 int/unsigned int 变量读取解析的核心原因。:以像素起始偏移字段 bfOffBits(偏移0x0A,4字节)为例,假设真实偏移十进制值为。文件头总占用:0x0E(14字节),DIB 信息头紧随其后。偏移 0x0A 处的 4 字节字段 bfOffBits,存储。磁盘4字节存储顺序:0x36 0x00 0x00 0x00。DIB 头总占用:0x36 - 0x0E = 40 字节。
2026-08-25 08:41:43
359
原创 Linux open 函数 Flag 参数详解
内核硬性逻辑:程序申请的权限,必须和磁盘文件真实权限匹配,权限不足则 open 直接返回 -1 打开失败。每次执行 write 写入操作前,自动将文件偏移量跳转至文件末尾,实现内容追加,不会覆盖原有文件数据。文件不存在:自动创建文件,此时 mode 参数、umask 掩码生效,共同决定文件初始权限。文件已存在:O_CREAT 完全失效,mode 参数直接作废,不会修改原有文件的任何权限。关键特性:仅清空文件数据,完全不修改文件权限。功能:将文件长度置 0,清空所有原有内容。,绝对不会修改磁盘文件权限。
2026-08-25 08:40:15
271
原创 嵌入式开发 API 笔记
API 全称应用程序编程接口,是程序间标准化交互通道。嵌入式领域分为三大类:系统 API、库 API、Web API,覆盖单片机、Linux 嵌入式全开发场景。硬件底层驱动、Linux 设备文件使用系统 API(系统 IO);文件读写、芯片外设、通信协议调用库 API(标准 IO、HAL 库);物联网联网、云端数据交互依靠Web API。吃透三类 API 的定义、分层、场景与代码示例,即可掌握嵌入式开发全部 API 核心知识。
2026-08-24 08:55:14
771
原创 BMP 图像到底是什么?
BMP(Bitmap)是Windows 原生、无压缩、硬件级位图图像格式。不压缩、不丢数据、直接裸存每一个像素的原始颜色字节。JPG/PNG 都是压缩图,需要解码才能看到像素;BMP 不需要解码,文件里存的就是原生像素数据,非常适合底层 C 语言文件 IO、嵌入式图像开发学习。BMP 是一套遵循 x86 小端硬件、4字节行对齐、行倒置、BGR通道的原生裸像素存储图像格式,结构简单、无压缩、适合底层编程学习,不适合商用传输。
2026-08-24 08:54:11
386
原创 C 语言文件 IO:系统 IO 与标准 IO 返回值致命区别
绝大多数 C 语言初学者都会踩一个超级大坑先学系统 IO read/write,记住了「读写返回值是字节数」,然后惯性带入到标准 IO fread/fwrite,导致读取逻辑完全写错、读不到数据、判断条件失效、程序BUG满天飞。系统IO 和 标准IO 的返回值逻辑完全不是一套东西。系统IO read/write:按字节读写,返回字节数,出错 -1标准IO fread/fwrite:按整块读写,返回块数,无负数最大误区:把 read 的字节思维,带到 fread 里,程序直接报废。
2026-08-23 10:35:47
350
原创 一文读懂标准IO与系统IO:看似相似,实则底层截然不同
1. 标准IO和系统IO用法相似是因为封装关系:标准IO是系统IO的上层优化封装,底层依赖系统调用实现,因此读写流程完全对齐;2. 二者核心差距在缓冲机制:标准IO靠用户态缓冲优化高频小IO性能,系统IO无用户缓冲,主打实时性和底层可控性;上层业务读写用标准IO,底层精准控制用系统IO。读懂这层“形似神不似”的本质,就彻底摆脱了死记硬背API的困境,真正理解Linux文件IO的核心设计思想。
2026-08-23 10:34:13
433
原创 Linux 系统 IO 知识点总结
• 返回:成功返回大于 0 的文件描述符 fd;失败返回‑1,设置全局错误码errno,可用perror()打印错误。• flags:打开标志,三选一必选:O_RDONLY只读、O_WRONLY只写、O_RDWR读写;• fd:文件描述符;buf:内存缓冲区,存放读到的数据;• fd:文件描述符;• 返回:成功返回实际读到字节数;• 返回:成功返回实际写入字节数;• offset 偏移量:正数向后偏移,负数向前,0 不动。成功返回 0,失败‑1。• 返回:成功返回光标距离文件开头总字节;
2026-08-22 08:42:21
317
原创 Linux /mnt/hgfs 共享文件夹权限异常问题详解
VMware 共享目录固定路径 /mnt/hgfs/,挂载机制强制屏蔽 Linux 原生权限规则,无视代码内 umask 与 open 的 mode;umask(0444) 仅剥离读权限,执行位保留与否区分文件类型:普通文件内核强制清除 x,目录文件完整保留 w、x;验证 umask、open 权限联动实验,禁止在 /mnt/hgfs 内生成测试文件;标准实验规范:源码 / 可执行文件迁移至 Linux 家目录 ~/ 运行,才能观察到理论匹配的真实文件权限;
2026-08-22 08:35:44
546
原创 Linux umask 权限掩码原理及与 open 函数的联动应用
umask 是剥夺权限,不是设置权限,只减不加。本篇固定逻辑:umask(0444) + mode(0666) 生成文件权限--w--w--w-。O_RDWR 需要读权限 → 二次打开失败;O_WRONLY 只需要写权限 → 可重复打开。普通文件无论 mode 是否带 x,最终都无执行权限;目录文件才会保留 x 位。mode、umask 仅新建瞬间生效,文件成型后永久固定。
2026-08-21 08:59:17
411
原创 算法八大时间复杂度
时间复杂度是算法效率的核心判断标准。本文结合 C 语言代码,通俗、直观地讲解八大时间复杂度的区别、原理与适用场景,帮助大家彻底看懂代码对应的时间复杂度。八大复杂度效率排序(从快到慢)不考虑硬件性能、编程语言带来的差异,仅分析数据规模 n 不断增大时,代码执行次数的增长速度。1. 优质效率(项目常用)O(1)、O(log n)、O(n)、O(n log n),速度稳定,适配大数据。2. 低效多项式(仅小数据可用)O(n²)、O(n³),数据量稍微变大就会超时,工作中必须优化。3. 暴力级(工程基本不用)
2026-08-21 08:58:11
397
原创 TFTP 调试两种网线组网方案(仅讲解至设备互 Ping,文件传输操作暂不展开)
1.电脑 WiFi / 手机热点仅供给 Windows 主机上网,和网线搭建的调试内网相互独立,Windows 主机是否连接外网,都不会影响开发板和虚拟机互相 ping 通;7. 双向 Ping 无丢包,代表网络环境就绪,满足 TFTP 传输前置条件(具体文件下载命令暂不讲解)。4. 网线插接完成后,观察电脑、开发板网口指示灯,正常闪烁代表物理网线链路无故障。只用一根网线,两端分别插电脑有线网口、开发板网口,不需要交换机、路由器;2. 单根网线直连电脑有线口与开发板网口,设备上电;
2026-08-20 08:36:38
647
原创 链式栈为什么用头插?链式队列为什么用尾插?
链式栈头插:适配后进先出,保证 O(1) 高效,贴合栈单端高效操作的核心思想。链式队列尾插:保证先进先出顺序正确,贴合队列有序排队的核心思想。最高核心:数据结构实现优先遵从结构思想而非代码运行结果。违背设计思想的写法,即使可编译运行,也是错误写法。。
2026-08-20 08:35:59
211
空空如也
keil无法生成.axf文件
2024-06-29
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅