- 博客(40)
- 收藏
- 关注
原创 嵌入式(day39)中断 eint timer
1、中断:当中央处理器CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程被称为中断。5、中断嵌套:当CPU正在处理一个中断源请求的时候,发生另一个优先级比他高的中断源请求,CPU能够暂停原来中断源的服务程序,去处理优先级更高的中断请求源,处理完后,再回到原中断服务程序。3、(中断向量表):用于存储所有中断源对应的中断服务程序(ISR)入口地址的一段特殊内存区域。2、中断源:请CPU中断的请求源。
2025-09-05 00:13:12
179
原创 嵌入式(day 38)硬件介绍 寄存器 key LED
GPIO最常用的 “通用外设接口”,本质是 “可灵活配置的引脚”,能实现 “输入” 或 “输出” 两种核心功能。传输数据:通过 “数据寄存器” 暂存 CPU 与外设之间的交互数据。寄存器地址是固定的、操作速度极快、每个寄存器有固定 “位定义”控制外设:通过向 “控制寄存器” 写入特定值,指挥外设工作。读取状态:通过读取 “状态寄存器” 的值,获取外设当前状态。:是指能够操作硬件的,具有固定地址的内存空间。输出功能: GPIO 向外设输出高低电平。输入功能: GPIO 读取外部信号的电平。
2025-09-05 00:12:08
182
原创 嵌入式学习(day37) 数据库 Sqlite相关命令函数
代码量少,一万行左右,总大小10M以内,文件型数据库,可以移动,跨平台移植性好,理论数据容量最大2T。关系型数据库:将复杂的数据结构简化为二维表格形式:大型:Oracle、DB2 中型的:MySql、SQLServer 小型:Sqlite。如果在插入数据前显式开启事务,插入完成后统一提交,则会大大提高 IO 效率,显著加快数据插入速度。在 SQLite 中,每调用一次 sqlite3_exec() 函数,就会隐式地开启一个事务。insert into 表名 values(值1, 值2, 值3);
2025-09-01 15:18:45
687
原创 嵌入式(day 36)select poll epoll
2. 添加关注的文件描述符:int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);1. 使用红黑树(二叉树)实现文件描述符集合的存储,没有文件描述符上限限制;1. 使用位图(数组)实现对文件描述符集合的保存,最多允许同时监测1024个文件描述符;4. 只能工作在水平触发模式(低速模式),不能工作在边沿触发模式(高速模式)。1. 使用链表实现对文件描述符集合的保存,没有了监测的文件描述符上限限制;-1:不设置超时(一直阻塞)
2025-08-28 23:20:09
752
原创 嵌入式(day35)TCP并发 IO复用 select
为了解决多线程或者多进程模型,在服务器运行过程中,频繁创建和销毁线程(进程)带来的时间消耗问题。基于生产者和消费者编程模型,以及任务队列等,实现的一套多线程框架。在不创建新的进程和线程的前提下,使用一个进程实现对多个文件读写的同时监测。4. 当内核监测到事件时,应用层select将解除阻塞,并获得相关的事件结果。5. 根据select返回的结果做不同的任务处理。exceptfds:其他事件的文件描述符集合。writefds:写事件的文件描述符集合。readfds:读事件的文件描述符集合。
2025-08-28 01:28:47
270
原创 嵌入式(day34) http协议
2. 万维网客户端与万维网服务器之间使用什么方式通信 HTTP:超文本传输协议。1. 万维网服务器后台如何标记万维网数据 url:统一资源定位符。3. 万维网客户端如何展示请求的数据 HTML:超文本标记语言。<协议>://<主机>:<端口>/<路径>基于传输层的TCP协议。
2025-08-26 23:34:14
182
原创 嵌入式(day33)TCP协议
AA C0 00 00 00 F0 00 BB 10 A0 00 00 00 10 校验 BB AA C0 00 00 00 F0 00 BB 10 A0 00 00 00 10 校验 BB。发送数据时序列号表示这包数据的起始编号,响应报文中的确认号是接收方收到的最后一个字节编号+1。2. 接收方数据处理速度较慢,导致多包数据在接收缓冲区缓存,应用层读时,一次将多包数据读出。TCP粘包问题:发送方应用层发送的多包数据,将来在接收方可能一次读到,多包数据产生了粘连。backlog:最大允许监听的客户端个数。
2025-08-26 22:54:17
539
原创 嵌入式(day32)网络、UDP
2)编辑--》虚拟网络编辑器--》更改设置--》VMnet0--》桥接至--》当前PC正在上网的网卡上--》应用--》确定。2)进程与进程在软件层面必须互联互通。DNS:域名解析服务(www.baidu.com---》IP地址)
2025-08-23 01:10:45
528
原创 嵌入式(day31)信号、共享内存
ctrl + z 让进程进入暂停态,后台进程来自终端的停止信号。当进程收到一个信号,会打断该进程正在执行的任务,处理信号产生的事件;子进程空间异步回收:通过子进程发送的SIGCHLD信号实现。SIG_IGN: 以忽略方式处理该信号(不处理)使用内存映射技术,减少的数据的反复拷贝,提高了通信效率。向自己所在的进程发送一个SIGALRM的信号。增加数据的等级(优先级:优先级数据越小,优先级越高)信号:实现进程间的通知机制、 实现进程间的异步通信、软中断。函数的地址:以捕获方式处理(自定义)
2025-08-20 00:05:14
657
原创 嵌入式(day30)进程间通信 IPC(有名、无名管道)
(4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系(多个执行流拿着对方想要的锁,并且各执行流还去请求对方的锁)。(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放(执行流本身使用着一把锁并不释放,还在请求别的锁)。(3)不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺(A执行流拿着锁,其它执行流不能释放)。如:线程A获取了1锁,线程B获取了2锁,同时线程A还想获取2锁,线程B还想获取1锁。4. 管道破裂:读端关闭,向管道中写入数据,发生管道破裂(异常)
2025-08-19 00:06:06
1706
原创 嵌入式学习(day 29)线程回收策略、线程通信
5. 销毁锁:int pthread_mutex_destroy(pthread_mutex_t *mutex);4. 解锁:int pthread_mutex_unlock(pthread_mutex_t *mutex);3. 加锁:int pthread_mutex_lock(pthread_mutex_t *mutex);1. 分离属性:不需要被其他线程回收的线程称为分离属性得到线程,将来会被操作系统所回收。2. 非分离属性:可以被其他线程回收或者结束的线程,称为非分离属性的线程。
2025-08-18 23:39:40
421
原创 嵌入式学习(day 28)线程
(2)waitpid 非阻塞方式回收:使用 waitpid() 并设置 options 为 WNOHANG 实现非阻塞,父进程可在循环中轮询检查是否有子进程退出。< -1:回收指定进程组内的任意子进程(例如:-100 表示等待 GID=100 的进程组中的任意子进程)- 安全性角度:线程没有进程安全性好,一个线程异常可能影响同一进程中的所有线程。线程和所在进程,以及进程中的其他线程,共用进程的堆区、数据区、文本区。- 通信方面:进程间不能直接通信,需要使用进程间通信机制(IPC 机制);
2025-08-16 00:20:19
489
原创 嵌入式学习(day27)多任务进程
功能:通过管道(`|`)将 `ps -aux` 的输出作为输入,使用 `grep` 查找与 `./a.out` 相关的进程信息。- `kill -信号的编号/信号的名称 PID`:向进程发送信号,让进程的状态发生变化。- `return`:在 `main` 函数中使用 `return`。- `pstree -p`:查看进程的产生关系(显示 PID 号)。- 进程退出:使用 `return` 或 `exit()` 相关函数。- `exit()` 和 `_exit()`:用于结束一个进程。
2025-08-14 23:57:18
787
原创 嵌入式学习(day26)frambuffer帧缓冲
2. 获取显示设备相关参数(分辨率,像素格式)---》ioctl。失败: MAP_FAILED ((void *)-1)NULL: 让操作系统自己分配用户空间。(1)framebuffer: 帧缓冲、帧缓存技术。1. 打开显示设备 (/dev/fb0)addr: 映射的用户空间首地址。length: 要映射的空间大小。3. 建立显存空间和用户空间的内存映射。4. 向映射的用户空间写入RGB颜色值。0: 从显存开头映射。成功: 映射的用户空间首地址。fd: 显示设备文件描述符。1. 封装函数绘制横线。
2025-08-13 23:54:06
504
原创 嵌入式学习(day25)文件IO:open read/write close
2. 标准IO是系统调用的一次封装,增加了缓冲区,目的是提高数据读写的效率。(1) 行缓冲 1k(1024字节) ----> 人家交互界面、终端。(2) 全缓冲 4k(4096字节) ----> 文件缓冲区。(3) 无缓冲 0k --------> 出错信息对应的设备。3. 文件IO主要应用在对硬件的操作的,也可以操作普通文件。stdout ----> 标准输出设备 ----> 1。stderr ----> 标准出错设备 ----> 2。stdin ----> 标准输入设备 ----> 0。
2025-08-12 21:47:36
1696
原创 嵌入式学习(Day24)fread/fwrite
FILE *-->stderr 标准出错流 ---》标准出错流(用于输出错误信息) 标准出错设备:显示器。FILE *-->stdin 标准输入流 ----》标准输入设备:键盘。FILE *-->stdout 标准输出流 ---》标准输出设备:显示屏。(3)gets是危险的,因为在读取时,没有大小的限制,可能造成内存越界。(3)fgets最多读取size-1个字符,最后一个位置存放\0。(1)从指定的已打开文件中读取最多一行数据(遇\n停止读取)获取流的当前位置到文件开头的偏移量。实现文件流重新定位。
2025-08-11 23:31:16
310
原创 嵌入式学习(23)fopen、fgetc/fputc fgets/fputs
普通文件 --------》xxx.c xxx.h xxx.txt xxx.jpg xxx.mp4 a.out。1、 Linux应用软件编程----》操作系统相关编程--->函数接口、流程框架。c 字符设备文件 ----》如输入输出设备(鼠标键盘显示器...)FILE * ---》文件流指针----》已打开文件。C标准库提供的一套对文件操作的操作方法----》库函数。input O: output -----> 文件。b 块设备文件 ----> 存储类设备(硬盘)
2025-08-10 22:24:46
274
原创 嵌入式day(22) 哈希表
2、哈希冲突:不同的 key 经过哈希函数后可能得到相同的索引,这叫哈希冲突。1、哈希表:(散列表) 提高数据查找效率。现代实现可能使用更高效的数据结构如红黑树。每个哈希桶(bucket)维护一个链表。:冲突发生后,顺序查找下一个空闲位置。:使用第二个哈希函数计算步长。:使用二次函数计算下一个探测位置。冲突的元素被添加到对应桶的链表中。
2025-08-08 00:50:18
216
原创 嵌入式(day21)内核链表、栈、队列
1、二级指针:(1)被调函数中修改主调函数指针变量,需要传该指针变量地址,形参用二级指针接收。(2)指针数组的数组名是二级指针,指针数组的数组名作为参数传递时,可用二级指针接收。2、内核链表:双向链表且循环,不再将数据存储在链表节点中,而是将节点嵌入到存储的数据中。3、栈:只允许从一端进行数据的插入和删除的线性存储结构,称为栈结构。一个有3个元素的数组,每个元素是一个指向int的指针。(2)入栈(头插) 出栈(头删)指针数组:保存多个指针的数组。(4)获取栈顶、遍历、销毁。(3)获取头队、遍历、销毁。
2025-08-07 23:30:01
309
原创 嵌入式(Day20)makefile管理、双向链表
1、Makefile:用来管理代码的编译和链接。当项目比较多的时候,用这个方便。时间戳:在编译代码时,只级译修改后的源文件,其他没有修改的,只进行链接即可。Makefile(首字母必须大写)中变量:(1)自定义变量 (2)系统变量。$(变量名) //OBJ=a.out。链接:处理多文件及函数的链接关系。语法: 目标文件:依赖文件。汇编:将汇编指令生成二进制指令。编译:将源程序转换成汇编指令。预处理:处理和#相关的指令。
2025-08-07 18:59:20
260
原创 嵌入式(Day19)valgrind探测工具、插入排序、循环链表
主要用于 C 和 C++ 程序。它可以帮助你发现程序中的内存错误,这些错误在普通编译和运行时往往难以察觉,但可能导致程序崩溃、数据损坏或安全漏洞。
2025-08-07 18:43:31
129
原创 嵌入式学习Day18(单向链表)
(2)编辑--》虚拟机网络编辑器--》更改设置--》VMnet0--》桥接--》桥接到PC正在上网的网卡上--》应用--》确定。快指针每移动两步,慢指针移动一步,当快指针到达链表末尾时,慢指针恰好位于链表的中间位置。1.valgrind: gnu提供的内存探测工具,可以用来检测内存错误和内存泄漏。2、虚拟机网络配置:(1)虚拟机--》设置-->网络适配器--》桥接模式--》确定。内存泄漏:申请的空间使用完没有及时释放,造成内存泄漏。3、快慢指针查找中间值。4、快慢指针倒查K值。
2025-08-05 00:14:57
401
原创 嵌入式学习day17(数据结构)
4、单向链表:单向链表是一种线性数据结构,它通过指针将一组零散的内存块连接起来,每个内存块称为一个节点。散列(哈希):将数据存储位置与数据元素之间关键字建立对应关系(哈希函数)根据该关系进行存储和查找。线性结构:数据元素与元素之间存在一对一的关系(顺序表,链表,队列,栈)链表对象:链表对象是管理整个链表的数据结构,它包含链表的基本信息和操作接口。(2)插入删除要移动大量数据。3、数据结构内容:1、链表:单向链表、双向链表、循环链表、内核链表。图形结构:数据元素与元素之间多对多的关系(网状)
2025-08-04 00:09:02
225
原创 嵌入式学习Day16(结构体,共用体,位运算)
3、枚举:是一种用户自定义的有范围的数据类型,用于定义一组具有离散值的符号常量。(4)取返运算 ~ 对二进制数的每个二进位取反,使数字 1 变为 0,0 变为 1。(3)内存对齐:内存对齐是指数据对象在内存中的起始地址必须是某个数值(通常是2、4、8等)的整数倍。(2)按位或 i | j 只要对应的两个二进位有一个为1,结果位就为 1。(1)按位与 i&j 有一个为0则为0,双1才是1,作用是指定位置清零。1、结构体:是一种用户自定义的数据类型,允许将不同类型的数据组合在一起。
2025-08-01 00:16:19
1368
原创 嵌入式学习Day15(动态内存、指针函数)
(参数1:原首地址,参数2:新开空间大小) 作用:当原空间后面的空间不足时,寻找新的空间,并将原空间的数据移植到新的空间后,将原空间内存释放。回调函数:回调函数是指通过函数指针调用的函数,它允许将一个函数作为参数传递给另一个函数,让后者在适当的时候调用前者。函数指针:是指向函数的指针变量,它可以存储函数的地址,并用于调用该函数。4、指针的数组:指存储指针变量的数组,即数组的每个元素都是一个指针。int **p: 前面的int *是基类型,后面的*p说明p是指针。:每个数据的大小,单位是字节。
2025-07-31 00:29:43
328
原创 嵌入式学习Day14(字符串与指针)
/ p是一个指针,指向包含5个int的数组 sizeof(p) = 8字节。// 因为a是行指针,a+i指向第i行,*(a+i)就是第i行一维数组名字,也就是指向第i行第0列元素的指针。// p的类型是 int(*)[4] - 指向包含4个int的一维数组的指针。*(a + i) + j // *(a + i)是指向第i行第0列的指针。*(*(a + i) + j) // 得到第i行第j列元素的值。
2025-07-29 22:29:03
614
原创 嵌入式学习Day13(一维数组与指针)
4、对指针可以进行加法运算,其结果依旧是一个指针,新指针是在原地址值基础上加n X (基类型)字节。如:如果指针变量*p已经指向数组中的一个元素,则P + 1,指的是同数组的下一个元素,而不是将P的值加1。7、指针不能相加(物理意义不明确:两个地址相加得到的地址通常不在原数组范围内),但可以相减(计算两个指针之间相差多少个元素)。可以初始化指针,表示当前指针不指向任何有效地址;5、空指针:空指针是一个特殊的指针值,用来表示"不指向任何东西"的指针。6、指针函数:指针函数是指返回值为指针的函数。
2025-07-28 22:32:57
235
原创 嵌入式学习day12(宏、指针)
4、条件编译:编译指令在预处理执行,根据条件的真假来决定是否包含某段代码。3、将偏移后那部分当作是一个基类型变量来看。2、宏定义:宏是一种文本替换机制,在编译预处理阶段,预处理器会将源代码中所有的宏名替换为宏定义的内容。1、预处理:编译过程中的第一个阶段,在实际编译之前对源代码进行文本替换和处理。(1)64位下,所有类型的指针都是8个字节,它由系统架构决定,与数据类型无关。3、文件包含:用于将一个文件的内容插入到另一个文件中。5、指针:指针是一个变量,它存储的是另一个变量的。(解引用)的操作数必须是指针。
2025-07-27 02:42:52
173
原创 嵌入式学习day11(函数)
可以写成 void print(int a[3][4],int rows)或void print(int a[][4],int rows)第一维行可以省略,第二位列不能省略。(1)局部作用域:任意一对花括号里的内容,只在定义它的代码块内有效,它存储在栈中。全局变量:全局变量是在所有函数外部定义的变量,其作用域从定义点开始到文件结束,可以被该文件中的所有函数访问。在两个或多个具有包含关系的作用域中定义的同名标识符,外层标识符在内层不可见。局部变量:局部变量是在函数内部内部定义的变量,数据在栈上。
2025-07-26 01:30:56
207
原创 嵌入式学习Day10 (函数传参,递归)
3、指令集:指令集是计算机处理器能够理解和执行的所有指令的集合,它是硬件和软件之间的接口。(1)值传递:无法在被调函数中修改主调函数的值。当调用函数时,实参的值被复制一份给形参,被调函数内部对实参的修改不会影响原来的实参。(2)指针传递:可以在被调函数中修改主调函数的值。当调用函数时,传递的是函数的地址,函数内部可通过访问地址直接修改原来的值。5、函数的入口地址:是指函数在内存中第一条指令的地址,也就是函数开始执行的位置。4、寄存器:寄存器是CPU内部的高速存储单元,是计算机中最快的存储设备。
2025-07-24 23:22:28
177
原创 嵌入式学习day9(二维数组,函数)
如: int a[2][3];int a[2][3]:表示2行3列的二维数值,本质就是2个一维数组的数组。局部初始化:int a[2][3] = {1,2,3};相当于:{1,2,3,0,0,0}。全部初始化:int a[2][3] = {1,2,3,4,5,6};也可以写成{{1,2,3},{4,5,6}}另外也可以写成 int a[][3] = {1,2,3,4,5,6};1、二维数组: 数据类型 数组名[行数][列数]2、数组元素的访问:数组名[行下标][列下标]如:int a[2][3]
2025-07-24 00:00:34
285
原创 嵌入式学习day8(字符型数组)
3、fgets(s)推荐使用 可以指定最大长度,会在末尾自动添加'\0',会把换行字符也存入数组中 格式: fgets(s,sizeof(s),stdin)2、gets(s) 不建议使用,他不检查缓冲区大小,输入的数据长度超过数组容量,会产生一出。输出:1、printf("%s",s);4、字符型数组的初始化:char s[6] = {'h','e','l','l','o'};1、字符数组:用来存放字符数据的数组,字符数组中的一个元素存放一个字符。输入:1、scanf(%s , s);
2025-07-22 23:13:23
196
原创 嵌入式学习day7(数组)
(2)越界访问,指的是程序访问数组时超过合法的内存范围 如 int a[10] 访问a[10],它会导致原本地址存在的其它数据被损坏。3、数组的初始化:在定义数组时对数组元素初始化。如:int a[10] = {0,1,2,3,4,5,6,7,8,9};数组名命名规则与变量相同、[常量表达式]用来表示元素个数,也就是数组长度、常量表达式中类型都是整型常量表达式。2、数组在内存存放的三大特性:数组的单一性、数组的连续性、数组的有序性。连续性:数组的存储空间连续,每个元素都是紧密连接的。
2025-07-22 00:03:08
125
原创 嵌入式学习Day6(循环控制)
先对表达式1初始化,然后执行表达式2,若满足表达式2的循环条件,则执行for的嵌套语句,然后执行表达式3;若不满足表达式2循环条件,结束循环,执行for下面的语句。while(表达式);5、for型循环:最灵活,不仅用于循环次数已确定的情况,而且可用于循环次数不确定只给出循 环结束条件的情况,完全可替代while型。2、循环的三要素:使用循环时必须进行循环初始化、必须有循环执行的条件、必须有使循环趋于结束的语句。3、while(当型循环):先对表达式内的值进行求值,当其值为真时执行下面的内嵌语句。
2025-07-20 00:28:17
242
原创 嵌入式学习Day5
2、case后必须为常量,不能是常量表达式。case 常量表达式1:语块1;|| 逻辑或(or) 逻辑或左右任意为真就是真,右边不再计算,只有两个都是假才是假。<、<=、> 、>=、优先级相同,高于 == 、!关系表达式进行逻辑判断,他的值是一个逻辑值用int型存储,在逻辑运算中非0即为真,0为假。&& 逻辑与(and) 逻辑与运算级高于逻辑或,逻辑非得运算级比他两都高。4、return 立即终止当前程序,返回0代表正常执行,返回-1程序出错,终止。
2025-07-18 23:15:03
446
原创 嵌入式学习Day4(scanf/printf/put/get函数)
*忽略部分输入 scanf("%3d%*3d%3d")表示跨过3位再取 输入123456789 最后输出 123 789。用getchar()输入时,字符会先存入缓冲区,缓冲区遵守先进先出规则,缓冲区用于高速硬件与低速硬件的链接,若缓冲区内无东西,系统会停在那里等待。% o u x X分别是无符号8进制 十进制十六进制的输出,x X 无区别,输出大小写的。例:表达式1,表达式2,表达式3 最后输出的结果是表达式3的值。%c 输出无符号单个字符 %s 输出字符串 %%打印%号。
2025-07-17 21:45:55
292
原创 嵌入式学习Day3 (字符型数据,运算符)
向左的箭头表示必转,如 char和short进行运算时,必须先转成int型,float运算时也必须转成double型,纵向箭头表示数据为不同类型时运算的转换方向,int和double进行运算时,先转成double型。对几个变量同时初始化可以写成:int a = 3, b = 3, c = 3;4、不同类型之间的混合运算:整型、字符型之间可以混合运算,但是运算时,要转成同一类型,然后进行运算。8、类型转换:赋值运算符两侧类型不一样时,但都是数值型或字符型时,在赋值时需要进行类型转换。整型的计算结果还是整型。
2025-07-16 23:26:26
287
原创 嵌入式学习Day2 (数据类型)
long long(长长整型) 8字节。例:0x32435463 在存储中占4个字节 32 43 54 63 存储时存储顺序反过来:63 54 43 32。在内存中存放形式:单精度浮点数 用1位表示符号位,8位表示指数部分,尾数为23位(将整数部分去掉)标识符:以数字字母下划线,区分大小写,不能以数字开头,不能用关键字,不要使用二类字。8个bit=1byte(字节)字节是最小存储单位。
2025-07-15 21:54:37
342
原创 Linux终端基本操作
vi: 编辑文件 输入i进行编辑 esc 然后:wq 保存加退出。cp ./文件A ./文件B :把文件A复制到文件B。mv ./文件A ./文件B :把文件A移动到文件B。ls-l:列出所有目录包含信息。pwd:显示当前绝对路径。cd退出回到home下。mkdir:创建文件夹。cd..退出当前文件。touch:创建文件。
2025-07-15 09:52:04
94
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅