嵌入式每日面经之33题

1.解释一下栈和队列的概念。
2.数组和链表有什么区别?
3.请解释一下 static、validate、const 这些关键字的作用。
4.如何去除字符串中的空格?
5.如何合并两个链表并保持顺序?
6.请说明蓝牙芯片在产品中的作用。
7.什么是蓝牙软件成品模式?
8.请介绍一下蓝牙协议栈的架构和分层。
9.比较蓝牙协议栈和网络协议栈的架构。
10.蓝牙芯片是否基于 Linux 或其他常用架构?
11.描述一下蓝牙软件的软件架构。
12.什么是 event-driven 类型的软件架构?
13.请解释函数指针和指针函数的区别。
14.请用简单的代码示例表示函数指针。
15.请用简单的代码示例表示指针函数。
16.操作系统任务切换的关键是什么?
17.请介绍您的项目,包括难点和解决方法。
18.在函数中定义一个大数组,是直接定义还是使用 malloc 分配内存?
19.函数中使用 static 定义的变量存在于哪个区域?
20.请解释 DMA 是什么?
21.SPI 有几种模式?
22.请解释进程间通信中锁和同步的概念。
23.当一个低优先级进程获取到锁时,高优先级进程会怎样?
24.如何解决优先级反转问题?
25.在用户态开发中,如何定位程序跑飞或出现段错误?
26.程序分成哪几个段?
27.堆和栈有什么区别?
28.请说明如何使用中断方式代替查询方式。
29.请解释 UART 的奇偶校验。
30.请介绍队列、栈和二叉树。
31.如何确定多个线程的执行顺序?
32.请解释 Linux 中线程的调度方式。
33.你了解整个 SPI 通信过程吗?
上述问题 已经整理到面经中,面经地址在下方!!

https://www.nowcoder.com/creation/manager/columnDetail/MJNwoM
全部评论

相关推荐

 CPU、寄存器、缓存、内存概述- CPU:中央处理器,执行指令的核心组件。- 寄存器:CPU内部的临时存储空间,存放快速访问的数据。- 缓存(Cache):在寄存器和内存之间的高速存储,分为三级(L1、L2、L3),速度和价格依次降低。- 内存:主要存储程序和数据的地方。数据访问流程1. CPU首先在寄存器中查找数据。2. 如果寄存器未命中,则检查缓存。3. 如果缓存未命中,则从内存中获取数据。内存区域- 栈区:  - 存放函数参数和局部变量。  - 由编译器自动分配和释放,效率高,但内存量有限(如iOS中为2M)。- 堆区:  - 通过`new`、`malloc`等动态分配的内存。  - 需要程序员手动释放,可能导致内存泄漏。- 静态区:  - 存放全局变量和静态变量。  - 程序结束时由系统释放。- 常量区:  - 存放常量,不允许修改。  - 代码区:  - 存放函数体的二进制代码。类型说明符- 基本类型:`void`、`char`、`short`、`int`、`long`、`signed`、`unsigned`、`float`、`double`、`struct`、`enum`、`union`。- 存储类型:`extern`、`static`、`register`、`auto`、`typedef`。- 类型限制符:`const`(只读)、`volatile`。变量理解- extern:指示变量在其他文件中定义。- static:  - 限制变量作用域。  - 局部变量存入静态存储区,延长生存周期。- register:将频繁使用的变量放入寄存器以提高效率。- auto:C语言默认存储类型。- typedef:给类型或变量表达式起别名。- const:只读变量。- volatile:  - 防止编译器优化。  - 适用于中断和多线程环境。C程序内存分配- 堆、栈、静态存储区、文件分配区(常量字符串)、程序分配区(二进制代码)。 sizeof与strlen- sizeof:关键字,返回类型或数组的字节大小。- strlen:计算字符串长度,直到遇到`\0`。 函数参数传递- 值传递、引用传递、指针传递、数组地址传递。Const、指针、基本类型组合的意义- const int x:只读变量。- const char *x:指向常量的指针,指针内容可变,指向内容不可变。- char *const x:常量指针,指针内容不可变,指向内容可变。- const char *const x:指针和内容均不可变。 数组与指针- 物理地址:内存单元的真实地址。- 逻辑地址:CPU生成的地址。 Linux进程间通信- 管道(pipe)、信号量、消息队列、信号、共享内存、套接字。 strcpy与memcpy区别- strcpy:复制字符串。- memcpy:复制指定长度的内存内容。 内存泄漏与内存溢出- 内存泄漏:未释放的内存,导致可用内存减少。- 内存溢出:程序请求的内存大于可用内存。 switch的变量类型限制- 允许:整形、布尔、字符、枚举。- 不允许:字符串等非基本类型。 防止头文件重复调用- 使用#ifndef和#pragma once。 实时操作系统- 示例:FreeRTOS、Ucos。 指针数组与数组指针- 指针数组:数组元素为指针。- 数组指针:指向数组的指针。 结构体自增与双重指针自增- 自增从右向左进行。 寄存器的使用- 存储频繁调用的数据,减少内存访问。 获取全局变量与局部变量地址(gdb)- 使用backtrace或bt命令。 进程中的同步与异步- 同步:通过锁实现。- 自旋锁:忙等待,不阻塞线程。- 互斥锁:阻塞线程,等待资源释放。进程与线程的关系与区别- 进程:资源分配的基本单位,包含一个或多个线程。- 线程:进程中的执行单位,最小调度单位。树的遍历(递归与非递归)- 中序遍历:左子树 - 根节点 - 右子树,利用堆栈进行进栈和出栈操作。剩余的大佬面经总结了  链接在下边https://www.nowcoder.com/creation/manager/columnDetail/MJNwoM
点赞 评论 收藏
分享
1.1 Linux 驱动程序的功能是什么?(1)对设备初始化和释放。(2)进行内核与硬件的数据交互。(3)检测和处理设备出现的错误。1.2内核程序中申请内存使用什么函数?答案:kmalloc()、kzalloc()、vmalloc()。解读:(1)void *kmalloc(size_t size, gfp_t flags);①申请连续的物理内存,这对于要进行DMA的设备十分重要,但大小不能超过128KB,其中有16B是被页描述符占用了。②较常用的flag有GFP_ATOMIC(分配内存的过程是一个原子过程)、GFP_KERNEL(正常分配内存)、GFP_DMA(给DMA控制器分配内存)。③对应的内存释放函数为void kfree(const void *objp)。(2)void *kzalloc(size_t size, gfp_t flags);①kzalloc()相对kmalloc()只是额外增加了__GFP_ZERO标志,除了申请内存外,还会对申请到的内存内容清零。②对应的释放函数也是kfree()。(3)void *vmalloc(unsigned long size);①申请虚拟地址连续的内存空间,但其对应的物理内存不一定连续,因此对申请的内存大小没有限制。②对应的内存释放函数为void free(const void *addr)。③注意:vmalloc()和vfree()可以睡眠,因此不能在中断上下文调用。1.3内核程序中申请内存和应用程序时申请内存有什么区别?答案:内核中申请内存空间用的是函数kmalloc、kzalloc、vmalloc,应用程序申请内存用的函数是malloc。解读:(1)kmalloc/kzalloc直接分配连续的物理地址(虚拟地址也是连续的)。(2)vmalloc分配连续的虚拟地址,但物理地址不一定连续。分配时实际分配了物理内存,不过这个物理内存页面是在公共的页表进行了映射,并没有在本进程的页表进行映射,当访问这段内存时,触发do_page_fault异常(缺页中断)才完成页表的同步工作。(4)malloc是用户空间申请内存的方法,分配连续的虚拟地址,物理地址一般不会连续。在分配时并没有做实际物理页的分配动作,实际分配物理页的动作是在do_page_fault异常(缺页中断)处理中完成的。1.4自旋锁和信号量在互斥使用时需要注意什么?在中断服务程序里面的互斥是使用自旋锁还是信号量? (1)使用自旋锁的进程不会睡眠, 而使用信号量的进程会睡眠。(2)中断服务程序使用的是自旋锁,原因是中断服务程序处于中断上下文,中断上下文是不参与调度的,也就没有保护现场与恢复现场,一旦睡眠就回不来了。 以上内容摘自专刊《嵌入式岗位笔试面试真题讲解》,该专刊不仅有真题讲解,还有经验分享,不清楚嵌入式该学什么的同学,想找嵌入式实习/正式工作的同学,都可以来看看:              https://blog.nowcoder.net/zhuanlan/v0ELPM嵌入式公司推荐:华为、小米、OPPO、VIVO、荣耀、一加、CVTE、大疆、insta360影石、美的 、TCL、海信、创维、烽火、比亚迪、吉利、长安、大众、经纬恒润 、小鹏、图森未来、百度、滴滴、蔚来、理想、 联发科、 紫光展锐 、全志、寒武纪 、晶晨半导体 、汇顶、华为、中兴、浪潮 、TP-LINK、讯飞、商汤、海康威视 、浙江大华、360、小马智行、元戎启行、深信服、移动、联通、电信、旷视、四维图新、中芯国际、复旦微电子、极氪。#牛客AI配图神器#
点赞 评论 收藏
分享
评论
点赞
10
分享

创作者周榜

更多
牛客网
牛客企业服务