嵌入式MCU面经(突击版)

C语言

  1. 联合体和结构体的区别:
    1. 首先最直观的就是数据类型名称上的区别:联合体union,结构体struct。
    2. 最大的区别:联合体共用内存;结构体不共用内存。具体来说,联合体里如果有多个联合体成员,整个联合体的内存大小就是该联合体内最大成员的大小,不涉及到字节对齐。结构体里如果有多个结构体成员,整个结构体的内存大小是该结构体成员经过字节对齐后总内存的大小。
    3. 比如说,联合体里有一个int成员和一个char成员,那么这个联合体的大小就是4个字节;结构体里有一个int成员和一个char成员,那么这个结构体的大小就是8个字节,这里char成员需要与int类型进行字节对齐,所以最终大小是8个字节。
    4. 联合体有一个很特别的用途,就是可以判断当前系统是大端存储还是小端存储;所谓大端存储,就是高字节数据存储在地址低位,低字节数据存在地址高位;小端存储就是高字节数据存储在地址高位;低字节数据存储在地址低位。
  2. 通过联合体判断系统大小端的代码如下:
#include <stdio.h>union {int num;char byte;
} test;int main() {test.num = 0x01020304;if (test.byte == 0x04) {printf("当前系统是小端序\n");} else if (test.byte == 0x01) {printf("当前系统是大端序\n");} else {printf("无法判断系统的字节序\n");}return 0;
}
  1. static是什么?有什么作用?
    1. static是一个C语言关键字,用于控制变量或者函数的存储位置和作用域。
    2. static修饰局部变量。如果直接声明一个局部变量不加其他修饰,该变量会存储在栈中,随函数调用结束而被销毁。用static修饰局部变量后,该变量存储位置会发生改变,会存储在内存中的.data数据段(静态数据区),该局部变量不会随函数的调用结束而被销毁,其生命周期是整个程序的运行周期。
    3. static修饰全局变量。用static修饰的全局变量,其存储位置在内存中的.data数据段,且该全局变量不能被外部文件使用,仅全局变量所在的当前文件可以访问该变量,外部文件无法通过extern等方法来访问。
    4. static修饰函数。使用static关键字修饰的函数是一个静态函数,其作用域就是当前文件,该函数不能被其他文件访问调用。
  2. const是什么?有什么作用?
    1. const是一个关键字,表示只读。const用于保护数据不被修改和提高代码的可读性。可以应用于变量、指针、函数参数等场景。
    2. const修饰变量。用const修饰的变量会存储在内存中的只读区,这个变量会变成常量,是无法修改的,是只读的。
    3. const修饰指针。用const修饰指针有两种常见的说法:指针常量和常量指针。指针常量,本质上是修饰一个常量:const int *p,p是指向int类型常量的指针,指向的数据不可以修改,但p本身可以修改,可以指向其他地址。常量指针,本质上是修饰一个指针: int *const p,这里p是一个常量指针,指针本身的指向不可修改,但其指向的值可以被修改。
    4. const修饰函数参数。保证传入函数的参数不能在函数内部被修改。

单片机

  1. STM32启动流程:(根据boot引脚选择启动区域)
    1. boot1为0,通过片内flash启动。
    2. boot0为0,boot1为1,通过系统存储器ROM启动。
    3. boot0为1,boot1为1,通过SRAM启动
  2. 中断:
    1. 中断可以理解为正在执行某段程序时,突然被打断,转而执行中断事件相关的程序,执行完了再回来执行最开始的程序。中断简单的可以从前后台系统的角度来理解,我们需要循环执行的程序是后台任务,中断事件对应的是前台任务。中断是一个很广泛的概念,除了单片机还有很多场景下都会涉及到中断,这里以单片机的中断为例。
    2. 要想在单片机中捕获中断并执行对应的中断回调函数,需要先进行中断初始化。
    3. 中断初始化:
      1. 设置中断源,对应某个能产生中断的外设;
      2. 设置中断控制器,使能或者屏蔽某个外设的中断通道,设置中断的优先级等,STM中的NVIC(嵌套向量中断控制器)就是一种中断控制器;
      3. 使能CPU中断总开关。
    4. 单片机处理中断大概有以下三个步骤:
      1. 保存现场,涉及到PC、LR寄存器,入栈操作
      2. 查询中断向量表,判断中断类型,调用对应的中断处理函数
      3. 恢复现场,设置到PC、LR寄存器,出栈操作
  3. STM32的4中IO口类型:
    1. 上拉输入:用于IO读取,常态时为高电平
    2. 下拉输入:用于IO读取,常态时为低电平
    3. 推挽输出:可以输出高电平和低电平,驱动能力强,是比较常见的输出类型
    4. 开漏输出:只能输出低电平,需要外部接一个上拉电阻才能输出高电平

FreeRTOS

  1. 任务间通信的方式:队列、任务通知、事件组、信号量、互斥量
  2. FreeRTOS任务有几种状态:就绪态、运行态、阻塞态、挂起态
  3. 简单描述一下FreeRTOS操作系统:
    1. 内核小,可移植性高,适用于多种硬件平台;
    2. 具有任务调度、中断管理、内存管理等功能。
  4. FreeRTOS的中断管理:
    1. 在FreeRTOS中有一套专门的中断API,例如xQueueSendToBackFromISR
    2. 首先,中断是对应程序运行实时性要求的。FreeRTOS中的任务调度允许任务抢占、阻塞,但是中断不行,中断程序必须顺序的执行,不能因为等待某些资源而阻塞。其次,FreeRTOS中设计了一套中断专属的API,就是那些FromISR后缀的,这样设计可以将任务与中断的操作分开来,提高代码的可读性,且这样易于整体代码的维护和管理。
    3. FreeRTOS中主要分为两种中断,一类是更高优先级的中断,这类中断不能使用FreeRTOS中提供的API函数,而更低优先级的中断可以使用FreeRTOS的API。FreeRTOS是通过FreeRTOSconfig文件中的#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5 来判断可管理的最高优先级中断
  5. FreeRTOS中SYSTICK和PendSV中断的作用:
    1. SYSTICK中断是由系统定时器触发的中断,多久触发一次呢?根据configTICK_RATE_HZ来配置,一般配置为1kHz。任务调度器通过SYSTICK中断定期触发,根据任务的优先级和调度策略来决定是否切换当前运行的任务。就是说任务的调度是根据SYSTICK中断来触发的,但是要注意,SYSTICK只是触发。任务切换操作是在PendSV中断函数中执行的
    2. PendSV中断的优先级设置为最低,以确保它能够在其他中断完成后执行。
    3. 总体而言,SYSTICK中断提供了任务调度的时基,而PendSV中断用于执行实际的任务切换操作。这两者共同协作,实现了FreeRTOS的多任务调度机制。
  6. 为什么要在项目中使用RTOS?如果只是对于简单的任务开发,可以选择用裸机开发;如果对于业务要求比较复杂的项目,在单片机硬件资源允许的前提下,尽可能地选用RTOS进行代码开发,因为使用RTOS可以更好的实现复杂的业务逻辑,且编写代码过程中条理逻辑会更加清晰,程序的实时性也会更强
  7. 简述FreeRTOS启动流程:
    1. 硬件初始化
    2. 系统初始化
    3. 任务创建
    4. 开启调度器
  8. FreeRTOS常见的内存管理机制:
    1. heap_1:只实现了pvPortMalloc,没有pvPortFree,只分配内存,不回收
    2. heap_2:实现了pvPortMalloc和pvPortFree,使用的是best fit,最佳适配算法;缺点:碎片化,不会合并相邻内存
    3. heap_3:使用的是malloc和free,非线程安全,malloc时是先暂停FreeRTOS调度器再去分配内存
    4. heap_4:使用了first fit,首次适配算法;会合并相邻的空闲内存,较少碎片化
    5. heap_5:使用的内存分配算法和heap_4一样,但是不局限于管理一片大数组,可以管理多个分块

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/57773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS 本地存储地址(位置)

前言: UserDefaults 存在沙盒的 Library --> Preferences--> .plist文件 CoreData 存在沙盒的 Library --> Application Support--> xx.sqlite 一个小型数据库里 (注:Application Support 这个文件夹已开始是没有的,只有当你写了存储代码,运行之后,目录里才会出…

MT-Pref数据集:包含18种语言的18k实例,涵盖多个领域。实验表明它能有效提升Tower模型在WMT23和FLORES基准测试中的翻译质量。

2024-10-10&#xff0c;由电信研究所、里斯本大学等联合创建MT-Pref数据集&#xff0c;它包含18种语言方向的18k实例&#xff0c;覆盖了2022年后的多个领域文本。通过在WMT23和FLORES基准测试上的实验&#xff0c;我们展示了使用MT-Pref数据集对Tower模型进行对齐可以显著提高翻…

C++list

1.迭代器的功能以及性质 功能有iterator&#xff0c;reverse_iterator&#xff0c;const_iterator&#xff0c;const_reverse_iterator 性质有单向&#xff0c;双向和随机&#xff0c;单向的迭代器只能操作&#xff0c;双向只能/--俩种&#xff0c;随机则可以执行/--//-的操作…

【C++篇】栈的层叠与队列的流动:在 STL 的韵律中探寻数据结构的优雅之舞

文章目录 C 栈与队列详解&#xff1a;基础与进阶应用前言第一章&#xff1a;栈的介绍与使用1.1 栈的介绍1.2 栈的使用1.2.1 最小栈1.2.2 示例与输出 1.3 栈的模拟实现 第二章&#xff1a;队列的介绍与使用2.1 队列的介绍2.2 队列的使用2.2.1 示例与输出 2.3 队列的模拟实现2.3.…

[快速阅读八] Matlab中bwlookup的实现及其在计算二值图像的欧拉数、面积及其他morph变形中的应用。...

以前看过matlab的bwlookup函数&#xff0c;但是总感觉有点神秘&#xff0c;一直没有去仔细分析&#xff0c;最近在分析计算二值图像的欧拉数时&#xff0c;发现自己写的代码和matlab的总是对不少&#xff0c;于是又去翻了下matlab的源代码&#xff0c;看到了matlab里实现欧拉数…

JS轮播图实现自动轮播、悬浮停止轮播、点击切换,下方指示器与图片联动效果

代码&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><s…

计算机网络原理总结C-网络层

网络层 网络层提供的两种服务网际协议IP 虚拟互连网络IP地址子网掩码&#xff08;无分类编址CIDR&#xff09;IP地址和MAC地址IP数据报格式&#xff08;路由&#xff09;转发分组的流程 因特网的路由选择协议&#xff08;动态路由协议&#xff09; 网际控制报文协议ICMPIP多播…

麒麟v10 arm64 部署 kubesphere 3.4 修改记录

arm64环境&#xff0c;默认安装 kubesphere 3.4 &#xff0c;需要修改几个地方的镜像&#xff0c;并且会出现日志无法显示 1 fluentbit:v1.9.4 报错 <jemalloc>: Unsupported system page size Error in GnuTLS initialization: ASN1 parser: Element was not found. &…

Java最全面试题->数据库/中间件->Redis面试题

文章目录 Redisredis的数据类型有哪些?Redis 内部结构有哪些?Memcache 与 Redis 的区别都有哪些?为什么 redis 需要把所有数据放到内存中?Redis 如何进行持久化?RDB和AOF的优缺点有哪些?什么是缓存穿透?如何避免?什么是缓存雪崩?何如避免?redis的淘汰策略有哪些?Red…

用更多的钱买电脑而不是手机

如果&#xff0c;我们对自己的定义是知识工作者&#xff0c;那么在工作、学习相关的电子设备投入上&#xff0c;真的别舍不得花钱。 需要留意的是&#xff0c;手机&#xff0c;对于大部分在电脑前工作的人&#xff0c;不是工作设备。在我看来&#xff0c;每年投入到电脑的钱&…

【高级IO】IO多路转接之select

select函数 我们知道IO 等待 拷贝&#xff0c;系统提供select函数来实现多路复用输入/输出模型&#xff1b;select系统调用是用来让我们的程序监视多个文件描述符的状态变化的&#xff1b;程序会停在select这里等待&#xff0c;直到被监视的文件描述符有一个或多个发生了状态…

植物健康,Spring Boot来助力

3系统分析 3.1可行性分析 通过对本植物健康系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本植物健康系统采用SSM框架&#xff0c;JAVA作为开发语言&#…

钉钉录播抓取视频

爬取钉钉视频 免责声明 此脚本仅供学习参考&#xff0c;切勿违法使用下载他人资源进行售卖&#xff0c;本人不但任何责任! 仓库地址: GItee 源码仓库 执行顺序 poxyM3u8开启代理getM3u8url用于获取m3u8文件userAgent随机请求头downVideo|downVideoThreadTqdm单线程下载和…

【纯血鸿蒙】HarmonyOS和OpenHarmony 的区别

一、开源鸿蒙&#xff08;Open Harmony&#xff09; 鸿蒙系统愿来的设计初衷&#xff0c;就是让所有设备都可以运行一个系统&#xff0c;但是每个设备的运算能力和功能都不同&#xff0c;所以内核的设计上&#xff0c;采用了微内核的设计&#xff0c;除了最基础的功能放在内核…

logback 如何将日志输出到文件

如何作 将日志输出到文件需要使用 RollingFileAppender&#xff0c;该 Appender 必须定义 rollingPolicy &#xff0c;另外 rollingPollicy 下必须定义 fileNamePattern 和 encoder <appender name"fileAppender" class"ch.qos.logback.core.rolling.Rollin…

LLM | 论文精读 | 基于大型语言模型的自主代理综述

论文标题&#xff1a;A Survey on Large Language Model based Autonomous Agents 作者&#xff1a;Lei Wang, Chen Ma, Xueyang Feng, 等 期刊&#xff1a;Frontiers of Computer Science, 2024 DOI&#xff1a;10.1007/s11704-024-40231-1 一、引言 自主代理&#xff08;…

企业自建邮件系统选U-Mail ,功能强大、安全稳定

在现代企业运营中&#xff0c;电子邮件扮演着至关重要的角色&#xff0c;随着企业规模的增长和业务的多样化&#xff0c;传统的租用第三方企业邮箱服务逐渐显现出其局限性。例如&#xff0c;存储空间受限、数据安全风险、缺乏灵活的管理和备份功能&#xff0c;以及无法与其他企…

C++从入门到起飞之——红黑树 全方位剖析!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 1. 红⿊树的概念 2. 红⿊树的实现 2.1 构建整体框架 2.2 红黑树的插入 2.3 红黑树的验证 2.4 红黑树…

数据库、数据仓库、数据湖和数据中台有什么区别

很多企业在面对数据存储和管理时不知道如何选择合适的方式&#xff0c;数据库、数据仓库、数据湖和数据中台&#xff0c;这些方式都是什么&#xff1f;有什么样的区别&#xff1f;企业根据其业务类型该选择哪一种&#xff1f;本文就针对这些问题&#xff0c;来探讨下这些方式都…

ASP.NET Core 8.0 中使用 Hangfire 调度 API

在这篇博文中&#xff0c;我们将引导您完成将 Hangfire 集成到 ASP.NET Core NET Core 项目中以安排 API 每天运行的步骤。Hangfire 是一个功能强大的库&#xff0c;可简化 .NET 应用程序中的后台作业处理&#xff0c;使其成为调度任务的绝佳选择。继续阅读以了解如何设置 Hang…