- 博客(70)
- 收藏
- 关注
原创 关于freertos的heap_4分配内存的方式以及首次适应算法
FreeRTOS的heap_4是一种动态内存分配方案,它使用首次适应算法来分配内存,并且会合并相邻的空闲块以减少内存碎片化。
2025-04-11 17:02:33
78
原创 C11新特性,委托构造函数
在C++11及更高版本中,引入了委托构造函数(Delegating Constructors)。委托构造函数允许一个构造函数调用同一个类中的另一个构造函数,从而实现代码复用。委托构造函数的调用一般就是在初始化列表里调用,例如第一个委托构造函数,他就直接调用了第一个主构造函数,并传入了0作为age,这个构造函数调用了主构造函数。委托构造函数的调用顺序是固定的,先调用被委托的构造函数,再执行当前构造函数的函数体。首先,一般的情况下,构造函数不能调用其它构造函数。委托构造函数的调用必须在成员初始化列表中完成。
2025-04-10 16:14:50
406
原创 配置完nfs后vmware虚拟机下ubuntu/无法联网问题
背景:我在用imx6ull配置完nfs和tftp后,哪怕还原了设置也连不上网,网上的教程都没用,什么配置路由,配置ip,配置什么用户文件,都没用,最后试出来了一个方法,解决问题。方法就是,把这个网络适配器移除了,再重新添加一个,暴力但有用。
2025-03-28 18:36:25
255
原创 嵌入式八股,static在Linux驱动编写时的用处
在内核模块中,如果一个函数或变量被声明为static,它不会被导出到内核的符号表中。内核符号表(Kernel Symbol Table)是操作系统内核中的一个重要组成部分,它记录了内核中所有导出的函数和变量的符号信息。对于变量,static关键字可以用来声明静态变量,这种变量在程序的整个生命周期内都占用内存。static关键字可以用来限制函数或变量的作用域,使其只能在当前文件内被访问。static关键字可以用来初始化静态数据,这些数据在模块加载时被初始化,并在模块的整个生命周期内保持其值。
2025-03-27 20:07:19
184
原创 设备树基本语法
可以使用#include的语法包含头文件,也可以使用该语法包含一个通用的soc设备树文件,作为dtsi文件导入,这里面一般包含一些不会变的设备,比如cpu。另外外设的概念很大,包括芯片内部的IIC,中断控制器。/表示根节点,这里面的一级子节点一般是由开发板原厂家做的。启动后,我们能够在根文件系统下的,/proc/device-tree/,下找到设备树信息。这就是一个uart设备,他的寄存器地址是7100000,这里是一般以字节为单位。非常重要的声明,用于指定设备树文件的版本。用于引用已经定义的设备节点的。
2025-03-26 10:22:58
138
原创 C11新特性,对模板右尖括号的优化
会被编译器解释为右移操作符,而不是模板参数表的结束。这导致在编写嵌套模板时需要在两个右尖括号之间添加一个空格,以避免编译错误。在 C++11 中,这种限制被取消了。C++11 改进了编译器的解析规则,使其能够正确判断。在 C++11 之前,模板实例化中的连续两个右尖括号。是模板参数表的结束标记还是右移操作符。
2025-03-21 10:15:04
187
原创 嵌入式八股,什么是线程安全
线程安全是指在多线程环境中,一个程序或代码段能够正确地处理多个线程同时访问和操作共享资源的情况,而不会导致数据错误、程序崩溃或其他不可预期的行为。在多线程程序中,多个线程可能会同时访问和修改共享资源(如变量、数据结构等)。例如,两个线程同时对一个整数变量进行加1操作,最终的结果可能不是预期的加2。:线程读取到的变量值不是最新的,因为其他线程对变量的修改尚未被当前线程感知到。:为每个线程提供独立的变量副本,避免线程之间的数据共享。简单来说,我们都知道线程共享一个进程的内存,要防止出现资源竞争。
2025-03-20 21:45:55
328
原创 C++11新特性,constexpr 修饰常量表达式
constexpr用于声明可以在编译时计算的常量表达式。正常使用const修饰表达式一般是在运行时,将其转化为对应的值,constexpr会在编译阶段就转化,另外对于普通常量,const和constexpr都能在编译阶段进行转化。
2025-03-18 11:58:19
181
原创 C++11新特性,bind
或绑定表达式),可以将函数、成员函数或成员变量与特定的参数或对象绑定在一起,从而简化函数调用。绑定了value,语法是先变量,后成员,这样仿函数直接输出变量,也可以给对其赋值。是一个占位符对象,表示绑定后的函数调用时的第一个参数。同时我这里也完成了削减参数的目的,现在f只有一个参数了 ,原本有三个。是传递给绑定器的第一个参数。它用于创建一个可调用对象(等,分别表示第二个、第三个参数。总的来说,只要有两个作用,是一个模板函数,位于。
2025-03-18 10:29:24
187
原创 嵌入式八股,手撕线程池(C++)
线程池的主要目的是复用线程资源,减少线程创建和销毁的开销,同时提高程序的并发性能。也就是说,我创建一个线程对象,他可以复用,线程池里有多个线程对象,有任务来了,我调用一个,用完了,我再放回去。
2025-03-16 21:43:19
366
原创 嵌入式八股,为什么单片机中不使用malloc函数
函数的动态内存分配和释放过程较为复杂,可能会引入额外的执行开销。单片机通常没有像PC那样的高级内存管理单元(MMU),因此无法像操作系统那样高效地管理内存。如果需要动态内存分配,建议使用嵌入式操作系统(RTOS)提供的内存管理接口,例如 FreeRTOS 的。单片机的内存资源通常非常有限,尤其是RAM的大小可能只有几KB到几十KB。进行动态内存分配可能会导致内存碎片化,使得程序在运行过程中逐渐耗尽可用内存。:即使总空闲空间足够,但由于碎片化,无法分配足够大的连续内存块。可能会导致内存管理混乱。
2025-03-15 16:47:34
1885
原创 嵌入式八股,DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)
首先,上网是需要IP地址的,且每一个IP地址都是不重复,以防止冲突,如果每一个IP地址都需要手动的静态分配将会是一个非常麻烦的过程。如果服务器无法满足客户端的请求(例如IP地址已被分配给其他设备),它会发送一个。消息后,会从IP地址池中选择一个可用的IP地址,并以广播方式发送一个。,从而简化网络设备的配置过程,提高网络管理的效率和灵活性。消息,正式确认分配的IP地址,并提供其他网络配置信息。消息后,会选择其中一个服务器的提议,并发送一个。消息,请求延长IP地址的租约时间。消息,请求确认分配的IP地址。
2025-03-06 16:40:59
240
原创 嵌入式八股,静态链接和动态链接的区别
生成的可执行文件是独立的,不依赖外部库文件,静态库后缀一般是.a。:在程序运行时,从共享库(如DLL或.so文件)中加载所需的函数代码。:程序启动时加载速度快,因为所有代码都在一个文件中,不需要额外加载共享库。:生成的可执行文件较大,因为包含了所有需要的库代码,占用更多磁盘空间。:生成的可执行文件较小,因为只包含对共享库的引用。:程序启动时加载的代码量小,运行时按需加载共享库。:可执行文件独立,不需要额外的库文件,便于分发。:需要额外的共享库文件,运行时依赖这些文件。:首次加载共享库时会有额外的延迟。
2025-03-05 20:25:57
251
原创 嵌入式八股,SPI的工作模式
另外,空闲时高电平更耗能,低电平更稳定 ,但时钟信号在空闲时保持高电平,信号的切换次数会减少。例如,从高电平切换到低电平,再回到高电平,这种切换方式比从低电平到高电平再回到低电平更稳定,减少了信号边沿的瞬态干扰。第一个跳变沿采样,速度会更快,第二个会有更宽的数据准备窗口,也就是比较长的准备时间。CPHA = 0:数据在第一个跳变沿采样,第二个跳变沿切换。CPHA = 1:数据在第二个跳变沿采样,第一个跳变沿切换。:决定时钟信号(SCLK)在空闲状态时的电平。:决定数据采样和切换的时钟边沿。
2025-03-03 15:19:14
353
原创 嵌入式八股,函数重载
编译器在编译阶段根据函数调用时提供的参数类型和数量,选择最匹配的函数版本进行绑定。并将函数名进行修饰,让这些重载的函数有不同的符号。函数重载是CPP中的一个概念,是指在同一个作用域中,允许定义多个同名函数,但这些函数的参数列表必须不同。参数列表的不同可以体现在参数的类型、参数的数量或参数的顺序上。写重载时,函数名要相同,参数列表必须不同,返回值可以同也可以不同,返回值不关键。:如果两个函数的参数列表完全相同,即使返回值不同,也会导致编译错误。:编译器会根据调用时提供的参数类型和数量,选择最匹配的函数版本。
2025-03-03 14:16:26
210
原创 嵌入式八股,STA模式和AP模式
STA模式是指设备作为无线网络中的一个终端站点,可以看作是一个客户端。在STA模式下,设备本身不接受无线接入,而是连接到AP(Access Point,无线接入点)节点进行网络访问。:AP模式是指设备作为无线网络的中心节点,可以看作是一个服务器。它提供无线接入服务,允许其他无线设备接入该节点,并通过它进行数据的交换和互相访问。:AP模式下的设备作为服务器,创建一个无线网络,允许其他设备连接到该网络。:STA模式下的设备作为客户端,通过连接到AP来访问网络资源。
2025-03-03 08:41:30
222
原创 嵌入式八股,深拷贝与浅拷贝
浅拷贝是指创建一个新的对象,但只复制原对象的引用(指针),而不复制实际的数据内容。换句话说,浅拷贝只复制对象的第一层内容,对于嵌套的对象或引用类型,它仍然指向原来的对象。深拷贝是指创建一个新的对象,并递归地复制原对象的所有内容,包括嵌套的对象。深拷贝会创建完全独立的副本,因此修改原对象不会影响深拷贝的对象。:如果原对象被修改,浅拷贝的对象也会受到影响,因为它们共享相同的数据。:完全独立的副本,修改原对象不会影响深拷贝的对象。:因为只复制引用,而不复制实际数据。:不会创建新的数据副本。
2025-02-28 17:56:56
319
原创 嵌入式八股文,select、poll、epoll
首先,这三个函数都是针对I/O多路复用的I/O 多路复用技术允许单个线程或进程同时管理多个 I/O 操作(如文件描述符或网络连接)。使用I/O 多路复用的目的之一就是为了解决高并发;
2025-02-28 15:27:05
172
原创 嵌入式八股文,回调函数
回调函数(Callback Function)是指一个函数作为参数传递给另一个函数,并在特定的事件或条件发生时被调用。回调函数有以下概念回调函数本质上是一个函数指针。它允许将一个函数的地址作为参数传递给另一个函数。调用方(调用函数)可以决定何时、何地调用回调函数。回调函数通常用于处理事件或通知。当某个特定事件发生时(如用户点击按钮、数据接收完成、定时器到期等),回调函数会被调用,从而实现对事件的响应。回调函数允许将调用方和被调用方解耦。
2025-02-28 11:18:27
224
原创 嵌入式八股文,FreeRTOS中信号量和队列的区别
它有一个计数器,表示可用资源的数量,任务可以通过获取(Take)和释放(Give)信号量来控制对资源的访问。:用于任务之间的同步,表示某个事件的发生。它只有两种状态(0 或 1),通常用于实现互斥(Mutex)或简单的任务同步。:一种特殊的信号量,用于保护共享资源的互斥访问。:信号量是一种同步机制,用于控制对共享资源的访问,或者用于任务之间的同步。用于任务之间的通信,允许一个任务向队列发送数据,另一个任务从队列接收数据。:队列是一种先进先出(FIFO)的数据结构,用于在任务之间传递数据。
2025-02-28 10:41:52
167
原创 嵌入式八股,Linux驱动三大基础类
块设备驱动用于管理那些以块(通常是512字节或更大)为单位进行数据传输的设备,例如硬盘、SSD、USB存储等。字符设备驱动用于管理那些以字节流方式访问的设备,例如串口、键盘、鼠标、蜂鸣器、某些传感器等。:与内核的网络协议栈(TCP/IP等)紧密集成。:数据以字节流的形式读写,通常支持随机访问。:数据以块为单位读写,通常不支持随机访问。:表示网络设备,包含设备状态、操作函数等。:定义了字符设备支持的文件操作函数,如。:表示字符设备,用于在内核中注册设备。:定义了块设备支持的操作,如。(接收数据)等函数。
2025-02-27 21:49:35
354
原创 嵌入式八股,为什么IIC要使用开漏输出+上拉电阻
首先GPIO得内部输出电路如图,MOS管的导通情况决定了GPIO的输出类型,只有一二两种情况就是推挽输出,二三两种就是开漏输出,使用开漏输出只能输出低电平,这时候就要配合上拉电阻输出高电平,同时减少最大输出电压,防止烧坏芯片,展开来说。
2025-02-27 16:28:33
176
原创 嵌入式八股文,环形缓冲区
环形缓冲区(Circular Buffer)是一种固定大小的数组,用于存储数据。当数据写入到数组的末尾时,会自动从数组的开头继续写入,形成一个“环”。它通常用于处理数据流,比如音频处理、日志记录等场景。时,缓冲区已满,或者说直接用一个计数,来记录当前存了多少数据。基本思路就是使用两个指针,一个tail指向读取位置,一个head指向写入位置,当。:环形缓冲区的大小是固定的,不能动态扩展。:当缓冲区写满时,新数据会覆盖旧数据。:数据按照先进先出的顺序读取。相遇时,缓冲区为空。
2025-02-26 10:00:00
292
原创 嵌入式八股,僵尸进程,孤儿进程,守护进程
守护进程是一种在后台运行的进程,通常没有控制终端(TTY)。它们通常用于提供系统服务,如网络服务、日志记录、定时任务等,父进程创建子进程后,主动退出父进程,就是守护进程。僵尸进程是指已经完成执行,但其父进程尚未读取其状态信息的进程。由于父进程尚未读取子进程的状态信息,子进程的资源(如进程表项)无法被释放,因此该进程处于“僵尸”状态。孤儿进程是指其父进程已经退出,但子进程仍然在运行的进程。:守护进程通常独立于用户会话,即使用户注销,守护进程仍然运行。:孤儿进程的父进程已经终止,但子进程仍在运行。
2025-02-25 16:00:00
310
原创 嵌入式八股,DMA
DMA(Direct Memory Access,直接内存访问)是一种硬件机制,允许外部设备在不经过CPU的情况下直接与内存进行数据传输。这种技术能够显著提高数据传输的效率,减轻CPU的负担,从而提升系统的整体性能。正常的逻辑是,cpu读取RAM中的数据,再由他发送给外设,cpu全程参与。:数据直接在设备和内存之间传输,减少了CPU的参与,提高了数据传输效率。:数据传输完成后,DMA控制器向CPU发送中断信号,通知数据传输完成。:CPU配置DMA控制器,设置源地址、目标地址和传输的数据量。
2025-02-25 10:10:21
139
原创 嵌入式八股文,c语言实现strcpy
是 C 标准库中的一个函数,用于将一个字符串复制到另一个字符串中。思路是,先用一个字符指针存一下要返回的地址,便于后续返回,一直复制,直到读到空字符。目标是从src中复制字符串到dest(包括结尾的空字符。
2025-02-24 17:36:05
262
原创 嵌入式八股文,malloc和new
更安全,因为它支持对象的生命周期管理,即确保了对象的构造和析构过程是自动完成的。malloc的效率要高于new,因为它只用分配内存,不涉及构造函数。是C++语言的运算符,用于动态分配内存。不需要额外的头文件。是C语言标准库函数,用于动态分配内存,定义在头文件。不仅分配内存,还会调用对象的构造函数进行初始化。仅分配内存,不初始化,需要指定分配内存的大小。返回的是对象的指针,不需要手动类型转换。类型的指针,需要手动强制类型转换。
2025-02-24 15:18:22
192
原创 嵌入式八股文,指针常量和常量指针
指针常量是指针本身的值(即地址)不能被修改,但指向的数据可以被修改。这种指针既指向常量数据,本身也是常量。:常量指针通常用于保护数据,防止通过指针修改数据。常量指针是指向常量数据的指针。:可以通过指针修改指向的数据。:不能通过指针修改数据。:指针的地址不能被修改。,即不能指向其他变量。
2025-02-24 08:30:00
265
原创 嵌入式八股,内存泄漏
内存泄漏是指程序中动态分配的内存没有被正确释放,导致这部分内存无法被系统重新使用。随着时间的推移,泄漏的内存会不断累积,最终可能导致以下问题:程序占用的内存不断增加,消耗系统资源。系统可用内存减少,可能导致其他程序运行缓慢甚至崩溃。在极端情况下,可能导致程序崩溃或系统死机。内存泄漏通常发生在动态内存分配的场景中,例如使用C语言中的。
2025-02-23 19:30:00
308
原创 嵌入式八股文,define和typedef的区别
1. #define是预处理器指令,用于定义宏(macro)。宏是一种简单的文本替换机制,通常用于定义常量、函数宏或条件编译。用于控制代码的编译,实现条件编译。:宏的作用域是整个文件,从定义点到文件末尾。
2025-02-23 11:01:20
191
原创 嵌入式八股文,野指针
依然保留原地址值的情况。此时通过指针访问或修改内存的行为是未定义的(Undefined Behavior)。:访问无效内存可能触发段错误(Segmentation Fault)。:若野指针指向的内存被重新分配,修改数据会破坏其他变量。:可能被利用进行内存注入攻击(如缓冲区溢出)。:野指针可能间歇性导致问题,难以稳定复现。这个主要是针对CPP。
2025-02-20 17:32:04
254
原创 嵌入式八股,struct结构体和union联合体的联系与区别
struct和union都是用户自定义的数据类型,它们都可以包含多个成员,并且成员可以是不同的数据类型。它们的成员都可以通过点运算符()或箭头运算符(->)进行访问。对于指针的访问用(->结构体和联合体的区别主要体现在内存的存储上,struct结构体为每个成员分配独立的内存空间,成员在内存中是连续存储的。结构体的总大小是所有成员大小之和(可能因为内存对齐而稍大)。这里的内存占用为16字节,
2025-02-19 17:01:38
284
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人