关于我嵌入式软件面试之后记录下来的总结

面试岗位:嵌入式软件工程师
面试城市:重庆
本人专业:计算机分流至物联网

一、题目(些许)

1.大小端存储

大端存储模式:是指数据的低位字节序保存在内存的高地址中,而数据的高位字节序保存在内存的低地址中
小端存储模式:是指数据的低位字节序保存在内存的低地址中,而数据的高位字节序保存在内存的高地址中

大小端详解
理解:32位机器,int 01234567

地址低地址——>——>高地址
大端存储67452301
小端存储01234567

大端存储方便人阅读,小端存储方便机器操作。

2.计算机网络的七层模型

从底至上
物理层——>数据链路层——>网络层——>传输层——>会话层——>表示层——>应用层

3.什么是嵌入式系统?嵌入式系统有哪些?

将硬件电路与用于提供项目解决方案的软件编程技术集成的电子系统称为嵌入式系统。

简单点就是对硬件进行编程的系统。
1.μClinux
μClinux是一种优秀的嵌入式Linux版本,其全称为micro-control Linux,从字面意思看是指微控制Linux。
2.μC/OS-II
μC/OS-II是在μC/OS的基础上发展起来的,是用C语言编写的一个结构小巧、抢占式的多任务实时内核。
3.eCos
eCos(embedded Configurable operating system),即嵌入式可配置操作系统。
4.FreeRTOS
FreeRTOS操作系统是完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行。
5.RT-Thread
RT-Thread 是一款主要由中国开源社区主导开发的开源实时操作系统。
5种常见的嵌入式系统

4.RTOS是什么

实时系统

5.switch()参数不能是

支持类型:byte、char、short、int、long、bool、枚举类型
不支持类型:float、double、string

<think>好的,我现在需要帮助用户寻找针对嵌入式软件工程师的C语言面试题汇总。首先,用户提到了几个引用资料,我需要先看看这些引用内容是否相关,是否能提供有用的信息。 引用[1]提到的是2022年的嵌入式经典面试题汇总,主要关于C语言,用户去年面试时遇到的常见问题,并且强调了总结归纳的重要性。引用[2]是2024年的最新面试题及答案,虽然答案比较简略,但覆盖了100道题,可能包含最新的趋势。引用[3]中的代码示例是关于结构体内存对齐的问题,这是一个常见的C语言考点,特别是在嵌入式系统中,因为内存管理很关键。 接下来,我需要整理用户的需求。用户明确想要嵌入式软件工程师的C语言面试题汇总,所以需要从这些引用中提取相关内容,并可能补充常见的考点。首先,结构体内存对齐在嵌入式开发中非常重要,因为涉及到底层内存操作,所以这应该是一个重点问题。比如结构体的sizeof计算,如引用[3]中的例子,结构体s1的成员有char、int、double等,需要考虑对齐后的总大小。 然后是位操作和位域,这在嵌入式开发中经常用于寄存器操作和节省内存。例如,如何设置或清除特定的位,使用位掩码等。这也是常见的面试题。 指针和数组的区别,以及指针在嵌入式中的应用,比如函数指针、指针运算等。用户可能被问到指针和数组名的区别,或者如何用指针访问特定内存地址,这在操作硬件寄存器时很常见。 关键字const、volatile、static的作用。特别是volatile在嵌入式中的重要性,用于防止编译器优化,确保直接访问内存地址,比如处理硬件寄存器或中断变量。 动态内存分配在嵌入式中的使用限制,因为嵌入式系统通常资源有限,可能避免使用malloc/free,转而使用静态分配或内存池技术。这也是一个考点。 中断服务程序(ISR)的注意事项,比如避免长时间操作、不可重入函数的使用、volatile变量等。这涉及到嵌入式系统的实时性和可靠性。 此外,可能需要包括一些代码分析题,比如看一段代码找出错误,或者预测输出结果。例如,使用未初始化的指针、缓冲区溢出、递归调用导致栈溢出等。 另外,嵌入式系统中常用的编译优化选项,比如GCC的-O选项,以及如何确保关键代码不被优化,可能涉及到volatile和内存屏障的使用。 可能还需要涉及多任务和并发控制,比如使用信号量、互斥锁,但在C语言层面可能更偏向于基础的多线程知识,或者如何避免竞态条件。 最后,关于调试和测试的问题,比如如何使用调试工具,查看内存泄漏,或者使用断言(assert)进行调试。 总结一下,我需要将以上提到的知识点组织成结构清晰的问题列表,确保覆盖嵌入式C语言的核心考点,并结合引用中的例子进行说明。同时,注意使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$,并检查语法正确性。回答中使用中文,并在引用内容后添加标识符,比如[^1]、[^2]、[^3]。 现在需要确保问题分类合理,每个类别下列举几个典型问题,并给出简要答案或解析,同时引用相关参考资料。例如,在结构体内存对齐的问题中,可以引用中的结构体示例,说明其内存布局。 可能还需要补充一些没有在引用中明确提到但常见的问题,如大小端问题、联合体的使用、预处理器指令等,但需要确保这些内容确实属于嵌入式C语言的常见面试题。 最后,生成相关问题部分需要与回答内容相关,引导用户进一步思考或探索更深入的内容,例如关于优化方法、实际应用场景等。</think>以下是针对嵌入式软件工程师的C语言面试题汇总及解析,结合内存管理、语法特性和实际应用场景进行分类整理: --- ### 一、结构体内存对齐 1. **计算结构体大小** ```c struct s1 { char ch; // 1字节 int a; // 4字节 double b; // 8字节 char c1; // 1字节 }; ``` **答案**:假设系统对齐规则为按最大成员对齐(此处为8字节),则总大小为$1 + 3(\text{填充}) + 4 + 4(\text{填充}) + 8 + 1 + 7(\text{填充}) = 28$字节。 2. **如何手动调整对齐方式?** 使用`#pragma pack(n)`指令修改默认对齐值,或通过`__attribute__((aligned(n)))`指定成员对齐。 --- ### 二、指针与内存操作 1. **指针与数组的区别** - 数组名是常量指针,不可修改;指针是变量,可指向不同地址。 - `sizeof(数组)`返回总字节数,`sizeof(指针)`返回地址长度。 2. **函数指针的应用场景** 用于回调函数、状态机实现等。例如: ```c void (*callback)(int); // 定义函数指针 ``` 3. **访问特定内存地址** ```c volatile uint32_t *reg = (volatile uint32_t *)0x40000000; // 操作硬件寄存器 ``` --- ### 三、关键字与修饰符 1. **volatile的作用** 防止编译器优化,强制从内存读取变量值。常用于: - 多线程共享变量 - 硬件寄存器访问 2. **static的三种用途** - 函数内:变量持久化(只初始化一次) - 文件内:限制作用域 - 函数外:隐藏函数/变量 --- ### 四、嵌入式系统特有问题 1. **中断服务程序(ISR)注意事项** - 避免使用不可重入函数(如`printf`) - 使用`volatile`修饰共享变量 - 保持ISR短小,防止阻塞其他中断 2. **动态内存分配的限制** 嵌入式系统通常禁用`malloc/free`,因碎片化风险高,改用静态数组或内存池。 --- ### 五、代码调试与优化 1. **查找内存泄漏** 使用工具如Valgrind,或通过日志记录`malloc/free`调用。 2. **优化代码体积** - 编译时使用`-Os`选项(优化大小) - 移除未使用代码,启用链接时优化(LTO) --- ### 六、位操作与寄存器 1. **设置某一位为1** ```c PORT |= (1 << 3); // 设置第3位 ``` 2. **位域定义** ```c struct { unsigned flag1 : 1; unsigned flag2 : 2; } status; // 节省内存空间 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值