
面试准备
文章平均质量分 89
饼干饼干圆又圆
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
嵌入式笔试准备
ARM架构的中断服务程序(ISR)的最后一条指令是BX LR。在ARM架构中,Link Register(LR)寄存器通常用来保存子程序返回地址。当发生中断时,硬件会自动将当前PC的值保存到LR中,然后跳转到中断向量表中对应的中断服务程序入口。BX是ARM指令集中的一个分支指令,根据指定的寄存器中的值来确定跳转的目标地址。通过将LR寄存器作为BX指令的操作数,就可以实现从ISR返回到中断发生前的指令处。原创 2024-09-01 14:03:16 · 864 阅读 · 0 评论 -
嵌入式笔试准备
IO多路复用是一种高效的I/O处理机制,它允许单个进程同时监控多个文件描述符(如网络套接字),一旦某个描述符就绪(可读或可写),就能及时通知程序进行相应的读写操作。程序将这些集合传递给select,select监听这些描述符,一旦其中的某个或多个描述符就绪,select 就会返回,程序再对就绪的描述符进行相应的 IO 操作。条件变量与互斥锁配合使用,允许线程等待某个特定的条件的发生。poll与select类似,但没有文件描述符数量的限制,并且使用了更灵活的数据结构(链表),可以监视更多的文件描述符。原创 2024-08-28 20:36:47 · 1265 阅读 · 0 评论 -
嵌入式笔试准备
假设这些腐烂橘子先开始是新鲜的,而有一个腐烂橘子(超级源点)会在下一秒把这些句子都变腐烂,而这个腐烂橘子刚开始的时间是-1,那么按照广度优先搜索的算法,下一分钟(第0分钟)这个腐烂橘子会把它们都变成腐烂橘子,然后继续向外拓展,所以其实这些腐烂橘子是同一层的节点。对于对象B,包含一个虚函数指针,也是对齐到8字节,然后是4个char型,最后补齐到8字节整倍数,变成16字节。C++的多态肯定是使用父类的指针指向子类的对象,所以肯定是释放子类的对象,如果不使用虚函数的话,父类的指针就只能释放父类的对象。原创 2024-08-28 10:32:43 · 965 阅读 · 0 评论 -
C语言笔试准备
经常要操作的内存分为哪几个类别?线程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。线程间可以直接读写进程数据段(如全局变量)来通信。线程上下文切换要比进程快。使用哈夫曼算法编码后,用编码值来存储这段文本将花费最少的存储空间。使用哈夫曼算法进行编码,编码值可以有多套,但每个字符编码的位是确定的。哈夫曼树带权路径长度最短的树,路径上全值较大的节点离根较近。当从一个最小堆删除一个元素时,需要把堆尾元素填补到堆顶位置,然后再按条件把它逐层向下调整到合适位置。原创 2024-08-26 14:16:49 · 906 阅读 · 0 评论 -
面试准备算法
我们将设置慢指针slow和快指针fast,慢指针每次走一步,快指针走两步,在有环的情况下一定相遇,此时再将慢指针放到slow,两个指针同时移动一步,相遇的点就是答案。对nums数组建图,每个位置i连一条i->nums[i]的边,由于存在重复的数字target,因此,target这个位置至少有两条指向它的边,在构建完图之后,对于任何一个查询,就可以从起点出发,通过广度优先搜索的方式,不断更新起点与当前点之间的路径,直到搜索到终点为止。因此,为了深拷贝出整张图,我们需要知道整张图的结构以及对应节点的值。原创 2024-08-22 15:15:02 · 962 阅读 · 0 评论 -
面试准备算法
对于数组中的每个元素,如果它与前面的元素最大公约数为1,那么它需要作为新的子数组的第一个元素。所以我们考虑以i结尾的和为k的连续子数组的个数时,只需要统计有多少个前缀和为pre[i] - k的pre[j]即可。所以考虑以i结尾的和为k的连续子数组个数只需要统计有多少个前缀和pre[i] - k的pre[j]即可。,i]里所有数的和,则pre[i] = pre[i-1] + nums[i],i]子数组和为k可以转换为pre[i] - pre[j-1] == k。查看Linux磁盘用量常用命令。原创 2024-08-20 09:53:59 · 711 阅读 · 0 评论 -
面试准备算法
i++){j--){原创 2024-08-18 16:59:14 · 802 阅读 · 0 评论 -
RTT学习
在动态创建线程和初始化线程的时候,会使用到内部的线程初始化函数_rt_thread_init(),_rt_thread_init()函数会调用栈初始化函数rt_hw_stack_init(),在栈初始化函数里会手动构造一个上下文内容,这个上下文内容会被作为每个线程第一次执行的初始值。因此,我们会编译得到一个稍微冗余的固件。默认使用的libc,提供了printf、scanf等很多标准库函数,但是这些库函数相对较大,而且很可能一些复杂的可能,我们在项目中并没有使用到,这样会造成代码体积的增大。原创 2024-08-12 14:46:03 · 1255 阅读 · 0 评论 -
RTT DEMO学习
同理的,如果内存池是空的,里面没有数据,接收邮件里面的 RT_WAITING_FOREVER 会使得nrf24l01_thread 线程阻塞,并挂起,然后 MCU 就会去干别的事情去了,在 ds18b20_thread 线程中采集温度,并申请内存块塞数据进去,内存块一旦有数据,就会发邮箱,另外一边一有邮箱收到了,就又开始工作了。我们创建两个线程去工作,onenet_mqtt_init_thread线程用于初始化 MQTT 客户端,onenet_upload_data_thread 线程去上传数据给云。原创 2024-08-11 10:58:18 · 1230 阅读 · 0 评论 -
嵌入式面试准备
使用32位地址,地址范围0.0.0.0到255.255.255.255。使用128位地址私有IP地址用于局域网(LAN)内部,不在互联网中传输。公有IP地址由互联网服务提供商(ISP)分配,可以在全球互联网中唯一识别。静态IP地址是手动分配的,不会改变。适用于需要长期保持相同IP地址的设备,如服务器。动态IP地址由DHCP服务器动态分配,每次连接网络时可能会关闭。路由器是一种网络设备,用于在计算机网络之间转发数据包。它主要用于连接不同的网络,并确定数据包的最佳路径。原创 2024-08-09 11:01:36 · 954 阅读 · 0 评论 -
嵌入式面试准备
子进程完整复制了父进程的地址空间,此时父子进程的虚拟内存空间映射到相同的物理内存空间。在全缓冲模式下,数据只会在缓冲区满时刷新,这意味着数据被存储在缓冲区直到缓冲区被填满,然后整个缓冲区的内容一次性刷写。线程是进程中的执行单元,它共享进程的资源和地址空间,但拥有自己的执行堆栈、程序计数器和一组寄存器。TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,广泛应用于互联网中。通常向文件写数据的默认模式就是全缓冲,这样可以减少对底层系统资源的调用次数,提高数据处理效率。原创 2024-08-09 07:49:34 · 619 阅读 · 0 评论 -
嵌入式面试准备
线程池是一种用于管理和重用多个线程的设计模式。它通过维护一个线程池(线程的几何),可以有效处理并发任务而无需每次创建和销毁线程。这种方法可以减少线程创建和消耗的开销,提高性能和资源利用率。原创 2024-08-07 19:28:40 · 1071 阅读 · 0 评论 -
嵌入式面试准备
我们可以设置消息队列的模式为O_RDWR,使它可以用于收发数据,从技术上讲,单条消息队列可以用于双向通信,但这会导致消息混乱,无法确定队列中的数据是本进程写入的还是读取的,因此,不会这么做,单条消息队列只用于单向通信。Linux提供了可以修改的属性pthread_rwlockattr_t,默认情况下,属性中指定的策略为“读优先”,当写操作阻塞时,读线程依然可以获得读锁,从而在读操作并发较高时导致写饥饿问题。管道在内核里,所以管道内存非常小,而共享内存的内存很大,并不是存到磁盘里,因为磁盘速度非常慢。原创 2024-08-06 15:45:22 · 1070 阅读 · 0 评论 -
嵌入式面试准备
进程是正在运行的程序,是操作系统进行资源分配的基本单位。程序是存储在硬盘或内存的一段二进制序列,是静态的,而进程是动态的,进程包括代码、数据以及分配给它的其它系统资源(如文件描述符、网络连接等)。使用标准库函数创建子进程在C99标准之前,main函数没有参数的形式被写为int main(),这在某些情况下可能导致与int main(void)行为不完全相同的问题,因为int main()在老式的C语言标准中不明确指出函数是否接受参数。从C99标准开始,原创 2024-08-05 15:08:02 · 1103 阅读 · 0 评论 -
嵌入式面试准备
我们在say_hello()函数中调用了printf()函数,这个函数是在stdio.h中声明的,后者来源于glibc库,printf()的实现在glibc的二进制组件中,通常是在共享库(如libc.so)或静态库(libc.a)文件中。如果是数组的插入排序,则数组的前面部分是有序序列,每次找到有序序列的第一个元素(待插入元素)的插入位置,将有序序列中的插入位置后面的元素都往后移动一个位置,然后将插入元素置于插入位置。在类成员函数的声明和定义中,const放在函数的参数表之后,不能修改该对象的数据成员。原创 2024-08-04 07:47:34 · 903 阅读 · 0 评论 -
嵌入式面试准备
可以用哈希表存储所有节点的父节点,然后从p节点依次向上跳,将经过的地方标记为true。q节点向上跳,遇到的第一个为true的节点,就是公共节点。给两个单词word1和word2,请返回将word1转换成word2所使用的最少操作数。定义dp[i]表示0,…,i-1是否能被空格拆分成若干字典中出现的单词。暴力枚举的时间复杂度高的原因是寻找target-x的时间复杂度过高。如果有两件,选择其中最高的一间,获得最高金额。如果只有一间房屋,则偷窃该房屋获得最高金额。原创 2024-07-29 20:30:43 · 901 阅读 · 0 评论 -
嵌入式面试准备
Linux系统中有很多种系统服务,大多数服务都是通过守护进程实现的,譬如系统日志服务syslog,web服务httpd,邮件服务sendmail和数据库服务mysqld等。假如是在排序数组中寻找一个目标值,那么直接利用二分法就可以在O(log n)找到目标值,但是这题添加了额外条件,如果不存在数组中的时候,需要返回插入顺序。父进程先于子进程结束,也就意味着,此时子进程变成了一个孤儿进程,在Linux系统中,所有孤儿进程都自动变成init进程的子进程。给一棵完全二叉树的根节点root,求出该树的节点个数。原创 2024-07-29 08:55:02 · 960 阅读 · 0 评论 -
面试算法刷题
需要调查从start基因变为end基因的基因变化,一次基因变化就意味着一个字符发生变化。如果start与end相等,此时返回0,如果最终基因序列不在bank中,返回-1。基因序列可表示为一条由8个字符组成的字符串,每个字符都是A,C,G,T。层次遍历,每次取出每一层的最后一个节点的值,加入到res即可。变化后的基因必须位于bank中。任何边界上的0不会被填充为X。原创 2024-07-27 07:51:44 · 290 阅读 · 0 评论 -
嵌入式面试总结
声明一个指向含有10个元素的数组的指针,其中每一个元素是一个函数指针,函数的返回值是int,参数是int*。原创 2024-07-26 07:48:40 · 890 阅读 · 0 评论 -
嵌入式面试总结
通过rand()可以得到[0,RAND_MAX]之间的伪随机数,但是每次运行的序列是相同的,通过srand()设置随机数种子。目录块中有多个目录项,每一个目录项都会对应到该目录下的某一个文件,目录项记录了该文件的文件名以及inode节点。在函数内部声明的静态变量会保持其值,直到程序结束,它们在内存中位置固定,不会随着函数的调用而销毁和重新创建。当函数被声明为静态时,它的作用域仅限于声明它的文件内部,不可见于其它文件中的代码。kill函数用于发送一个信号,在发送信号的时候需要指定接收信号的进程。原创 2024-07-24 19:06:17 · 847 阅读 · 0 评论 -
嵌入式面试总结
当进程对文件进行操作时,将进行权限检查,如果文件的set-user-ID位权限被设置,内核会将进程的有效ID设置为该文件的用户ID(文件所有者ID),意味着该进程直接获取了文件所有者的权限,以文件所有者的身份操作该文件。inode数据结构中记录了文件的硬链接数,当为文件每创建一个硬链接,inode节点上的链接数就会加1,每删除一个硬链接,inode节点上的链接数就会减1,直到为0,inode节点和对应的数据块才会被文件系统回收。原创 2024-07-22 09:10:32 · 1328 阅读 · 0 评论 -
嵌入式面试总结
对于或运算,如果第一个表达式为真,不需要执行第二个表达式。对于与运算,如果第一个表达式为假,不用执行后面语句。原创 2024-07-20 10:12:29 · 770 阅读 · 0 评论 -
嵌入式面试总结
在计算机系统中,通常存储空间分为两种:内部存储空间和外部存储空间。内部存储空间通常访问速度比较快,能按照变量地址随机访问。也就是我们所说的RAM(随机存储器)。外部存储空间保存的内容相对固定,即使掉电后数据也不会丢失。变量,中间数据一般存放在RAM中,只有实际使用时才将它们从RAM调入到CPU中进行运算。一些数据需要的内存大小在程序运行过程中根据实际情况确定,这就要求具备动态管理内存的能力。原创 2024-07-19 07:36:54 · 726 阅读 · 0 评论 -
嵌入式面试
嵌入式实时多线程操作系统,基本属性之一是支持多任务。一个处理器核心在某一时刻只能运行一个任务。在RTT中,任务通过线程实现。RTT主要采用C语言编写,浅显易懂,方便移植。它把面向对象的设计方法应用到实时系统设计中,使得代码风格优雅、架构清晰、系统模块化并且可裁剪性非常好。相较于Linux操作系统,RTT体积小,成本低,功耗低,启动速度快,实时性高,占用资源小,非常适用于资源受限的场合。物联网操作系统是指以操作系统内核为基础,包括文件系统、图形库等较为完整的中间件组件,具备低功耗、安全的软件平台。原创 2024-07-16 18:14:51 · 950 阅读 · 0 评论 -
嵌入式面试总结
new 、delete是C++中的操作符,而malloc、free是标准库函数。new、delete是类型安全的,new知道要分配对象的类型并调用构造函数,malloc只知道字节大小,不调用构造函数。new调用构造函数,delete调用析构函数。malloc、free不调用析构函数。new返回指定类型的指针,malloc返回void*,需要强制类型转换。new可以初始化对象,malloc不会初始化分配的内存。new在分配失败时抛出异常,malloc在分配失败时返回NULL。原创 2024-07-15 14:08:39 · 802 阅读 · 0 评论 -
嵌入式面试准备
malloc()从堆里面获得空间,也就是说函数返回的指针是指向堆里面的一块内存,操作系统中有一个记录空闲内存地址的链表,当操作系统收到程序的申请时,就会遍历该链表,寻找第一个空间大于所申请空间的堆节点,然后将该节点从空闲节点链表中删除,并将该结点的空间分配给程序。依次从小到大取每个序列中的元素比较,较小的一个放进新序列,取完一个有序序列中的所有元素后,再把剩下一个序列中的元素放进新序列的后面的即可。最坏情况下,每次选择的基准总是数组中的最小或最大元素时,快速排序退化为链表,高度为n,每层需要进行n次比较。原创 2024-07-13 10:46:45 · 654 阅读 · 0 评论 -
操作系统——内存管理(面试准备)
我们来看这样一个例子。每个进程都有4GB的虚拟地址空间,而对于大多数程序来说,其使用到的空间远未达到4GB,因为会存在部分对应的页表项都是空的,根本没有分配,对于已分配的页表项,如果存在最近一定时间未访问的页表,在物理内存紧张情况下,操作系统会将页面换出到硬盘,也就是说不会占用物理内存。我们利用这一特性,把最常访问的几个页表项存储到访问速度更快的硬件,于是计算机科学家们,就在CPU芯片中,加入了一个专门存放程序最常访问的页表项的Cache,这个Cache就是TLB,通常称为页表缓存,转址旁路缓存、快表等。原创 2024-07-11 09:53:26 · 1372 阅读 · 0 评论 -
面试经典题
public:i--;i--;return res;使用分段存储管理方式,当进程在主存中没有找到需要访问的页面并且内存中没有空闲物理块,需要进行页面置换。产生缺页中断后,首先去内存寻找空闲物理块,若内存没有空闲物理块,使用相应的页面置换算法决定淘汰页面,然后调出淘汰页面,最后调入该进程需要访问的页面。volatile关键字并不能保证线程安全。HTTP协议的响应码由三个十进制数字组成,第一个数字为1~5表示5种状态。原创 2024-07-10 19:28:40 · 1534 阅读 · 0 评论 -
面试经典150题
当遇到两个点时,只要栈不为空,就切换到上一级(弹出栈顶目录),当遇到目录名时,就放入栈。因此,如果展开表达式中所有的括号,则得到的新表达式中,数字本身不会发生变化,只是每个数字前面的符号会变化。如果将所有大写字符转换为小写字符,并移除所有非字母数字后,正着读和反着读一样,就认为短语是一个回文串。每次贪心匹配,匹配成功则i和j同时右移,匹配s的下一个位置,匹配失败则j右移,i不变。设计一个支持push,pop,top操作,并能在常数时间内检索到最小元素的栈。给定字符串s和t,判断s是否为t的子序列。原创 2024-07-09 11:23:29 · 1302 阅读 · 1 评论 -
面试经典150题
如果我们能计算出所有dp[i][j]的值,那么其中的最大值即为矩阵中只包含1的正方形的边长的最大值,其平方就是最大正方形的面积。此外,还需要考虑边界条件,如果i和j中至少有一个为0,则以此位置为右下角的最大正方形的边长只能是1,因此dp[i][j] = 1。如果要移除的元素在数组的开头,例如序列[1,2,3,4,5],当val为1时,我们需要把每一个元素都左移一位。对于一个节点u,如果它的所有相邻节点都已经搜索完成,那么回溯到u的时候,u本身也会变成一个已经搜索完成的节点。那么称该排列是图G的拓扑排序。原创 2024-07-08 21:35:17 · 864 阅读 · 0 评论 -
C++专业面试真题(1)学习
数组元素基本有序的情况下,快速排序是最慢的,因为会退化成冒泡排序,选择排序时间复杂度都是O(N2),堆排序都是O(nlogn),但是基本有序对插入排序是最好的,因为这样只需要比较大小,不需要移动,时间复杂度趋近于O(n)。例如,每个用户都有自己的目录,这样即使不同用户使用相同的文件名,也不会冲突。完全二叉树是一种特殊的二叉树,其中所有层都是完全填满的,除了最后一层,其节点都是从左到右排列的。快速排序是选中一个元素,将比其小的元素放在其左边,比其大的元素放在右边,然后递归处理。原创 2024-07-04 15:02:53 · 975 阅读 · 0 评论 -
C++专业面试真题(1)学习
面向过程思想完成一个需求的步骤:首先搞清楚做什么,然后分析怎么做,最后在通过代码体现。一步一步去实现,而具体的每一步都需要我们去实现和操作。这些步骤相互调用和协作,从而完成需求。在上面的每一个具体步骤中我们都是参与者,并且需要面对具体的每一个步骤和过程,这就是面向过程最直接的体现。面向过程编程,其实就是面向着具体的每一个步骤和过程,把每一个步骤和过程完成,然后由这些功能函数相互调用,完成需求。面向对象思想面向对象的思想是尽可能模拟人类的思维方式,使得软件的开发方法与过程尽可能接近人类认识世界。原创 2024-07-03 21:14:21 · 872 阅读 · 0 评论 -
C++专业面试真题(1)学习
用户程序的地址空间被划分成若干固定大小的区域,称为“页”,相应地,内存空间分成若干个物理块,页和块的大小相等。I/O多路复用能够在单个线程中,通过监视多个I/O流的状态来同时管理多个I/O流,一旦检测到某个文件描述符上我们关心的事件发生,能够通知程序进行相应的读写操作。死锁是指在两个或多个进程之间,每个进程都在等待其它进程释放资源,从而导致这些进程都无法继续执行的现象。银行家算法:一种动态资源分配算法,在每次资源请求时,模拟资源分配情况,判断是否会进入不安全状态,只有在不会进入不安全状态时,才分配资源。原创 2024-07-01 17:52:51 · 1218 阅读 · 0 评论 -
C++专业面试真题(1)学习
孤儿进程孤儿进程是其父进程已经终止但它仍然在运行的进程。当父进程终止时,这些孤儿进程将被系统的systemd收养,由它们负责清理。系统会自动处理孤儿进程。init进程会接管这些孤儿进程,并调用wait系统调用清理它们的资源。僵尸进程僵尸进程是已经终止但其退出状态信息仍然保留在进程表中的进程。僵尸进程保留在进程表中,直到其父进程读取了它们的退出状态。僵尸进程不会消耗任何CPU或内存资源,但会占用进程表项。原创 2024-07-01 15:49:15 · 993 阅读 · 0 评论 -
面试准备算法
答案肯定是字符串的某个前缀,然后简单直观的想法是枚举所有前缀来判断,设前缀长度lenz,前缀串的长度必然要是两个字符串长度的约数才能满足条件。可以枚举长度,再去判断这个前缀串拼接若干次以后是否等于str1和str2。原创 2024-06-28 09:37:53 · 408 阅读 · 0 评论 -
嵌入式Linux应用层开发 I/O操作
每个进程都有一个文件描述符表:文件描述符表在底层通过数组来实现的。文件描述符实际上是这个数组的偏移量。执行代码int fd = open(“test.txt”, O_RDONLY);//描述符表会增加一项当我们执行open()等系统调用时,内核会创建一个新的struct file,这个数据结构记录了文件的元数据(文件类型、权限等)、文件路径、支持的操作等,然后分配文件描述符,将struct file维护在文件描述符中,最后将文件描述符返回给应用程序。原创 2024-06-20 07:42:32 · 884 阅读 · 0 评论 -
C++面试题
多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码。在多态中,通常父类中虚函数的实现都是毫无意义的,主要都是调用子类重写的内容。当子类重写父类的虚函数时,子类中的虚函数表内部会替换成子类的虚函数地址。多重继承:一个子类继承多个父类,这些父类可能继承同一个父类。在继承之前,加上关键字virtual,变为虚继承。解决方法:将父类中的析构函数改为虚析构或纯虚析构。当父类指针或引用指向子类对象的时候,发生多态。两个类有共同的父类,又有共同的子类。纯虚函数写法:将{}改为= 0;原创 2024-06-19 18:52:06 · 539 阅读 · 0 评论 -
C++面试准备
声明可以有多次,但是定义只能有一次。原创 2024-06-12 14:58:51 · 1034 阅读 · 0 评论 -
Leetcode学习
对于给定的链表,首先对除了头节点head以外的节点进行删除操作,然后判断。递归的终止条件是head为空,此时直接返回head。当head不为空时,递归地进行删除操作,然后判断 head 的节点值是否等于 val并决定是否要删除 head。原创 2024-06-04 19:43:35 · 865 阅读 · 0 评论 -
物联网面试准备
串行通信接口:按位发送和接收的接口。如:RS-232/422/485等。RS-232接口(DB9)原创 2024-06-03 08:49:09 · 1202 阅读 · 0 评论