- 博客(41)
- 收藏
- 关注
原创 驱动相关基础
层:具体硬件层(I2C传感器)。:I2C 适配器层,驱动厂家实现。I2C_coreI2C核心层,提供I2C设备和驱动的注册、匹配及通信方法。I2C_clientI2C_driver:遵循platform设备驱动分离思想,匹配成功后执行probe函数。I2C传感器挂载在对应的I2C总线上,I2C适配器层驱动由芯片厂家实现,I2C核心层用来管理I2C设备和驱动的注册、匹配以及I2C通信方法,设备驱动层通过将I2C总线上的设备和驱动匹配,执行 probe 函数。应用层调动驱动层接口实现I2C的读取写入。
2025-05-20 15:36:58
764
原创 硬件设备基础
首先 ARM 架构支持 7 种类型的异常,分别是:复位异常,系统重启或开机时会产生此异常。处理器无法识别指令的异常,处理器执行的指令是有规范的,如果尝试执行不符合要求的指令,就会产生此异常。软中断,软件中需要去打断处理器工作,可以使用软中断来执行,当执行 SWI 指令时就会产生此异常。预取指令失败,ARM 在执行指令的过程中,要先去预取指令准备执行,如果预取指令失败,就会产生该异常。读取数据失败。普通中断。快速中断。异常发生时,ARM。
2025-05-12 17:26:38
1073
原创 线程邮箱框架与示例
在多线程编程中,线程邮箱是一种用于线程间通信的数据结构,它通过为每个线程分配一个队列来缓存和传递数据,从而解决多任务并行时数据丢失的问题。线程邮箱的实现方式主要有两种:一是利用系统提供的消息队列机制,二是通过手写链表结构封装实现。后者不仅能够提升代码编写能力,还具有良好的移植性。在具体实现中,线程邮箱通过创建线程任务结构体和消息任务结构体,以及相应的操作函数(如创建邮箱、添加任务、发送和接收消息、销毁邮箱等),来实现线程间的数据传递和同步。通过这种方式,可以有效地协调不同线程间的数据交换,提高系统的整体效率
2025-05-09 16:16:21
371
原创 framebuffer框架与示例
是计算机图形系统中用于存储图像数据的一块内存区域,这些区域直接对应屏幕上的每个像素。当图形系统需要更新屏幕显示时,会从帧缓冲中读取数据并传输到显示设备。
2025-05-06 19:30:36
915
原创 网络基础-----C语言经典题目(13)
IO 多路复用是一种能够同时对多个 IO 操作进行监控的机制,一旦有 IO 操作准备就绪(可读、可写、出现异常等),它就会发出通知。这一机制主要借助系统调用(select、poll、epoll)来达成,适用于高并发场景。IO 多路复用采用的是单线程轮询多个 IO 事件的工作模式。流程如下:1.把所有需要监控的 IO 描述符(select)都集合起来。2.调用多路复用函数,让线程处于阻塞状态,等待某一个或多个 IO 描述符变为就绪状态。
2025-05-03 15:30:30
951
原创 网络基础-----C语言经典题目(12)
客户端向服务器发送一个带有SYN标志位的数据包,请求建立连接。服务器收到请求后,发送SYN + ACK包。客户端收到服务器的 SYN + ACK 后,发送ACK包确认。三次握手建立连接时,合并SYN + ACK ,减少一次交互,可以提高效率。四次挥手断开连接时,因全双工特性和数据完整性要求,ACK 和 FIN 需分开发送。确保双向连接独立关闭。
2025-04-30 16:40:38
888
原创 进程与线程-----C语言经典题目(9)
线程的分离属性是一种线程状态设置,它能改变线程结束时的资源回收机制。当线程被设置为分离状态后,一旦线程执行完毕,系统会自动回收它所占用的资源,无需其他线程调用来等待。确保同一时间只有一个线程 / 进程访问共享资源(变量、文件),防止数据竞争和不一致问题。通过实现,使用和保护临界区。// 加锁// 临界区代码(访问共享资源)// 解锁通过sem_t实现,初始值为1时可作为互斥锁(如sem_wait()和sem_post()死锁指的是两个或多个线程(进程)因争夺资源而陷入无限等待的状态。
2025-04-29 10:35:32
754
原创 进程与线程-----C语言经典题目(8)
虚拟地址是运行程序时CPU所生成的地址。线程属于程序能够独立运行的最小执行单元。存在于进程内部,和同一进程的其他线程共享全局变量、文件描述符等资源,不过各自拥有独立的栈空间与程序计数器。
2025-04-27 20:23:41
1039
原创 数据结构------C语言经典题目(7)
时间复杂度是衡量算法执行时间随输入数据规模增长而变化的趋势的指标。它关注的是算法执行时间的“增长率”,而不是具体的执行时间,用于评估算法的效率和优化。
2025-04-25 15:56:51
854
原创 数据结构------C语言经典题目(6)
内存泄漏是指程序动态分配的内存空间(如malloc、calloc、realloc等函数申请)在使用完毕后未被正确释放。即未调用free函数。导致这部分内存无法被系统重新分配利用的现象。内存碎片是指程序运行过程中,由于频繁地申请和释放内存,导致内存中出现大量不连续的小空闲块,这些空闲块虽然总容量足够,但无法满足较大内存块的分配请求,从而影响内存使用效率的现象。
2025-04-25 09:54:46
1414
原创 编译与存储------C语言经典题目(4)
auto 关键字用于修饰局部变量,表示变量的存储方式为自动存储。一般来说,局部变量默认就是auto 存储类,所以auto 关键字通常可以省略。int func()// 显式声明为 auto 变量int y = 20;// 隐式也是 auto 变量(默认)// ...
2025-04-23 10:51:52
548
原创 结构体与共用体-------C语言经典题目(3)
int age;// 声明指向Student结构体的指针)位域通过在结构体成员声明中使用 类型 成员名 : 位数struct 结构体名 {类型 成员名1: 位数1;// 位域成员类型 成员名2: 位数2;// 普通成员(非位域)类型 普通成员名;类型:必须是int 、 unsigned int 、 signed int位数:表示该成员占用的二级制位数,取值为正整数。
2025-04-22 14:16:03
720
原创 指针----------C语言经典题目(2)
基本格式为:数据类型 *指针变量名int *p;// 定义一个指向 int 类型的指针变量char *p;// 定义一个指向 char 类型的指针变量float *p;// 定义一个指向 float 类型的指针变量基本格式为:返回类型 (*指针变量名)(参数列表)例如:int (*fun)(int a)简单来说,回调函数是“被其他函数调用的函数”,当某段代码需要在特定事件发生时、或完成某个操作后调用一个自定义函数时,会将这个自定义函数的指针作为参数传递进去,供其在适当的时候调用。
2025-04-19 16:15:33
761
原创 函数与数组---------C语言经典题目(1)
字符串是由字符组成的序列,并且以空字符“\0”(ASCII码值为0)作为结尾标志的一维字符数组。字符串在内存中占用连续的字节空间,末尾的‘\0’不计入字符串的实际长度,但用于标记字符串的结束。比如:字符串“hello”,在内存中实际存储为h e l l o \0,共六个字节。
2025-04-18 16:34:46
673
原创 Linux自学day24-进程和线程2
这段代码的主要功能是创建一个子进程,子进程休眠 10 秒后以退出状态码 10 结束,父进程等待子进程结束并回收其资源,同时根据子进程的退出状态输出相应的信息。该文件定义了一个简单的 C 程序,其主要功能是打印一条问候信息、当前进程的进程 ID(PID),并遍历命令行参数列表,将每个参数的索引和值打印出来。同时,代码中包含了一段被注释掉的用于打印环境变量的代码。这段代码的主要功能是创建一个子进程,并在子进程中执行。该文件定义了另一个 C 程序,其主要功能是使用。,并传递一组命令行参数。编译生成的可执行文件。
2025-02-21 18:43:53
338
原创 Linux自学day23-进程和线程
僵尸进程是进程执行结束后,空间没有被回收的进程。产生原因是子进程结束时,父进程未回收其空间。避免方法有两种:一是让父进程先结束,子进程成为孤儿进程被 init 进程收养,子进程结束时 init 进程回收其空间;二是子进程结束时,父进程使用 wait 或 waitpid 函数回收子进程空间。
2025-02-20 19:05:57
511
原创 Linux自学day22-实现简单的单词及单词含义查询的功能
这里有一个单词表,以下是单词表的一部分:由单词和单词后的释义构成,中间用空格隔开。根据单词表中的内容,完成让用户输入单词就获得单词含义的功能。
2025-02-18 20:00:38
585
原创 Linux自学day21-拷贝图片,统计字符,文件IO,目录IO
用于改变文件指针的位置,它可以从文件开头(SEEK_SET)、当前位置(SEEK_CUR)或文件末尾(SEEK_END)进行偏移,返回新的文件偏移量。函数:用于从文件中读取数据,第一个参数是文件描述符,第二个参数是存储读取数据的缓冲区指针,第三个参数是要读取的最大字节数,返回值是实际读取的字节数。函数:用于向文件中写入数据,第一个参数是文件描述符,第二个参数是要写入的数据的指针,第三个参数是要写入的字节数。及每种字符出现的次数?:这是一个结构体,用于存储日期和时间的各个部分,如年、月、日、时、分、秒等。
2025-02-17 19:42:22
478
原创 Linux自学day20-流的输入与输出
在文件打开、读取和写入过程中,都需要进行错误检查和处理。如果文件打开失败、读取出现错误或者写入失败,都需要相应地处理错误情况,以保证程序的健壮性。两种方法的核心目的都是将一个文件(源文件)的内容复制到另一个文件(目标文件)中,完成文件内容的拷贝操作。函数返回文件指针的当前位置,即从文件开头到当前位置的字节数。在文件内容拷贝场景中,通常有两种常见的实现思路:一种是按字符拷贝(使用。:可变参数列表,根据格式化字符串中的格式说明符提供相应的参数。中的格式化字符串,用于指定输出的格式。:指向要写入的文件的指针。
2025-02-15 19:39:11
888
原创 Linux自学day18-二叉树、哈希表、常见的排序与查找算法
实现队列的基本操作,包括创建队列、判断队列是否为空、入队、出队和销毁队列,同时还提供了计算二叉树高度的函数。实现二叉树的创建、递归和非递归的遍历方式(前序、中序、后序、层序)以及销毁二叉树的功能。,相当于进行普通的插入排序,但由于前面的操作已经让数组基本有序,所以这一轮排序效率较高。前序遍历的顺序是:根节点 -> 左子树 -> 右子树。中序遍历的顺序是:左子树 -> 根节点 -> 右子树。后序遍历的顺序是:左子树 -> 右子树 -> 根节点。实现栈的基本操作,包括创建栈、压栈、弹栈和销毁栈。
2025-02-13 20:26:47
587
原创 Linux自学day17-数据结构-双向链表、内核链表
实现了一个简单的双向链表,包含创建链表、头部插入节点、遍历显示链表、删除指定数据节点以及销毁链表的功能。
2025-02-11 18:16:23
514
原创 Linux自学day16-数据结构-单向链表2
函数名为,返回值类型为int。pphead:指向链表头节点指针的指针,用于在函数中修改链表头指针(如果删除的是头节点)。tmpdata:要删除的节点中的数据。函数名为,它接受一个指向类型的指针phead(链表头指针)作为参数,返回值是一个指向类型的指针,即链表的中间节点指针。
2025-02-08 21:16:23
1863
原创 Linux自学day15-数据结构-单向链表
定义一个指向类型的指针plist,并初始化为NULL,用于指向链表的头节点。调用函数创建一个链表,并将返回的头节点指针赋值给plist。
2025-02-07 20:10:48
871
原创 Linux自学day13-指针、结构体
int year;int mon;int day;int hour;int min;int sec;char sex;int age;int score;:定义了一个表示日期的结构体,包含年、月、日三个成员。:定义了一个表示时间的结构体,包含时、分、秒三个成员。:定义了一个包含和的结构体,用于表示日期和时间。:定义了一个表示学生信息的结构体,包含姓名、性别、年龄和成绩四个成员。pdat = &d;printf("年: %d\n", pdat->year)
2025-01-22 19:15:35
1606
原创 Linux自学day12-指针数组与数组指针
这是一个指向整数数组的指针,函数将对这个数组进行排序。int len:表示数组的长度,即数组中元素的个数。:这是一个函数指针,指向一个比较函数。该比较函数用于确定两个整数的大小关系,以便在排序过程中进行元素的交换。:定义一个整型变量num并初始化为100。:定义一个整型指针p,初始化为NULL,指针p可以用来存储一个整型变量的地址。:定义一个指向整型指针的指针q,初始化为NULLq可以用来存储一个整型指针的地址。
2025-01-21 18:03:41
622
原创 Linux自学day11-指针函数与函数指针
char *pstr:指向要统计的字符串的指针。:分别是用于存储大写字母、小写字母、数字和空格数量的指针。
2025-01-20 20:10:58
788
原创 Linux自学day10--指针一
定义一个整型指针p,并初始化为NULL,表示指针当前不指向任何有效的内存地址。:定义一个整型指针q,并初始化为NULL,与p类似。
2025-01-19 17:46:37
870
原创 Linux自学day9-递归函数与宏定义
(x):(y)PRINTF在代码的开头(第219行),使用#define定义了一个宏PRINTF,它接受两个参数a和b。这个宏的作用是通过结构来执行三条printf语句:第一条用于输出变量a的值。第二条用于输出变量b的值。第三条用于输出a与b的和。
2025-01-18 18:13:28
793
原创 Linux自学day8-二维数组、函数一
这段代码的主要功能是将用户输入的两个字符串str1和str2连接起来,并输出连接后的str1字符串。iistr1str2'\0'str2str1str1这段代码的主要功能是比较两个输入字符串,找到它们第一个不相等字符的位置,并输出这两个字符的ASCII码值之差。str1str2str1'\0'str1str2这段代码主要展示了如何定义、初始化、赋值二维数组,并通过两种方式(直接打印和循环打印)输出数组的元素值。
2025-01-17 20:26:49
694
原创 Linux自学day7-字符型一维数组
函数会按字典顺序比较两个字符串,若两个字符串相等,则返回 0;函数在接收字符串时,遇到空格、制表符或换行符就会停止接收,所以它不能接收包含空格的字符串;才会停止接收输入,在此之前,即使遇到空格也不会停止,会一直接收直到用户按下回车键;如果比较结果为 0,说明两个字符串相同,输出。用于指定复制的字符数量,这里减去 1 是为了留出一个位置给字符串结束标志。,也就是逐个输出字符串中的字符,直到遇到结束标志。,所以即使这里没有显式添加换行符,输出结果也会换行;加 1,从而遍历整个字符串,统计字符个数(不包括。
2025-01-15 19:22:23
1450
原创 Linux自学day6
主要不要越界,虽然不会报错,但程序有可能会出问题,可以全部初始化,也可以局部初始化,一般初始化都为0。代码先是定义了一组一维数组,以及该有的变量,接着用for循环语句,让i从0开始自加,像这样的一维数组,元素个数必须为常量,而元素下标可以是:常量、变量、表达式。首先依旧是定义变量,用for循环和scanf来对数组进行一个元素的输入。先假设当前轮次的第一个未排序元素(下标为。)开始,到数组末尾,遍历剩余未排序的元素。同样,先定义,len是元素个数。首先是定义变量,并输入数组元素。,即记录下更小元素的下标。
2025-01-14 18:09:58
371
原创 Linux自学day5
1.计算100以内奇数之和:用 ( i % 2!= 0) 若为奇数,则余数为1,真值;若为偶数,则余数为0,假值。最后要打印换行符,得数按照 %-2d 打印,使得数占2个域宽,并左对齐。2.goto的falg不一定要用flag,也可以用其他标识,如f。先让鸡的数量自加,兔的数量用50减去鸡的数量即可求得。y自加到9,x自加到y,这样子就避免了重复运算。跳出当前循环或者switch分支,想要结束循环。在循环中屏蔽某次循环,可以使用continue。外层循环执行1次,里层循环执行1遍。
2025-01-13 19:15:48
214
原创 Linux自学day4
同时出现了新的问题,当输入的字母超过一个时,如何对这个字符数做一个判断,使之能够提示输入有误。昨天的问题是无法通过给三角形任意赋值来计算任意三角形的周长和面积,今天学完了scanf,就很好的解决了这个问题。4.switch后面的值只与case后面的值比较一次,然后顺序向下执行直到遇到break,如果输入的字符不在26个英语字母中,则显示输入数据有误,如果输入的字符是z或Z,则输出a。从键盘输入一个字符,输出该字符的按字典排列顺序的下一个字符,例如,输入a,则输出b。=(不等于) >= <=
2025-01-12 19:58:41
265
原创 Linux自学day3✊
1.赋值是内存空间的拷贝,如果空间大小一样则直接拷贝2.如果小数据放入大空间,补符号位(正数补0,负数补1)3.如果大数据放入小空间,直接截取数据低位4.浮点数类型赋值给整形(舍弃小数点后精度)。
2025-01-11 19:02:59
148
原创 Linux自学day2✊
所谓进制,就是到了某一个位数,就往前进一。十进制:逢十进一;二进制:逢二进一;八进制:逢八进一;十六进制 :逢十六进一。注意,十六进制 用abcdef表示10 11 12 13 14 15;二进制、八进制、十六进制转换十进制:从右往左依次 对应的 0次方 1次方 2次方 3次方 .....最后相加。十进制转换二进制、八进制、十六进制:除数取余法,最后从下往上一次排列即可。
2025-01-10 19:59:12
164
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人