- 博客(39)
- 收藏
- 关注
原创 ARM中的寄存器
ARM处理器具有一组**通用寄存器**和**专用寄存器**,这些寄存器被用于存储数据、地址以及处理器状态等信息。- CPSR(Current Program Status Register):当前程序状态寄存器,保存当前处理器的状态,如条件标志、处理器模式、异常状态、以及是否启用中断等。ARM支持多种处理器模式(如用户模式、异常模式),不同模式下有部分寄存器被“**银行化**”,即在不同模式下,这些寄存器有独立的副本,从而使得切换模式时,寄存器之间不会互相干扰。程序可以根据需要自由使用这些寄存器。
2024-09-18 19:52:47 848
原创 ARM架构中的重要知识点的详细解释
在Thumb指令集中,寄存器**R0-R7**被称为**Low group**寄存器,因为它们可以由大多数Thumb指令直接访问。- 在复位后,ARM处理器会进入Supervisor模式,并且处于ARM状态,即32位ARM指令集模式(CPSR的T位为0)。- PC(Program Counter,程序计数器):用于存储当前执行指令的地址,通常由**R15**寄存器表示。- LR(Link Register,链接寄存器):用于存储子程序返回地址,通常由**R14**寄存器表示。
2024-09-18 19:24:27 959
原创 ram和rom的种类迭代和介绍
Flash Memory | 是 | 电气块级擦除 | 1万-100万次 | 快 | SSD、U盘、大容量存储设备 |- 用途:广泛用于**大容量存储设备**,如**固态硬盘(SSD)**、**U盘**、**存储卡**,适合连续读写的大容量数据存储。| EEPROM | 是 | 电气擦除 | 大约10万次 | 较慢 | BIOS、配置数据存储 || PRAM | 是 | 电气擦除 | 大约10万次 | 快 | 高性能存储解决方案 |
2024-09-18 19:21:46 1318
原创 linux下framebuffer相关函数及知识点详解及整合运用
通过 `FBIOGET_VSCREENINFO` 可以获取可变屏幕信息(`fb_var_screeninfo` 结构体),包括屏幕的像素宽度、高度、颜色深度等。这样,我们可以像操作普通数组一样操作屏幕上的像素。在 framebuffer 上绘制像素时,首先需要知道屏幕的颜色模式(例如 RGB888 或 RGB565),然后根据坐标计算相应的内存位置,并向该位置写入颜色值。Framebuffer 设备通常在 `/dev/fb0`(主显示设备)下表示,可以使用 `open` 函数打开该设备,进行读写操作。
2024-09-10 21:22:34 1133
原创 linux下c语言中的单向列表,双向链表,内核双向列表,及适用场景
Linux 内核中的双向链表不会直接与数据绑定,而是通过一个独立的 `list_head` 结构体表示链表节点的指针。链表的最后一个节点指向 `NULL`,表示链表的结束。由于双向链表的节点有两个指针,操作和单向链表相比稍显复杂,但在链表的遍历、删除和插入操作中,灵活性更强。- `list_add()` 和 `list_add_tail()`:在链表头或尾部插入节点。双向链表的缺点是每个节点需要额外的空间来存储 `prev` 指针,相比单向链表占用更多内存。// 如果头节点就是要删除的节点。
2024-09-05 19:33:43 1081
原创 Linux下数据库相关知识点及SQLite3相关知识,和callback回调函数
事务 (Transaction):SQLite支持ACID(原子性、一致性、隔离性、持久性)事务,可以通过 `BEGIN TRANSACTION`、`COMMIT` 和 `ROLLBACK` 来管理。如果字段的值为 `NULL`,则该元素指向 `NULL`。- SQL的扩展支持:SQLite支持标准SQL的大部分功能,并提供了一些扩展,如 `AUTOINCREMENT`、 `UNIQUE` 和 `CHECK` 约束。假设我们有一个表 `words`,包含两列 `word` 和 `meaning`。
2024-08-29 21:45:58 2004
原创 linux下的多路复用io(select,poll,epoll)
如果 `timeout` 的 `tv_sec` 和 `tv_usec` 都为 `0`,则 `select` 是非阻塞的。如果 `timeout` 为 `-1`,则 `epoll_wait` 将无限期阻塞;- `events`: 需要监视的事件,如 `EPOLLIN`(可读)、`EPOLLOUT`(可写)、`EPOLLERR`(错误)、`EPOLLET`(边缘触发)等。- `events`: 监视的事件,如 `POLLIN`(可读)、`POLLOUT`(可写)、`POLLERR`(错误)等。
2024-08-28 19:41:44 1169
原创 深入了解linux下TCP并发服务器和IO模型的实现
2. **并发服务器**:能够处理多个客户端的请求。1. **单循环服务器**:同一时刻只处理一个客户端的请求,通常使用传统的阻塞式编程模型。- **IO多路复用**:使用单个进程/线程处理多个连接,通过高效的IO多路复用机制来管理多个并发连接。- **多进程**:每个客户端连接由一个独立的进程处理。- **多线程**:每个客户端连接由一个独立的线程处理。- UDP协议由于是无连接的,天然支持并发处理。4. **accept()**:接受客户端的连接请求,返回一个新的套接字用于与客户端通信。
2024-08-27 21:23:44 1214
原创 什么是粘包(TCP)
假设发送端发送了两个消息 `Hello` 和 `World`,它们被合并成一个数据流 `HelloWorld` 发送出去,接收端接收到的数据可能是 `HelloWorld`,而不是两个独立的 `Hello` 和 `World`。1. TCP 是面向流的协议:在 TCP 连接中,发送的数据被看作一个连续的字节流,而不是离散的消息。3. 消息头包含消息长度:在每个消息前添加一个定长的消息头,消息头中包含消息体的长度。1. 固定长度的消息:预先规定每个消息的长度,例如每个消息为固定的 1024 字节。
2024-08-23 19:19:03 579
原创 UDP(用户数据报协议)和 TCP(传输控制协议)
UDP 是一种无连接、不可靠的传输协议,适用于需要快速传输且对可靠性要求不高的应用,如视频流、游戏等。- 与 UDP 类似,只是 `type` 使用 `SOCK_STREAM`。3. 使用 `sendto` 发送数据或 `recvfrom` 接收数据。2. 对于服务器,绑定套接字到指定的地址和端口 (`bind`)。5. 使用 `send` 和 `recv` 进行数据通信。3. 使用 `send` 和 `recv` 进行数据通信。- `accept()`:接受连接请求,创建新的套接字。
2024-08-22 19:59:25 895
原创 基于linux下的mplayer播放器项目
用户可以通过文本菜单选择不同的操作,如播放、暂停、停止、调整播放速度、跳转时间、选择上一首/下一首歌曲以及设置播放模式。通过信号处理机制,主进程能够在子进程结束时采取进一步的动作(如按播放模式播放下一首)。- 暂停/恢复播放:暂停当前播放的文件,再次执行可恢复播放。- 调整播放速度:通过输入倍速值调整播放速度。- 单曲播放:播放单个文件,结束后停止播放。- 随机播放:随机选择一个文件进行播放。- 顺序播放:按顺序播放目录中的文件。- 跳转时间:跳转到指定时间进行播放。- 停止播放:停止当前的播放。
2024-08-20 16:22:40 611
原创 linux系统中信号量的定义,初始化,pv操作,销毁相关函数,和进程间通信,及进程间通信中管道的函数
对于无名信号量使用`sem_destroy`,而有名信号量使用`sem_close`和`sem_unlink`。如果信号量的值为0,则调用进程将被阻塞,直到信号量的值大于0。- `pipefd`: 一个包含两个文件描述符的数组,`pipefd[0]`用于读,`pipefd[1]`用于写。- V操作(`sem_post`):增加信号量的值,并且如果有进程因为P操作而被阻塞,则唤醒它们。// 删除有名信号量。
2024-08-16 20:03:39 336
原创 linux系统中wait()和waitpaid()函数
子进程结束后,系统会将该进程的退出状态传递给父进程,并释放子进程的资源,从而避免僵尸进程的产生。常用的两个函数是 `wait` 和 `waitpid`,它们的主要功能是等待子进程状态发生变化,并回收子进程所占用的资源。注意: 如果主线程调用了 `pthread_exit()`,它只会结束主线程本身,而不是整个进程,其他线程将继续运行,直到它们自行结束或被 `pthread_join()` 等待。- 使用 `WNOHANG` 时,如果没有子进程结束,`waitpid()` 会立即返回,不会阻塞调用进程。
2024-08-15 19:50:29 1171
原创 linux系统中线程和线程锁相关函数,及死锁的发生原理和应对方法
原型:`int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);- 原型:`int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);- `const pthread_attr_t *attr`:线程属性,`NULL` 表示默认属性。
2024-08-15 19:45:34 692
原创 linux系统exec系列函数及其用法
3. 环境变量: `execle` 和 `execve` 允许指定自定义的环境变量,而 `execvp` 和 `execlp` 会继承父进程的环境变量。- `arg0`, `...`: 程序的参数列表,第一个参数 `arg0` 通常是程序名。如果 `exec` 系列函数调用失败,它会返回 `-1`,并设置 `errno` 以指示错误。- `argv`: 参数数组,第一个元素通常是程序名,数组以 `NULL` 结束。- `argv`: 参数数组,第一个元素通常是程序名,数组以 `NULL` 结束。
2024-08-13 19:19:36 400
原创 Linux系统中的进程与线程及常用命令
aux` 选项表示显示所有用户的进程,`grep` 用于过滤包含 `a.out` 的进程。- 进程状态包括 `R`(运行)、`S`(睡眠)、`D`(不可中断的睡眠)、`T`(停止)和 `Z`(僵尸)。- 使用 `pstree -sp`、`ps aux` 和 `ps -elf` 可以获取系统中进程的详细信息。- `bash(1234)` 和 `bash(2345)` 是 `init` 进程的子进程。- `a.out(5678)` 是 `bash(1234)` 启动的程序 `a.out`。
2024-08-12 19:35:54 472
原创 Linux中的系统调用和函数
文件和链接操作函数:`symlink`、`remove`、`rename`、`link` 和 `truncate` 用于操作文件和目录,包括创建链接、删除文件、重命名文件、创建硬链接和调整文件大小。- 用户和组信息函数:`getpwuid`、`getpwnam`、`getgrgid` 和 `getgrnam` 用于获取用户和组的详细信息。// 用户的全名和其他信息。- `target`:符号链接指向的目标文件或目录的路径。
2024-08-08 18:50:01 876
原创 linux系统<dirent.h> 中readdir、opendir 和 closedir的使用方法
文件系统支持:不是所有的文件系统都支持所有的 d_type 常量。在某些文件系统中,d_type 可能总是返回 DT_UNKNOWN,这时你可能需要使用 stat 函数来获取文件类型。printf("文件名: %s, 类型: ", entry->d_name);// 下一目录项的偏移量。// inode 编号。printf("文件名: %s\n", entry->d_name);- DT_UNKNOWN:表示目录项的类型未知,通常在某些文件系统或平台上使用。printf("FIFO管道\n");
2024-08-07 18:57:27 820
原创 linux系统文件io,及与标准io区别
原型: `void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);- 原型: `ssize_t write(int fd, const void *buf, size_t count);- 原型: `ssize_t read(int fd, void *buf, size_t count);- 原型: `off_t lseek(int fd, off_t offset, int whence);
2024-08-06 18:33:36 1383
原创 linux系统标准io,stdio.h
`printf`:将格式化的数据输出到标准输出(通常是终端)。- `fopen`:打开一个文件并返回一个文件指针。- `fprintf`:将格式化的数据写入文件。- `fscanf`:从文件中读取格式化的数据。- `scanf`:从标准输入读取格式化的数据。- `fgets`:从文件中读取一行字符串。- `fclose`:关闭一个打开的文件。- `fgetc`:从文件中读取一个字符。- `fputs`:将一个字符串写入文件。- `fputc`:将一个字符写入文件。- `fwrite`:将数据写入文件。
2024-08-05 20:38:43 701
原创 linux系统编程中Shell脚本配置,及man test命令手册
你可以使用 `man test` 命令查看 `test` 命令的详细手册页。这里使用了`exec`来重定向标准输出和标准错误到日志文件中,并使用`tee`来将日志同时输出到终端和文件中。- `INT1 -le INT2`: 检查第一个整数是否小于或等于第二个整数。- `INT1 -ge INT2`: 检查第一个整数是否大于或等于第二个整数。- `STRING1!- `INT1 -lt INT2`: 检查第一个整数是否小于第二个整数。- `INT1 -gt INT2`: 检查第一个整数是否大于第二个整数。
2024-08-03 18:08:57 782
原创 c语言位运算符和位运算,位运算举例,位段
/ 设置位段c为9(超出范围,结果取最低4位:二进制: 1001)// 结果: 11111010 (对于32位整数,结果为-6)// 结果: 00001010 (10)// 设置位段b为5(二进制: 101)// 结果: 00000010 (2)// 结果: 00000001 (1)// 结果: 00000111 (7)// 结果: 00000110 (6)// x 变为 00000011 (3)// 设置位段a为1。
2024-08-02 19:11:16 1074
原创 c语言结构体的概述,定义结构体变量类型的方法,结构体变量的引用,结构体变量的初始化,结构体数组,指向结构体数据类型的指针,用指针处理链表
每个节点包含数据和一个指向下一个节点的指针。在这个结构体中,有三个成员:`id`(整数类型),`name`(字符数组类型,用于存储学生姓名),和 `grade`(浮点数类型,表示成绩)。`head_ref` 是指向头指针的指针,这使得可以直接修改头指针。在这个例子中,我们设置了 `student1` 的 `id` 为 1,`name` 为 "Alice",`grade` 为 89.5。这里 `ptr` 是一个指向 `Student` 结构体的指针。使用箭头运算符 `->` 可以访问指针指向的结构体成员。
2024-08-01 17:47:10 866
原创 c语言返回函数值的指针,指针数组和指向指针的指针,有关指针的数据类型和指针运算的小结
返回的指针应指向有效的内存。- 指针的使用: 函数返回指针、指针数组、指向指针的指针等,都是指针在C语言中的重要应用。- 指针的运算: 包括指针的加减、比较等操作,需要注意指针类型的步长和类型安全性。- char* names[]: 数组中的每个元素都是一个指向字符的指针。- 指针的基本概念: 包括指针的声明、指向数据类型的指针、指针的运算等。- `*(p + 2)`: 访问 arr 的第三个元素,值为 3。
2024-07-31 17:32:22 448
原创 c语言数组与指针,字符串与指针,指向函数的指针,malloca动态内存分配
arrPtr 是一个指向 arr 首元素的指针,通过 arrPtr + i 可以访问数组中第 i 个元素的地址,*(arrPtr + i) 解引用得到该元素的值。- malloc(5 * sizeof(int)) 分配了存储5个整数的内存,并返回一个指向该内存的指针。
2024-07-30 20:09:55 505
原创 c语言中的地址与指针的概念,及变量的指针和指向变量的指针变量
/ 输出 p 存储的地址(即 x 的地址)printf("Value pointed to by p: %d\n", *p);// 输出 x 的值,即 10。// 通过指针 p 修改 x 的值,将 x 的值递增 1。// 获取 p 指向的值,即 x 的。
2024-07-29 17:03:28 2149
原创 c语言预处理命令(宏定义,文件包含处理,条件编译)
当你写 `SQUARE(4)` 时,预处理器会将其替换为 ((4) * (4))。在调用 MAX(x, y) 时,会被替换为 ((x) > (y)?双引号 `" "` 表示编译器首先在当前目录中查找这个文件,如果找不到再去标准库路径中查找。`stdio.h` 包含标准输入输出函数的声明。在这个例子中,如果定义了 `DEBUG`,`LOG` 宏会输出调试信息;在编译时,所有的 `PI` 都会被替换为 `3.14159`。#ifdef 检查 DEBUG 是否已定义,如果已定义则编译对应的代码。
2024-07-27 17:10:19 939
原创 c语言标识符的作用域与可见性(局部作用域与全局作用域),变量的生存期(静态生存期和动态生存期)
与普通全局变量不同,它们的作用域仅限于声明它们的文件内部,不能被其他文件访问。使用 static 关键字声明的函数只能在声明它们的文件内使用,不能被其他文件访问。在C语言中,标识符的作用域和可见性以及变量的生存期是非常重要的概念。- 在上面的例子中,staticVar 的值在每次调用 example 函数时都会累积,而不是每次重新初始化。标识符的作用域和可见性决定了它们在哪些地方可以被访问,而变量的生存期决定了它们在内存中的持续时间。
2024-07-27 14:35:21 802
原创 c语言中数组作为函数参数
传递数组的首地址:在 C 中,数组名作为函数参数时,实际上传递的是数组的首地址。函数内部只能访问数组的元素,但不能改变数组的大小或形状。这里 `(*arr)[10]` 表示 `arr` 是一个指向包含 10 个 `int` 元素的数组的指针。- 获取数组长度:在函数中无法直接获取数组的长度,必须在调用函数时将长度信息作为参数传递。- 数据类型一致性:确保函数参数的类型与实际数组元素的类型一致,避免数据转换错误。- 指针表示法:可以用指针加偏移的方式处理多维数组,但要小心指针操作的复杂性。
2024-07-26 19:20:36 617
原创 c语言函数的嵌套调用,递归调用的相关应用及栈区,堆区,字符串常量区,静态区,全局区,代码区的含义
printf("将盘子 %d 从 %c 移到 %c\n", n, from_peg, to_peg);- 每次递归调用都处理一个较小的问题(即将`n-1`个盘子移动到辅助杆,再将第`n`个盘子移动到目标杆,然后将`n-1`个盘子移动到目标杆)。// 将 n-1 个盘子从辅助杆移到目标杆。printf("将盘子 1 从 %c 移到 %c\n", from_peg, to_peg);- 递归地调用`fibonacci(n - 1)`和`fibonacci(n - 2)`来计算结果。
2024-07-25 19:59:46 832
原创 c语言二维数组的定义,引用,初始化及二维数组的程序举例
在这种初始化方法中,数组的每一行可以用一个大括号 `{}` 包括起来,元素之间用逗号隔开。在C语言中,数组的索引从 0 开始,因此 `matrix[1][2]` 实际上是第二行第三列的元素。引用二维数组中的元素需要使用两个下标:一个表示行索引,另一个表示列索引。如果只想初始化部分元素,剩下的元素会自动初始化为 0(对数值类型的数组)。- 遍历和操作二维数组:可以使用循环和索引来访问和修改数组中的元素。这个定义了一个 2 行 3 列的数组,并初始化了其元素。{1, 2, 3, 4}, // 第一行。
2024-07-24 18:25:36 2460
原创 c语言二分法查找及字符数组,字符串处理函数
通常,字符数组用来存储字符串,而字符串在C语言中是以字符数组的形式存储的,末尾以空字符 `'\0'` 结尾。printf("第五个字符通过指针: %c\n", *(ptr + 4));printf("第一个字符: %c\n", str[0]);printf("第五个字符: %c\n", str[4]);printf("连接后的字符串: %s\n", str1);printf("修改后的字符串: %s\n", str);printf("复制的字符串: %s\n", dest);
2024-07-23 19:19:57 838
原创 c语言一维数组的定义和引用及字符数组
每次从数组开头比较相邻元素,如果顺序错误就交换,经过一轮比较后,最大(或最小)的元素会移动到数组末尾。- 数组元素在内存中是连续存储的,数组的第一个元素的地址就是整个数组的起始地址。- 数组中的所有元素必须是相同类型,数组可以存储基本数据类型或自定义的数据类型。- 每次从未排序部分选择最小(或最大)的元素,放到已排序部分的末尾。- 对于几乎已排序的数组,性能较好,适用于小规模数据排序。
2024-07-22 20:34:36 300
原创 c语言goto,while,do while,for语句的循环,break,countie的用法及循环的嵌套和不同循环的对比
在C语言中,`break`和`continue`语句用于控制循环的流向。它们在处理循环时非常有用,尤其是在特定条件下需要中断或跳过某些迭代时。它在处理需要提前退出循环的情况时非常有用,例如找到满足条件的元素后立即退出循环。在C语言中,`goto`、`while`、`do while`和`for`语句都可以用于控制程序的流向,特别是在实现循环时。通常用于在特定条件下跳过某些迭代,但继续执行后续的循环。- 当 i 等于 7 时,break 语句将终止整个循环,所以不会打印 i = 7 及其后的任何值。
2024-07-20 17:39:53 370
原创 c语言关系运算符与关系表达式,逻辑运算符与逻辑表达式,及if和switch语句
`, `>`, `<`, `>=`, `<=`)用于比较两个值,结果是布尔值。关系运算符用于比较两个值之间的关系,结果是布尔值(`true` 或 `false`)。C语言中的关系运算符与关系表达式、逻辑运算符与逻辑表达式,以及`if`和`switch`语句的总结。- 逻辑运算符(如 `&&`, `||`, `!// 这段代码将被执行,因为 a 不大于 b 的逻辑结果为 true。- `switch` 语句用于根据表达式的值选择执行某个特定的代码块。- `if` 语句用于根据条件判断执行不同的代码块。
2024-07-19 20:16:06 734
原创 C语言字符数据与格式的输入输出
format` 参数是一个字符串,包含了格式说明符,后续参数是指针,用于存储读取到的数据。例如,当你先读取一个整数,然后读取一个字符时,`scanf`可能会读取到缓冲区中残留的换行符。3. 未处理的数据:如果缓冲区中有多余的数据,`scanf`函数将不会自动清空它们。例如,`%8.2f`表示输出至少占8个字符的位置,并且保留两位小数。// 输出宽度为8,保留两位小数的浮点数。// 输出浮点数,保留两位小数。解决方法:在读取字符之前添加一个空格格式说明符,或者使用`getchar`来清空缓冲区中的换行符。
2024-07-18 19:18:56 635
原创 c语言运算符与表达式
例如,在表达式a + b * c中,由于乘法运算符`*`的优先级高于加法运算符+,因此会先计算b * c,然后再计算a + (b * c)。- `++`、`--`(后缀)、`sizeof`、`&`(取地址)、`*`(指针)、`+`、`-`(一元)、`~`、`!`float`类型的操作数在参与运算时会被提升为`double`。- 所有小于`int`的整数类型(如`char`和`short`)在参与运算时会被提升为`int`。其中,`type`是要转换成的目标类型,`expression`是需要转换的表达式。
2024-07-17 18:25:09 687
原创 c语言数据类型
long long int: 更长的整型,通常占用8个字节(64位),表示范围约为 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。- char: 字符型,通常占用1个字节(8位),用于存储单个字符,表示范围为 -128 到 127 或 0 到 255(视具体实现的符号性)。- int: 最常用的整数类型,通常占用4个字节(32位),表示范围约为 -2,147,483,648 到 2,147,483,647。
2024-07-16 18:21:11 247
原创 嵌入式基础入门
tar -czvf archive.tar.gz file_or_directory # 创建gzip压缩的tar归档。tar -cvf archive.tar file_or_directory # 创建tar归档。tar -xzvf archive.tar.gz # 解压gzip压缩的tar归档。grep -r 'pattern' directory # 递归搜索目录。tar -xvf archive.tar # 解压tar归档。rm -r directory # 递归删除目录及其内容。
2024-07-15 19:19:05 345
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人