嵌入式每日面经之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
点赞 评论 收藏
分享
旧的一年即将结束,新的一年即将到来,提前祝大家新年快乐。对于24届的同学,春招就在眼前,对于25届的同学,秋招也不遥远了。作为经历过23届秋招的过来人,当时拿了,工控龙头-汇川技术的offfer,安防龙头-海康威视的offer,国内电车知名品牌-极氪的offer,都是嵌入式软件岗位。目前已经入职半年,并且已经成功转正,对于即将准备从事嵌入式软件的学弟学妹们,我提供一些学习与面试经验以供参考。首先,需要花1-2个月的时间,扎扎实实的把C语言过关,可以通过刷牛客上的选择题,以及算法编程题来提高。在有了扎实的C语言基础后,需要学习MCU思维,这里不是只会某一款MCU,而是通过学习一款MCU,来掌握所有MCU的开发思维。常见的MCU包括 ST、NXP、GD。还需要掌握操作系统,包括freertos 或者Linux,以及常用的通信协议,Modbus、CanOpen、Lwip、Ethercat、Profinet。其次,还需要学习数据结构,理解数据结构的作用,以及各种典型数据结构的思路,包括链表,队列,线性表,列表。最重要的是,需要有实际的项目经验,这是企业最看重的,尤其对于研究生来说,企业默认是要有工作经验的。本科生,企业更看重打比赛经历。所以一定要好好的准备一些拿得出手的项目,对于没有项目的学弟学妹,我可以提供。这些项目是我在读研期间给导师所作的四个项目,需要的同学可以私信我。#嵌入式##嵌入式软件#
点赞 评论 收藏
分享
评论
点赞
13
分享

创作者周榜

更多
牛客网
牛客企业服务