自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 驱动三阶段——ADC,I2C,IIO,SPI

本次任务为完成内核自带驱动exynos_adc.c驱动阅读及调试,根据驱动程序写设备树。所以第一步我们把匹配名写成compatible = "samsung,exynos-adc-v1"得到查看内核中驱动drivers/iio/adc/发现probe函数中获取了两次资源两个mem分别对应设备树节点reg里的第一个地址块与第二个地址块;最终存入info结构体内部;第一个获取的是,第二个获取的是在嵌入式系统中,一个标准的寄存器通常占用(32位);最后一个寄存器ADCMUX的起始地址是。

2026-09-21 00:27:35 136

原创 驱动二阶段——设备驱动

input子系统的设计旨在实现对于各种输入设备的统一抽象和处理。其主要组成部分包括:1、输入核心层(Input core) 2、输入事件层(Input Events) 3、设备驱动程序层(Input DeviceDriver)Linux内核中注册了多个事件处理handler驱动模块,分别是:evdev:通用输入事件接口,我们可以通过设备文件/dev/eventX或/dev/input/eventX读取事件;mousedev:一个早期的鼠标事件接口;

2026-08-24 15:17:32 249

原创 驱动第一阶段——启动流程

1.基本硬件初始化(需要的时钟和设备)2. 判断对应的启动方式(emmc;sd卡;usb)3. 把bootloader 第一阶段的代码加载到IRAM(芯片内运行内存)SPL(Secondary Program Loader(二级程序加载器)):u-boot-spl.bin1.初始化整个系统的时钟;2.初始化内存3.把完整的bootloader搬移到内存中1.初始化了一些硬件设备(根据开发板 去定义(网卡;串口;USB))2.加载对应的操作系统(内存)

2026-08-03 12:52:10 274

原创 STM32第三周/阶段

I2C(Inter-Integrated Circuit),集成电路总线,它由飞利浦(现为NXP)公司在20世纪80年代开发,是一种广泛用于嵌入式系统的通信协议,用于在同一块电路板上的集成电路之间进行通信。I2C总线:是一种物理通信架构,用于连接多个设备,实现设备之间的数据传输。I2C协议:是一套规则,定义了IIC总线上数据通信的过程,包括如何启动通信、传输数据、应答信号、结束通信等。

2026-07-15 10:18:18 218

原创 时钟控制器和TIM、DMA、ADC、UART控制器

RC振荡器: • RC振荡器的优点是成本低,启动速度要比晶振快,但是精度没有晶振/陶 瓷谐振器高。无源晶体振荡器: 工作原理是基于压电效应和共振原理交互作用而产生的。需要借助于 时钟电路才能产生振荡信号,自身无法振荡起来。有源晶体振荡器: 内部是一个完整的振荡电路,原理与无源晶振类似,有源晶振需要外 部电源供电才能起振。内部时钟源: HSI 内部高速时钟源 LSI 内部低速时钟源外部时钟源: HSE 外部高速时钟源 LSE 外部低速时钟源。

2026-06-29 03:36:52 290

原创 电路元器件和GPIO控制器

电容器由两个相互靠近的导体组成,中间夹一层不导电的绝缘介质(电介质)。单位是法拉(F)。电感核心作用是阻碍电流的变化,依据楞次定律可知电流变化时会产生阻碍电流变化的感应电动势,可以让电流不突变。电感系数L的单位为亨利(H),计算公式为(串联),(并联),(感抗)。P性半导体(多空穴)和N型半导体(多电子)组成的PN结内部形成耗尽层(也是内部电场:N指向P的正向电势差),阻碍电流通过;这就是二极管的单向导电性。正向偏置:阳极连正极,阴极连负极,此时外加电压削弱了PN结的内部电场,电流正常流通。

2026-06-09 01:45:43 252 1

原创 5.27C语言考试错题解析

本文主要考察了C语言编程中的几个关键知识点:1) #define宏定义的文本替换特性;2) sizeof运算符对数组的处理方式;3) volatile关键字的作用;4) 子网掩码的计算方法。文章还分析了常见编程错误,如返回局部变量地址导致的野指针问题,并通过一个字符串拷贝函数的实现示例,展示了如何正确处理指针参数、断言检查以及链式调用。代码示例中包含详细的注释,说明了每个关键步骤的实现原理和注意事项。

2026-05-27 17:05:54 248 1

原创 制作库的流程

定义:静态库是在程序编译链接阶段,其代码会被完整地”复制”到最终生成的可执行文件中,成为可执行 文件的一部分,编译完成后,静态库与可执行文件“绑定”,运行时无需额外依赖;• 特点:• 可执行文件独立运行,不依赖外部库文件;• 静态库会使可执行文件体积较大,但是效率比较高;• 若静态库更新,需重新编译链接程序;定义:动态库也称之为共享库,是在程序运行时才被加载到内存中,可以被多个可执行文件共享使用, 为它们提供函数、数据等资源;• 特点:• 可执行文件运行时,需依赖系统中存在的动态库;

2026-04-29 09:10:22 346

原创 文件IO函数

所需头文件原型t mode);功能用文件IO的方式打开文件参数pathname文件路径和名字不写路径默认打开当前路径下的文件flags打开文件的方式:ORDONLY:以只读方式打开文件,文件不存在则打开失败OWRONLY:以只写方式打开文件,文件不存在则打开失败ORDWR:以读写方式打开文件,文件不存在则打开失败OAPPEND:以追加方式打开文件,文件不存在则打开失败OCREAT:文件不存在则创建文件如果 flags中填写了O。

2026-04-28 15:57:00 344

原创 标准IO函数

man手册是用于在linux系统中查询命令、函数等的帮助手册,不同的章节分类便于快速定位获取各类 linux系统相关的帮助信息;man man:查看man手册自身的章节说明,了解man手册整体架构和使用规范;• man 1 要查看的内容:查看可执行程序或shell命令的帮助文档,“1”对应用户命令章节;• man 2 要查看的内容:查看系统调用(内核提供的函数)相关帮助,“2”对应系统调用章节;• man 3 要查看的内容:查看库调用(库中的函数),“3”对应库函数章节;

2026-04-28 15:33:28 287

原创 标准IO的缓冲区(用户态)

定义:标准 I/O 中的缓冲区是C语言标准库为优化文件读写效率设计的内存机制,本质上就是一段由FILE 结构体管理的内存空间;• 作用:通过临时存储数据、批量处理,可以减少硬件IO(如磁盘、终端)的交互次数,提升程序效率;• 缓冲策略:标准 I/O 中设计了行缓冲、全缓冲、无缓冲三种策略,来适配不同的场景,也支持手动修改;•行缓冲:默认用于终端设备(如stdout、stdin),Linux系统中行缓冲的大小为1024(1KB);•全缓冲。

2026-04-22 20:32:50 306

原创 标准IO和文件IO的概念及对比

定义:标准 I/O 是 C 库提供的输入输出函数集合,由 ANSI C 标准统一规范,为跨平台 IO 操作奠定基础;• 跨平台性:在UNIX 系统、Windows系统、Linux 等多系统操作均实现标准 I/O 库, 让代码跨平台开发更顺畅;• 高效实现原理: 通过缓冲机制(内存临时存储数据),减少直接系统调用次数, 降低硬件交互开销,提升 IO效率;• 易用性设计: 基于系统底层调用封装,屏蔽复杂硬件操作,开发者无需关注设备细节, 简单调用函数即可完成 IO;

2026-04-22 15:35:21 221

原创 环境变量配置

定义​:• PATH 是 Linux 系统中不可或缺的环境变量,以冒号分隔的形式,有序存储着一系列可执行文件所在 的目录路径。这些路径涵盖了系统命令、用户自定义脚本、各类应用程序的存储位置,像 /bin 存放 基础系统命令,/usr/bin 容纳用户级工具,~/bin 可用于保存个人脚本;• 关键作用​:• PATH 为用户提供了便捷的命令执行方式,在终端输入命令(如 python、git)时,无需输入命令的完整路径,系统会依据 PATH 自动定位对应可执行文件,让用户。

2026-04-17 14:25:59 597

原创 gcc与gdb

GDB是GNU 项目 下的一个功能强大的调试工具,主要用于调试 C/C++/Go等编程语言编写的程序;核心功能:•动态检查程序运行状态(变量值、内存布局、寄存器内容等等);•跟踪代码执行流程(单步执行、断点设置、函数调用等等);•支持多线程调试(查看线程状态、切换线程上下文等等);启动和退出GDB• 启动:在终端中输入gdb 可执行文件名即可启动 GDB 并加载相应的可执行文件;• 退出:在 GDB 命令行中输入quit或q,然后按回车键即可退出 GDB;

2026-04-15 11:09:16 331

原创 linux操作系统命令

在 Linux 操作系统中,命令是用户与系统交互的关键方式。基于 Shell(如 Bash、Zsh 等)进行解析执行, 以标准化文本字符串形式呈现。命令的语法格式:命令名 [选项] [参数]•:必不可少的核心部分,是执行特定操作的基础标识符,由英文单词或者是单词缩写构成;•:用于灵活调整命令的执行行为和输出格式。可根据实际需求决定是否使用;通常以短选项“-”或者是长选项“--”作为前缀;•:作为命令操作的对象或数据来源,也并非总是必需,参数可能是文件路径、目录名、字符串 等等;

2026-04-14 19:10:50 423

原创 树和二叉树及赫夫曼树

森林(Forest)是m(m≥0)棵互不相交的树的结合。对树中的每个结点而言,其子树的集合即为森林。

2026-04-14 14:53:01 322

原创 栈、队列、循环队列

队列(queue)是一种先进先出(first in first out,FIFO)的线性表,它只允许在表的一端进行插入,而在另一端 删除元素。允许插入的一端叫做队尾(rear),允许删除的一端叫做队头(front)。双端队列:两边都能进出队的线性表。

2026-04-01 19:41:45 369

原创 线性表(顺序表和链表)

线性结构的特点是:1、存在唯一的一个被称作“第一个”的数据元素2、存在唯一的一个被称作“最后一个”的数据元素3、除第一个之外,集合中的每个元素均只有一个前驱4、除最后一个以外,集合中的每个数据元素均只有一个后继线性表的时间复杂度插入的时间复杂度:O(n)=n/2;删除的时间复杂度:O(n)=(n-1)/2;

2026-04-01 19:15:22 166

原创 数据结构前言

1.数据的逻辑结果集合;线性结构;树形结构;图状结构;2.数据的物理存储结构顺序存储;链式存储;索引存储;散列存储1.顺序存储结构是一种将数据元素按照它们在逻辑结构中的顺序依次存储在连续的存储空间中的结构。它通 过存储元素的地址顺序与元素的逻辑顺序保持一致,从而实现高效的顺序访问。2.链式存储是一种将数据元素存储在不连续的内存空间中,并通过指针链接每个元素来保持元素间逻辑关系 的存储方式。链式存储结构不要求数据存储在连续的空间中,这使得其。

2026-03-25 19:18:17 50

原创 指针(三类特殊指针和二级指针以及野指针)

概念:指针是一个变量,它存储另一个变量的内存地址。变量存储在内存中,每个变量占据一定的内存空间,并有 唯一的地址。示例: int x = 10;// 声明指针 p,指向变量 x 的地址解释: &x 获取变量 x 的内存地址。int *p 声明了一个指向 int 类型的指针变量 p。p 存储了 x 的地址。声明指针:int *p;// 声明一个指向 int 类型的指针 p,用于定义指针,表示这是一个存储地址的变量。赋值与获取地址: int a = 5;p = &a;

2026-03-19 19:47:34 372

原创 函数、递归函数和goto语句

1.函数的概念: 函数是执行特定任务的代码块。它可以接收输入(称为参数),完成任务后返回结果。2. 函数的作用:提高代码复用性:同一个函数可以被多次调用,而不需要重复写相同的代码。增强可读性:通过将复杂的逻辑分解成多个函数,可以让代码更加清晰。方便调试和维护:函数的独立性使得调试和更新代码更加简单。

2026-03-19 14:30:36 345

原创 聚合数据类型

原因:观察前面学习的变量常量等,我们可以发现这些都是单一类型的数据,为了处理复杂情况,我们需要把不同类型的数据组合在一起,表示一个逻辑上紧密相关的实体。比如学生信息管理系统,客户信息管理系统,停车场管理系统,都是包含多种类型的数据。1.整型、字符型、浮点型基本数据类型;2数组、指针、其他结构体等派生数据类型;3枚举类型;4联合体;5函数指针。唯一的例外:不能在结构体内部包含嵌套这个结构体本身,这样会导致无限套娃,编译器无法计算这个结构体到底有多大(内存无限大),所以会报错。

2026-03-17 17:25:16 369

原创 学习三种数组(其实是两种)

字符数组是用于存储字符序列的数组,每个元素是一个字符类型(char)。字符数组通常用于表示字符串,但本质上它只是字符的集合。1 声明语法示例: char name[10];// 声明一个长度为10的字符数组2 显式初始化: 可以直接在声明时为字符数组赋值。示例: char name[5] = {'H', 'e', 'l', 'l', 'o'};数组name存储字符序列Hello,但不会自动加上字符串结束符\0。3 字符串初始化: 使用字符串字面量直接初始化字符数组。

2026-03-14 11:19:38 357

原创 条件判断结构和循环结构

if 语句用于根据一个条件是否为真,决定是否执行代码块,是最基础的判断结构。

2026-03-11 20:06:10 359

原创 三种运算符号及相关应用

功能: 加法运算符用于两个操作数相加。它可以用于整数、浮点数以及字符类型(因为字符可以按ASCII码 值处理)。特点: 可以对整型(int)、浮点型(float)、双精度型(double)等类型操作数进行加法操作。如果。

2026-03-11 09:08:53 527

原创 常量以及在嵌入式内的应用

定义:const 关键字用于定义具有类型的符号常量。使用 const 修饰的变量不能被修改。语法: const 数据类型 常量名 = 常量值;//常量浮点数PI为3.14159//常量整数为MAX_LENGTH为100//注意PI和MAX_LENGTH不能修改,否则会报错特点: const 常量有类型限制,编译器会进行类型检查。const 常量存储在内存中,可以参与程序运行时的计算。const和#define不能同时定义同名常量。常量可用来定义程序内不会改变的值,常见的使用为定义数学常量和物理常量。

2026-03-10 09:38:37 365

原创 输入与输出函数

返回值:返回成功打印的字符数(如果是unsigned char类型的则转换为int返回),如果输出发生错误时返回负值。功能:从输入流读取字符串的函数,相比于gets()更安全,因为它能允许指定读取的最大字符数,避免了缓冲区溢出的问题。如果读取到换行符也会停止读取,并且换行符会作为字符串的一部分存储在str中,并且在字符串结尾自动加上\0.n:要读取的最大字符数(包括终止符\0),最多读n-1个字符,最后一个留给\0;//读取输入的整数和浮点数。字符串,用于指定输入的数据类型,例如%的d,%f,%l。

2026-03-09 20:17:04 259

原创 具体变量细节和变量的指针

只能表示true 或 false的两种数据类型;引入:#include <stdbool.h>;定义:bool flag = true;与使用int模拟布尔值相比较下的优点(5个)特性使用int模拟布尔使用bool_Bool可读性低 (01-1含义模糊)高 (truefalse语义明确)意图表达混淆 (是计数?还是状态?精准 (明确表示逻辑状态)内存占用通常 4 字节通常 1 字节类型检查弱 (可随意进行算术运算)强 (逻辑运算更规范)标准化依赖约定俗成。

2026-03-09 15:10:41 341

原创 进制转换与各种变量

变量在定义时需要指定名字和类型,或者指定初值定义规则:<存储类型> <数据类型> 变量名 = 初始值;

2026-03-06 16:53:45 374

原创 预备:编译、main()函数、头文件

本文介绍了C语言编译过程及相关基础知识。编译过程包括预处理(.c→.i)、编译(.i→.s)、汇编(.s→.o)和链接(.o→.exe)四个阶段,分别由cpp、gcc、as和ld处理。重点讲解了main函数的两种定义形式及其作为程序入口的特性。同时列举了常用系统头文件和使用;包含用户自定义头文件的区别,并说明了头文件防护机制#ifndef/#define/#endif的三大作用:防止重复包含、实现条件编译和跨平台兼容。文章还强调了main函数应返回0的编程规范。

2026-03-06 11:41:00 83

空空如也

空空如也

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

TA关注的人

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