- 博客(67)
- 收藏
- 关注
原创 Qtcreator串口和TCP实现与区别
如此的话我们就能得到一段简单的连接,我们就可以在连接的基础上,将得到的数据添加我们需要的功能。可以在Qtcreator的帮助中快速详细查看他们库里的函数使用方法。:TCP通信建议放入独立线程(避免阻塞UI)。:串口号/波特率 → IP地址/端口号。:添加帧头/帧尾(如。(1)串口函数头文件。
2025-10-09 15:31:48
581
原创 嵌入式实战场景题目(一)
3. 第三次擦写,sector 0和sector 1的valid值都为0x5a,比较version,sector 1的version比sector 0大,所以使用sector 0擦写,sector 1为备份数据,version加1,valid为0x5a。2. 第二次擦写,sector 0的valid为0x5a,sector 1的valid为0xff,表明sector 1为无效数据,使用sector 1擦写,vesion在上次的基础上加1,valid为0x5a。DRAM容量大,但需要刷新,读写速度较慢。
2025-05-09 17:31:54
754
原创 嵌入式基础(五)之ARM架构
Cache的大小和配置通常由具体的处理器设计决定,不同的处理器可能具有不同级别和层次的Cache结构(如L1 Cache、L2 Cache等),以便更好地适应各种应用场景和性能需求。在函数调用时,参数和局部变量通常存储在堆栈中。在ARM架构中,Cache(缓存)是一种用于提高处理器性能的高速存储器,用于存储最常用的数据和指令。通用寄存器 (R0 - R15):这些寄存器用于存储数据和地址,其中R0-R12为通用寄存器,R13为堆栈指针(SP),R14为链接寄存器(LR),R15为程序计数器(PC)。
2025-04-16 15:20:04
572
原创 嵌入式基础(四)之BootLoader
因此,为了让Bootloader能够在不同的嵌入式板卡上运行,可能需要进行适当的参数配置和源代码的调整。等,从主机下载的文件通常首先被Bootloader保存到目标机的RAM中,然后被Bootloader写到目标机的Flash内的固态存储设备中。通过交叉编译,可以利用开发环境的资源进行编译,生成在目标平台上运行所需的较小且高效的可执行文件。BootLoader的Stage 1会从预定义的存储设备(例如硬盘、闪存)中读取Stage 2的引导程序,并将其加载到预先分配的内存空间(RAM)中。
2025-04-16 15:19:29
3647
原创 嵌入式基础(三)基础外设
SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议,主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。在同步通信中,发送方和接收方的时钟是相互关联的,数据的传输和接收是基于一个共同的时钟信号进行同步的。// 配置 TIM2 的通道 1。
2025-04-14 19:35:02
1363
原创 嵌入式基础(二)ARM基础
DMA(Direct Memory Access,直接存储器访问) 提供在外设与内存、存储器和存储器、外设 与外设之间的高速数据传输使用。它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU,在这个时间中,CPU对于内存的工作来说就无法使用。简单来说就是一个数据搬运工。DMA的意义主要体现在以下几个方面:代替CPU搬运数据,为CPU减负:数据搬运是一个耗时的任务,如果由CPU来执行数据传输操作,会占据CPU的大量时间和计算资源。
2025-04-14 19:33:08
1018
原创 嵌入式基础(一)基本概念
在传统的顺序执行中,指令按照在程序中的顺序依次执行,如果前面的指令有数据依赖关系或者访存等操作需要较长的延迟,处理器会因为等待产生停顿。乱序执行则可以在指令的执行过程中动态地对指令进行重排序,使得能够并行地执行那些不具有数据依赖关系的指令,从而提高处理器的性能。当系统发生中断时,处理器会立即暂停当前正在执行的任务,并跳转到中断处理程序的入口地址,执行相应的中断处理程序。更高的时钟频率:由于每个阶段的时钟周期更短,处理器在同样的时间内可以完成更多的阶段,从而可以以更高的时钟频率工作,提高处理器的性能。
2025-04-02 19:38:56
1199
原创 操作系统高频(七)虚拟地址与页表
每次访问或插入新数据时,通过操作链表的头部指针和节点的连接关系来更新缓存的访问顺序,同时使用哈希表来查询快速访问指定键值的节点。缺页中断的目的是实现了虚拟内存的概念,允许程序使用比实际物理内存更大的地址空间,并将常用的页存放在物理内存中,而将不常用的页放在磁盘上。通过缺页中断处理,操作系统能够根据需求将所需的虚拟页从磁盘加载到内存中,实现了透明的内存管理和动态的页面调度。LRU算法的优点是可以充分利用程序的局部性原理,将最近被访问的页面保留在内存中,从而提高缓存命中率和访问效率。
2025-04-02 19:36:20
692
原创 操作系统高频(六)linux内核
通过这两个阶段的启动过程,引导加载程序能够在启动过程中对硬件进行初始化和配置,并加载操作系统,以使嵌入式系统能够正常运行。:Linux内核是嵌入式系统的核心,负责管理系统的硬件资源、提供各种设备驱动程序和执行系统的核心功能。:应用程序是嵌入式系统中运行在用户空间的程序,利用Linux内核提供的服务和资源完成特定的功能需求。为了保护系统的稳定性和安全性,将操作系统的核心部分放在内核态下运行,限制用户态的权限。它通过设置处理器、内存、时钟和外设等硬件的初值,确保它们处于正确的状态以便后续的系统操作。
2025-04-01 15:19:36
1103
1
原创 操作系统高频(五)linux命令
另外,GDB 还提供了一些特殊的命令用于处理多进程调试,如 inferior 命令用于切换当前活动进程,detach 命令用于从进程中分离 GDB。例如:grep -l 'pattern' file.txt:仅打印匹配模式的文件名,而不打印匹配的行。是一个强大的 Linux 命令,用于在文件中搜索指定的模式或关键字,并将匹配的行打印出来。该命令常用于分析一行的信息,若当中有我们所需要的信息,就将该行显示出来,该命令通常与管道命令一起使用,用于对一些命令的输出进行筛选加工。
2025-04-01 15:14:10
1047
原创 操作系统高频(四)linux基础
在多进程的情况下,可以使用带有命名的互斥量来实现跨进程间的同步和互斥访问。需要注意的是,ulimit命令是针对当前的shell会话生效的,修改只在当前会话中有效。因此,在多核处理器上,自旋锁可以表现得更好,因为它充分利用了处理器的并行性和线程的空闲时间。总的来说,Linux的fork系统调用可以复制父进程的状态和资源,创建一个独立的子进程,从而实现并发和多进程编程的能力。互斥锁的使用场景包括:临界区较长或者需要保证临界区的独占性的情况,常见于共享资源的读写、数据库访问、线程间通信等。
2025-03-27 16:58:39
905
原创 操作系统高频(三)
在边缘触发模式下,当一个文件描述符上的状态发生变化时(如从无数据变为有数据可读),epoll_wait 函数会通知一次,并且只通知一次。:中断处理程序执行完毕后,会根据之前保存的状态信息(通常是从栈或特定的寄存器中恢复)恢复被中断的程序的执行。在调用wait时,线程会释放它持有的锁,进入等待状态,并等待其他线程通过notify或notifyAll来唤醒它。此时系统产生了死锁。类似于 select,当调用 poll 函数时,内核会遍历指定的文件描述符数组,检查是否有就绪的 I/O 事件,并进行相应的处理。
2025-03-26 19:13:24
689
原创 操作系统高频(二)线程与进程
因此,一个进程可以创建的线程数由可用虚拟空间和线程的栈的大小共同决定,只要虚拟空间足够,那么新线程的建立就会成功。理论上,一个进程可用虚拟空间是2G,默认情况下,线程的栈的大小是1MB,所以理论上一个进程可以创建2048个线程,当然更改编译器的设置可以创建多余2048个线程。父子进程都有管道的读端和写端,子进程的描述符是从父进程复制而来的。理论上,一个进程可用虚拟空间是2G,默认情况下,线程的栈的大小是1MB,所以理论上一个进程可以创建2048个线程,当然更改编译器的设置可以创建多余2048个线程。
2025-03-26 19:11:40
1289
原创 操作系统高频(一)线程与进程
同样地,阻塞也不一定意味着同步。具体而言,当线程发起一个阻塞式的操作(如等待I/O、获取锁、等待条件满足等)时,它会进入阻塞状态,暂停执行,直到条件满足或被唤醒。例如,在互斥锁的场景中,当一个线程尝试获取互斥锁但锁已经被其他线程占用时,它会被阻塞,等待锁的释放。使用进程间通信机制(IPC):使用操作系统提供的进程间通信机制,如管道、消息队列、共享内存、套接字等,可以实现进程间的数据传输和同步,确保共享数据的正确性和一致性。在同步中,任务或操作可能会按照特定的顺序执行或等待其他任务的完成,以满足特定的条件。
2025-03-25 14:59:59
786
原创 计算机网络高频(五)HTTP和HTTPS
常见的请求首部字段包括:Host:指定服务器的主机名和端口号User-Agent:标识客户端的用户代理信息Content-Type:指定请求体的数据类型Content-Length:指定请求体的长度Authorization:用于身份验证的凭据Cookie:包含客户端的Cookie信息Accept:指定客户端能够接受的响应内容类型Referer:指示请求的来源URL。协议: 为了使数据在网络上从源头到达目的,网络通信的参与方必须遵循相同的规则,这套规则称为协议,它最终体现为在网络上传输的数据包的格式。
2025-03-25 14:58:28
1256
原创 计算机网络高频(四)socket网络编程
具体过程是,当用户访问网站时,先访问一个位于前端的负载均衡器(也称为调度器),然后负载均衡器会根据配置的算法(如轮询、权重轮询、IP-Hash等)选择一个压力较小的后端服务器,并将该访问请求引导到被选中的服务器上进行处理。在使用长连接的情况下,客户端和服务器之间的TCP连接在一个网页打开后不会立即关闭,而是保持连接状态,如果客户端再次访问服务器上的网页,可以继续使用已经建立的连接,避免频繁建立和关闭连接的开销。根据服务器处理请求的速度进行负载均衡分配,处理请求最早结束的服务器会获得下一个请求。
2025-03-24 19:46:39
1075
原创 计算机网络高频(三)UDP基础
因此,在使用UDP进行数据传输时,需要对数据的可靠性和顺序性进行额外的处理,例如应用层协议可以在数据中插入序号、校验和等机制,来进行错误检测和纠正。TCP为了保证可靠传输并减少额外的开销(每次发包都要验证),采用了基于流的传输,基于流的传输不认为消息是一条一条的,是无保护消息边界的(保护消息边界:指传输协议把数据当做一条独立的消息在网上传输,接收端一次只能接受一条独立的消息)。相比之下,TCP提供了可靠性和顺序性的保证,需要进行数据重传和拥塞控制等额外的机制,这些机制会带来一定的性能开销。
2025-03-24 19:44:11
1371
原创 计算机网络高频(二)TCP/IP基础
发送方根据接收窗口的大小来调整发送数据的速率,以避免发送方持续发送过多的数据,导致接收方无法及时处理和接收,从而实现流量控制,避免网络拥塞和数据丢失。TCP使用超时重传机制来处理丢失的数据或确认。SYN攻击(SYN flood)是一种常见的网络攻击方式,其利用TCP协议的三次握手过程中的漏洞,通过发送大量伪造的SYN请求包给服务端,耗尽服务端资源,使其无法响应正常的请求。接收方在收到乱序的数据包后,可以通过发送ACK报文来通知发送方已经接收到哪些数据包,以便发送方进行数据包的重排和重传,确保数据的顺序性。
2025-03-22 20:30:28
2012
2
原创 操作系统高频(一)线程与进程
同样地,阻塞也不一定意味着同步。具体而言,当线程发起一个阻塞式的操作(如等待I/O、获取锁、等待条件满足等)时,它会进入阻塞状态,暂停执行,直到条件满足或被唤醒。例如,在互斥锁的场景中,当一个线程尝试获取互斥锁但锁已经被其他线程占用时,它会被阻塞,等待锁的释放。使用进程间通信机制(IPC):使用操作系统提供的进程间通信机制,如管道、消息队列、共享内存、套接字等,可以实现进程间的数据传输和同步,确保共享数据的正确性和一致性。在同步中,任务或操作可能会按照特定的顺序执行或等待其他任务的完成,以满足特定的条件。
2025-03-22 20:28:50
953
原创 C++高频(五)之虚函数
总结一下,虚函数的实现方式通常包括在对象中添加一个指向虚函数表的指针(vptr),虚函数表存储了虚函数的地址,子类继承并重写父类的虚函数时会替换相应的地址,通过 vptr 指针和虚函数表来实现动态绑定和多态。虚函数的调用是通过虚函数表(vtable)实现的,每个包含虚函数的类都有一个虚函数表,存储了每个虚函数的地址。派生类的虚函数表会替代基类的虚函数表。至于内联函数方面,虚函数不能直接被标记为内联函数,因为虚函数在运行时通过虚函数表进行调用,而内联函数需要在编译时进行替换,两者的机制是不相容的。
2025-03-19 19:03:02
677
原创 C++高频(四)之c++11新特性
包括了正则表达式库、基于范围的循环(Range-based for loop)、哈希表(std::unordered_map、std::unordered_set)、随机数库、异步任务库(std::async)、类型特征工具(std::is_same、std::is_convertible 等)等。可以将其简单理解为"可以取址的表达式"。移动构造函数与拷贝构造不同,它并不是重新分配一块新的空间同时将要拷贝的对象复制过来,而是"拿"了过来,将自己的指针指向别人的资源,然后将别人的指针修改为nullptr。
2025-03-19 19:01:10
944
原创 C++高频(三)
为了使CPU能够对变量进行快速的访问,变量的起始地址应该具有某些特性,即所谓的"对齐",比如4字节的int型,其起始地址应该位于4字节的边界上,即起始地址能够被4整除,也即"对齐"跟数据在内存中的位置有关。因此,在编程中需要按照平台的要求对不同类型的数据进行合理的字节对齐,以保证程序的正常运行和最优化的存储空间利用。对齐后,填充空间的大小可以最小化,节省存储空间。字节对齐是指将变量的起始地址按照一定规则调整,使得变量占用的存储空间的起始地址能够满足特定要求,常用的要求是变量的起始地址是其长度的整数倍。
2025-03-18 21:08:21
705
原创 C++高频(二)
内联函数是指在函数声明前加上inline关键字的函数,它的作用是告诉编译器在调用函数的地方直接将函数体插入,而不是通过函数调用的方式执行。在运行时,通过指针或引用访问虚函数时,编译器会根据对象的实际类型,通过虚函数指针找到对应的虚函数表,然后根据函数名或索引在虚函数表中查找相应的函数地址进行调用。多态是面向对象编程的重要概念之一,它可以实现函数的动态绑定,使得通过基类指针或引用调用的函数能够根据实际对象的类型来决定调用哪个对象的成员函数。内联函数在编译时展开,避免了宏带来的副作用和类型不匹配的问题。
2025-03-17 17:53:06
1123
原创 C语言面试高频(内存管理)
内存池则是在真正使用内存之前,先申请分配一大块内存(内存池)留作备用,当我们申请内存时,从池中取出一块动态分配的内存,释放内存时,再将我们使用的内存释放到我们申请的内存池内,再次申请内存池也可以再取出来使用。通常情况下习惯使用new/delete/malloc/free等API申请分配和释放内存,这样导致的后果是:当程序长时间运行时,由于所申请的内存块大小不定,频繁使用时会造成大量的内存碎片从而降低程序和操作系统的性能。栈:栈上的内存分配和释放是自动进行的,随着函数的调用和返回进行相应的操作。
2025-03-16 20:30:54
1380
原创 C语言面试高频(二)
指针数组的类型声明中,指针符号 * 出现在数组名的后面,用于表示指针数组的类型。当开辟的空间小于 128K 时,调用 brk()函数,malloc 的底层实现是系统调用函数 brk(),其主要移动指针 _enddata(此时的 _enddata 指的是 Linux 地址空间中堆段的末尾地址,不是数据段的末尾地址)务必正确配对分配和释放:确保每次内存分配都有相应的释放,释放内存的操作必须与分配内存的操作对应(malloc和free 一定要malloc和free的次数一致否则就泄露)。
2025-03-14 17:47:35
1164
原创 C语言面试高频(一)
const定义的常量有作用域限制,可以根据声明位置的不同而有不同的作用域。const生成符号表中的一个符号,有明确的名字和类型,可以进行调试和符号查找。在 File2.c 中,我们使用 extern 关键字来声明同名的全局变量 globalVar,以表示它是在其他源文件中定义的。它记录了程序在运行时附带的命令行参数的数量,至少为1,因为程序自身的名称也算一个参数。在这个例子中,getMessage 函数的返回类型前面的 const 关键字指示函数返回一个指向常量字符的指针。
2025-03-14 17:45:56
732
原创 C++面试高频(一)
(Pointer to a constant):指针常量是指指针本身是不可更改的,即指针变量自身的值不能被修改,但指向的值可以修改。(Constant pointer):常量指针是指指针指向的地址不能更改,即指针变量指向的地址不能被修改,但可以通过指针修改指向的值。需要注意的是,对于转换为char的int值,如果超出了char类型的范围(-128至127),将会发生溢出,只保留最低位字节的值。野指针(Dangling Pointer):指的是没有初始化过的指针,它指向的地址是未知的、不确定的、随机的。
2025-03-11 17:39:24
494
原创 计算机网络 -实验六 rip路由协议实验
1.了解rip路由协议 2. 学会启用rip协议 3. 熟悉华为网络模拟器的使用方法; 4. 掌握网络拓扑图的绘制
2025-03-10 14:15:29
485
原创 计算机网络-实验四子网划分
要划分成3个子网,则网络号n:3<=2n,所以n>=2,考虑每个部门约50台主机,主机位m:50<=2m,其中m>=6, m+n=8;主机之间测试连通性,以部门1的主机PC1测试到部门2的主机PC2、到部门3的主机PC3、到部门4的主机PC4为例子,截图说明连通性。为主机分配IP后,主机之间测试连通性,以部门1的主机PC1测试到部门2的主机PC3和到部门3的主机PC5为例子,截图说明连通性。特别提醒:通常把第1个IP地址作为主机PC的IP地址,最后1个IP地址作为主机PC的网关地址。
2025-03-03 16:45:39
1316
原创 计算机网络实验2-虚拟局域网(VLAN)划分
四、实验内容 1、根据实验拓扑图建立好实验环境,并设定 PC 机的 IP 地址;2、通过交换机的基本命令,在 S5700 交换机上创建虚拟局域网(VLAN),并完成虚拟局域网(VLAN)划分,并通过其中一台 PC 机 ping 其余主机(分别ping同一vlan的主机和不同vlan的主机),查看 ping 命令运行结果;4. 配置 VLAN、查看配置并测试网络连通性 (1) 配置 VLAN 将 PC 划分到不同vlan(同一vlan至少包括2台pc) [s1]display int #查看端口。
2025-02-27 19:22:06
890
原创 面向对象程序设计-实验十二
一行输入为一批数,第一个输入为数据类型(1表示整数,2表示字符型数,3表示有一位小数的浮点数,4表示字符串,0表示输入结束),第二个输入为该批数的数量size(0<size<=10),接下来为size个指定类型的数据。对于输入的每一批数,按从小到大排序后输出。输出将从小到大顺序输出数据。/* 请在这里填写答案 */题目2(给出题目描述)题目3给出题目描述)
2025-02-25 21:55:18
681
原创 面向对象程序设计-实验十一
(给出题目描述)#include<iostream>usingnamespacestd;classMyTimeprivateintm_h;intm_m;intm_s;publicMyTime(inthintmintsm_h =h;m_m =m;m_s =s;MyTime()this->m_h =this->m_m =this->m_s = 0;MyTimeoperator++()m_s++;if。
2025-02-23 19:59:12
1039
原创 面向对象程序设计-实验十
/重载双目运算符'-'Complex operator+(Complex &c) const;//重载双目运算符'+'Complex operator-=(Complex &c );//重载双目运算符'-='
2025-02-20 18:11:33
1165
原创 面向对象程序设计-实验九
include<iostream>#include<string>usingnamespacestd;classvehiclepublicintspeed;intweight;voidRun()voidStop()classbicyclevirtualpublicvehiclepublicintheight;classmotorcyclevirtualpublicvehiclepublicint。
2025-02-20 18:07:45
1048
原创 面向对象程序设计-实验七
这里需要设计一个捐款人类Donator及一个相关函数getMaxName( ),Donator类中包含捐款人的姓名及其捐款额。输入本批次将参与的捐款人数。输出本批次中捐款最高者姓名。你编写的代码将被嵌入这里。个捐款人的姓名和捐款额。输入目前已有的捐款总额。你的代码将被嵌在这里。
2025-02-14 20:49:57
1289
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅