自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 硬件基础(1)基于ARM9 s3c2440基础

UART(Universal Asynchronous Receiver-Transmitter,通用异步收发传输器)是一种常用的串行通信协议,广泛应用于微控制器、计算机、嵌入式系统等设备之间的数据传输。中断是计算机系统中一种重要的事件处理机制,能够让处理器在执行程序的过程中暂停当前任务,响应某个特定事件(通常是硬件或软件产生的信号),并处理该事件。GPIO的工作模式和功能通过特定的寄存器进行配置,通常包括方向寄存器(设置输入/输出)、数据寄存器(进行读写操作)和控制寄存器等。

2024-09-26 18:18:09 776

原创 ARM中要使用的汇编基础

【代码】ARM中要使用的汇编基础。

2024-09-19 21:43:01 570

原创 ARM基础

ARM公司(正式名称为ARM Holdings Ltd.)是一家总部位于英国剑桥的半导体和软件设计公司,专注于开发和授权基于ARM架构的处理器技术。输入设备的任务是把人们编好的程序和原始数据送到计算机中去,并且将它们转换成计算机内部所能识别和接受的信息方式。CPU的指令集是指令的集合,这些指令用于控制计算机的操作和执行各类计算。程序计数器、链接寄存器和堆栈指针是计算机架构中关键的寄存器,它们负责程序的控制流程和数据管理。运算器是对信息进行处理和运算的部件,经常进行的运算是算术运算和逻辑运算,因此运算器。

2024-09-18 20:37:43 2779

原创 利用framebuffer在显示设备中显示图片和文字

该函数将一个 UTF-8 编码的字符绘制到指定的位置,支持不同颜色的像素显示。该函数用于显示 UTF-8 编码字符串,逐个字符调用。

2024-09-11 20:50:16 1019

原创 framebuffer

是一种独立于硬件的抽象图形设备。是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。

2024-09-10 20:21:51 474

原创 数据结构(6)哈希表和算法

冒泡排序: 最好 O(n)O(n)O(n), 平均 O(n2)O(n^2)O(n2), 最坏 O(n2)O(n^2)O(n2)选择排序: 最好、平均、最坏均为 O(n2)O(n^2)O(n2)插入排序: 最好 O(n)O(n)O(n), 平均 O(n2)O(n^2)O(n2), 最坏 O(n2)O(n^2)O(n2)快速排序: 最好 O(nlog⁡n)O(n \log n)O(nlogn), 平均 O(nlog⁡n)O(n \log n)O(nlogn), 最坏 O(n2)O(n^2)O(n2)

2024-09-09 22:52:17 1337

原创 数据结构(5)树

一、树树型结构是一种一对多的结构,非线性的结构二、树的基本要素。

2024-09-09 09:35:06 586

原创 数据结构(4)栈和队列

增栈和减栈:增栈是指数据的存放位置有低地址向高地址增长,减栈是指,数据的存放位置有高地址向低地址增长。队列也是一种顺序存储数据的结构,它只允许从一端进行数据的插入,另一端进行数据的删除,因此,它遵循。满栈和空栈的判断依据:栈顶位置是否有数据,栈顶有数据的称为满栈,栈顶位置没有数据的称为空栈。的错误:如果不正确地管理队列的头尾指针,可能会导致队列在逻辑上被认为是满的,即使实际上还有空间可用。栈是一种线性的数据存储结构,由于栈只允许从一端进行数据的插入和删除。栈的类型有:满增栈,满减栈,空增栈,空减栈。

2024-09-06 20:14:05 720 1

原创 数据结构(3)内核链表

内核链表通常提供了一组宏和函数来简化链表的操作,例如添加、删除和遍历节点。内核链表是一种在操作系统内核中使用的数据结构,主要用于管理和组织内核对象。: 内核链表的每个节点都包含指向前一个节点和后一个节点的指针,这使得在链表中进行插入和删除操作时更加高效。: 内核链表的操作通常在内核空间中进行,避免了用户空间和内核空间之间的上下文切换,从而提高了性能。是一个宏,用于获取结构体中某个成员相对于结构体起始位置的字节偏移量。是一个宏,用于根据结构体成员的指针获取包含该成员的结构体的指针。

2024-09-05 20:23:59 511

原创 数据结构(2)单向链表排序和双向链表操作

双向链表是一种链表数据结构,其中每个节点都有两个指针:一个指向下一个节点(next),另一个指向前一个节点(prev)。这种结构使得在链表中进行插入和删除操作更加灵活,因为可以在 O(1) 的时间复杂度内访问前一个节点。快慢指针是一种常用的算法技巧,通常用于链表中,以解决一些特定的问题,比如寻找链表的中间节点、检测链表是否有环等。双向链表和单向链表是两种常见的数据结构,它们在结构、操作和使用场景上有显著的区别。通过这种方式,快指针和慢指针的相对速度可以帮助我们在链表中找到特定的节点或判断某些条件。

2024-09-04 19:46:08 675

原创 数据结构(1)数据结构基础(单向链表)

数据结构是一组用来保存一种或多种特定关系的数据的集合。其主要目的是组织和存储数据,以便于高效的访问和修改。程序 = 数据结构 + 算法单向链表是一种线性数据结构,由一系列节点构成,每个节点包含数据部分和指向下一个节点的指针。它是一种灵活的存储方式,相比于数组,单向链表不需要连续的内存空间。

2024-09-03 19:27:53 820

原创 数据库基础

SQLite 是一个轻量级的关系数据库管理系统,其特点和优势使其广泛应用于各种应用程序中。

2024-08-29 20:32:58 467

原创 IO复用技术

I/O复用是一种能够同时处理多个I/O操作的技术,适用于高并发场景。

2024-08-28 20:04:53 643

原创 并发服务器开发基础

阻塞IO适合对响应时间和并发性要求不高的情境,而非阻塞IO则适合高并发和实时性的需求。根据具体应用场景,开发者可以选择合适的IO模型来实现最佳的性能和用户体验。信号驱动IO适合需要及时响应IO操作的场景,而IO多路复用则适合高并发处理多个IO流的场景。两者在性能和复杂性上各有优缺点,开发者根据具体需求选择最合适的方法。

2024-08-27 19:24:22 402

原创 Linux系统编程(15)send/recv函数

粘包问题是网络编程中常遇到的一个问题,尤其是在使用 TCP 协议的情况下。由于 TCP 是一种面向字节流的协议,它不会维护消息边界,可能会导致多个独立发送的数据包在接收方被粘连在一起。抓包是指通过特定工具捕获网络中传输的数据包,以便分析其内容、结构和传输状态。是在网络编程中常用的两个函数,用于在套接字(socket)之间发送和接收数据。:如果发送方频繁地发送小数据包,接收方可能会在缓冲区中接收到这些小包的组合。:成功时返回实际发送的字节数,失败时返回 -1。用于接收来自连接的套接字的数据。

2024-08-23 19:02:33 1411

原创 Linux系统编程(14)UDP全双工通信和TCP半双工通信

listen函数将创建的socket套接字设置为监听模式后,创建一个序列用来存储请求连接的设备,accept函数每次将第一个在队列中的请求进行处理后产生一个用来通信的和客户端建立连接的新的套接字 ,用来负责后续的通信。如果有更多的连接请求到达,新的连接可能会被拒绝或未处理,直到队列中有空闲位置。由于TCP面向连接和可靠性高的特性,因此,在使用TCP协议通信时,需要在客户端和服务端之间先建立连接才能进行数据通信。: 指定缓冲区的大小,即要接收的数据的最大字节数。结构体的指针,包含要绑定到的地址信息。

2024-08-22 19:23:27 1284

原创 Linux系统编程(13)IPC(共享内存)和网络通信基础

共享内存是通过映射的方式在内核中申请一段可以使用的物理内存空间来映射到用户空间中,用户对用户空间的操作就是直接操作物理内存区域。通过这种方式,进程可以直接读写这部分内存,从而实现高效的数据交换。相比于其他 IPC 机制(如管道、消息队列、套接字等),共享内存的优点在于它提供了更快的数据传输速度,因为数据不需要通过内核进行复制。

2024-08-21 18:35:46 832

原创 Linux系统编程(12)信号 和 有名管道

有名管道是一个特殊的文件类型,它在文件系统中有一个名称,允许不同进程之间进行通信。

2024-08-17 19:44:05 578

原创 Linux系统编程(11)信号量和管道

信号量-------让线程间有顺序协调地工作,它可以用来协调多个线程或进程,使得它们不会因为同时访问共享资源而导致数据不一致或系统崩溃。管道可以看作是一个数据流的通道,其中一个进程将数据写入管道的写端,另一个进程从管道的读端读取数据。定义了一个数据类型为sem_t 的变量,名为sem;管道中的数据量不能超过这个大小,否则写操作会阻塞。介绍 IPC (进程间通信)中的古老通信方式:管道。管道实际上也是在内核中运行的。如果需要双向通信,通常要创建两个无名管道。系统调用创建无名管道。:表示使用这个资源。

2024-08-16 19:16:28 595

原创 Linux系统编程(10)线程资源回收和互斥锁

死锁(Deadlock)是多线程或多进程编程中常见的一个问题,它指的是一组进程或线程在互相等待资源的过程中形成了一个循环依赖,导致它们都无法继续执行。简单来说,死锁是一种系统状态,在这种状态下,所有的进程或线程都在等待其他进程或线程释放资源,但由于互相等待,系统中的所有进程或线程都处于阻塞状态,无法继续执行。用于保护共享资源,确保在同一时刻只有一个线程能够访问这些资源(排他性),它是一种软件层面上 的锁。尝试获取锁,如果锁已被其他线程持有,则函数立即返回,而不是阻塞调用线程。销毁互斥锁,释放其占用的资源。

2024-08-15 19:59:50 972

原创 Linux系统编程(9)

wait函数有两个作用:1.获取子进程 的退出状态当父进程要获取子进程的退出状态时,子进程里需要使用exit函数(exit(退出状态值)退出状态值只有低八位有效,有效值的范围为0~255;父进程通过wait或者waitpid函数来获取到推出状态值2.回收资源注意点:wait本身是一个阻塞操作,会使调用者阻塞。waitpid函数与wait函数有类似的作用。

2024-08-14 18:57:29 1241

原创 Linux系统编程(8)进程进阶

子进程被创建好后,就需要去执行它所该执行的功能,根据子进程需要做的事,将其分为两类:1.子进程所做的事与父进程差不多,两者功能几乎一样 //子承父业2.子进程所做的事和父进程做的事完全不同,子进程自己完成一项功能 // 自力更生介绍exec函数族是用于替换当前进程映像(程序)的一组函数。这意味着执行这些函数后,exec函数族的成员execarg, ...NULLargv[]NULLarg, ...NULLenvp[]argv[]NULLenvp[]arg, ...NULLexeclp与execl。

2024-08-13 20:20:07 846

原创 Linux系统编程(7)多任务编程:进程

进程是正在运行中的程序,或者说是一次程序的执行过程。程序是死的,进程是活的,程序是存储在硬盘上的,进程是运行在内存中的,一个程序可以对应多个进程。程序加载到内存中就成为了进程。

2024-08-12 20:16:40 895

原创 基于C语言的linux下minishell(简易版)

组成:makefile、main.c、ls.c、cd.、.........6,ln -s 创建软链接 ln -s 1 2 2是指向文件1到软链接。10,mv 移动或剪切文件 mv 1 2 把1 剪切成2。7,ln 创建硬链接 ln 1 2 2是指向1的硬链接。9,touch 新建文件 touch 1 新建文件 1。1,cp 复制文件 cp 1 2 把文件1复制成文件2。8,rm 删除文件 rm 1 删除文件1。2,cat 查看文件 cat 1 查看文件到内容。

2024-08-10 14:06:46 184

原创 Linux系统编程(6)GDB调试

在使用GDB调试程序之前,需要在编译时添加调试信息。

2024-08-10 13:57:54 218

原创 Linux系统编程(5)用户id,时间,makefile

1.getpwuidgetpwuid是一个用于获取与指定用户 ID (UID) 相关联的密码文件条目的函数。它返回指向passwd结构体的指针,其中包含有关用户的信息。passwdNULL结构体2.getgrgidgetgrgid用于获取与指定组 ID (GID) 相关联的组文件条目。它返回指向group结构体的指针,其中包含有关组的信息。groupNULL结构体1.timetime函数用于获取自 Unix 纪元(1970 年 1 月 1 日 00:00:00 UTC)以来的秒数。time_tNULL。

2024-08-08 19:17:47 645

原创 Linux系统编程(4)文件夹操作

1.fleno功能: 返回与文件流相关联的文件描述符。 参数: 是一个指向文件流的指针。 返回值: 成功时返回文件描述符,出错时返回并设置。2. fdopen功能: 将现有的文件描述符转换为文件流,并指定文件打开模式。 参数: : 文件描述符。 : 文件打开模式(如、、等)。 返回值: 成功时返回指针,出错时返回并设置。3. opendir功能: 打开目录并返回指向结构体的指针。 参数: 是目录的路径。 返回值: 成功时返回指针,出错时返回并设置。 用途

2024-08-07 19:53:32 836

原创 Linux系统编程(3)文件定位、缓冲区和文件IO

在 Linux 操作系统中,文件 I/O(输入/输出)是通过一组系统调用实现的,这些调用提供了对文件和设备进行读写操作的功能。文件 I/O 主要用于与设备文件和普通文件进行交互。无缓冲适用于需要实时输出的情况, 主要用于出错处理信息的输出 stderr ,不对数据缓存直接刷新。:在读取或写入数据时,先将数据存储到缓冲区,然后再进行实际的I/O操作。ftell将指针移动至文件末尾时,可以获取到整个文件的字节大小。函数用于向文件描述符指向的文件中写入数据。函数用于移动文件指针到文件中的指定位置。

2024-08-06 19:52:45 748

原创 Linux系统编程(2)标准IO

标准输入输出库,位置在/usr/include/stdio.hstdio.h-->stdio.c-->libc.so (so动态库文件/usr/lib)FILE 结构定义的对象 FILE * 称之为流对象,也叫文件流指针。FILE*是一个指向结构体的指针。filename:这是一个指向字符串的指针,表示要打开的文件的名称。可以是相对路径或绝对路径。mode"r""r+""w""w+""a""a+"此外,还可以在模式字符串中添加b以表示二进制模式,例如"rb""wb"和"ab"。

2024-08-05 19:51:03 723

原创 Linux系统编程(1):Shell脚本配置

shell是一种解释性语言,本质上是命令解释器shell脚本是实际上是命令合集告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。2.编写脚本3.chmod +x XX.sh 修改程序的执行权限,确保可以被执行。4../XX.shPATHPWDHOME$0$1$#$$1.read:使用read命令从终端读取输入:2. echo:使用echo。

2024-08-03 18:56:24 400

原创 C语言基础(15)链表的删除,插入和共用体,枚举,typedef

删除链表中的尾节点清除链表共用体是一种特殊的数据结构,允许将不同的数据类型存储在同一内存位置。只可以存储一个成员。由于共用体中的所有成员共享同一内存位置,所以修改一个成员会覆盖之前存储的值。枚举是一种用户定义的数据类型,它由命名的整型常量组成。枚举可以为一组相关的常量定义有意义的名称,而不是直接使用数字。枚举中的值实际上是整型值。typedef用于给已有的数据类型定义新的名字,提高代码的可读性和可维护性。定义复杂的结构类型时,typedef也非常有用。

2024-08-02 20:03:40 356

原创 C语言基础(14)结构体和链表

结构体对齐是指编译器在内存中为结构体的各个成员分配内存时,可能会在成员之间插入填充字节,以使每个成员的起始地址都能满足其对齐要求。有头链表(带头结点的链表)是指在链表的开始部分有一个特殊的节点,称为首节点,这个节点不存储有效数据,仅用于指向链表的第一个节点,从而简化链表的操作。2、结构体成员按照结构体成员声明先后次序依次存放,并且每个成员的首字节放置的位置必须能够整除成员的字节数;箭头运算符的左边是指向结构体的指针,右边是结构体的成员。值域是这个节点所携带的数据,指针域存放的是下一个节点的地址。

2024-08-01 18:59:23 1813

原创 C语言基础(13)数组指针和函数指针

一个指向指针的指针是一个保存指针地址的变量。定义时需要两个星号(**int x = 10;// 指向int类型的指针// 指向指针的指针。

2024-07-31 19:16:28 277

原创 C语言基础(12)字符指针 万能指针 和动态分配内存

malloc` 用于分配指定大小的内存块,例如 `int *arr = (int *)malloc(5 * sizeof(int));万能指针需要通过类型转换才能指向的数据,例如将 `void *ptr` 转换为 `int *` 类型后再进行指针运算。使用 `malloc` 和 `calloc` 需要检查返回的指针是否为 `NULL` 以确保内存分配成功。它可以指向不同类型的数据,例如 `int`、`float` 或 `char` 等。在实际编程中,万能指针可以提高代码的灵活性和通用性,但使用时。

2024-07-30 19:25:23 541

原创 C语言基础(11)指针的概念和基础用法

而不是变量的副本。这意味着在函数内部对指针所指向的变量进行的修改会影响到原始变量,即通过指针运算可以实现在被调函数中修改主调函数中的内容。当定义一个指针后,既不初始化也不赋值时,指针中的地址为随机值,这种指针称为。函数的返回值类型定义为指针类型时,这个函数就是指针函数。指针是一种用来存放地址的数据类型。:空指针是指不指向任何有效内存地址的指针,通常用。定义一个指针时,*符号是类型说明符,例如,:通过指针访问指针指向的变量。声明了一个指向整数类型的指针。:获取变量的内存地址。指向的地址中的值赋给变量。

2024-07-29 18:17:48 352

原创 C语言基础(10)标识符的作用域和可见性及预处理命令

关键字(将变量的生存期由动态生存期修改为静态生存期)声明的局部变量,它们的生存期也是整个程序运行期间,但作用域仅限于定义它们的函数内。static关键字作用与函数时,意义是限制函数的使用范围,限制该函数只能在本程序.c文件中使用,其他.c文件不能使用。变量的生存期(Lifetime)指的是变量在程序执行过程中从创建到销毁的时间段。具有静态生存期的变量在程序开始执行时被分配,并在程序结束时被销毁。4.在两个或者两个具有包含关系的不同作用域中定义的同名标识符,外层标识符在内层不可见(就近原则)

2024-07-27 19:36:49 418

原创 C语言基础(10)数组作为函数参数传递

sizeof(a)的值为8,因为数组名传递参数时,传递给形参的数组的首地址,地址数据占用8个字节。二维数组在函数声明中,必须明确指定二维数组的列数。如果函数需要使用数组的行数或其他维度的信息,需要显式传递这些大小。由于在被调函数中无法求得数组的占用大小,因此在。sizeof函数实际上是读取数据的数据类型。当二维数组作为参数传递时,虽然整体仍然是二维数组。,其余维度必须指定。

2024-07-26 19:48:37 2956

原创 C语言基础(9)函数嵌套调用和递归调用

保护现场指的是在调用一个函数之前,保存当前函数的执行状态,以便在被调用函数执行完毕后能够正确地恢复并继续执行。恢复现场指的是在被调用函数执行完毕返回之后,恢复原来的执行状态,以便继续执行调用函数。函数调用实际上是程序跳转到被调函数的位置执行被调函数后,再返回到主调函数。是内存中的一部分,用于动态分配内存。在函数调用过程中,保护现场和恢复现场是确保程序执行正确性的关键步骤。每次递归调用都会在栈上创建一个新的栈帧,直到达到递归的终止条件。递归调用是特殊的嵌套调用,其中一个函数直接或间接地调用自身。

2024-07-25 20:15:04 1046

原创 C语言基础(8)二维数组和函数

返回值通常可以是任何基本数据类型(如整数、浮点数、字符等)返回值的类型在函数定义时指定。C语言中的函数是代码组织和重用的基本单元。但以第1种方法为好,一行对一行,界限清楚。这种赋初值方法比较直观,把第1个花括号内的数据给第1行的元素,第2个花括号。这意味着函数接收到的是实参的副本,而不是实参本身。可以将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值。函数调用时,实参的数量必须与函数定义中的形参。二维数组实际上本质是一维数组的嵌套。内的数据赋给第2行的元素 ……定义函数时没有写返回值类型的。

2024-07-24 20:16:37 1278

原创 C语言基础(7)二分查找和字符数组

字符数组通常用于存储字符串。字符串是以字符数组的形式表示,并且以空字符。

2024-07-23 19:29:13 727

空空如也

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

TA关注的人

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