面试题
- 1、Crotex-M 处理器才用的架构是"v7"
Cortex-M3处理器是基于ARMv7-M架构的处理器,支持更丰富的指令集,包括许多32位指令,这些指令可以高效的使用高位寄存器。另外,M3还支持:
查表跳转指令和条件执行(使用IT指令)
硬件除法指令
乘加指令(MAC)
各种位操作指令
支持更丰富的指令导致了更大的面积成本和更高的功耗。典型的微控制器,Cortex-M3的电路门数是Cortex-M0 和 Cortex-M0+两倍还多。但是,处理器的面积只是大多数现代微控制器的很小的一部分,多出来的面积和功耗经常不那么重要。
- 2、Cortex-M3 使用的存储器格式是"小端或者大端"
- 3、中断屏蔽器能屏蔽( B )
A,所有中断和异常
B,除了 NMI 外所有的异常和中断
C,除了 NMI、异常外所有其他中断
D,部分中断
-- tip:中断与异常的区别
中断是指 CPU 对系统发生某事件时的这样一种响应:
CPU 暂停正在执行的程序,在保留现场后自动地转去执行该事件的中断处理程序;执行完后,再返回到原程序的断点处继续执行。
-- 还可进一步把中断分为外中断和内中断。
外中断:就是我们指的中断:是指由于外部设备事件所引起的中断,如通常的磁盘中断、打印机中断等; 内中断:就是异常:是指由于CPU 内部事件所引起的中断,如程序出错(非法指令、地址越界)。内中断(trap)也被译为“捕获”或“陷入”。
- 异常是由于执行了现行指令所引起的。由于系统调用引起的中断属于异常。
- 中断则是由于系统中某事件引起的,该事件与现行指令无关。
-- 中断和异常
-
相同点:都是CPU对系统发生的某个事情做出的一种反应。
-
区别:中断由外因引起,异常由CPU本身原因引起。
-- 4、ADC 转化的过程是采样-量化-编码
-- 5、ARM Crotex-M3 不可以通过( D )唤醒 CPU
A,I/O 端口
B,RTC 闹钟
C,USB 唤醒事件
D,PLL
-- 6、基于中断的实时编程结构的实时性取决于( A)
A,中断响应时间
B,最长任务执行时间
C,任务切换时间
D,所有任务执行时间之和
-- 7、单片机进行串口通信时,若两机的发送与接收可以同时进行,则称为( D )
A.半双工传送
B.单工传送
C.双工传送
D.全双工传送
-- 8、关于中断抢占和响应的描述下列正确的是( A )
A、只有抢占优先级不一样时才发生中断嵌套
B、只有响应优先级不一样时才发生中断嵌套
C、只有抢占和响应优先级都不一样时才发生中断嵌套
D、都不正确
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
-- 9、根据 Free RTOS 状态切换过程,填写如下框图中当前任务可能处于的状态。
- a:就绪态.b:运行态。c:阻塞态。d:挂起态。
①:创建任务→a 态:任务创建完成后进入 a 态,表明任务已准备,随时可以运行,只等待 任务调度器进行调度;
②:a 态→b 态:发生任务切换时,就绪列表中最高优先级任务 被执行,从而进入 b 态;
③:b 态→a 态:有更高优先级任务创建或者恢复后,会发生任务调度,此处可以看做是 CPU 使用权被更高优先级任务 抢占了;
④:b 态→c 态:正在运行的任务发生挂起、延时、读信号量等待 (举 1/2 个例子)情况时,该任务会从就绪列表中删除,然后发生任务切换,运行上述框图中的哪一个过程编号 ②;
⑤: c 态→a 态:任务被恢复后,此时被恢复的任务会被加入就绪列表,从而切换任务状态;如果此时被恢复任务的优先级高于正在运行任务的优先级,将会运行上述框图中的哪一个过程编号 ② ;
⑥⑦⑧: a/b/c 态→d 态:任务可以通过调用 vTaskSuspend() API 函数都可以将处于任何状态的任务挂起,被挂起的任务得不到 CPU 的使用权,也不会参与调度,除非它从挂起态中解除。
⑨:d 态→a 态:把 一 个 挂 起 状态 的 任 务 恢复的 唯 一 途 径 就 是调 用 vTaskResume() 或 vTaskResumeFromISR() API 函数,如果此时被恢复任务的优先级高于正在运行任务的优先级,将会运行上述框图中的哪一个过程编号 ②;
FreeRTOS 中又有很多钩子函数,什么是钩子函数: 钩子函数(Hook 函数)是一种被操作系统内部调用的函数,它允许开发者在特定的事件发生时执行自定义的操作。
如何在 FreeRTOS 中使用钩子函数 在 FreeRTOS 中使用钩子函数,首先需要在 FreeRTOSConfig.h 中定义相应的配置宏以启用特定的钩子函数。一旦相应的配置宏被定义,就可以实现具体的钩子函数。
-- 10、在使用 Keil 编译工具时,编译器的优化等级有什么作用和区别:
-- Keil 编译器提供了多个优化等级,每个等级都有其特定的优化策略和目标。
- O0(无优化):这是默认的优化级别,编译器不执行任何优化。主要用于调试目的,因为在此级别下, 编译器会尽量保持源代码的原始结构,使得调试信息更加准确。编译时间通常是最短的。
- O1(基本优化):这个级别执行一些基本的优化操作,如删除未使用的变量、内联简单函数等。这些优化可以提高代码的执行效率,同时保持较快的编译速度。与 O0 相比,O1 级别在编译时间和执行效率之间达到了一个较好的平衡。
- O2(中级优化):在 O1 的基础上,O2 级别进行了更多的优化操作,包括更大范围的内联、循环展开、函数调用图优化等。这些优化可以显著提高代码的性能,但编译时间可能会稍长。O2 级别是推荐的优化等级,除非有特殊需求。
- O3(高级优化):在 O2 的基础上,O3 级别进行了更深入的优化操作,如更大范围的内联、循环变形、自动向量化等。这可以进一步提高代码的性能,但编译时间可能大幅增加。使用 O3 级别需要权衡编译时间和执行效率之间的关系。
-- 11、ADC 的作用是什么______模拟量转变为数字量______,如果 12bitADC,参考电压是 0-3.3V, 那么测得 2V 电压对应的 ADC 转换后的值是多少2482,ADC 转换后的值是 1100,那么对应的电压值是多 少0.89V。
-- 首先,我们要知道ADC的转换公式:
- 这里使用的是一个 12 位 ADC,那么ADC 的分辨率是 12 位,即输出的数字值可以在
-- tip:在以后的工作中ADC采集到的数据如何保证他的准确?需要拿着设备去专门的地方做实验,然后得到转换公式。
-- 12、STM32 单片机的地址总线宽度是__32__位,其中断优先级有____4____位可以用来配置,表示中断等级。
-- 注意,如果详细说的话,8位指的是内核优先级,4位指的是单片机的优先级
-- 13、简述单片机的内部构造一般有哪几部分组成,以你熟悉的单片机为例简述一个单片机能工作的最小系统板需要哪些外围电路(2 分)
最小系统电路:能够支持一个芯片运行的最基本的组成单元:电源电路、时钟、复位
-- 14、简述 IAP 代码升级流程和框架
- 启动阶段:单片机从基地址启动,首先运行引导区代码。
- 检测升级需求:引导区代码检测是否存在代码升级事件,这可以通过检测特定标志位、接收特 定数据或检测外部输入(如按键、串口接收等)来实现。
- 处理升级事件:如果检测到升级需求,引导区代码将启动接收新代码的过程,这可能包括从外 部源(如串口、USB、网络等)接收新的应用程序代码。
- 写入新代码:接收到的新代码被写入到单片机的存储区域,这通常涉及到对 flash 存储器的擦 除和写入操作,具体操作依赖于单片机的具体型号和编程接口。
- 重启单片机:写入新代码后,单片机需要重启以加载并执行新的应用程序。
- 跳转到新代码:单片机重启后,将跳转到新的应用程序地址开始执行。
-- 15、计算 9600 波特率 15 个连续字节传输所需要的时间(8 为数据位、1 位停止位、无校验位)
- 波特率9600 表示每秒传输 9600 个比特,而每个字节包含 8 个数据位和 1 个停止位,共计 10 个比特。 因此,传输一个字节所需的时间可以通过以下公式计算:
对于 15 个连续字节的传输时间,可以通过将每个字节所需的时间相加得到
- 也就是15ms
-- 注意这里默认有一个起始位!!!
-- 16、关于 ARM 处理器的异常向量表的描述正确的是( B)
A, 异常向量表放的就是中断服务子程序
B,异常向量表放的就是中断服务子程序的入口地址
C, 异常向量表放的就是跳转指令,指令该指令进入相应中断服务子程序
D, 以上都不是
-- 17、简述下方两个电路图的作用和工作原理
- 图一:控制 BUZ 器件的导通和关闭。
- 图二:DET_BAT 引脚控制 Q3 导通,从而测量 BAT_AD 位置的电压。
-- 18、根据 STM32F1 的时钟分布图,在图中找出满足①②③时钟条件需要修改的地方?并简述时钟结构?
- 答:共 5 处需要修改,如下:
HSE:外部高速时钟;
HSI:外部低速时钟;
LSE:外部低速时钟;
LSI:内部低速时钟;
SYSCLK:可有 HSE/HSI/PLLCLK 选择决定,最大为 72MHz; 单片机提供给外设的时钟分为 2 个总线 APB1/APB2;
-- 19、PWM 是什么?涉及哪些关键参数?如何使用 PWM 进行电机的开环控制?
PWM(脉冲宽度调制)是一种利用微处理器的数字输出来对模拟电路进行控制的技术。 PWM,是一种通过改变信号的占空比来控制数字设备功率输出的技术
-- PWM 涉及的关键参数包括频率、占空比和分辨率。
- 电源电路设计:构建一个由直流电源供电的 PWM 电压馈电逆变器。这个逆变器将作为电机控 制的核心部分,负责将直流电源转换为交流电源,以驱动电机运行。
- PWM 信号生成:通过 PWM 控制器生成 PWM 信号,这个信号将用于控制逆变器的输出电压 和频率。PWM 信号的占空比可以调节,从而控制电机的速度。
- 电机驱动:将生成的 PWM 信号输入到逆变器,通过逆变器将直流电转换为交流电,进而驱动 电机运行。在这个过程中,电机的转速和运行状态不会反馈给控制系统,因此这是一个开环控 制系统。
- 参数设置:根据电机的具体参数(如额定电压、额定频率、极对数等),计算所需的 PWM 信 号频率和占空比,以确保电机能够按照预期的速度和方向运行。
- 速度和方向控制:通过改变 PWM 信号的频率可以控制电机的速度,而通过改变 PWM 信号的 相位可以控制电机的方向。在实际应用中,可能还需要考虑电机的启动和停止控制。
- 适应性调整:在低速运行时,可能需要额外的升压措施来克服定子电阻对电压降的影响,以确 保电机能够稳定运行。
-- 20、对于单片机程序运行中意外进入HardFault Handler,有哪些可能的原因?(3 分)
- 数组越界:当程序试图访问数组范围之外的内存位置时,会导致 HardFault。
- 野指针:使用未初始化的指针或已经释放的内存空间也会导致 HardFault。
- 堆栈溢出:函数调用层次过深或数组过大时,可能导致堆栈越界,从而触发 HardFault。
- 未初始化硬件操作:在硬件未初始化的情况下进行操作,如 IIC、串口等,可能导致死机。
- 内存溢出或访问越界:程序中申请的内存超出了系统的可用内存,或者申请的内存在使用过程 中未被正确释放,导致系统无法为其他请求分配足够的内存,甚至可能导致系统崩溃。
- 硬件故障:电源干扰、连接器故障或传感器故障等硬件问题也可能导致 HardFault。
-- 21、决定或影响 ADC 输出精度的因素有哪些?
-- 决定或影响 ADC 输出精度的因素主要包括参考电压的稳定性、时钟精度、分辨率、噪声、温度、采样率以及模拟信号的质量。
- 参考电压的稳定性:ADC 使用参考电压来将模拟信号转换为数字信号。如果参考电压不稳定, ADC 输出的数字信号的精度将受到影响。
- 时钟精度:ADC 使用时钟来采样模拟信号并将其转换为数字信号。如果时钟精度不高,ADC 可能会在采样过程中产生误差。
- 分辨率:ADC 的分辨率指的是能够表示的数字信号的数量。分辨率越高,ADC 输出的数字信 号的精度就越高。
- 噪声:ADC 在采样和转换过程中可能会受到噪声的影响。噪声可能来自 ADC 自身、电源、信 号源等方面。
- 温度:ADC 的性能可能会随温度变化而变化。如果 ADC 的工作温度范围之外,其精度可能会受到影响。
- 采样率:ADC 的采样率指的是每秒采样的次数。采样率越高,ADC 输出的数字信号的精度就 越高。
- 模拟信号的质量:ADC 输入的模拟信号的质量对其输出的数字信号的精度也有影响。例如, 如果输入信号的幅度太小或太大,或者存在电压漂移或共模干扰等问题,ADC 的精度可能会 受到影响。
-- 22、请简述一下 STM32F1 系列单片机上电之后的启动过程 (4 分)
- 初始化堆栈指针:首先,系统会初始化堆栈指针(SP),将其设置为初始值。
- 初始化 PC 指针:接着,系统初始化程序计数器(PC)指针,将其指向 Reset_Handler。
- 初始化中断向量表:系统会初始化中断向量表,这是系统中断处理的基础。
- 配置系统时钟:配置系统时钟,确保系统能够在正确的时钟频率下运行。
- 调用 C 库函数_main:通过调用 C 库函数_main 来初始化用户堆栈,然后跳转到 main 函数, 开始执行用户编写的程序逻辑
-- 23、请简述 SPI 和 UART 通信物理接口分别有几根线,作用什么? (4 分)
- SPI:
CS:片选
CLK:时钟线
MISO:主机输入,从机输出
MOSI:主机输出,从机输入
- USART:
TX:数据发送
RX:数据输出
GND:地线
-- 25、请列举单片机编程中有哪些方法可降低系统功耗?(至少 4 点,4 分)
- 优化代码:编写简洁明了的代码可以减少单片机的运行时间,从而降低功耗。使用 32 位单片机内核可能更 有效,因为它可以在一个时钟周期内对大型数据块进行处理,同时采用先进的半导体工艺技术也有助于降 低运行功耗 2。
- 利用睡眠模式:让单片机在大部分时间内处于休眠状态,只在需要时唤醒,可以显著降低功耗。选择能够 快速唤醒的单片机,以减少从睡眠模式到活动模式的过渡时间,即“死区时间”,从而减少电量消耗 2。
- 调整工作频率和电压:降低单片机的工作电压和时钟频率可以显著降低功耗。如果单片机支持可编程时钟 速率,应确保在所有操作模式下以最低速率运行,并根据所选时钟频率以尽可能低的电压运行单片机 2。
- 使用低速晶振:在低功耗场合,使用低速晶振(如 32kHz)可以实现更低功耗。通过 I/O 口的操作改变振荡 电阻,从而改变单片机工作频率,达到节能的目的。
-- 26、根据 STM32 中中断处理机制,请回答以下问题:(5 分)
- (1)简述中断的作用及目的?(1 分) 答:提高程序的实时性,使设备能够快速响应硬件事件;
- (2)简述中断的处理过程?(1 分) 答:中断触发,打断当前 CPU 的程序,将处理器状态压栈, 转而立刻执行中断服务程序,执行结 束将处理器状态出栈继续之前的 CPU 程序运行;
- (3)简述 STM32 的优先级中抢占和响应的区别?(1 分)
答:抢占优先级决定是否可以抢占 CPU, 响应优先级是在抢占优先级相同时, 中断同时到来, 谁 的响应优先级高, 谁先执行。
- (4)分析如下中断代码,找出其中问题?(2 分)
__interrupt double compute_area (double radius) { double area = PI * radius * radius; printf(” Area = %f”, area); return area; }
- 1). ISR 不能返回一个值。如果你不懂这个,那么你不会被雇用的。
- 2). ISR 不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。
- 3). 在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器 入栈,有些处理器/编译器就是不允许在 ISR 中做浮点运算。此外,ISR 应该是短而有效率的,在 ISR 中做浮点运算是不明智的。
- 4). 与第三点一脉相承,printf()经常有重入和性能上的问题。
-- 26、写一段 STM32 的代码,在定时器中断函数中,每经过 100ms,在引脚 PB1 输出脉宽为 100us 的 高电平。(可以用伪代码的形式描述)(3)
//定时器中断服务函数,100ms 触发一次
Int flag = 0;
Void TimHander(void)
{
flag = 1;
}
Void main(void)
{
PB1 = 0;
While(1)
{
If(flag==1)
{
flag =0;
PB1 = 1;
Delay_us(100);
PB1 = 0;
}
}
}
-- 27、结合空气质量检测仪项目回答以下问题(8)
- 1)讲解设备端建立 TCP 连接基本流程方式,WIFI 组网方式有哪些,区别是什么?(2)
设备端建立 TCP 连接的基本流程通常遵循 TCP/IP 协议中的三次握手过程
第一次握手:客户端向服务器发送一个 SYN 报文,请求建立连接。这个报文中包含了客户端 的初始序列号(ISN),并且 SYN 标志位被设置为 1,ACK 标志位被设置为 0。这表明这是一个连接 请求,而不是一个确认报文。
第二次握手:服务器收到 SYN 报文后,会确认客户端的 SYN 报文,并发送一个 SYN-ACK 报文作为回应。这个报文中包含了服务器的初始序列号,并且 SYN 和 ACK 标志位都被设置为 1。服务器的确认号设置为客户端的 ISN 加 1,表示对客户端的 SYN 报文的确认。
第三次握手:客户端收到服务器的 SYN-ACK 报文后,会向服务器发送一个 ACK 报文, 确认服务器的 SYN 报文。这个报文中 ACK 标志位被设置为 1,确认号为服务器的初始序列号加 1,表示对服务器的 SYN 报文的确认
-- 2)讲解阿里云平台物模型建立流程(2)
创建阿里云账号;
进入物联网平台;
创建产品;
功能定义;
发布;
创建设备;
-- 3)概述什么是 MQTT、MQTT 的通信机制、主题的作用及在哪里被定义、MQTT 协议的报文构 成、报文的类型有哪些(列举三到四个)、连接报文的具体报文构成?(4)
- MQTT 是一种轻量级的消息协议,专为低带宽、不可靠或高延迟的网络环境设计。它广泛用于物 联网(IoT)、移动应用、小型设备、传感器网络等领域,以实现设备间的可靠消息传输 MQTT 协议基于客户端-服务器(Client-Server)架构。在 MQTT 通信中,所有的 Client(客户端)
必须经过 Server(服务器,也称为 Broker,即代理服务器)才能进行通信。
MQTT 主题用于对应用消息进行分类和标识。
MQTT 报文构成:固定报头+可变报头+有效载荷 报文类型:连接报文、断开连接报文、连接确认报文、发布报文、发布确认报文、订阅报文。。。
连接报文构成: 固定报头(0x10+剩余长度)+可变报头(协议名+协议级别+连接标志+保持连接)+有效 载荷(客户端标识符+遗嘱主题+遗嘱消息+用户名+密码)
只有发布报文的有效载荷部分是JSON格式,其他报文不是
-- 28、UART 功能(考核内容:数据处理逻辑)(8)
- 1)UART 数据收发处理,使用串口工具(上位机)向 MCU 发送指定数据(指令),串口工具会 收到 MCU 对应的响应,命令不区分大小写,参数需要区分大小写。
a) AT 握手测试命令:发送 AT 响应 OK(2)
/*
flag:UART 数据接收完成的标志位
buff:UART 接收数据的缓冲区
num:UART 接收数据的计数值
*/
void DataAnly(void)
{
if(flag==1)
{
flag=0;
char *p = strstr(buff,"AT");
if(p != NULL && *(p+4)==’\0’)
{UART_SendStr("OK\r\n");
}
flag=0;
memset(buff,0,100);
num = 0;
}
}
b) AT+SHOW 屏幕数据显示命令:
/*
flag:UART 数据接收完成的标志位
buff:UART 接收数据的缓冲区
num:UART 接收数据的计数值
*/
void DataAnly(void)
{
if(flag==1)
{
flag=0;
char *p = strstr(buff,"AT+SHOW");
if(p != NULL)
{
if(*(p+7)=='?')
{
UART_SendStr("+SHOW:1234567890\r\nOK\r\n");
}
else if(*(p+7)=='=')
{
char data[100] = {0};
sprintf(data,"AT+SHOW=%s\r\nOK\r\n",(p+8));
UART_SendStr(data);
}
}
flag=0;
memset(buff,0,100);
num = 0;
}
}
c) AT+LED 控制命令:(2)
/*
flag:UART 数据接收完成的标志位
buff:UART 接收数据的缓冲区
num:UART 接收数据的计数值
*/void DataAnly(void)
{
if(flag==1)
{
flag=0;
char data[100] ={0};
char *p = strstr(buff,"AT+LED");
if(p != NULL)
{
if(*(p+6)=='?')
{
u8 mode = Read_LEDMODE();
sprintf(data,"+LED:%d\r\nOK\r\n",mode);
UART_SendStr(data);
}
else if(*(p+6)=='=')
{
u8 mode = *(p+7);
Set_LEDMODE(mode-'0');
sprintf(data,"OK\r\n");
UART_SendStr(data);
}
}
flag=0;
memset(buff,0,100);
num = 0;
}
}
-- 29、RTOS 和裸机编程的区别?FreeRTOS 任务间通信方式有哪些?并逐个分析每种通信方式在什么场景下使用。
-- 裸机开发
优点:
直接硬件控制:裸机开发允许开发者直接控制硬件资源,使得对系统的控制更为精细。
资源利用更灵活:由于没有操作系统的开销,可以更灵活地管理和利用系统资源。
性能优势:由于没有操作系统的额外开销,裸机开发有潜力获得更好的性能。
缺点:
复杂性高:开发者需要处理所有底层的硬件控制和任务调度,因此系统的设计和维护相对更为复杂。
多任务困难:裸机开发一般只能执行单一任务,因为没有任务调度器来支持多任务并发。
开发周期较长:由于需要手动处理许多底层细节,裸机开发可能需要更多的时间来完成。
-- RTOS 开发
优点:
任务调度:RTOS 提供了任务调度器,可以方便地支持多任务并发,提高系统的可维护性。
抽象层:提供了对底层硬件的抽象,使得开发者可以更专注于应用程序的逻辑。
同步和通信:RTOS 提供了同步和通信机制,使得任务之间的通信和同步更容易实现。
缺点: 资源开销:RTOS 本身会占用一些系统资源,包括内存和处理器时间。
学习曲线:学习 RTOS 可能需要一些时间,特别是对于初学者。
不适用于所有应用:对于一些简单的嵌入式应用,引入 RTOS 可能会显得过于庞大和不必要。
-- 信号量:
信号量是一种用于同步和互斥的机制,用于控制对共享资源的访问和任务同步。在 FreeRTOS 中,信号量分为二值信号量、计数型信号量、互斥信号量和递归互斥信号量。例如, 多个任务需要访问一个共享的 ADC(模拟数字转换器)时,可以使用互斥信号量来确保一次只 有一个任务可以访问 ADC,实现资源互斥访问。
-- 消息队列:
消息队列是任务间传递消息的一种机制,用于在任务之间安全地传递数据。
FreeRTOS 使用 QueueHandle_t 类型来表示消息队列。消息队列适用于异步数据传输和命令响应等场景。例如,一个任务采集传感器数据并将其放入消息队列,另一个任务负责处理这些数据,从而实现异步通信。
-- 互斥量:
互斥量用于保护共享资源免受多个任务同时访问,确保同一时间只有一个任务可以访问共享资源。
-- 事件组:
事件组用于多个任务之间的通信,允许一个或多个事件标志被设置或清除,以通知其他任务特定事件的发生。
-- 任务通知:
任务通知机制允许一个任务通知另一个任务关于某个事件的发生,如数据可用或其他状态变化
信号量:KQM的空闲中断中释放信号量,在KQM解析任务中,等待信号量,完成KQM接收完成和解析任务的同步,好处: 响应比较及时,比较节省CPU事件:SU_03T的空闲中断中释放信号量,在SU_03T解析任务中,等待信号量,完成SU_03T 接收完成和解析任务的同步,好处:响应比较及时,比较节省CPU消息队列:按键任务中释放消息,在网络任务中等待 消息,避免全局变量在多个任务中被更改值,
-- 30、阅读下面两个寄存器功能,并阅读图片最下面英文问题,根据问题作答?
看门狗:本质上是定时器,可以用来防止程序跑飞如何防止程序跑飞:正常需要1ms喂狗,如果程序 跑飞,无法实现喂狗,看门狗溢出,让单片机复位
TDR 保存值 转载值 TCNT 计数值
#define TDR_ADDR (0x10002000)
#define TCNT_ADDR (0x10002008)
#define TDR (*((volatile unsigned int *)TDR_ADDR))
#define TCNT (*((volatile unsigned int *)TCNT_ADDR))
//输入时钟频率:32768Hz
1/32768s 计数一下
//250ms
0.250*32768 = 8192 下void Reset250(void) {
TDR = 8192;
TCNT = 0;
}void main()
{
Reset250();//给定时器赋初值
while(1)
{}
}
-- 31、如图,如果 ADC 采用 12bits 分辨率,Vref=3.0V,写出电压 ADC 计算式。
Vadc = (R62/(R62+R63))*V1
-- 32、LVGL 介绍:(6 分)
- (1)LVGL 是如何适配的底层屏幕显示及触摸位置?
LVGL 自身有显示和触摸的接口函数,用户需将自身屏幕的显示函数和获取触摸数值的函数,写 入 lvgl 对应的接口函数中即可。
- (2)LVGL 界面设计的开发流程?
LVGL(Light and Versatile Graphics Library)界面设计的开发流程主要包括准备阶段、界面 设计阶段、代码实现与集成阶段以及测试与优化阶段。 准备阶段:软件环境搭建,硬件环境搭建。 界面设计阶段:使用 UI 编辑软件设计界面,导出 UI 设计 代码实现与集成阶段:代码中集成 LVGL 环境,将导出的 ui 移植入代码中,初始化 LVGL,加载显示 测试与优化阶段:功能测试,性能优化。
(3)LVGL 中事件的作用是什么,如何使用事件?
LVGL(Light and Versatile Graphics Library)中的事件机制是处理用户输入和系统内部状态变化的重 要方式,它允许开发者在 GUI(图形用户界面)应用中的不同阶段插入自定义代码,以响应特定的操 作或状态变化。 使用: 定义事件回调函数、为对象添加事件回调、在回调函数中处理事件、注册和注销事件回调
-- 33、keil 编译结果中 Code、RO-data、RW-data、ZI-data 分别对应什么信息?并分别指出 heap 和 stack 的区别。
Code 代表执行的代码,程序中所有的函数都位于此处。 RO-data 代表只读数据,程序中所定义的全局常量数据和字符串都位于此处。
RW-data 代表已初始化的读写数据,程序中定义并且初始化的全局变量和静态变量位于此处。
ZI-data 代表未初始化的读写数据,程序中定义了但没有初始化的全局变量和静态变量位于此处
Program Size: Code="18248"RO-data=320 RW-data=260 ZI-data=3952
FLASH:Code, RO-data,RW-data
RAM :RW-data, ZIdata
SRAM 空间用来存放了什么东西了:1、各个文件中声明和定义的全局变量、静态数据和常量;
2、
HEAP 区;3、STACK 区。
堆区(heap):一般由程序员使用 malloc 或 new 来进行分配,在适当的时候用 free 或 delete 来进行释放。若程序员不释放,程序结束时可能由操作系统回收。分配方式类似于数据结构中的链表。
堆栈的大小在编译器编译之后是不知道的,只有运行的时候才知道栈区(stack):由编译器自动分配和释放,程序员不做干涉。存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。程序的中断,函数的形式参数传递等都需要 STACK 来实现。所有在处理的函数,包括函数嵌套,递归,等等,都是从这个“栈”里面,来分配的。