嵌入式应用软件开发中C语言方向面试题
嵌入式应用软件开发中C语言方向面试题随笔
- 前言
- 一、C语言基础
- 二、嵌入式开发相关
- 三、硬件相关知识
- 五、实际编程问题
前言
做嵌入式开发这么多年了,简单记录下C语言方向常见面试题,这里是应用软件方向的。
一、C语言基础
- C语言的指针与数组的区别是什么?
- 指针:指针是一个变量,用来存储另一个变量的地址。指针可以进行算术运算(加减),并且可以指向不同的内存位置。
- 数组:数组是一个由相同类型的数据元素组成的集合。在C语言中,数组的名字代表数组的首地址,但数组本身是一个固定大小的集合,不能改变其大小。
- 请解释一下C语言中
const
的使用场景及其作用。
const
关键字用于声明常量或指针常量。它的作用是告诉编译器某些变量的值不可改变,增加程序的可读性和安全性。- 用法:
const int x = 10;
:声明一个常量x
,其值不能被修改。int * const ptr;
:声明一个指向整数的常量指针,指针本身不能改变,但指向的值可以改变。
- C语言中的
static
关键字的作用是什么?
static
有两个作用:- 局部变量:在函数内部,
static
使得变量的生命周期延续到程序结束,即变量不会在函数调用结束后消失,保持上一次调用时的值。 - 全局变量和函数:在文件作用域内,
static
限制了变量或函数的作用域,只能在当前文件内使用,不能被外部链接(其他文件访问)。
- 局部变量:在函数内部,
- C语言中
volatile
的作用是什么?
volatile
关键字告诉编译器不要对该变量进行优化。通常用于硬件寄存器、外部中断或多线程环境下的共享数据,以确保每次访问变量时都重新从内存中读取其最新值,而不是使用编译器优化的缓存值。
- C语言中
union
和struct
的区别是什么?
struct
是结构体,存储的数据项大小为所有成员大小之和,成员可以是不同类型,每个成员有独立的内存空间。union
是共用体,所有成员共享相同的内存空间,大小为最大成员的大小,只有一个成员可以存储数据。
- 如何在C中实现动态内存分配?
- 使用标准库中的
malloc
、calloc
、realloc
和free
来动态分配和释放内存。malloc(size)
:分配size
字节的内存。calloc(count, size)
:分配count
个size
字节的内存并初始化为0。realloc(ptr, size)
:重新分配内存,调整原指针ptr
所指内存的大小为size
字节。free(ptr)
:释放由malloc
、calloc
、realloc
分配的内存。
- 简述
sizeof
操作符的工作原理,并说明其应用场景。
sizeof
是一个编译时操作符,用于返回对象或数据类型的大小(以字节为单位)。它在编译时确定类型的大小,而不需要运行时计算。- 示例:
sizeof(int)
返回4
(在大多数平台上),sizeof(array)
返回数组的总字节数。
- 在C语言中,如何防止内存泄漏?
- 防止内存泄漏的关键是每次动态分配内存后,确保在不再使用时释放内存。应遵循以下原则:
- 每次
malloc
、calloc
或realloc
之后,确保调用free
来释放内存。 - 在程序结束前进行内存检查,防止未释放的内存块导致泄漏。
- 使用智能指针或内存管理库(如
valgrind
)帮助检测内存泄漏。
- 每次
- 什么是内存对齐,如何在嵌入式系统中处理内存对齐问题?
- 内存对齐是指将数据类型存储在内存中时按其数据类型大小的整数倍进行存放,以提高内存访问效率。大多数处理器要求基本数据类型的地址是它们大小的整数倍。
- 处理内存对齐问题:可以使用编译器指令如
#pragma pack
(在GCC中为__attribute__((packed))
)来控制内存对齐。
二、嵌入式开发相关
- 嵌入式系统中的“中断”是什么?它如何工作?
- 中断是指在处理器执行程序时,硬件或软件发出的信号,打断当前指令的执行,转而执行中断服务程序(ISR)。中断可由外部设备(如外部硬件信号)或内部事件(如定时器超时)触发。
- 如何处理中断嵌套?
- 中断嵌套是指一个中断服务程序(ISR)在执行时可以被另一个更高优先级的中断打断。处理方法通常包括:
- 配置优先级,使得高优先级的中断可以打断低优先级的中断。
- 使用嵌套中断的中断控制器或嵌套向量表。
- 解释一下嵌入式系统中的RTOS与裸机编程的区别。
- RTOS(实时操作系统)提供任务调度、内存管理、资源共享等高级功能,适用于需要精确时间控制的应用。
- 裸机编程指没有操作系统的环境,直接与硬件交互,适用于资源有限或对实时性要求极高的简单系统。
- 什么是
ISR
(Interrupt Service Routine)?它有什么要求?
ISR
是响应中断的函数,其要求包括:- 必须尽可能短,避免长时间占用处理器资源。
- 禁用中断嵌套,避免死锁。
- 必须清除中断源,以防止中断重复触发。
- 如何在C语言中实现一个简单的任务调度器?
- 可以通过定时器和轮询方式来实现简单的任务调度:
- 将任务函数放入队列或环形缓冲区。
- 使用定时器中断周期性地执行任务。
- 根据优先级或其他策略调度不同的任务。
- 如何在嵌入式开发中优化代码的执行效率和内存使用?
- 优化方法包括:
- 使用内存池、数据结构优化减少内存碎片。
- 使用
inline
函数避免函数调用开销。 - 避免不必要的全局变量和堆内存使用。
- 使用位操作和简化算法来加速计算。
- 什么是内存池(Memory Pool),如何使用它来优化内存管理?
- 内存池是预先分配一块内存区域,将其划分为多个固定大小的内存块,从而减少动态内存分配的开销,并避免内存碎片。
- 如何使用DMA(Direct Memory Access)提高数据传输效率?
- DMA允许外设直接与内存进行数据交换,不需要CPU的干预,从而减轻CPU负担,提高数据传输效率。配置DMA控制器并启用相应的中断处理。
- 如何在C中操作硬件寄存器?
- 可以通过指针访问硬件寄存器,通常是通过特定的地址进行读写:
#define REGISTER_ADDRESS
相关文章:
嵌入式应用软件开发中C语言方向面试题
嵌入式应用软件开发中C语言方向面试题随笔 前言一、C语言基础二、嵌入式开发相关三、硬件相关知识五、实际编程问题前言 做嵌入式开发这么多年了,简单记录下C语言方向常见面试题,这里是应用软件方向的。 一、C语言基础 C语言的指针与数组的区别是什么?指针:指针是一个变量…...
linux 系统配置ip
最常见的配置方法是通过 DHCP 获取动态 IP 地址,或者手动配置一个静态 IP 地址。下面我将详细说明这两种常见的配置方法。 通过 DHCP 自动获取 IP 地址 如果你的开发板连接到网络(比如通过网线或者 Wi-Fi),并且网络环境支持 DHCP…...

低代码开发:开启企业数智化转型“快捷键”
一、低代码开发浪潮来袭,企业转型正当时 在当今数字化飞速发展的时代,低代码开发已如汹涌浪潮,席卷全球。从国际市场来看,诸多企业巨头纷纷布局低代码领域,像微软的 PowerApps、OutSystems 等平台,凭借强大…...
Tailwind CSS 实战:性能优化最佳实践
在现代网页开发中,性能优化就像是一场精心策划的马拉松。记得在一个电商项目中,我们通过一系列的性能优化措施,让页面加载时间减少了 60%,转化率提升了 25%。今天,我想和大家分享如何使用 Tailwind CSS 进行性能优化。 优化理念 性能优化就像是在打磨一块璞玉。我们需要通过各…...

[redux] useDispatch的两种用法
先重写2个方法先, 方便ts类型推导,如果你看不懂为什么这么写, 先看我这篇 [redux] ts声明useSelector和useDispatch-CSDN博客 export type RootState ReturnType<typeof store.getState>; export type AppDispatch typeof store.dispatch; export const useAppDispat…...

Postgresql 命令还原数据库
因为PgAdmin打不开,但是数据库已经安装成功了,这里借助Pg命令来还原数据库 C:\Program Files\PostgreSQL\15\bin\psql.exe #链接数据库 psql -U postgres -p 5432#创建数据库 CREATE DATABASE "数据库名称"WITHOWNER postgresENCODING UTF8…...

电脑找不到mfc110.dll文件要如何解决?Windows缺失mfc110.dll文件快速解决方法
一、mfc110.dll文件的重要性 mfc110.dll,全称Microsoft Foundation Class Library 110,是Microsoft Visual C Redistributable for Visual Studio 2012的一部分。这个动态链接库(DLL)文件对于支持基于MFC(Microsoft F…...
Elasticsearch与数据库数据一致性:最佳实践与解决方案
在现代应用程序中,Elasticsearch(ES)作为一个高效的分布式搜索引擎,常常与数据库一同使用,以提供强大的搜索、分析和数据可视化功能。然而,数据库和Elasticsearch之间的同步与一致性常常成为一个挑战。如何…...

vue导入导出excel、设置单元格文字颜色、背景色、合并单元格(使用xlsx-js-style库)
npm i xlsx-js-style <template><button click"download">下载 Excel 表格</button><el-table :data"tableData" style"width: 100%"><el-table-column prop"date" label"日期" width"180…...

电子电气架构 --- 中央处理器HPC及软件架构
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...
代码实战:基于InvSR对视频进行超分辨率重建
Diffusion Models专栏文章汇总:入门与实战 前言:上一篇博客《使用Diffusion Models进行图像超分辩重建》中讲解了InvSR的原理,博主实测的效果是非常不错的,和PASD基本持平。这篇博客就讲解如何利用InvSR对视频进行超分辨率重建。 目录 环境准备 代码讲解 环境准备...

一文读懂主成分分析法(PCA)
主成分分析法(PCA) 主成分分析法(PCA)主成分分析的基本思想主成分的计算主成分分析的原理主成分分析的特点主成分分析的应用 主成分分析法(PCA) 主成分分析的基本思想 PCA是1901 年Pearson在研究回归分析…...
Redis(基础篇 + 实践篇 )
01 | 基本架构:一个键值数据库包含什么? Redis 作为一个内存数据存储系统,它的架构设计非常简洁,但功能非常强大。理解其核心架构对高效使用 Redis 至关重要。 客户端与服务器架构: 客户端通过 TCP 协议连接到 Redis …...
高质量C++小白教程:2.10-预处理器简介
当你在编译项目时,你可能希望编译器完全按照你编写的方式编译每一个代码文件,当事实并非如此。 相反,在编译之前,每一个.cpp文件都会经历一个预处理的阶段,在此阶段中,称为预处理器的程序对代码文件的文本进行各种更改. 预处理器实际上不会以任何方式修改原始代码文件,预处理…...

一、二极管(模电理论篇)
导论:PN结(结电容)是构成二极管,三极管,场效应管的原理基础 1.二极管特性(单向导电性) 1.1 P型半导体与N型半导体 在单晶体硅(原子核为正四价电子,可以形成四条共价键&…...

JAVA学习笔记_JVM
文章目录 初识jvm内存结构程序计数器(寄存器) 栈问题辨析内存溢出 线程诊断本地方法栈Heap堆内存溢出内存诊断 方法区内存溢出常量池 stringTable直接内存垃圾回收 初识jvm JRE JVM 基础类库 JDK JRE 编译工具 JavaSE JDK IDE工具 JavaEE JDK 应用服务器 IDE工具 jvm是…...
SQL 中复杂 CASE WHEN 嵌套逻辑优化
目标:优化复杂的 CASE WHEN 逻辑,提升 SQL 语句的可读性与执行效率,减少多层嵌套带来的复杂性。 1. CASE WHEN 的常见问题 嵌套过深:多个条件判断嵌套,难以阅读和维护。重复逻辑:相似逻辑在多个分支中重复…...

STM32-笔记34-4G遥控灯
4G接线 一、项目需求 服务器通过4G模块远程遥控开关灯。 二、项目实现 复制项目文件夹38-wifi控制风扇项目 重命名为39-4G遥控点灯 打开项目文件 加载文件 main.c #include "sys.h" #include "delay.h" #include "led.h" #include "ua…...

被催更了,2025元旦源码继续免费送
“时间从来不会停下,它只会匆匆流逝。抓住每一刻,我们才不会辜负自己。” 联系作者免费领💖源💖码。 三联支持:点赞👍收藏⭐️留言📝欢迎留言讨论 更多内容敬请期待。如有需要源码可以联系作者免…...

Java(day1)
注释 在Java中注释分为单行注释、多行注释还有文档注释 //我是单行注释/*我 是多行 注释 *//** 我是文档注释*/ 关键字 关键字:是被Java赋予了特定含义的英文单词 特点:关键字的字母都是c 在常用的代码编辑器中关键字都有特殊的高亮标记 在这个里…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...

通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...