- 博客(46)
- 收藏
- 关注
原创 git reset详解
到指定的提交,并可选择是否修改工作区和暂存区。⚠️ 注意:若提交已被推送到远程仓库,强制重置(修改会保留在工作目录,可重新编辑后提交。确保无需保留代码再使用,或提前。)后需谨慎操作,避免影响协作。
2025-04-14 10:56:46
386
原创 宏控的用法
/ 如果 CONFIG_FEATURE_X 被启用(=y 或 =m),则编译此代码。IS_ENABLED(CONFIG_USB) // 展开为 1(模块也算启用)#include <linux/kconfig.h> // 内核代码中已默认包含。// 假设 CONFIG_X 是通过 -DCONFIG_X=1 传递的编译选项。IS_ENABLED(CONFIG_NET) // 展开为 1。IS_ENABLED(CONFIG_DEBUG) // 展开为 0。// 未启用时的代码。
2025-04-10 15:25:48
517
原创 ARM基础知识点及简单汇编语法
RAM(随机存取存储器,Random Access Memory)**是一种计算机存储器,用于暂时存储当前正在使用的数据和指令。**ROM(只读存储器,Read-Only Memory)**是一种非易失性存储器,通常用于存储永久性数据,即使断电也能保持数据。CMOS(互补金属氧化物半导体,Complementary Metal-Oxide-Semiconductor)**是两种常见的数字电路技术。:NOR Flash的物理地址通常映射到处理器的启动地址(如。:将寄存器的值存储到内存。
2024-09-18 20:52:10
2519
原创 frame buffer的使用
Frame buffer 是一块连续的物理内存,用于保存屏幕上每个像素的颜色信息。每个像素的信息可以表示为不同的格式,如 RGB、BGR、ARGB 等,具体格式取决于系统的显示模式。Frame buffer 中的每个字节都对应于屏幕上的一个或多个像素。Linux 系统中的 Frame Buffer 通过内存映射机制(Memory-Mapped I/O)工作。函数将 frame buffer 的内存映射到用户空间,便于直接对其操作。等表示的是 Frame Buffer 设备文件,程序可以通过。
2024-09-10 20:30:20
513
原创 哈希表和时间复杂度
(Hash Table),它通过将键值映射到特定的数组索引,从而实现高效的查找、插入和删除操作。其核心思想是将数据直接存储到具有固定大小的数组中,通过哈希函数计算出每个数据的存储位置。主要特性:哈希函数用于将输入的键(通常是字符串或数字)转换为数组中的索引。理想的哈希函数应尽量避免不同的键映射到同一索引(称为冲突)。:负载因子是哈希表中存储的元素数量与哈希表大小的比值。当负载因子过大时,哈希表的性能会下降,通常通过(重新哈希)来解决。
2024-09-09 18:48:23
1464
原创 栈和队列的数据结构
使用链表实现栈和队列的操作,可以充分发挥链表动态分配内存的特性,避免数组实现中需要预定义大小的限制。也就是说,最后加入栈中的元素最先被移除。这样插入操作发生在队尾,删除操作发生在队头。即最先加入队列的元素最先被移除。作为栈的栈顶,实现入栈、出栈和查看栈顶的操作。的原则,因此我们可以使用单向链表的。的原则,因此使用链表实现时,可以让。
2024-09-06 23:47:38
1473
原创 内核链表及其操作
定义一个双向链表的节点结构,类似于内核中的list_head,包含两个指针,分别指向前驱节点和后继节点。此外,还可以嵌入一些实际的数据。// 定义链表节点结构// 前驱节点// 后继节点// 数据节点结构,包含数据和链表指针int data;// 嵌入链表指针扩展my_node结构体,包含更复杂的数据(如姓名、年龄和成绩)。// 链表节点结构// 复杂数据类型——学生信息int age;// 嵌入链表结构。
2024-09-06 00:29:11
1144
原创 单向链表,双向链表的操作
双向链表是一种链式数据结构,每个节点包含三个部分:数据域、指向前一个节点的指针(与单向链表相比,双向链表的优点在于可以在 O(1) 时间内访问前一个节点。初始化一个空的双向链表,通常用一个指向第一个节点的头指针。遍历并打印链表中的所有节点,从头到尾和从尾到头都可以进行。双向链表的删除操作可以是删除头节点、尾节点或任意节点。双向链表的插入操作可以在头部、尾部或中间位置进行。将链表反转,使每个节点的指针指向前一个节点。将新节点插入到链表的头部。将新节点插入到链表的尾部。删除链表中的某个指定节点。
2024-09-04 19:48:06
652
原创 数据结构---链表
有头链表是指在链表的最前面有一个特殊的节点,即头节点(head node)。头节点不存储实际的数据,它的作用是指向链表的第一个数据节点,或者作为链表的起点。无头链表是指链表没有头节点,第一个节点即是链表的第一个数据节点。链表的起点直接指向第一个数据节点,如果链表为空,则该指针为NULL。
2024-09-03 18:34:50
1575
原创 嵌入式数据库
SQLite3是一个轻量级的关系型数据库管理系统,它遵循ACID(原子性、一致性、隔离性和持久性)原则,广泛用于嵌入式系统和应用程序中。通常可以通过将表的位置互换来实现右联接的效果,即使用左联接并调换表的位置。交叉联接用于生成两个表之间的笛卡尔积,即每个表的每一行与另一个表的每一行进行组合。左联接返回左表中的所有记录,即使在右表中没有匹配的记录。如果右表中没有匹配的记录,则结果中右表的列将包含空值(NULL)。只有当两个表中的记录满足联接条件时,才会包含在结果中。关键字,按列的值从小到大排序。
2024-08-29 21:07:49
2528
原创 IO多路复用几种函数
poll()是另一种 I/O 多路复用机制,允许应用程序监视多个文件描述符,等待它们的状态发生变化。与select()不同,poll()使用一个数组来表示文件描述符。epoll()是 Linux 特有的 I/O 多路复用机制,设计用于高效处理大量文件描述符,尤其适合需要高性能的网络服务和其他 I/O 密集型应用。epoll提供了更好的扩展性和性能,尤其在处理大量文件描述符时优于select()和poll()
2024-08-28 20:49:57
1383
原创 TCP并发服务器多线程和多进程方式以及几种IO模型
应用程序可以在等待 I/O 完成的同时执行其他任务,需通过轮询(多次尝试)来检查 I/O 是否完成。信号驱动 I/O 模型中,应用程序发起 I/O 操作并继续执行其他任务,当数据准备好时,内核会通过信号通知应用程序。在异步 I/O 模型中,应用程序发起 I/O 操作并立即返回,I/O 操作由内核完成,操作完成后内核通过回调机制通知应用程序。在阻塞 I/O 模型中,当应用程序发起 I/O 操作时,整个进程会被阻塞,直到操作完成。在这个过程中,应用程序无法执行其他任务,必须等待 I/O 操作的完成。
2024-08-27 21:04:56
1432
原创 有名管道,signal
用于设置特定信号的处理函数。当指定的信号发生时,操作系统会调用设定的处理函数。成功时返回实际读取的字节数,失败时返回 -1 并设置。成功时返回实际写入的字节数,失败时返回 -1 并设置。是要检查的信号的编号。是要删除的有名管道的路径。: 允许设置信号处理程序以及附加选项,如信号阻塞或修改信号处理的标志。返回值是旧的信号处理函数的指针。: 用于阻塞、解除阻塞或设置进程的信号屏蔽字。结构体的指针,用于指定新的信号处理行为,结构体的指针,用于保存旧的信号处理行为。: 用于判断信号是否属于指定的信号集。
2024-08-17 19:55:08
1034
原创 线程间的顺序执行(信息量)进程间的通信
信号量是一种用于进程间或线程间同步和互斥的机制。它的核心机制基于计数和操作,用来管理对共享资源的访问。1. **信号量的定义**: - 信号量是一个用于控制对共享资源访问的整数计数器。它能够记录可用资源的数量或进程/线程的等待状态。2. **操作**: - **P 操作(也称为 wait 操作)**: - 功能:申请资源或等待条件满足。 - 实现:将信号量的值减一。如果信号量的值小于零,则进程或线程将被阻塞,直到信号量的值大于零。 - **V 操作(也称为 signal
2024-08-16 19:52:49
1257
原创 进程编程及其函数的使用
阻塞调用,直到子进程终止。它返回子进程的 PID,并将子进程的退出状态存储在一个整数中。函数用于正常终止进程并返回一个状态码给操作系统。状态码通常用来表示进程的退出状态。创建一个新进程(子进程),新进程几乎是父进程的完整拷贝。终止进程并产生核心转储(如果系统配置为生成核心转储)。系统调用来回收子进程的资源,并获取子进程的退出状态。函数用于非正常退出进程,通常是由于程序错误。进程终止后,父进程可以使用。
2024-08-13 20:20:16
684
原创 进程及多任务编程
进程是操作系统中用于执行程序的基本单位。一个进程在执行时拥有自己的地址空间、代码、数据和系统资源。程序代码定义:程序的指令集,是执行的核心部分。存储:代码通常被加载到内存中的只读区域,以防止被修改。数据段已初始化数据段定义:存储程序中已初始化的全局变量和静态变量。存储:这部分数据在程序加载时被初始化为指定的值。未初始化数据段(BSS段)定义:存储未初始化的全局变量和静态变量。初始化:在程序开始运行时,操作系统会将这部分数据初始化为零。堆定义。
2024-08-12 23:42:53
902
原创 文件操作常用函数及makefile的使用
定义变量:指定目标:默认目标:编译和链接:清理:自动变量:伪目标: 如 ,并不是实际生成的文件,而是用于执行某些命令的目标。模式规则: 通过通配符定义适用于多种文件的规则,如 。
2024-08-08 19:21:50
1088
原创 缓冲区和文件IO--linux系统调用
打开一个文件或设备,并返回一个文件描述符,用于后续的读写操作。:改变文件描述符的文件偏移量,支持随机访问。:关闭一个文件描述符,释放相关资源。:从文件描述符中读取数据。:向文件描述符中写入数据。
2024-08-06 20:33:54
1079
原创 文件Io编程基础
个字符),包括换行符。返回值为字符串指针或。返回值为非负值(成功)或。:成功返回 0,失败返回 EOF。:读取一行字符(最多读取。
2024-08-05 20:05:20
1273
原创 共用体、typedef、位运算
定义: 内存分配:访问成员:用途: 共用体 依次存储了整数、浮点数和字符串。最后访问的成员 ,覆盖了之前的值。 是 C 语言中的一个关键字,用于为现有的数据类型定义新的类型名称。它的主要目的是提高代码的可读性、可维护性和简化复杂类型的使用 是已经存在的类型,可以是基本数据类型(如 、)或复合类型(如结构体、共用体、指针等)。 是新的类型名,用户可以在代码中使用它来替代 。简化复杂类型的定义: 上述定义创建了一个新的类型 ,它表示一个指向以两个 作为参数、返回类型为
2024-08-02 20:25:20
1506
原创 结构体,链表
结构体是将不同类型的数据组合成一个单独的数据类型的方式。每个数据成员在结构体中都有自己的存储空间。struct 结构体名 {数据类型 成员1;数据类型 成员2;// 其他成员链表(Linked List)是一种常见的数据结构,由一系列节点组成,这些节点通过指针相互连接。链表在动态数据存储和灵活数据管理方面具有优势。
2024-08-01 20:17:48
935
原创 函数与指针、回调函数、二级指针
指针数组 (int *p[10]):数组指针 (int (*p)[10]):函数指针 (int (*pf)(int, int)):多级指针 (a = &p):多级指针的应用 (a + i -> ((a + i) + j)):函数指针的声明和初始化 (void (*pFunc)(void)):函数指针的声明与普通指针类似,只不过它指向的是函数。 是一个指向接受 参数且返回 类型的函数的指针。可以通过赋值将函数的地址赋给 。函数指针的初始化 (pFunc = (void(*)(void))函数地址):函数指
2024-07-31 19:21:44
856
原创 指针的相关定义和运算
C 语言中,指针加 1 后,指针的值会增加一个步长,该步长取决于指针所指向的数据类型的大小。下面是详细解释及示例。是一个预定义的宏,表示空指针。空指针不指向任何有效内存地址,用于指针初始化和错误检查。会根据指针指向的数据类型移动指针。
2024-07-29 18:04:26
540
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人