Skip to content

面试记录

宁波戴维医疗——医疗器械嵌软开2305

  • PID的作用?

    proportional比例,调节力度,起振幅度。代码表现为当前值与目标值的差(Error)

    当两者差距不大时,就让加热器“轻轻地”加热一下。要是因为某些原因,温度降低了很多,就让加热器“稍稍用力”加热一下。 要是当前温度比目标温度低得多,就让加热器“开足马力”加热,尽快让水温到达目标附近。

    integral积分,累积偏差。代码表现为当期值与目标值差的累积(∑Error)

    在P的作用下,水温慢慢升高。直到升高到45℃时,他发现了一个不好的事情:天气太冷,水散热的速度,和P控制的加热的速度相等了。

    这可怎么办? P兄这样想:我和目标已经很近了,只需要轻轻加热就可以了。D兄这样想:加热和散热相等,温度没有波动,我好像不用调整什么。

    derivative微分 ,调节收敛,控制抖动,抖动越大力度大,接近目标力度小。

    代码表现为这次偏差值与上次偏差值的差,差越大D作用越大(Error-LastError)

苏州某公司——充电桩嵌软开2305

  • MOS管与三极管的区别

MOS是电压控制元件,三极管是电流控制元件

由于MOS控制不需要电流,功耗低,可大量MOS集成在芯片内部,靠电压驱动。而三极管基极电流不可忽略,管打开时b,e间存在持续电流,无法集成

海康萤石——智能家居嵌软开2311

RTThread的任务调度方式?

  • 按照任务优先级调度,同等优先级的按照时间片轮转调度

RS485是全双工还是半双工?

  • 半双工,两个设备之间只能有一个时刻是发数据或者收数据,如果同时收发,会存在数据冲突的问题

IIC从设备能否给主设备发数据?

  • 不能,数据的发起是由主设备起始的,所以主设备不能主动给从设备发数据

福州某初创——嵌软开2404

  • IIC从设备最多挂载多少子设备?如何确认是写信号还是读信号?

    IIC传输数据是以字节为单位的,1Byte=8Bit

    在起始信号后,第一个字节数据为寻址。

    高7bit表示设备地址 2^7=128个地址,0x00地址除去,总共可以挂载127个不同设备

    最后1bit为读/写信号标识,0写1读

上海华泰——IC测开2407

  • AC-DC全桥整流的原理?

    单相整流桥是由四个普通二极管组成的,按照正方形排布。它可以将交流电转换为直流。

    在整流桥的每个工作周期内,同一时间只有相对的两个二极管进行工作,因此我们可以将整流器工作周期分为正半周和负半周。若加入滤波电路可以得到稳压的直流电。

福州某公司——嵌软开2407

FreeRTOS如何实现上下文切换?

  • 通过保存和恢复任务的上下文寄存器状态来完成上下文切换。 当一个任务被切换出去时,它的寄存器状态会被保存到任务的控制块中, 包括程序计数器、堆栈指针和其他寄存器。当任务切换回来时,它的上下文就会被恢复,使得任务可以从之前被暂停的地方继续执行。

FreeRTOS线程间通信的方式?

  • 信号量,消息队列,邮箱,事件组。

在串口中断中需要线程通信,FreeRTOS如何实现?

  1. 开启串口的接收中断(UART_IT_RXNE)和空闲中断(UART_IT_IDLE) 接收中断是每接收一个字符时 产生中断 空闲中断是每完成一次接收后 产生中断
  2. 每当接收中断时(即接收一个字符),将获取的字符送入消息队列 xQueueSendFromISR
  3. 当完成一个串口传输时(即本次传输完成),释放信号(通知任务传输完成)xSemaphoreGiveFromISR

忘记了——嵌软开2408

什么是野指针?野指针是怎么产生的?

  • 野指针就是指针指向的位置不可知。(随机的、不正确的、没有明确限制的)

    指针未定义,未初始化。默认随机值

    指针越界访问

    指针指向的空间被释放

线程间同步的方式?

  • 信号量,互斥量,临界区,事件。

线程间同步与线程间通信的区别:

线程间通信的目的是交换信息、数据和事件; 而线程间同步的目的是控制线程的执行顺序和资源的访问顺序。 虽然有些机制(如信号量和事件)既可以用于通信也可以用于同步,但它们的侧重点和使用方式有所不同。 例如,信号量在同步中主要用于控制资源的访问,而在通信中则可能用于传递简单的信号或事件信息。

线程间通信和同步往往是相辅相成的。在多线程编程中,线程之间既需要交换信息以实现协作,又需要同步以确保资源的正确访问和线程的有序执行。

共同目标:它们的共同目标是提高程序的并发性和可靠性,确保多线程程序能够正确、高效地运行。

H3C外包

volatile关键字的作用?

volatile 关键字和 const 对应,用来修饰变量

  • 用它声明的类型变量表示可以被某些编译器未知的因素更改遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。
volatile int i=10;
int a = i;
...
// 其他代码,并未明确告诉编译器,对 i 进行过操作
int b = i;

上例,volatile 指出 i 是随时可能发生变化的,每次使用它的时候必须从 i的地址中读取,因而编译器生成的汇编代码会重新从i的地址读取数据放在 b 中。

无volatile关键字导致被优化做法是:由于编译器发现两次从 i读数据的代码之间的代码没有对 i 进行过操作,它会自动把上次读的数据放在 b 中。而不是重新从 i 里面读。这样以来,如果 i是一个寄存器变量或者表示一个端口数据就容易出错,所以说 volatile 可以保证对特殊地址的稳定访问。

字节对齐是怎么样的?

  • 结构体中每个数据类型都要对齐,对齐值位其成员中自身对齐值最大的那个值。

深入理解字节对齐

C编译为可执行文件的过程?

  1. 预处理:对源代码文件中文件包含关系(头文件)、预编译语句(宏定义)进行分析和替换,生成预编译文件
  2. 编译:将经过预处理后的预编译文件转换成特定汇编代码,生成汇编文件
  3. 汇编:将编译阶段生成的汇编文件转化成机器码,生成可重定位目标文件
  4. 链接:将多个目标文件及所需要的库连接成最终的可执行目标文件。

指针常量和常量指针

  1. 指针常量:int * const p //指针常量

    我们知道指针变量是指向一个地址的,声明了指针常量,说明指针变量不允许修改。 即指针指向一个地址,该地址不能被修改,但是该地址里的内容可以被修改

  2. 常量指针:const int *p = &a; //常量指针

    这个指针是一个指向常量的指针,指针(指向的变量的值)不可通过该指针修改const,但是指针指向的值可以改变。

static关键字

  1. 修饰局部变量

    静态局部变量在函数内定义,生存期为整个源程序,但作用域与局部变量相同,只能在定义该变量的函数内使用。 退出该函数后,尽管该变量还继续存在,但不能使用它。

  2. 修饰全局变量

    只能被本文件中调用,而不能被同一程序其它文件中的函数调用。 全局变量默认对其他声明文件来说是可见,可用的。使用extern即可引用 static会限定全局变量的可见域,本文件可以访问,但是对于其他文件是不可见的。

  3. 修饰函数

    只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。区别于一般的非静态函数(外部函数)。 类似于修饰全局变量

C语言中static修饰函数和变量用法

函数指针与指针函数

  1. 函数指针:指向函数的指针
  2. 指针函数:返回值类型为指针的函数