嵌入式秋招面经总结

 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
全部评论

相关推荐

小公司 驱动开发 n*13
点赞 评论 收藏
分享
评论
点赞
9
分享

创作者周榜

更多
牛客网
牛客企业服务