自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ## 运算符

#运算符的主要作用是将宏参数连接在一起形成一个新的标记,用于动态生成标识符或代码段。这使得宏在生成代码时更加灵活和强大。通过使用##运算符,可以简化重复代码的编写,提高代码的可维护性和可读性。

2024-07-24 09:45:04 157

原创 预处理器宏

宏定义使用#define其中,NAME是宏名,是宏的替换文本。预处理器宏是C语言中一个非常灵活和强大的工具,适用于代码替换、参数化和条件编译。理解并正确使用宏可以使代码更简洁、更易维护。可变参数宏和条件编译特别有用,允许根据不同的编译条件生成不同的代码,从而使代码更具适应性和可调试性。

2024-07-24 09:21:49 272

原创 ioctl操作实现的原理

ioctl用户空间调用ioctl:通过文件描述符和命令码发送控制命令。内核接收命令:内核将调用对应驱动程序的ioctl函数。命令解码和处理:驱动程序解码命令码并执行相应的操作。数据复制:安全地在用户空间和内核空间之间复制数据。返回结果:将处理结果返回给用户空间。

2024-07-23 19:51:48 140

原创 字符设备驱动程序的读写操作详解

在 Linux 内核开发中,用户空间和内核空间的数据传输是至关重要的。由于两者有不同的访问权限和地址空间,直接使用memcpy进行传输是不安全的。为解决这个问题,内核提供了专门的函数和。本博客将详细介绍这些函数的使用场景、参数和返回值,并通过实际代码示例展示如何在设备驱动开发中实现安全的数据传输。此外,还会讨论put_user和get_user函数,帮助读者更好地理解和掌握 Linux 内核中用户空间和内核空间之间的数据传输方法。

2024-07-23 12:06:44 823

原创 从系统调用到设备驱动:详解open、syscall_open和drv_open

未找到则创建新的struct inode对象,pnode指向该对象,并从文件系统中读取文件的元信息到该对象*//*将struct file对象地址填入进程的描述符数组,得到对应位置的下标赋值给fd*//*用devno在字符设备链表查找对应节点,并将该节点的地址赋值给pcdev*/)中实现,会触发内核中的相应处理函数陷入内核空间,最终调用具体的文件或设备驱动程序的。/*创建struct file对象,并将该对象的地址赋值给pfile*/位于具体的设备驱动程序代码中,是设备驱动程序中的具体实现函数,是。

2024-07-23 00:52:11 570

原创 详解字符设备驱动框架及操作函数的实现原理

设备的操作函数如果比喻是桩的话(性质类似于设备操作函数的函数,在一些场合被称为桩函数),则:驱动实现设备操作函数 ----------- 做桩insmod调用的init函数主要作用 --------- 钉桩rmmod调用的exitt函数主要作用 --------- 拔桩应用层通过系统调用函数间接调用这些设备操作函数 ------- 用桩 是 Linux 内核中定义的一个结构体,用于描述文件和设备的操作接口。每个文件或设备都关联一个 对象,其中包含了对文件或设备进行操作的函数指针。这个设计使得内核可以通过统

2024-07-23 00:17:06 934

原创 GCC编译过程

开头表示预处理指令,不是语句,不能编译不能执行,只在预处理阶段处理这些指令。预处理是编译过程的第一步,主要将不能编译的头文件、宏定义、注释等内容处理掉,由预处理器。与所需的库文件(如 C 标准库)链接起来,解决所有符号引用,生成最终的可执行文件。链接器将多个目标文件和库文件链接成最终的可执行文件:例如,下图中,链接过程中,编译是将预处理后的源代码转换为汇编代码的过程,由 GCC 编译器本身完成。:处理宏定义、文件包含和条件编译,生成扩展的源代码文件。的定义,将其链接到最终的可执行文件中。

2024-07-14 21:34:38 539

原创 为什么机器码和汇编语言需要区分不同的CPU架构?

CPU唯一识别的编码是机器码,机器码是处理器直接执行的二进制指令,不同的机器码表示不同的运算,汇编语言是机器码的符号化。不同的CPU因为架构不同,内部的硬件结构不一样,有不同的指令集和寄存器配置,直接使用机器码或汇编语言编写的程序无法在不同架构间移植。所以,一条在 x86 架构上合法的机器指令在 ARM 架构上可能是无效的,甚至没有对应的指令。例如,ARM精简指令集(RISC)没有原生的除法指令,需要通过一系列指令来实现除法操作,而 x86 复杂指令集(CISC)则有直接的除法指令。

2024-07-14 17:23:31 154

原创 SD卡存储结构

SD卡的存储结构由控制器、闪存芯片和接口组成,逻辑上则分为引导区、保留区、用户数据区、文件分配表和文件目录。控制器通过管理存储单元、执行磨损均衡和坏块管理,确保SD卡的数据存储可靠性和使用寿命。

2024-07-10 14:13:24 425

原创 辨析常量指针、指针常量、常量引用、引用常量的区别

的区别在于一个是引用所绑定的值是常量,另一个是引用本身是常量(实际上,引用本身不能是常量,只能是常量引用)。指针常量是指该指针本身是常量,即指针一旦初始化后不能再指向其他地址,但可以通过该指针修改其指向对象的值。引用常量是指引用本身是常量,一旦初始化后不能再绑定其他变量,但可以通过该引用修改所绑定变量的值。常量指针是指其指向的对象是常量,不能通过该指针修改所指向的值,但可以修改指针本身指向的地址。的主要区别在于一个是指针指向的值是常量,另一个是指针本身是常量。const读作常量,*读作指针,按照顺序读。

2024-07-09 10:54:58 220

原创 const的用法(定义和用途)

常量变量(Constant Variables)定义:常量变量是指一旦初始化后就不能再被修改的变量。用法示例:// 错误,常量变量不能被修改常量指针(Pointer to Constant)定义:指向常量的指针,意味着不能通过该指针修改它所指向的值,但可以改变指针本身指向的地址。用法示例:int a = 10;*ptr = 20;// 错误,不能通过 ptr 修改它指向的值ptr = &b;// 合法,ptr 可以指向其他地址指针常量(Constant Pointer)定义。

2024-07-09 10:49:53 549

原创 详解volatile 关键字

硬件优化内存访问速度低于 CPU 处理速度,使用硬件高速缓存(Cache)加速内存访问。现代 CPU 指令可以乱序执行,以充分利用指令流水线,提高执行速度。软件优化程序员优化:在编写代码时进行优化。编译器优化将内存变量缓存到寄存器。调整指令顺序,充分利用 CPU 指令流水线,如重新排序读写指令。对常规内存进行优化时,这些优化通常是透明且高效的。内存屏障解决编译器优化或硬件重新排序引起的问题。内存屏障确保特定顺序执行的操作之间的顺序性。Linux 提供了一个宏函数。

2024-07-08 20:27:51 897

原创 2021-10-15 C语言 函数

Day8 函数函数的基本用法1.定义函数是一个完成特定功能的代码模块,其程序代码独立,通常要求有返回值,也可以是空值。一般形式如下:<数据类型><函数名称>(<形式参数说明>){语句序列;return [(<表达式>)];}① <数据类型>是整个函数的返回值类型,return [(<表达式>)]语句中表达式的值要和函数的<数据类型>保持一致。如无返回值应该写为void型。② <形式参数说明>

2021-10-15 21:51:27 409

原创 2021-09-28 C语言 指针专题(二)

Day7 指针专题(二)字符指针与字符串C语言通过使用字符数组来处理字符串。通常我们把char数据类型的指针变量称为字符指针变量,字符指针变量与字符数组有着密切关系,它也被用来处理字符串。1.初始化字符指针是把内存中字符串的首地址赋予指针,并不是把该字符串复制到指针中,可通过指针将字符串的内容做修改。例:#include <stdio.h>#include <ctype.h>int main(int argc, char *argv[]){ char

2021-09-28 20:35:38 205

原创 2021-09-25 C语言 指针专题(一)

Day6指针专题(一)指针1.C程序设计中使用指针可以:(1)使程序简洁、紧凑、高效(2)有效的表示复杂的数据结构(3)动态分配内存(4)得到多于一个的函数返回值2.在计算机内存中,每个字节单元(1Byte=8Bits)都有一个编号称为地址;在C语言中,内存单元的地址称为指针,专门用来存放地址的变量称为指针变量。在不影响理解的情况下,有时对地址、指针和指针变量不区分统称指针。3.指针变量的说明:(1)一般形式:<存储类型> <数据类型> * <指针变量名&g

2021-09-25 17:40:09 194

原创 2021-09-17 C语言 数组和字符串

Day5 数组和字符串数组概述① 构造数组类型之一。② 数组是具有一定顺序关系的若干个变量的集合,组成数组的各个变量称为数组的元素。③ 数组中各元素的数据类型要求相同,用数组名和下标确定。数组可以是一维的也可以是多维的。一维数组1.定义所谓一维数组是指只有一个下标的数组,它在计算机的内存中是连续存储的。C语言中,一维数组的说明一般形式如下:<存储类型> <数据类型> <数组名> [<表达式>]例:int a[6] ;数组名表示内存首地址

2021-09-17 20:37:36 384

原创 2021-09-14 C语言 控制语句

Day4控制语句分支结构:if()~else、switch循环结构:for()、while()、do~while()、goto辅助控制:contine、break、return分支结构1.if-else语句1.1.一般形式:if(表达式) 语句块1;else 语句块2;1.2.常见形式1.2.1. 简化形式:if(表达式) 语句块 ;例:if(x>y) printf(“%d”,x) ;1.2.2. 阶梯形式:(命令行模式下输入gg=G美化代码)if(表达式1) 语句块1

2021-09-14 23:27:27 90

原创 2021-09-09 C语言 输入输出专题

**Day3输入输出专题**C语言没有I/O语句,I/O操作由函数实现#include <stdio.h>1.字符输出函数putchar( )格式:putchar©参数:C为字符常量、变量或表达式功能:把字符c输出到显示器上反值:正常,为显示的代码值例:int c ;char a ;c = 65 ;a = ‘b’ ;putchar©;putchar(‘\n’);putchar(a);显示结果为:AB2.格式输出函数printf格式:printf(“格式控制串”,

2021-09-10 10:22:01 281

原创 2021-09-08 C语言 数据类型、常量、变量及运算符

Day2数据类型、常量、变量及运算符数据类型1.数据类型的分类2.基本数据类型<limits.h>头文件查看数据类型长度逻辑类型:只有两个量true和false,表示逻辑真值和逻辑假值(bool类型)整数类型:包括char、short、int和long浮点类型:包括float和doublevoid类型:主要用于说明不返回值的函数或指向任意类型的指针等3.强制数据类型转换强制数据类型转换是指采用某种方式将某种数据类型强制转换成指定的数据类型。包括显示数据类型转换和隐式数据类

2021-09-09 01:15:21 444

原创 2021-09-05 C语言基础知识及必备的 Linux 命令

嵌入式学习历程 level1 Day1 必备的 Linux 命令 基础知识 1. 计算机基本结构:冯诺依曼模型(存储程序的思想:系统的运行是通过程序指令控制) (存储器,运算器,控制器,输入、输出设备) 2. 存储器:内存,外存,寄存器(CPU 内部的高速缓冲器) 3. 程序就是系统可以识别的一组有序的指令。存储在磁盘上,被加载到内存中执行。 4. 程序设计语言的发展:机器语言,汇编语言,高级语言。 5. 程序设计步骤:编辑(vi),编译、链接(gcc),执行、调试。 .

2021-09-05 12:54:51 135

原创 计算机组成原理 存储单元、存储字、存储字长、存储容量的区分

存储单元、存储字、存储字长、存储容量的区分

2021-04-27 22:58:35 3896

空空如也

空空如也

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

TA关注的人

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