- 博客(21)
- 收藏
- 关注
原创 H.264编解码(NAL)
在我们的日常生活中,比如有缓存电影或者是发送视频的需求。如果没有视频压缩,一部手机只能存几分钟视频,1TB 硬盘也装不下几部电影,用 4G 网络发一段 1 分钟视频,可能需要几十分钟(甚至传不完),在线看视频更是完全不可能。所以就引入了H264这样的压缩技术。这边文章更注重如何传输(NAL)。
2025-07-14 21:59:00
988
原创 环形队列的使用
前面讲到了的使用,我们能会发先当队尾指针加到和队列的大小相同时,就无法再继续存放数据,而此时队头指针持续取出直到队头指针和队尾指针相同时,就判断队满了。但此时下面队列下面还是有没使用的部分,出现了的情况(如上一篇文章中插图的图d)。为了避免假溢出这一情况,引入了环形队列。环形队列的初始化和销毁等和普通队列大致相同(初始化队列时无需指向-1),不同的是对队头指针和队尾指针的操作。
2025-06-30 18:56:31
421
原创 链栈的使用
前面讲到的的使用,栈中数据元素的逻辑关系呈线性关系,所以栈也可以像顺序表一样采用链式存储结构,称之为链栈。链栈的优点是不存在栈满上溢的情况,下面将采用带头结点的单链表来实现链栈,每次出栈进栈都是在头节点后。
2025-06-29 13:24:59
327
原创 栈的基本使用
栈是一种只能在一端进行插入或删除操作的线性表。表中允许进行插入和删除操作的一端称之为栈顶,栈的另一端称之为栈底。所以栈的操作是先进后出。
2025-06-29 12:11:46
261
原创 双链表的使用
前面的介绍了,会发现找后驱结点变方便了,如果要去找前驱结点呢,所以就引出了双链表,因为只是多了个前驱节点,所以除了插入和删除部分和单链表有些差异,其他都相同。
2025-06-28 16:19:29
316
原创 单链表的使用
前面讲到了,顺序表需预先分配连续内存空间,若空间不足需扩容(可能导致数据迁移);而单链表节点分散存储,按需动态分配内存,避免内存浪费。而且顺序表在插入和删除数据的时候需要将前面的数据或者是后面的数据进行移动,效率较低。所以在接下来将讲解单链表的使用。
2025-06-27 19:55:27
431
原创 Cmake的使用
前面有讲解到了makefile,但是在后面项目代码量日益变多的情况下,体会到了Cmake的便利性,所以会讲解下面会介绍cmakecmake_minimum_required() -- 指定cmake的最小版本要求project() --定义工程名称,并可指定工程支持的语言(在我的理解project就像给当前项目画了一个 “边界”,让它的构建缓存、输出文件、变量、目标等都与其他项目(或子项目)互不干扰)set() --显示的定义变量。
2025-06-26 11:29:47
622
原创 顺序表的应用
线性表的顺序存储结构(简称为顺序表)是把线性表中的所有元素按照逻辑顺序依次存储到从计算机存储器中指定存储位置开始的一块连续的存储空间中,如下图所示因此可以根据以上特点定义一个相关的结构体。
2025-03-25 10:38:41
971
原创 SPI驱动程序(ICM20608)
在之前的文章中写了i2c的驱动程序,我们可以知道i2c的传输速度较慢,且为半双工的通信模式。而这篇文章讲解的SPI解决了以上的两个缺点包含了与 SPI 传输相关的各种信息,如传输的长度、数据缓冲区指针、传输标志等,使得 SPI 控制器能够根据这些信息正确地执行数据传输操作。在使用spi_transfer函数前应该先使用kzalloc函数为结构体在内核内存中分配一块内存地址,在使用tx_buf和rx_buf时也同样要分配一份内存地址给它们,当然在声明完之后应该使用kfree函数去释放内存,防止内存泄漏。
2025-03-14 14:16:04
656
原创 i2c驱动程序(AP3216C芯片)
在前面说到了i2c的应用,使用i2c控制EEPROM进行掉电不丢失的存储。在这一篇文章中将对AP3216C进行驱动代码及应用程序的实现。
2025-03-11 22:04:38
1671
原创 led驱动程序的优化(总线模型、设备树模型)
uart1 {/**okay 设备正常运行*disabled 设备不可操作,但是后面可以恢复工作*fail 发生了严重错误,需修复*fail-sss 在fail的基础上加上了sss的错误信息regreg 的本意是 register,用来表示寄存器地址。但是在设备树里,它可以用来描述一段空间。反正对于 ARM 系统,寄存器和内存是统一编址的,即访问寄存器时用某块地址,访问内存时用某块地址,在访问方法上没有区别的。/dts-v1/;
2025-03-04 19:42:29
1125
原创 Linux嵌入式点亮一个led
建立物理地址和虚拟地址之间的映射关系,让内核可以通过虚拟地址来访问硬件设备的物理地址空间,从而实现对硬件设备的控制和数据交互phys_addr:这是一个 resource_size_t 类型的参数,表示要映射的硬件设备的物理起始地址。这个地址通常可以从硬件设备的数据手册中获取。size:这是一个 unsigned long 类型的参数,表示要映射的物理地址空间的大小,单位是字节。
2025-02-28 19:55:44
882
原创 gdb调试
Linux嵌入式等其他场景中无调试选项,但我们在使用时需要调试时,就要使用到gdb调试工具。接下来将从使用方法和基本调试命令来介绍gdb工具。
2025-02-27 22:31:18
784
原创 第一个驱动程序开发
上述file结构体中包含了file_operation结构体,file_operation定义了字符设备驱动程序与用户空间进行交互时所支持的各种操作。Linux 内核中用于输出调试信息、日志信息等的函数,它的功能类似于用户空间的printf函数,但由于运行在内核空间,有着不同的实现和使用场景。设备节点:用户空间程序与字符设备驱动进行交互的接口,通过设备节点,用户空间程序可以调用字符设备驱动提供的操作函数来访问硬件设备。设备类:对设备的逻辑分组,方便设备的管理和识别,并且可以自动创建设备节点。
2025-02-26 11:53:10
1053
原创 直接访问EEPROM(Linux嵌入式)
它会先尝试使用 /dev/i2c/%d 格式的路径打开设备文件,如果失败且错误码为 ENOENT(文件不存在)或 ENOTDIR(不是目录),则会尝试使用 /dev/i2c-%d 格式的路径再次打开。若最终仍无法打开文件并且quiet参数的值为0,会根据错误码输出相应的错误信息。返回值:返回最终的文件描述符,打开成功则返回一个非负整数,否则返回 -1quiet) {} else {\n");
2025-02-14 13:50:28
755
原创 i2c协议和SMBus协议
在面对不同的情况使用不同的协议可以事半功倍,在平时运用也可以多加考虑首先介绍一个底层的 I2C SMBus 访问函数,用于执行各种 SMBus 操作。如果操作成功,返回读取到的字节数据;如果失败,返回负数错误码__s32 err;return err;
2025-02-13 20:56:01
1423
原创 I2C-Tool使用(无需编写驱动程序直接访问设备)
i2cdetect:用于在 Linux 系统中扫描 I2C 总线并检测连接在其上的 I2C 设备-l 列出I2C总线上连接的设备I2CBUS(I2C 总线的编号) 列出该总线上连接设备的地址i2cget:通常用于从指定的I2C地址读取数据其中的MODE:b(一字节)、w(两字节)、e(执行一个 “PEC(Packet Error Checking,数据包错误检查)读取)例:从I2C 总线 0 上,地址为 0x1e 的传感器设备的一个地址为0xc的16位寄存器上读取两字节的数据i2cset。
2025-02-10 21:23:05
734
原创 多线程编程
多线程编程是一种在单个进程中同时执行多个线程的技术,提高程序的并发性的同时提高资源利用率。attr: 指向 pthread_attr_t 类型的指针,指定线程的属性。如果发生错误,返回相应的错误码。mutex: 指向 pthread_mutex_t 类型的指针,表示要上锁的互斥锁。thread: 指向 pthread_t 类型的指针,用于保存新创建线程的 ID。如果发生错误,返回相应的错误码,例如 EINVAL(条件变量或互斥锁未初始化)。arg: 传递给线程函数的参数,可以是任何类型的指针。
2025-02-03 16:52:10
243
原创 网络编程(TCP UDP)
网络编程使得不同计算机之间可以有效地交换数据。它为数据传输提供了协议和标准,使得在网络上传输数据变得简单而高效。网络编程实现了客户端-服务器模型,这是现代应用程序架构的基础。客户端请求服务,服务器提供服务。
2025-01-24 19:29:19
1080
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅