必背八股文-嵌入式基础篇1
本篇有关于嵌入式开发相关内容,一般面试官会结合你个人简历中项目负责内容进行相关知识点的提问。
芯片选型考虑哪些因素?
- 性能:确保芯片具有足够的处理能力来满足项目需求。
- 内存:选择具有足够RAM和ROM(或Flash)容量的芯片。
- 能耗:根据项目要求,权衡功耗和性能。
- 外设和接口:选择支持所需通信协议和设备连接的芯片。
- 封装和尺寸:考虑空间限制和生产要求,选择合适的封装类型。
- 开发工具和支持:选用具有良好文档和支持的芯片,降低开发难度。
- 供应和成本:确保稳定供应并选择性价比合适的芯片。
- 软件和生态系统:选择具有成熟软件支持和丰富生态系统的芯片。
- 安全性:根据项目要求,选择具有相应安全功能的芯片。
- 可扩展性:选择具有一定可扩展性和升级能力的芯片,以适应项目需求变化。
STM32F4和F1的区别,为什么选用F4?
内核不同:F1是Cortex-M3内核,F4是Cortex-M4内核;
主频不同:F1主频72MHz,F4主频168MHz;
浮点运算:F1无浮点运算单位没有硬件FPU处理浮点数运算,F4有;
(没有浮点加速硬件FPU只影响浮点计算的速度,并不是不能计算浮点数,因此只能通过内核的软件进行计算。先要把这个浮点数运算转换成定点数存储,再把这个定点数转换成指数的方式进行运算,不仅中间要进行数据转换,并且要进行多次移位,而整数型就不需要这么复杂的操作,直接运算就可以,所以F1浮点数运算不仅运算量大并且会加大MCU的负载,要慢很多)
功能性能:F4外设比F1丰富且功能更强大,比如GPIO翻转速率、上下拉电阻配置、ADC精度等;
内存大小:F1内部SRAM最大64K,F4有192K(112+64+16)。
F4的RAM和ROM:ram192K,rom大小2048K
考虑到需要浮点运算和使用RTOS系统,最后选择F4;
STM32启动过程:
- 处理器复位:当STM32芯片上电或者外部复位信号触发时,处理器的复位引脚将会被拉低,导致处理器执行复位操作。在复位期间,处理器会将各个寄存器的值初始化为默认值,并开始执行复位向量表中的第一条指令。
- 复位向量表:在STM32微控制器中,复位向量表是一个存储器区域,其中包含了处理器在复位时跳转执行的第一条指令的地址。通常,复位向量表位于存储器的起始地址,由芯片制造商预先定义。复位向量表的内容包括复位中断处理函数、中断向量表和其他初始化函数。
- 系统初始化:复位向量表中的第一条指令通常是一条跳转指令,将控制权转移到系统初始化函数的地址上。系统初始化函数主要用于设置处理器和系统的一些基本配置,例如时钟源和时钟频率的配置,初始化堆栈指针、全局变量等。
- C库初始化:在系统初始化完成后,通常会调用C库的初始化函数。C库的初始化函数主要是对C语言运行环境的初始化,包括清零BSS段(未初始化的全局变量)、复制数据段(初始化的全局变量)等。
- 主函数入口:C库初始化完成后,处理器将跳转到主函数的入口地址开始执行用户程序。主函数是程序的入口点,其中包含应用程序的具体逻辑。
需要注意的是,上述步骤是一般情况下的启动流程,具体的启动过程可能会因不同的芯片型号、启动模式和编译器设置而有所差异。此外,还可以通过修改复位向量表的内容来实现特定的启动操作,例如自定义复位中断处理函数或添加其他初始化函数。
stm32的定时器
提问定时器相关的,具体根据你个人开发使用情况解答。
- 定时器时钟使能:首先,需要使能所需的定时器时钟。这可以通过RCC(Reset and Clock Control)寄存器来配置。例如,如果要使用TIM2定时器,需要使能TIM2的时钟。
- 定时器配置:配置定时器的基本参数,例如计数器的工作模式、时钟分频系数、计数器的自动重载值等。这些配置可以通过定时器的相关寄存器进行设置。
- 定时器中断设置(可选):如果需要使用定时器中断,可以配置中断源和中断优先级,并使能定时器中断。
- 启动定时器:配置完成后,启动定时器开始计数。定时器可以通过软件触发或外部触发来启动计数。
- 定时器中断处理(可选):如果配置了定时器中断,当计数器达到设定的值时,会触发中断。在中断服务程序中可以执行相应的操作,例如更新计数器的值、处理中断标志等。
stm32的AD采样
提问AD采样相关的,具体根据你个人开发使用情况解答。
- ADC配置:首先,需要配置ADC模块的相关寄存器,包括时钟使能、采样时间、采样通道等。这些配置可以通过寄存器操作或者使用STM32提供的库函数进行设置。
- GPIO配置:为了使用ADC,需要将相应的GPIO引脚配置为模拟输入模式,并使能相应的ADC通道。这可以通过配置GPIO寄存器来完成。
- 触发方式设置:可以选择触发ADC转换的方式,例如软件触发或外部触发。如果选择外部触发,还需要配置相关的触发源和极性。
- ADC转换:在进行ADC转换之前,可以设置ADC分辨率、对齐方式、连续转换模式等。然后,可以通过启动转换命令或触发源来开始ADC转换。
- 中断或轮询获取结果:可以选择使用中断或轮询的方式获取ADC转换结果。如果使用中断方式,可以在转换完成后触发中断,并在中断服务程序中读取转换结果。如果使用轮询方式,则需要在转换完成后主动查询并读取转换结果。
- 结果处理:获取到ADC转换结果后,可以根据需要进行相应的处理,例如数据转换、单位换算等。
Linux嵌入式和单片机嵌入式区别:
复杂性:Linux嵌入式系统是基于Linux内核构建的,具有完整的操作系统功能,包括多任务处理、文件系统、网络协议等。相比之下,单片机嵌入式系统通常使用裸机编程或者实时操作系统(RTOS),具有更简单的系统结构和功能。
处理能力:Linux嵌入式系统通常在较强大的处理器上运行,例如ARM、x86等,具备较高的处理能力和存储容量。而单片机嵌入式系统使用单片机芯片,其处理能力和存储容量较低。
开发环境:Linux嵌入式系统使用标准的开发工具链和开发环境,可以使用高级编程语言(如C/C++)进行开发,并且具备广泛的软件支持和开发社区。单片机嵌入式系统的开发通常需要使用特定的单片机编程工具和汇编语言,开发资源相对较少。
系统定制性:Linux嵌入式系统具有很高的可定制性,可以根据应用需求选择所需的软件组件和功能,并且支持模块化的软件开发和更新。单片机嵌入式系统的定制性相对较低,往往需要在设计阶段确定所需功能和硬件配置。
成本和功耗:Linux嵌入式系统由于使用较高性能的处理器和较大容量的存储器,相对而言成本较高,并且功耗较高。单片机嵌入式系统由于采用低成本、低功耗的单片机芯片,成本较低且功耗较低。
总的来说,Linux嵌入式系统适用于需要复杂功能、较高性能和较大存储容量的应用,如智能手机、平板电脑、网络设备等。而单片机嵌入式系统适用于资源有限、功耗要求低、对实时性要求较高的应用,如传感器、家电、汽车电子等。
FreeRTOS、μC/OS的区别
开源性质:FreeRTOS是一个开源的RTOS,可以免费获取并在商业和非商业项目中使用。它具有广泛的用户社区和支持。而μC/OS是一种商业RTOS,需要购买许可证才能使用。
架构和内核:FreeRTOS采用基于优先级的抢占式内核架构,支持多任务处理、时间片轮转调度和中断服务机制。它提供了一套轻量级的内核函数和任务管理机制。μC/OS也是基于优先级的抢占式内核,但它提供了更多的功能,如事件标志、信号量、消息邮箱等,以满足更复杂的应用需求。
资源占用:FreeRTOS的内核非常小巧,具有低的存储器占用和快速的上下文切换速度,适用于资源有限的嵌入式系统。μC/OS相对而言具有更大的内核代码大小和更高的存储器占用,但它提供了更丰富的功能和可选组件。
硬件平台支持:FreeRTOS在多种处理器架构上都有支持,包括ARM、MIPS、x86等,因此它适用于广泛的硬件平台。μC/OS也支持多种处理器架构,但支持的硬件平台较少,且主要集中在微控制器和嵌入式系统上。
社区支持和生态系统:由于FreeRTOS的开源性质,它具有庞大的用户社区和广泛的生态系统,提供了丰富的示例代码、开发工具和支持资源。μC/OS作为商业RTOS,其用户社区和生态系统相对较小,但有专门的技术支持和服务。
在RTOS中,二值信号量和互斥量的区别?
二值信号量是一种计数器,只有两种状态:0和1。当一个任务试图获取一个已经被获取的二值信号量时,该任务会被挂起,直到该信号量被释放为止。二值信号量通常用于同步任务的开始或者结束,或者是保护共享资源的读写等。由于二值信号量不具有优先级继承功能,当高优先级任务等待低优先级任务释放二值信号量时,低优先级任务可能会优先执行,导致任务调度出现问题。
互斥量也是一种计数器,但它具有更多的状态。当一个任务获取一个已经被获取的互斥量时,该任务会被挂起,并且该互斥量的计数器会减一。只有当计数器归零时,该互斥量才会被释放。互斥量通常用于保护共享资源的读写等,它具有优先级继承功能,可以避免高优先级任务因为等待低优先级任务释放互斥量而被阻塞的问题。
在RTOS中,任务通知的运行机制是怎么样的?
- 发送任务向接收任务发送通知,通知包括通知值和接收任务的句柄。
- 接收任务准备好接收通知,并在等待通知列表中等待通知的到来。
- 发送任务调用发送通知的API函数,RTOS将通知保存到接收任务的等待通知列表中。
- 如果接收任务已经准备好接收通知,那么RTOS会将该任务从等待通知列表中移除,并唤醒该任务继续执行。
- 如果接收任务没有准备好接收通知,那么该任务会继续等待,直到接收任务准备好接收通知。
UCOS任务调度
一个任务,也称作一个线程。
UCOS有一个任务调度机制,根据任务的优先级进行调度。
一个是硬件中断, 那么系统会将当前任务有关变量入栈,然后执行中断服务程序,执行完成后出栈返回.
另一个是任务之间的切换,使用的方法就是任务调度,每一个任务有自己的栈,顺度也是一样的入栈,然后执行另一个程序,然后出线返回。
并非是每一任务按优先级顺序轮流执行的,而是高优先级的任务独占运行,除非其主动放弃执行,否则低优先级任务不能抢占,同时高优先级可以把放出去给低优先级任务使用的CPU占用权抢回来。所以UCOS的任务间要注意插入等待延时,以便UCOS切出去让低优先级任务执行。
UCOS中任务间的通信
在UCOS中,是使用信号量、邮箱(消息邮箱)和消息队列这些被称作事件的中间环节来实现任务间的通信的,还有全局变量。
信号量用于:
1.控制共享资源的使用权(满足互斥条件)
2.标志某时间的发生
3.使2个任务的行为同步
消息队列:
概念:
(1)消息队列实际上就是邮箱阵列。
(2)任务和中断都可以将一则消息放入队列中,任务可以从消息队列中获取消息。
(3)先进入队列的消息先传给任务(FIFO)。
(4)每个消息队列有一张等待消息任务的等待列表,如果消息列中没有消息,则等待消息的任务就被挂起,直到消息到来。
STM32 中断是怎么进入到中断服务程序的
在STM32中,中断服务程序是通过中断向量表来实现的。中断向量表是一个包含中断处理程序入口地址的表格,每个中断都有一个对应的中断向量,当该中断发生时,CPU会根据中断向量表找到该中断对应的中断处理程序入口地址,并跳转到该地址执行中断处理程序。
中断向量表的起始地址位于STM32的Flash或者SRAM中,中断向量表的
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏主要是介绍嵌入式软件开发岗位的相关知识和学习攻略,为大家提供一份笔试与面试手册。包括有嵌入式软件开发岗位介绍与学习攻略;校园招聘和offer疑惑问题的介绍;在笔试方面,如何刷题为笔试作准备,提供往年笔试真题;在面试方面,提供相关知识的复习重点,提供面试真题。包括有:华为、蔚来、文远、大疆、三一、深信服、亚马逊、Intel、百度、科大讯飞、OPPO、京东、中兴、比特大陆|算能、美团等等