嵌入式软件面试基础知识点

        准备了一些嵌入式软件面试的基础知识点,有一些是面试中常见的问题,大部分问题都配有答案。作者水平有限,部分问题的答案可能会有错误或者没有答案,希望能给秋招春招的同学们一点小帮助。以后如果有补充将会不定时更新!

1、stm32时钟系统(以stm32f1为例)。

(1)stm32时钟源有五个:

        ①HSI_RC(高速内部时钟源,RC振荡电路8MHz)

        ②HSE_OSC(高速外部时钟源,晶振,4~16MHz,一般为8MHz)

        ③LSI_RC(低速内部时钟源,RC振荡电路40KHz)

        ④LSE_OSC(低速外部时钟源,晶振,32.768KHz)

        ⑤PLL_CLK(锁相环时钟源,由HSI或HSE分频得到)

        ps:RC振荡电路产生的时钟源不稳定,一般情况下使用晶振

(2)系统内各时钟来源:

        ①系统时钟(SYSCLK)来源:HSI、HSE、PLL

        ②实时时钟来源:HSE(分频)、LSI、LSE

        ③看门狗时钟来源:LSI

        ④USB时钟来源:PLL(分频)

(3)stm32f1有两条外设时钟总线,分别为APB1和APB2,这两个总线时钟都是由系统时钟(SYSCLK)分频而来,其中APB1为低速时钟总线(通用定时器、串口、I2C、USB),APB2为高速时钟总线(IO口、ADC、SPI)。

 图片源自正点原子STM32配套学习视频PPT

2、C语言堆和栈的区别。

(1)栈区空间较小,由系统自动分配内存空间,同时系统自动释放空间。

    堆区空间较大,需要手动申请空间并指明大小,并且需要手动释放空间。

(2)栈区的空间可以静态分配也可以自动分配。

    堆区的空间都是动态分配,没有静态的堆。

(3)栈区空间较小,所以存放的一般都是生命期比较短的数据,例如函数的参数和局部 变量等。

    堆区空间较大,存放动态申请的内存等。

(4)栈区的地址是连续的,不会产生内存碎片。栈是向低地址扩展的数据结构。

    堆区的地址不一定连续,很容易产生内存碎片。堆是向高地址扩展的数据结构。

3、什么是推挽输出?

        推挽输出是指既可以输出低电平,也可以输出高电平,可以直接驱动功耗不大的数字器件。

        推挽电路是由两个三极管或MOSFET,以推挽方式存在于电路中,电路工作时,两只对称的开关管每次只有一个导通,所以导通损耗小、效率高、既提高电路的负载能力(带负载能力增强),又提高开关速度。

4、单片机上电之后不运行,可能的原因有哪些?

(1)供电电压是否正常

(2)复位引脚是否正常

(3)晶振是否起振

5、举例:单片机的型号和主要参数

        

6、结构体、联合体、sizeof

结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

参考博客:C语言共用体(C语言union用法)详解

7、串口和并口的区别

        串行接口也称串口(Serial Interface),通常指COM接口(例如stm32的串口和电脑上的USB串口),串口数据传输是数据一位一位地按顺序在串口线上进行传输,特点是结构简单,成本低,适用于远距离传输。缺点是传输速度慢。

        并行接口简称并口(Parallel interface),指采用并行传输方式来传输数据的接口标准。并口数据传输是数据多位同时在并口线上进行传输,最常见的是8位并口,特点是传输速度快,缺点是远距离传输成本高。

8、局部变量和全局变量分别存放在哪里

(1)局部变量:栈区

(2)全局变量:静态存储区

(3)动态申请的数据(malloc):堆区

9、精度和分辨率有什么区别

        对于一把10cm的尺子,假设它有100个均匀分布的刻度,那么我们就可以理解为这把尺子的分辨率是10cm/100 = 0.1cm,但是实际上我们并不知道这把尺子是否真的就是10cm,或者说我们并不知道这把尺子的每个刻度是否真的就是0.1cm,因为他可能与真实的0.1cm有一点误差。此时,如果说这把尺子的精度是±5%,那么这把尺子的真实长度可能是9.5cm~10.5cm。所以,分辨率指的是测量仪器在没有误差的情况下所能测得的最小数值,大部分情况下分辨率与分度值相同;而精度则是指测量仪器的测量结果与真实值之间的偏差。

10、static关键字

(1)一个声明为static的局部变量仅初始化一次,在函数调用结束后其值会被保留而不会被释放。

(2)一个声明为static的全局变量,仅能被模块内的其他函数调用而不能在模块外调用。

(3)一个声明为static的函数,仅能在声明它的模块内被调用而不能在模块外调用。

11、SPI

SPI是四线的全双工通信,四根线分别为:

        ①MISO(Master Input Slave Output):主设备数据输入,从设备数据输出

        ②MOSI(Master Output Slave Input):主设备数据输出,从设备数据输入

        ③SCLK:时钟信号,由主设备提供

        ④CS:从设备片选信号,由主设备提供

参考博客:SPI通信协议(SPI总线)学习 - 涛少& - 博客园

12、I2C

(1)I2C是两线的半双工通信,一根时钟线SCL,一根数据线SDA。

(2)I2C协议:

        ①空闲状态:SCL和SDA均为高

        ②START:SCL为高期间,SDA从高到低跳变

        ③END:SCL为高期间,SDA从低到高跳变

        ④ACK(应答):应答信号一般出现在每个字节数据的后面,即第九位,在SCL为高期间SDA持续稳定为底则表示有效应答,如果SDA持续稳定为高则表示否应答。

        ⑤数据的有效性:SCL为高期间,SDA持续稳定为高则表示1,如果SDA持续稳定为低则表示0。

(3)I2C数据包组成:(上图为写,下图为读)

13、中断的处理流程

14、什么是预编译,何时需要预编译

(1)不经常改动的大型代码体可以预编译。多个模块都使用同一标准的头文件和相同的编译条件,可以将所有头文件进行预编译。

(2)预编译指令指示了在程序正式编译前由编译器进行的操作,可以放在程序中的任何位置。

15、一个32位的机器,该机器的指针是多少位?

        指针是多少位取决于地址总线的位数。一个机器是多少位的取决于处理器一次运算所能处理的二进制数的位数。

16、局部变量与全局变量重名

        在局部变量的作用范围内,局部变量会屏蔽全局变量。

17、进程和线程的区别

基本概念:进程是资源分配的最小单位,线程是CPU调度的最小单位。

(1)一个进程可以包含多个线程

(2)同一进程中多个线程之间资源可以共享,不同进程之间资源无法共享

(3)进程比线程消耗更多的资源

(4)进程之间不会互相影响,但是一个线程崩溃将会导致整个进程崩溃

(5)为什么要多线程?

        机器的运行,实际上就是CPU与相关寄存器和RAM之间的数据交流。但是CPU的速度很快,往往比寄存器和RAM的操作快得多,为了提高CPU的利用率,我们往往会创建一个进程,然后在进程下面创建多个线程,让它们轮流获得CPU的使用权,减小CPU的闲置时间。

(6)为什么要多进程?

        对于如果的CPU而言,一个CPU内部可能不是一个核而是多核,多线程技术可以提高CPU中多核的运行效率,最大限度地使用计算机解决问题。

18、TCP和UDP的区别

(1)TCP是面向连接的,UDP是无连接的,即发送数据之前不需要建立连接。

(2)TCP比UDP更可靠,TCP尽可能保证数据无差错,不丢失,不重复且按顺序到达;UDP只是尽最大努力传输数据,不保证数据的可靠性。

(3)UDP省去了繁琐的交互和检错,具有较好的实时性,工作效率比TCP高。适用于需要高速传输和对实时性有较高要求的通信场景。

(4)TCP是点对点通信,UDP支持一对一、一对多、多对一、多对多的通信方式。

19、指针函数与函数指针

(1)定义不同

        指针函数本质是一个函数,其返回值为指针。

        函数指针本质是一个指针,其指向一个函数。

(2)写法不同

        指针函数:int* fun(int x,int y);

        函数指针:int (*fun)(int x,int y);

        可以简单粗暴的理解为,指针函数的*是属于数据类型的,而函数指针的星号是属于函数名的。再简单一点,可以这样辨别两者:函数名带括号的就是函数指针,否则就是指针函数。

参考博客:函数指针和指针函数用法和区别

20、C语言编译过程

主要流程概括为:

(1)预编译(处理预编译指令),由.c文件生成.i文件

(2)编译(检查语法,优化代码),由.i文件生成.s文件

(3)汇编(由汇编生成机器码),由.s文件生成.o文件

(4)链接(连接各个模块,生成可执行文件),由.o文件生成可执行文件

参考博客:C语言编译和链接过程简介_liuchunjie11的博客-CSDN博客_c语言编译过程

 如果有需要word文档的同学可以留下邮箱,给个三连奥!

  • 12
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
嵌入式面试基础知识准备包括一些常见问题和答案,以及一些关于嵌入式软件开发的基础知识点。例如,关于Linux进程状态,常见的有3种状态:运行态、就绪态和等待态,而不是6种。在C语言方面,一些基础知识点包括volatile、const、static和指针等。volatile关键字通常用于多线程编程中,用于标识变量可能会被其他线程修改,需要使用该关键字来确保在编译器优化时不对这些变量进行优化。举几个需要使用volatile关键字的例子可以是多线程共享的变量或者与硬件相关的寄存器。除了这些基础知识点外,还可能涉及到其他嵌入式相关的内容,如嵌入式系统架构、设备驱动、嵌入式操作系统等。为了更好地准备嵌入式面试,建议学习这些基础知识点,并且多做一些实际的嵌入式开发项目,以增加实践经验。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [嵌入式软件面试基础知识点](https://blog.csdn.net/m0_56041246/article/details/121481340)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【嵌入式面试嵌入式知识点面经整理](https://blog.csdn.net/weixin_42112090/article/details/128686200)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值