- 博客(350)
- 资源 (14)
- 收藏
- 关注
原创 Linux驱动:framebuffer应用层实践
本文解析了Linux帧缓冲(Framebuffer)驱动在/sys/class/graphics路径中的存储原理,并提供了查看驱动信息的代码实现。文章首先说明Linux设备模型将图形设备归类到/sys/class/graphics目录,Framebuffer作为基础图形抽象层通过register_framebuffer()注册时自动创建设备节点。随后展示了一个C程序示例,通过ioctl获取fb_var_screeninfo和fb_fix_screeninfo结构体信息,包括分辨率、像素深度、内存大小和颜色格
2025-06-11 23:31:44
352
原创 Linux驱动:class_create、device_create
udev是Linux系统中动态管理设备文件的关键机制,主要功能包括:设备文件动态管理 - 自动响应设备插拔事件,在/dev目录下创建/删除对应设备节点设备属性配置 - 基于硬件ID设置权限、所有者和符号链接内核事件响应 - 通过uevent机制监听设备状态变化
2025-06-06 18:45:00
626
原创 Linux驱动:register_chrdev_region、 alloc_chrdev_region
本文摘要介绍了Linux字符设备驱动开发的关键概念和API: 提供MAJOR/MINOR/MKDEV宏操作 设备号管理: register_chrdev_region:静态分配设备号 unregister_chrdev_region:释放设备号 字符设备结构cdev: cdev_init:初始化设备结构并关联文件操作 cdev_add:将设备注册到系统 cdev_del/cdev_put:移除设备和释放资源
2025-06-05 23:15:00
711
原创 驱动:字符驱动操控硬件
驱动操控硬件和裸机操控的主要区别在于:驱动程序通过内核提供的API和资源管理机制访问硬件,具有隔离性、安全性和并发控制能力;而裸机操控则直接操作硬件寄存器,效率更高但缺乏保护机制和资源管理。
2025-06-05 19:45:00
744
原创 驱动:字符设备驱动注册、读写实操
本文介绍了Linux字符设备驱动的开发流程,包括Makefile编写、模块基本结构、设备注册与注销的实现方法。主要内容为:1) 构建模块编译环境,编写包含init/exit函数的驱动框架;2) 实现file_operations结构体并注册字符设备,添加open/release操作;3) 测试驱动安装/卸载流程,处理设备号冲突问题;4) 实现内核自动分配主设备号;5) 通过mknod创建设备节点文件。文章通过具体代码示例演示了从驱动编写到应用程序调用的完整开发过程,重点解决了设备注册注销时的常见问题。
2025-06-04 20:43:48
1274
原创 驱动: file_operations、register_chrdev、/proc 文件系统概述
Linux字符设备驱动开发核心机制 file_operations结构体是Linux内核驱动开发的关键接口,它定义了用户空间与内核空间文件操作的映射关系。该结构体包含多个函数指针,如open、read、write、ioctl等,驱动开发者通过实现这些回调函数来提供设备功能。一个典型的字符设备驱动实现包括: 注册设备号(alloc_chrdev_region) 初始化cdev结构体(cdev_init)并关联file_operations 实现核心操作函数: open/release:设备打开/关闭时的资源管
2025-05-25 19:15:00
575
原创 Linux驱动:基本环境准备
本文介绍了开发板调试模块的完整流程,包括内核源码树准备、开发板启动配置、模块编译测试等关键步骤。主要内容为:1) 准备内核源码树并进行模块编译;2) 通过uboot启动开发板,配置tftp下载内核镜像;3) 设置nfs挂载rootfs文件系统;4) 配置Ubuntu与开发板网络连接;5) 内核配置需开启nfs rootfs支持。文中详细给出了各环节的命令操作和参数设置方法,并提供了相关配置的参考链接,是完整的嵌入式开发环境搭建指南。
2025-05-24 16:11:55
768
原创 C++:面试题汇总
本文介绍了C++编程中的一些基础概念和内存管理技术。首先,指针和引用的区别在于指针可以重新赋值并指向不同的对象,而引用是对象的别名且不能改变绑定对象。接着,const关键字用于定义常量,确保变量值不被修改,而static关键字用于控制变量和函数的生命周期和作用域。define用于定义宏,而inline用于内联函数以减少函数调用开销。constexpr用于编译时常量,volatile用于防止编译器优化,extern用于跨文件访问全局变量。std::atomic提供了对基本数据类型的原子操作封装,解决多线程数据
2025-05-22 23:00:00
807
原创 Linux:面试题
本文概述了操作系统中的关键概念和机制。中断和异常分别由外部设备和CPU内部触发,用于处理紧急事件和错误。用户态和核心态区分了进程和操作系统的运行环境。
2025-05-20 22:45:00
1184
原创 C++ :STL
STL(Standard Template Library)是C++标准库的核心,通过泛型编程提供高效的数据结构与算法处理。它包含四大组件:容器、迭代器、算法和函数对象。容器分为序列容器(如vector、list)、关联容器(如set、map)和容器适配器(如stack、queue),用于管理数据集合。迭代器提供访问容器元素的统一接口,支持多种操作方式。算法是独立于容器的通用函数,用于排序、查找、修改等操作。函数对象通过重载()运算符,用于算法的自定义操作。STL的设计使得C++程序员能够高效地处理复杂的数
2025-05-19 21:00:00
870
原创 C++:⾯向对象的三⼤特性
面向对象编程的三大特性包括继承、封装和多态。继承允许子类继承父类的属性和方法,实现代码复用;封装通过访问控制隐藏内部实现细节,仅对外提供必要接口;多态则允许不同类的对象通过相同接口调用,增强代码灵活性。访问修饰符如public、private和protected控制成员的访问权限。多重继承允许一个子类继承多个父类的特性。重载和重写的区别在于作用域和参数列表,重载在同一作用域内,重写则在继承关系中。C++多态通过虚函数和指针/引用实现,虚函数表存储虚函数地址。构造函数和析构函数分别用于对象初始化和资源释放。虚
2025-05-18 23:15:00
728
原创 C++:C++内存管理
C++ 内存管理涉及多个关键概念和区域,包括栈、堆、全局/静态存储区、常量存储区和代码区。栈用于存储局部变量和函数参数,由编译器自动管理;堆用于动态内存分配,需手动管理,容易产生内存泄漏。内存泄漏通常由未正确释放内存或指针丢失引起,可通过智能指针、RAII原则和内存检测工具避免。智能指针(如 std::unique_ptr、std::shared_ptr 和 std::weak_ptr)自动管理对象生命周期,减少手动内存管理的风险。野指针和悬浮指针分别指向无效内存和已销毁对象,可通过初始化指针和使用智能指针
2025-05-17 21:00:00
377
原创 C++:字符串操作函数
本文介绍了C++中常用的字符串处理函数和容器类方法。strcpy()用于复制字符串,strlen()计算字符串长度,strcat()连接字符串,strcmp()比较字符串。这些函数在处理字符串时非常有用,但需注意目标字符串的空间是否足够。此外,std::string类中的length()和size()方法功能相同,均返回字符串的字符个数。容器类如vector中的size()方法用于返回容器中元素的数量。这些函数和方法在字符串处理和容器操作中具有广泛的应用。
2025-05-16 21:15:00
280
原创 C++ 基础知识点
指针和引用是C++中两种重要的概念,指针存储变量的内存地址,可以重新赋值并支持空值,适合动态内存管理;引用是对象的别名,初始化后不能更改,且不能为空,语法更简洁安全,常用于函数参数传递和操作符重载。const关键字用于声明常量,保证变量值不被修改,可修饰变量、函数参数、成员函数等,常用于指针、引用和成员函数的常量声明,提升代码安全性。static关键字用于限制变量或函数的作用域,延长局部变量的生命周期,或声明类成员为静态,使其属于类而非对象,所有对象共享同一个静态成员。
2025-05-15 22:30:00
926
原创 Linux驱动:驱动编译流程了解
本文介绍了在开发板中编译Linux内核镜像(zImage)的步骤,并详细说明了内核源码树的配置和编译过程。首先,通过解压内核源码包并配置编译选项,生成了自定义的内核镜像。编译过程中遇到的错误通过重新执行编译命令得以解决。其次,文章详细讲解了常用的内核模块操作命令,包括lsmod、insmod、modinfo和rmmod,并提供了使用modprobe加载和卸载模块的示例。最后,通过一个简单的内核模块示例代码(module_test.c)和对应的Makefile,展示了如何编译和加载自定义内核模块,并将生成的模
2025-05-12 23:01:14
735
原创 C++ 模板方法模式详解与实例
模板方法模式(Template Method Pattern)属于行为型设计模式,其核心思想是在一个抽象类中定义一个算法的骨架,而将一些步骤延迟到子类中实现。这样可以使得子类在不改变算法结构的情况下,重新定义算法中的某些步骤。它通过继承机制,实现代码复用和行为扩展,减少重复代码,提升程序的可维护性和扩展性。
2025-05-08 20:15:00
1168
原创 STM32:看门狗
窗口看门狗(WWDG)由系统时钟(PCLK1)分频后驱动,其工作依赖于系统时钟的正常运行。它相较于独立看门狗,具有更严格的时间监控机制。窗口看门狗设置了一个时间窗口,喂狗操作必须在这个时间窗口内完成,早于或晚于该窗口都会导致系统复位。这种特性使其能够更精准地监控程序的运行状态,适用于对程序运行时序要求较为严格的场景。
2025-04-27 18:12:30
570
原创 模式设计简介
八大原则贯穿面向对象设计的核心逻辑,最终指向以下目标:解耦:降低模块间依赖,使系统更灵活复用:通过抽象与封装提高代码复用性健壮性:减少修改导致的连锁反应,降低维护成本可扩展性:支持通过新增代码而非修改旧代码扩展功能在实际开发中,需根据场景灵活组合原则,避免过度设计。例如,复杂业务场景可优先使用组合 + 接口隔离,简单场景可通过继承快速实现(但需警惕继承的局限性)。
2025-04-25 22:45:00
994
原创 Linux应用:网络基础
OSI(Open Systems Interconnection)模型即开放式系统互联参考模型,是一个逻辑上的网络通信架构标准。它将网络通信的功能划分为七个层次,从下到上依次为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。每一层都有其特定的功能和职责,层与层之间相互协作,通过接口进行通信。这种分层结构使得网络通信的设计和理解更加模块化,便于故障排查、技术升级以及不同厂商设备之间的互操作性。例如,物理层负责处理物理介质上的信号传输,如电缆、光纤中的电信号或光信号;
2025-04-23 21:21:15
650
原创 windows USB 了解
这些函数通常按以下顺序使用:调用 SetupDiGetClassDevs 函数创建设备信息集。利用 SetupDiEnumDeviceInterfaces 函数枚举设备信息集中的设备接口。针对每个枚举到的设备接口,调用 SetupDiGetInterfaceDeviceDetail 函数获取详细信息。最后调用 SetupDiDestroyDeviceInfoList 函数销毁设备信息集,释放资源。
2025-03-28 22:07:04
662
原创 vs2022+QT6.7.3打包程序流程
5、管理员方式打开x64 Native Tools Command Prompt for VS 2022,进入test目录,执行:windeployqt6.exe XXX.exe。6、修改程序名称:在"项目->属性->配置属性->常规"选项卡下的“目标文件名”选项,和“项目->属性->配置属性->链接器->常规”选项卡下的“输出文件”选项保持一致即可。4、管理员方式打开Qt 6.7.3 (MSVC 2022 64-bit),进入test目录,执行:windeployqt6.exe XXX.exe。
2025-03-28 21:45:00
363
原创 Linux应用:线程进阶
信号量(Semaphore)是一个整型的计数器,用于控制对共享资源的访问。它通过 PV 操作来实现同步,P 操作将信号量的值减 1,如果值小于 0 则线程阻塞;V 操作将信号量的值加 1,如果有线程在等待则唤醒一个等待的线程。sem_t属于信号量类型,sem是所定义的信号量变量。sem_wait(&sem):这是信号量的 P 操作,其作用是将信号量的值减 1。若信号量的值为 0,线程会被阻塞,直至信号量的值大于 0。printf(“线程进入临界区\n”);:输出线程进入临界区的信息。
2025-03-27 23:19:11
966
原创 Linux应用:线程基础
进程:是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位。每个进程都有自己独立的地址空间、内存、数据栈以及其他用于维护进程运行的资源。线程:是进程中的一个执行单元,是程序执行的最小单位。线程共享所属进程的资源,如地址空间、打开的文件等,但有自己独立的栈空间和程序计数器等。
2025-03-27 22:11:41
841
原创 Linux应用:异步IO、存储映射IO、显存的内存映射
全部刷新实现简单,但效率较低;更新刷新能提高效率,但实现复杂度较高,需要额外的处理来检测变化区域。在实际应用中,要根据具体的需求和场景选择合适的刷新方式。
2025-03-24 23:05:51
1865
原创 Linux应用:select、poll
在阻塞 I/O 模型中,当应用程序调用一个 I/O 操作(如读取文件、从网络套接字接收数据等)时,该应用程序会被阻塞,直到 I/O 操作完成。例如,一个进程调用read系统调用从磁盘读取数据,在数据从磁盘传输到内核缓冲区并复制到用户空间之前,进程会一直处于等待状态,无法执行其他任务。这种模型简单直接,但在等待 I/O 完成的期间,进程资源被浪费,无法进行其他有用的工作。。
2025-03-24 22:57:34
805
原创 Linux应用:Linux的信号
捕获信号并自定义处理:进程可以定义一个信号处理函数,当接收到特定信号时,内核会调用该函数,进程在函数中可以执行自定义的操作。首先需要定义信号处理函数,int fd;int* ptr;if (fd!if (ptr!exit(0);return 0;stdio.h:提供标准输入输出库函数,如 printf 用于输出信息。
2025-03-20 23:32:02
1068
原创 Linux应用:进程间通信
SystemV IPC 是 UNIX System V 操作系统中引入的一组进程间通信机制,包括消息队列、共享内存和信号量。这些机制在 Linux 系统中也得到了广泛应用。。
2025-03-20 22:59:47
947
原创 Linux应用:程序运行
kill命令的这种用法是向指定的进程发送特定信号编号的信号。信号在操作系统中是一种软件中断机制,用于通知进程发生了某种特定事件或要求进程执行特定操作。。
2025-03-17 23:13:07
634
原创 Linux应用:进程详解
程守护进程是一种在后台运行且不受终端控制的进程。它具有以下特点:生存期长:从系统启动开始运行,一直持续到系统关闭,期间持续提供特定服务。脱离控制终端:守护进程启动后,与创建它的终端脱离关系,即使终端关闭,它也能继续运行。运行在特定会话和进程组:通常会创建自己独立的会话和进程组,避免受到其他进程的干扰。。
2025-03-16 20:51:49
613
原创 Linux应用:进程的回收
waitpid函数也是用于等待子进程结束的系统调用,它比wait函数更加灵活。waitpid可以指定等待特定 PID 的子进程,也可以设置非阻塞等待模式或者阻塞模式。通过waitpid,父进程可以更精确地控制对子进程的等待和资源回收操作,例如可以在不阻塞父进程的情况下,定期检查子进程是否结束。pid_t pid;int status;// 创建子进程// 处理 fork 失败的情况return 1;// 子进程代码printf("子进程开始执行,PID: %d\n", getpid());
2025-03-14 21:14:30
642
原创 Linux应用:PCB、fork
子进程是由另一个进程(父进程)通过fork或其他类似机制创建的新进程。子进程继承了父进程的许多属性,如用户 ID、组 ID、环境变量、文件描述符等,但它有自己独立的 PID 和内存空间,与父进程并发执行,在一定程度上可以看作是一个独立的程序在运行。
2025-03-13 21:32:55
922
原创 linux应用:进程前章
操作系统加载程序:当用户在命令行输入程序的可执行文件名或者通过图形界面点击应用程序图标时,操作系统的加载器(loader)开始工作。加载器会在磁盘上找到对应的可执行文件,该文件遵循特定的格式,如 ELF(Executable and Linkable Format,用于 Linux 系统)。加载器将可执行文件中的代码和数据加载到内存中,并设置好运行环境,包括初始化栈(stack)等。。
2025-03-12 22:13:42
895
原创 linux应用:随机数、proc
proc是一个虚拟文件系统,它提供了一种内核与用户空间交互的方式,通过文件和目录的形式展示内核对象的信息,包括进程信息、系统状态、硬件设备信息等。它并不占用实际的磁盘空间,而是在内存中动态生成。当访问/proc下的文件时,内核会实时生成相应的信息并返回给用户空间程序。与时间相关的 proc 文件。
2025-03-12 19:52:52
869
原创 Linux应用:时间API
在 Linux 内核中,jiffies 是一个非常重要的全局变量,它记录了系统启动以来产生的时钟中断次数。每发生一次时钟中断,jiffies 的值就会增加 1。时钟中断是由硬件定时器产生的,其频率在系统编译时就已经确定,通过HZ宏来表示,单位是赫兹(Hz)。例如,如果HZ的值为 1000,那就意味着系统每秒会产生 1000 次时钟中断,jiffies 每秒也会增加 1000。jiffies 的类型通常是unsigned long,这使得它能够表示一个非常大的计数值,即使系统运行很长时间也不会溢出。
2025-03-11 20:58:19
1070
原创 linux应用:静态文件、 inode(i 节点)、vnode、流
inode(index node,索引节点)是 Unix/Linux 文件系统中的一种数据结构,用于存储文件的元数据信息,每个文件和目录在文件系统中都有一个对应的 inode。inode 是文件系统管理文件的核心,它记录了文件的各种属性和数据块的存储位置等信息。
2025-03-10 21:12:01
1207
wrieshark.zip
2021-03-12
IAR for 430
2020-10-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人