面试相关

自我介绍

各位面试官您好!非常荣幸参加贵公司嵌入式开发职位的应聘。下面我简单的介绍一下我个人的基本情况:我叫王双喜,老家是安徽的· 一些基本信息简历上都有,我就不重复了。

那么,我首先简单介绍一下之前的项目经验吧。

第一个项目:基于ucosii操作系统的有害气体检测系统设计。在本项目中主要负责完成了对数据的多通道采集;该系统具有实时监测报警功能、系统的记录功能(主要包括:开机记录、故障记录、报警记录、事件的记录等功能)。在该项目中主要是在传统的单片机编程基础上加上了ucosii操作系统从而解决了传统裸机编程的缺点,并且在该项目中系统的学习到了相关操作系统方面的知识;同时利用业余时间学习了Linux操作系统。

第二个项目主要是自己参加创新、创业大赛的项目;可穿戴智能导盲系统,主要是针对盲人、老人、弱势群体设计一套具有激光测距、定位、避障、定位呼救等功能。主要负责完成底层硬件这方面。多元传感器传感器的选取,数据的采集,uboot、Linux内核的移植,图像运动程序的设计等方面。

第三个项目 是自己毕业课题火炮的动态测试研究 主要实现了火炮的多参数动态测量,主要有炮塔座圈间隙的测量、应变的测量、后座位移的(测量精度0.01mm) 同时利用图像处理技术测量间隙,作为参考。同时利用ANANS仿真间隙特性,作为实验的参考数据。通过数据采集模块将采集到的数据传给下位机,在下位机中利用Matlab对数据进行频谱分析,找到噪声信号的频谱,最后利用滤波技术滤除噪声。将分析处理的数据传送给主控板,主控板将和温度的数据打包一起发送给上位机。

平时在学校里也参加一些创新、创业的大赛;具有较好的学习能力、动手能力、团队精神。

或许在所有的求职者中,我不是最优秀的,但是如果贵公司能够给我这个工作机会,我相信我有信心做好这份工作。

摄像头驱动

camera理论基础和工作原理_ysum6846的博客-CSDN博客

基于FIMC接口的CMOS摄像头驱动分析与设计-AET-电子技术应用 (chinaaet.com)

摄像头工作原理

首先光线通过镜头进入摄像头内部,然后经过IR Filter过滤红外光,最后到达sensor(传感器),可以将光学信号转换为电信号,再通过内部的ADC电路转换为数字信号,然后传输给DSP(如果有的话,如果没有则以DVP的方式传送数据到基带芯片baseband,此时的数据格式Raw Data)加工处理,转换成RGB、YUV等格式输出。所以我们一旦给摄像头提供了时钟,并且复位了摄像头,摄像头就可以工作了,通过PCLK、HSYNC、VSYNC听传输数字图像信号。

所以摄像头的驱动主要完成三大步:

  • 摄像头的上电、时钟这些基本条件
  • 通过IIC总线保证摄像头的初始化
  • 摄像头工作后传回数据到主控

Mclk:摄像头要 工作,必须要有个时钟进行同步,这个时钟就是MCLK,必须要有,否则摄像头就是一个死物,这个时钟由主控芯片提供,确切的说是有主控芯片的控制器提供

IIC总线:主要作用就是为主控芯片配置或者读取摄像头的寄存器提供通道。mini2440音频模块中的L3协议,也是这个作用。不要看见协议就怕,协议就是一条路,数据传输的路,有规定的数据传输的道路

Configuration Register:配置寄存器,控制器(在主控芯片中)通过IIC来设置,相当于告诉摄像头如何工作等

Output Mode & Sync Control
输出接口,从光线进入镜头、过滤、光感应、ADC,然后到图像数据处理,最终数据到达外部接口。摄像头取一幅图像的整个工作完成,摄像头本质上还是一个终端节点,所以需要将采集好的图像数据传递给主控芯片,所以要有数据引脚,图形格式补在是Raw Data,而是YUV或者RGB数据。进行数据传输,肯定需要时钟进行同步,所以需要PCLK,告诉主控芯片,哪个数据代表了一个像素点;VSYNC负责告诉芯片哪些是一帧数据,HSYNC则同步行数据。

驱动利用S3C6410内置的FIMC接口技术,采用DMA和ping-pong缓冲池机制,结合内存共享策略

摄像头为130万像素、20引脚的OV9650,通过FIMC接口接入S3C6410,其主要有数据传输的接口,时钟的接口,IIC接口等。

驱动模型

在Linux操作系统中,设备驱动为应用程序提供访问接口,屏蔽了底层硬件细节。从Linux2.6内核开始,设备被驱动和内核映射为文件,应用程序可以像访问普通文件一样访问这些挂载在/dev目录下的设备,访问接口被定义在驱动中file_operations结构体对象内。每一个接口函数其实都是一个系统调用,其具体实现由驱动程序完成。Linux内核中驱动模型包括总线(Bus)、设备(Device)和驱动(Driver)三个要素,即设备和驱动作为对象挂载在相同的总线上,由总线对设备和驱动进行一一匹配。

Linux驱动模型将所有外设分为字符设备、块设备和网络设备三种。摄像头属于字符设备,其驱动遵循着字符设备驱动的框架,包括设备号、设备注册和最重要的文件操作函数的实现。特别地,针对摄像头设备,V4L2[8]接口为驱动程序提供了一套完备的文件操作标准接口和缓冲池管理策略,目前大多数的摄像头驱动都遵循V4L2接口标准。

2.3 关键模块驱动的设计与实现

  OV9650通过FIMC接口与S3C6410连接,FIMC为输入图像进行格式转换、剪裁等预处理,最后传输到内核中开辟的图像缓冲区,供应用程序读取。摄像头驱动分为两个部分:OV9650驱动和FIMC驱动。

  2.3.1 OV9650驱动

  OV9650驱动的主要作用是挂载驱动和配置寄存器,其中.h文件定义了寄存器配置数据,并由.c文件调用。由于FIMC接口的存在,应用程序不需要直接操作OV9650摄像头,因此OV9650驱动不需要为应用程序提供访问接口,不需要定义file_operations结构体。

  从Mach-smdk6410.c文件中可以知道,内核在启动时,将OV9650作为一个I2C设备挂载到内核树的I2C总线上。之后内核找到OV9650驱动,执行其入口函数——ov965x_init(),将OV9650.c文件中定义的i2c_driver驱动对象也添加到内核树中,最后由总线根据其name将设备和驱动进行匹配。在匹配工作完成之后,内核会调用其探测函数ov965x_probe(),将OV9650的配置数据传递给FIMC驱动中的一个全局参数s3c_fimc,用于配置FIMC寄存器,然后,初始化OV9650寄存器。

  2.3.2 FIMC驱动

  FIMC是s3c6410芯片为摄像头设备提供的一个接口,用来对所采集的图像进行裁剪、放缩等预处理。FIMC为输出图像提供两个DMA通道:preivew通道和codec通道,并为每个通道分配四个ping-pong缓冲区,以提高图像传输速度和内存使用效率。如图5所示。

 FIMC接收OV9650图像数据,并向上传递。因此,FIMC驱动最重要的作用就是向应用层提供标准的操作接口,供应用程序使用。

  FIMC驱动主要包括三个部分:(1)platform驱动注册;(2)file_operations接口定义;(3)V4L2接口实现。

  2.3.2.1 platform驱动注册

  platform是Linux 2.6内核所引进的一种新型驱动管理和注册机制。目前Linux内核中大部分的设备驱动都采用platform架构。在platform架构中,设备用platform_device表示,驱动用platform_driver表示。Linux platform driver机制与传统的device driver机制(通过drivce_register函数进行注册)相比,一个十分明显的优势在于platform机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序使用这些资源时通过platform device提供的标准接口进行申请并使用,提高了驱动和资源管理的独立性,并且拥有较好的可移植性和安全性(这些标准接口是安全的)。

  FIMC驱动入口函数是s3c_fimc_core.c中的s3c_fimc_register(),该函数将platform_driver类型的s3c_fimc_driver挂载到platform虚拟总线。由mach-smdk6410.c文件可知,内核启动时将所有platform_device(包括s3c_device_fimc0)挂载到platform总线。platform总线的match函数将device和driver匹配之后,会自动调用s3c_fimc_driver中指定的probe函数探测设备、申请内存资源、申请中断等,并将最终形成的platform_device类型数据保存到内核中,供后续使用。最后,调用video_register_device函数将对应的video_device注册到内核。

V4L2接口

  V4L2接口功能强大,为应用程序提供了完备的操作接口,包括设置格式、帧率、白平衡、曝光模式、申请缓冲区、取数据、剪裁图像等。此处仅列举几个重要接口。

C语言

关键字

volatile关键字

  • volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改。volatile 提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如 果没有 volatile 关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。所以遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问

例子:并行设备的硬件寄存器(如:状态寄存器)

中断服务程序中修改的供其它程序检测的变量,需要加volatile;

多线程应用中被几个任务共享的变量

static关键字

1、变量

  • 局部变量:编译器一般不对普通局部变量进行初始化,它的值在初始时是不确定的,并且普通局部变量存储于进程栈空间,使用完毕会立即释放。使用static修饰符定义;变量在全局数据区分配内存空间;编译器自动对其初始化
    其作用域为局部作用域,当定义它的函数结束时,其作用域随之结束。
  • 全局变量:全局变量定义在函数体外部,在全局数据区分配存储空间,且编译器会自动对其初始化。普通全局变量对整个工程可见,其他文件可以使用extern外部声明后直接使用。静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。能够有效地降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用。

2、函数

  • 非静态函数可以在另一个文件中直接引用,甚至不必使用extern声明;静态函数只能在声明它的文件中可见,其他文件不能引用该函数;不同的文件可以使用相同名字的静态函数,互不影响

const关键字

  1. 变量:表示定义的变量为常量,常量指针指的是该指针指向的地址内容为常量不可改变;指针常量指指针本身是一个常量,不能指向其他的地址
  2. 函数的参数:表示传入函数的参数值是不可以被修改的。
  3. 函数的返回值:函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。

ARM体系与架构

ARM处理器

STM32时钟系统

时钟系统有振荡器、定时唤醒器、分频器等组成的电路,它是系统的脉搏,处理器的内核在时钟的驱动下完成指令的执行、状态变化等动作,同样外设也是在时钟的驱动下完成的各种工作。

STM32F0有四个时钟源:

HSI:高速内部时钟,RC振荡器,频率位8M

HSE:高速的外部时钟,可接石英的谐振器。

LSI:低速内部时钟

LSE:低俗外部时钟

定时器

SYSTick定时器:滴答定时器,是一24位定时器,也就是最能计数2^24在使用的时候,我们一般给计数器送一个初始的计数值,计数器向下计数,每来一个时钟信号,计数初值就减一,计数值减到0的时候,就会触发一次中断。然后重新从计数初值再减一计数,循环不断

驱动相关

uboot

什么是bootloader

bootloader是引导加载程序的总称,在操作系统之前运行的一小段代码,它会先初始化时钟、关门狗、中断、SDRAM等外设,然后将Linux内核从flash拷贝到内存中,最后启动内核。它的主要工作就是启动Linux内核。

uboot启动过程

uboot启动过程主要分为两个阶段:

第一阶段:硬件的初始化;复制U-boot第二阶段的代码到RAM空间中;设置堆和栈;清空BSS段;跳转到第二阶段入口

uboot入口代码:在start.o中,源代码为start.S

1、硬件的初始化

1、设置异常向量:在源码中设置了异常向量表,同时还有对应的异常处理程序。当产生一个异常的时候,cpu会根据异常号在异常向量表中找到对应的异常向量,然后跳到异常处理函数入口处去执行异常处理函数。

uboot_source.png

2、CPU进入SVC模式:将CPU的工作模式位设置为管理模式,并将中断禁止位和快中断禁止位置置1,从而屏蔽了IRQ和FIQ中断。

3、设置控制寄存器地址:s3c2440开发板,完成了WATCHDOG,INTMSK,INTSUBMSK,CLKDIVN四个寄存器的地址的设置

4、关闭看门狗:向看门狗的控制寄存器写入0.在uoot启动的时候,看门狗会开启,但是没有喂狗的操作,程序会跑飞,CPU将不断的重启

5、屏蔽中断:INTMASK是主中断屏蔽器。是一个32位的寄存器。每位对应一个中断,将所有的位置1,从而屏蔽对应的中断。

6、设置NTMSK,INTSUBMSK,CLKDIVN:cpu上电以后,晶振输出稳定,我们为了提高系统时钟,需要软件来启用PLL。设置这三个寄存器。

7、关闭MMU,cache

8、初始化RAM控制寄存器:完成存储控制器的设置。

9、复制U-boot第二阶段代码到RAM中:

10、设置堆栈:只要将sp指针指向一段没有被使用的内存就完成栈的设置了。

11、清除BSS段:(用户堆区)初始值为0,无初始值的全局变量,静态变量将自动被放在BSS段。应该将这些变量的初始值赋为0,否则这些变量的初始值将是一个随机的值,若有些程序直接使用这些没有初始化的变量将引起未知的后果。

12、跳转到第二阶段的代码入口

第二阶段:

开发板的相关配置;时钟初始化;初始化环境变量;串口控制台初始化;打印uboot相关信息,配置可用的RAM,NORflash初始化,NANDflash初始化,调用main_loop

U-Boot使用了一个存储在寄存器中的指针gd_t来记录全局数据区的地址:

U-Boot启动内核时要给内核传递参数,这时就要使用gd_t,bd_t结构体中的信息来设置标记列表。

U-Boot使用一个数组init_sequence来存储对于大多数开发板都要执行的初始化函数的函数指针

uboot_16.png

GPIO与引脚复用子系统

gpio子系统提供了:

- 读引脚值,高或者低
- 输出高低电平;
- 部分gpio还负责接收IRQ,涉及irqchip子系统;
 内核里使用GPIO子系统的代码被称为ConsumerConsumer通过子系统GPIO_request来申请GPIO;
 

如何给cpu添加gpio驱动

针对具体的CPU构造strut gpio_chip,然后向gpio的子系统注册

pinctrl子系统提供了:

- 引脚复用,大多数引脚都可以通过配置寄存器来选择复用成不同的功能,例如某个引脚即可用作为普通的gpio,也可以作为UART的TX;
- 引脚配置,一般包括上下拉、驱动能力等;
struct pinctrl_desc表示pin控制器,通过pincrtl_register注册进pincrtl子系统中

如何给cpu添加pincrtl驱动

项目:互联网蓝牙项目

项目功能需求

1、环境参数的采集(温湿度、有毒气体浓度)

2、蓝牙通信。物联网感知端和手机的通信 异常状态报警

3、事件记录的功能(开机记录、故障记录、报警记录)

蓝牙技术

蓝牙简介

  • 无线技术标准
  • 短距高数据交换传输距离8-30m
  • 频段:2.4-2485GH
  • SIG
  • 蓝牙协议栈
  • 跳频技术
  • 分主从设部

蓝牙接口编程

7eaa9f214b6b98b992def8614c8dc87.png

嵌入式系统开发中存储器选择的要点

  • 是否有必要使用存储器
  • 存储数据量
  • 读写次数
  • 温度范围
  • 成本

蓝牙模块ATK-HC05

简介及特点

ATK-HCO5-是一款高性能的主从一体蓝牙串口模块;该模块支持非常宽的波特率范围:4800-1382400,并且模块兼容5V或3.3V单片机系统

两种工作模式与角色

两种工作模式:命令响应工作模式和自动连接工作模式

在自动连接工作模式下模块又可分为主(Master)、从(Slave)
和回环(Loopback)三种工作角色。当模块处于自动连接工作模式时,将自动根据事先设定的方式连接的数据传输;当模块处于命令响应工作模式时能执行下述所有AT命令,用户可向模块发送各种AT指令,为模块设定控制参数或发布控制命令。通过控制模块外部引脚(PIO11)输入电平,可以实现模块工作状态的动态转换。

功能

  • 初始化C-05作为从设备
  • 数据发送
  • 数据的接收并且显示
  • KEYO实现主从模式的切换|

与手机相连的方式:将KEY拉低,蓝牙才可以正常的收发数据,然后我们在手机上安装蓝牙串口助手。

编程配置

通过串口和MCU进行通信,主要通过AT指令。该款芯片已将蓝牙的协议栈与Profile固化到程序内部。芯片有一个MCU,其实也可以通过Profile去配置协议栈。

代码流程

初始化硬件资源:LED 按键 串口 I/O 蓝牙模块

AT指令测试 ,判断key0的状态,切换状态;可以发送数据,接受数据

软硬件设计

硬件模块

  • 电源模块:充电 电平 AD
  • MCU:
  • LCD:
  • 传感器:
  • 存储
  • I/O

蓝牙模块

设备与手机端蓝牙通信协议制定

意义:确保数据的完整性与可靠性

组成:头+命令+数据+长度+数据+校验位+数据尾

功能:·蓝牙初始化
·实现AT指令操作参数AT指令
·实现数据的发送
·实现数据的接收

运动传感器

1运动传感器模块要实现的功能

  • 初始化MPU6050DME
  • 原始数据的读取
  • ·数据的转换DMP四次元
  • ·数据的解算DMP库、

2运动传感器模块的接口函数分析

  • ·Mpu6050_nit
  • ·Mpu6050_Data_Read
  • ·Mpu6050_ConvertI
  • ·Mpu6050_Data_Cal

调试方法

接口的调试方法及常见问题(IC接口为例)

  • ·确保时序是正确的须率__时钟数据
  • ·地址

整机联调时的常见问题及解决方法

  • ·软件的问题?硬件的问题?
  • ·系统的可整性配置临界tips:软硬件联调中会用到的工具
  • ·万用表电压电流打通断
  • ·示波器打时序

蓝牙协议栈详解

蓝牙协议栈详解_luowei568567784的专栏-CSDN博客_蓝牙协议栈详解

蓝牙信道分析

蓝牙2.4GHz 与 WiFi 2.4GHz 5GHz无线信道频率划分总结_白浪的博客-CSDN博客_蓝牙信道

BLE详解——广播和数据报文结构分析

BLE详解——广播和数据报文结构分析 - 知乎 (zhihu.com)

想问的问题

平时也比较关注半导体行业,12nm芯片已经可以普及了。可以满足大部分中高端的产品。未来可能是AI的时代,但是对于端级的ai,集成度基本已经到了极限了,目前最先进的制程是5nm,而在1nm的量级可能会产生量子效应,集成度的极限也要到了。这样就会影响芯片的大小,所以现在有好多用异构多核的方式提升这个计算的性能,但这些会牵扯到流水线阻塞、i/o操作等,一定也是底层架构方面的问题。因为贵公司也有做AI方向的,所以我想问下贵公司嵌入式会涉及哪些方面的工作?以及公司的培养制度是如何的?

posted @ 2021-09-02 11:24  胡木杨  阅读(118)  评论(0)    收藏  举报