自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 GPIO子系统

当设备树描述为gpio/gpios时,使用 gpioz[i] = devm_gpiod_get_index(&pdev->dev, NULL, i, GPIOD_OUT_LOW);devm_gpiod_get和 devm_gpiod_get_index 调用后,当设备被销毁或卸载时,内核会自动遍历并释放该设备所持有的所有资源。使用 gpio_request 的意义在于,用于申请一个GPIO资源,确保在后续的操作中该资源不会被其他设备或驱动占用,起到引用计数+1的效果。使用 gpios,不能使用 gpio。

2024-07-15 15:29:44 216

原创 交换两个数的方法

不定义第三个变量,交换两个数的方法总结1、使用加法和减法交换,仅适用于整数和浮点数,存在溢出风险a = a + b;b = a - b;a = a - b;2、使用异或运算符,仅适用于整数,不存在溢出风险a ^= b;b ^= a;a ^= b;

2024-06-27 11:26:33 379

原创 Linux平台总线

平台总线是Linux内核中虚拟出来的一条总线,并非真实的物理导线。它主要用于连接和管理设备驱动与设备之间的通信,为它们提供一个匹配的平台。平台总线的设计目的是为了管理上的方便和统一。

2024-05-28 12:00:31 450

原创 Linux 字符设备驱动

字符设备驱动代码流程如下,以 led 驱动为例,此驱动基于 linux内核5.4.31 版本申请设备号创建class类创建设备节点硬件初始化实现 file_operations操作接口。

2024-05-27 21:28:55 1921

原创 Linux内核模块间传参

Linux 内核对模块之间的命名空间进行了隔离,模块间不能直接访问对方的内部符号。因此,需要一种机制来实现模块间符号的共享。通过 EXPORT_SYMBOL宏,内核开发者可以将需要共享的函数或变量导出,使其对其他模块可见和可用,从而实现了模块间的符号共享和功能扩展。这种机制在 Linux 内核的模块化设计中起到了重要的作用,使得不同模块之间可以更加灵活地协作和共享资源。其中,symbol_name是要导出的符号的名称。使用 EXPORT_SYMBOL。

2024-05-27 11:51:25 195

原创 Linux 内核模块基础

宏用于在 Linux 内核模块中指定模块的许可证信息。这个宏的作用是告诉内核模块的使用者,该模块的代码所遵循的许可证类型。在 Linux 内核模块中,模块的许可证信息是很重要的,因为它决定了模块的代码在法律上的使用方式。模块加载函数,用于在模块加载时执行一些初始化操作,比如注册设备、初始化数据结构等。模块卸载函数,用于在模块卸载时执行一些清理工作,比如释放资源、注销设备等。宏,你可以在加载模块时传递参数给模块,从而改变模块的行为或配置。模块中的参数会在该目录下创建同名的文件,文件中会保存参数的值。

2024-05-27 11:08:30 692

原创 左值和右值

右值是指那些不能出现在赋值语句左边的值,也就是不能作为赋值的目标的值。:左值是指那些可以出现在赋值语句左边的值,也就是可以作为赋值的目标的值。

2024-05-24 09:39:53 145

原创 11、函数

11.函数(核心中的核心)11.1.明确:任何C程序,C源文件都包含两部分内容:一堆的变量(包括数组)和一堆的函数)11.2.函数概念:函数就是一堆语句的组合,用以实现一些相对独立并且具有一定通用性的功能 问:为何需要函数这个技术? 答:举例子 用户要求:实现两个正数相加 vim main1.c int main(void) { int a; int b; in...

2022-03-10 12:01:26 178

原创 10、数组

10.1.明确:计算机程序最终玩内存,玩内存首先得分配,目前分配内存的方法只学了一种: 定义变量,例如: int a; int b; int c; ... int aa; ... int zzzzz.....; 前提是数据类...

2022-03-01 16:12:49 489

原创 9、空语句

9.1语法:仅仅包含一个;语句 例如: int a = 1; printf("a = %d\n", a); ; //空语句,起到了延时的作用9.2应用场景:用于实现一个空循环 例如: for(;;); //空死循环,让CPU跑到这里别再往下运行了 int i = 10000; for(; i >= 0; i--); //空循环10000次,每次CPU都需要消耗点时间,此代码就是起到延时作用 //让...

2021-11-29 16:18:03 806

原创 8、C程序的循环结构

8.C程序三大结构之循环结构8.1.循环结构功能:将一组语句重复多次执行 三种类型循环:for循环,while循环,do...while循环8.2.for循环a)语法格式: for(表达式1; 表达式2; 表达式3) { 循环语句; } 语义(执行流程): 第一步骤:首先计算,运行表达式1(只做一次) 第二步骤:然后计算,运行表达式2 如果表达式2的结果为真,那么就执行运行循环语句 如果表达式2的结果为假,那么for循环结束退出 第...

2021-11-29 16:14:06 459

原创 7、C程序的分支结构

7.C程序的流程控制7.1.明确:C程序是一个结构化程序,就是以顺序,分支,循环三种基本结构构建的 单入口单出口的程序 类比:C程序----->一栋楼 顺序------->一居室 分支-------->二居室 循环-------->三居室 顺序结构:就是CPU从上到下依次运行7.2.分支结构a)分支结构功能:实现多选一 分支结构分两类:条...

2021-11-29 16:03:57 673

原创 6、数据类型转换

数据类型转换分两种:隐式转换和强制转换6.1.隐式转换特点:如果表达式中不同数字的数据类型不同,gcc编译器先将不同的数据类型 转换成相同的数据类型之后再做运算 隐式转换分三种情况:a)隐式转换过程中必须把占内存小的类型转换成占内容大的类型//小转大 例如: int a = 0, c; //各占4字节 char b = 2; //占1字节 c = a + b; //gcc编译器自动将b转换成int类型然后再...

2021-11-29 15:56:01 419 2

原创 5、运算符和表达式

5.1.概念 明确:计算机程序最终玩内存,内存存的是数字(二进制数字),并且这些数字之间可以 做运算,例如:加减乘除等,最终就是程序将内存中的数据做各种运算操作 运算符:对内存中的数字进行各种运算的符号,例如:+,-等 表达式:运算符和数字结合起来的式子,称之为表达式,例如:1+15.2.C语言的运算符1)算数运算符:加,减,乘,除,取余,对应的符号:+,-,*,/,% 注意: 1.如果参与除法计算的两个数字是整型数则计算结果只保留整数...

2021-11-29 15:49:36 501

原创 4、进制转换

4.1.明确:计算机中数字都是在内存中,并且数字都是以二进制的形式存储4.2.明确:计算机中对数字的表示形式有四种: 2进制表示,8进制表示,10进制表示,16进制表示 不管是哪种形式,都是对同一个内存中存储的数字的不同表示形式而已 也就是内存的中的数字不会随着进制的不同而改变! 8,10,16进制给程序员看,好看 2进制给计算机看,计算机只认2进制4.3.明确:计算机中把内存中每个字节又分8段,每段只能记录0和1 要...

2021-11-26 17:36:08 664

原创 3、变量的数据类型

1、数据类型功能:让编译器gcc计算变量将来要分配的内存空间大小2、12类基本数据类型如下: 关键字名称 含义 内存大小 数字范围 char 字符类型(本质是单字节整型数) 1字节 -128~127(背) ...

2021-11-26 17:25:44 591 1

原创 2、C语言的变量

1.明确计算机内存相关概念 内存:暂存CPU数据运算时的数据或者运算之后的数据 优点:速度快 缺点:掉电丢失 结论:程序最终玩的内存(玩的不是程序,玩的是内存) 字节(Byte):计算机中将内存分成一格一格,每一格用来存一个数字 每一格专业术语叫字节,内存的最小存储单元为字节 地址(address):计算机中给内存的每个字节指定一个编号,此编号从...

2021-11-26 17:05:22 333

原创 1、C语言相关基础知识

1.C语言功能:类似英语一样,英语是人和人交流沟通的方式,工具 C语言就是人和计算机交流沟通的方式,工具 除了C语言,还有C++,JAVA,Python,Go,Rust语言等2.C语言背景: 1972年由丹尼斯里奇发明C语言 1978年发布<<the c programming language>>出版,走向世界 1989年发布C89标准 1999年发布C99标准3.编写人生第一个标准C程序...

2021-11-26 17:00:27 765

原创 多线程编程(下)

11.互斥锁静态初始化pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 进程结束才释放内存单元动态初始化pthread_mutex_t mutex; //定义互斥锁对象pthread_mutex_init(&mutex, NULL); // 分配内核资源...pthread_mutex_destroy(&mutex); // 释放内核资源...pthread_mutex_lock(&mutex); // 锁定...

2021-09-27 17:05:20 198

原创 多线程编程(上)

1.什么是线程?源代码 -编译和链接-> 程序 -加载到内存中-> 进程 | | 文件 内存 ...

2021-09-26 12:40:41 131

原创 二分查找算法

// 实现二分查找的功能函数int find(int arr[],int left,int right,int data){ // 保证数组中确实存在元素 if(left <= right) { // 计算中间元素的下标 int p = (left+right)/2; // 寻找中间元素进行比较 if(data == arr[p]) { return p; } // 如果目标元素小于中间元素,左边查找 else if(data < arr[p]).

2021-09-24 11:34:06 87

原创 数据结构—二叉树

#include <stdio.h>#include <stdlib.h>typedef struct node{ int data; struct node *left; struct node *right;}node_t;typedef struct tree{ node_t *root; int cnt;}tree_t;// 初始化二叉树void tree_init(tree_t *tree){ tree->root = NULL; .

2021-09-24 11:30:10 123

原创 数据结构—双向链表

#include <stdio.h>#include <stdlib.h>typedef struct node{ int data; struct node *next; struct node *prev;}node_t;typedef struct list{ node_t *head; node_t *tail;}list_t;// 初始化链表void list_init(list_t * list){ list->head = (no.

2021-09-24 11:19:12 125

原创 数据结构—单向链表

#include <stdio.h>#include <stdlib.h>#include <string.h> // memsettypedef struct node { int data; struct node *next; }node_t;typedef struct list { struct node *head; struct node *tail; }list_t;/* 定义遍历函数打印 */v.

2021-09-24 09:07:48 133

原创 数据结构—队列

#include <stdio.h>#include <stdlib.h>typedef struct queue{ int *arr; int cap; int size; int front; int rear;}queue_t;void queue_init(queue_t *queue ,int cap){ queue->arr = (int *)malloc(cap * sizeof(queue->arr[0])); queue-&g.

2021-09-24 08:59:04 85

原创 数据结构—栈

#include <stdio.h>#include <stdlib.h>typedef struct stack{ int *arr; int cap; int top;}stack_t;void stack_init(stack_t *stack ,int cap){ stack->arr = (int *)malloc(cap * sizeof(int)); stack->cap = cap; stack->top = 0;}v.

2021-09-24 08:54:21 109

原创 字符串相关算法

/* 字符串逆转 */void my_reverse(char *p){ int len = strlen(p); for (int i = 0;i < len/2; ++i) { int tmp = p[i]; p[i] = p[len-1-i]; p[len-1-i] = tmp; }}/* 小写转大写 */void atoA(char *p){ while (*p) { if (*p > 'a' && *p < 'z') { .

2021-09-22 18:42:02 124

原创 网络通信(下)

3.基于并发的TCP客户机/服务器模型1)TCP协议的基本特征A.面向连接:参与通信的双发在正式通信之前需要先建立连接,以形成一条虚拟电路,所有的后续通信都在这条虚电路上完成。类似于电话通信业务。正式通话之前要先拨号,拨通了才能讲话。拨号的过程就是一个建立连接的过程。三次握手: 客户机 服务器发起连接请求 --------SYN(n)--------> 被动侦听 等待应答 &lt...

2021-09-21 11:31:07 152

原创 网络通信(上)

1.网络和网络协议1)什么是计算机网络?计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过有形或无形的通信线路连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。2)什么是网络协议?网络协议是一种特殊的软件,是计算机网络实现其功能的最基本的机制。网路协议的本质就是规则,即各种硬件和软件必须遵循的共同守则。网络协议并不是一套单独的软件,它融合于所有涉及网络通信的软件甚至硬件之中,因此可以说协议于网络中无处不在。3)什么是协议栈?为

2021-09-21 10:29:08 138

原创 进程间通信(下)

10.XSI的IPC对象1)IPC对象的标识符(ID)和键(KEY)IPC对象在系统内核中的唯一名称用键(KEY)表示。不同的进程可以通过键来引用该IPC对象。一旦进程获得了该IPC对象,即通过其标识(ID)来称谓该对象。 IPC对象(键) 内核空间--- / --- | --- \ --------------- /键 |键 \键 用户空间进程1 进程2 进程3 ID1 ID2 ID3#include <sys/ipc.h&...

2021-09-18 13:36:46 318

原创 进程间通信(上)

1.什么是进程间通信Unix/Linux系统中每个进程都拥有独立的4G字节大小的虚拟内存空间。其中高地址的1G字节被映射到相同的物理内存区域,用于保存内核代码和数据。低地址的3G字节作为保存用户代码和数据的用户空间,被映射到彼此不同物理内存。因此同一个虚拟内存地址,在不同的进程中,会被映射到不同的物理内存区域,在多个进程之间以交换虚拟内存地址的方式交换数据是不可能的。鉴于进程之间天然的内存壁垒,为了能够在不同进程之间高效地交换数据,需要有一种专门的机制,这就是所谓的进程间通信(Inter-...

2021-09-18 13:09:43 95

原创 Linux信号(下)

11.现代版本的信号处理与发送经典版本的信号处理与发送:signal/kill(raise)现代版本的信号处理与发送:sigaction/sigqueueint sigaction(int signum, const struct sigaction* sigact, struct sigaction* oldact);成功返回0,失败返回-1。signum - 信号编号sigact - 信号行为oldact - 输出原来的信号行为,可置NULL当signum信号被递送时,按sigact结构

2021-09-18 12:44:27 230

原创 常用排序算法

【代码】常用排序算法。

2021-09-17 21:44:50 77

原创 Linux信号(上)

1.基本概念1)什么是信号? 事件(信号)过程(进程)1---------v---------> / \ /事件\过程(进程)2 /---v---\ / \ / \过程(进程)3...

2021-09-17 21:28:32 275

原创 Linux进程

1.进程的基本概念程序:磁盘上的可执行文件 | 加载到内存 v进程:内存中的指令和数据 执行 | ^ v | 访问 CPU---+2.进程的分类交互式进程:由Shell启动,借助标准I/O与用户交互。批处理进程:在无需人工干预的条件下,自动运行一...

2021-09-17 20:24:31 517

原创 Linux文件操作(下)

11.文件元数据i节点 文件元数据 数据块索引表struct stat { dev_t st_dev; // 设备ID ino_t st_ino; // i节点号 mode_t st_mode; // 文件类型和权限 nlink_t st_nlink; // 硬链接数 uid_t st_uid; // 用户ID gid_t st_gid; // 组ID ...

2021-09-17 17:16:34 186

原创 Linux文件操作(中)

10.文件锁读写冲突 期望的访问 读取 写入 无人访问 OK OK文件的某个区域正在被访问 多人在读 OK ...

2021-09-17 17:02:44 219

原创 Linux文件操作(上)

1.文件系统的物理结构1)硬盘的物理结构:驱动臂、盘片、主轴、磁头、控制器2)磁表面存储器的读写原理硬盘片的表面覆盖着薄薄的磁性涂层,涂层中含有无数微小的磁性颗粒,谓之磁畴。相邻的若干磁畴组成一个磁性存储元,以其剩磁的极性表示二进制数字0和1。为磁头的写线圈中施加脉冲电流,可把一位二进制数组转换为磁性存储元的剩磁极性。利用磁电变换,通过磁头的读线圈,可将磁性存储元的剩磁极性转换为相应的电信号,表示二进制数。3)磁道和扇区磁盘旋转,磁头固定,每个磁头都会在盘片表面画出一个圆形轨迹。改变磁头位置,可以

2021-09-17 11:10:16 247

原创 系统调用简述

应用程序--------------+ vi/emacs/tftp/firefox | | | 标准库、 第三方库 | C/C++ Qt/X11 | | | 系统调用<-------...

2021-09-17 10:39:09 120

原创 Linux内存相关知识点

1.虚拟内存、物理内存、半导体内存和换页文件虚拟内存:地址空间,虚拟的存储区域,应用程序所访问的都是虚拟内存。物理内存:存储空间,实际的存储区域,只有系统内核可以访问物理内存。虚拟内存和物理内存之间存在对应关系,当应用程序访问虚拟内存时,系统内核会依据这种对应关系找到与之相应的物理内存。上述对应关系存储在内核中的内存映射表中。物理内存包括半导体内存和换页文件两部分。当半导体内存不够用时,可以把一些长期闲置的代码和数据从半导体内存中缓存到换页文件中,这叫页面换出,一旦需要使用被换出的代码和数据,再把

2021-09-17 10:33:19 186

空空如也

空空如也

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

TA关注的人

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