mqtt
MQTT介绍以及应用(远程控制LEd灯亮灭以及上报温湿度)_csdn 用mqtt服务实现大棚远程管理-CSDN博客
osal
OSAL操作系统分析(添加自定义任务)_osal 分析-CSDN博客
模拟gpio
使用GPIO来模拟UART_gpio模拟串口-CSDN博客\
【基于STM32的串口通信----用软件模拟】_软件模拟串口-CSDN博客
piD
pixhawk似乎也是用的四环串级_px4 内环 外环-CSDN博客个人弄无人机的感受,还是尽量用大的通用的飞控吧。_小无人机飞控可以用到大无人机吗-CSDN博客
c语言
C语言-文件操作函数基础fgetc(读字符),fputc(写字符),fgets(读文本),fputs(写文本),fclose(关闭文件),fopen(打开文件)_可以打开关闭文件的函数-CSDN博客
C/C++:内存分配,详解内存分布(P:图解及代码示例)_全局变量内存分布图-CSDN博客
- Data:数据段,要放在可执行文件中的数据,包括堆、栈、以初始化的全局变量
- Bss: 未初始化的全局变量,不占用可执行文件的大小
- Text: 只读区域,包括常量区和代码区
硬件
【工具使用】Keil5软件使用-进阶调试篇_keil5 软件使用 进阶调试篇-CSDN博客
STM32速成笔记—RTC_stm32 rtc-CSDN博客
【STM32学习】实时时钟 —— RTC_stm32 rtc-CSDN博客
江科大STM32学习笔记(上)_stm32博客-CSDN博客
最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客
使用两个定时器来完成数据接收工作,Timer6定时52us用于数据接收,Timer7定时10ms用于确定数据是否传输完成。定时器相关配置和中断处理放到了btime.c和btime.h
arm
Live555 C++ arm linux64 RTSP推流开发-CSDN博客
操作系统
裸机的轮询系统
初始化完硬件,在主程序里执行死循环,顺序的执行各种事情,
轮询系统简单,是适合需要顺序执行,不需要外部事件驱动就能完成的事件
如果一个事件执行长的时候,另外一个事件是扫描按键,此时按键按下了,
,没办法去执行,导致丢失事件
前后台系统
在轮询系统的基础上加入了中断,外部事件的响应在中断里执行,事件的处理还在轮询里执行
中断称为前台,无限循环 为后台
执行循环的时候,如果出现了中断,中断会打断后台,去执行中断服务程序,如果事件的处理比较简单,直接在服务程序里执行,事件处理比较复杂,返回到后台程序处理。
前后台确保了事件不会丢失,中断可嵌套。提高了响应能力
多线程
事件响应也是在中断里执行的,事件的处理在线程里执行的,高优先级线程优先执行。
RTOS也不是实时响应并处理紧急的事情,只是在很短时间(一般ms级别)就做出了响应,给人感觉就是实时在响应。
系统滴答不是越大越好
因为系统调度也会占用时间,滴答变大,时间片偏小,任务执行的时间越短。
影响rtos实时性的因素
-
线程内任务在阻塞运行
-
避免线程内有等待释放信号量,释放锁,以及阻塞的队列等等。。。
避免使用delay函数进行延时操作,在需要delay时,可考虑使用该实时线程的运行周期对该函数进行周期调用
-
中断相关操作
程序中有一些临界段代码,若想安全访问则需要关闭中断,那么访问这段代码前关总中断,访问完后打开总中断,在这个时间内,系统是无法响应外部任何中断的,这一段时间为关中断时间。
-
临界区相关操作
-
临界区内的代码必须要有很短的运行时间,否则会反过来影响中断的响应时间。
gpio模仿模拟串口
需要两个gpio来当前rx和tx的引脚,设置外设接收的RX中断函数,用来接收数据
设置Tx,推挽输出,上拉 rx 下降沿触发中断,上拉 使能中断,
使用定时器模拟一个延迟发送的逻辑
发送数据,需要写一个函数,设置起始位低电平,延迟一段时间,然后循环发送数据,每位都要延迟一段时间,奇偶校验位,然后是停止位
接收数据,首先是外部gpio有下降沿的电平,触发外部中断,中断处理函数读取gpio电位检查是否是低电平,然后给定时器重载值,使能定时器,定时器到期去执行定时器回调函数,回调函数中执行接收一位数据,存放到全局的缓冲区等待处理
main之前的程序,
程序上电执行复位程序,从固定地址启动。一般是0x 0000 0000 启动,arm7
stm32设置FLASH启动时,会从0x8000 0000的flash地址启动,堆栈指针设置为0x8000 0000,pc寄存器位sp+4,
stm32内部通过中断向量表来响应中断,启动是将从中断向量表取出复位中断向量,来执行复位中断程序启动,复位中断服务程序执行的最终结果是跳转至C程序的main函数,而main函数应该是一个死循环,是一个永不返回的函数
在main函数执行的过程中,发生了一个中断请求,此时STM32的硬件机制会将PC指针强制指回中断向量表处
根据中断源进入相应的中断服务程序
中断服务程序执行完毕后,程序再度返回至main函数中执行
复位中断服务程序先执行SystemInit()函数初始化系统时钟,然后执行main()函数
SystemInit()函数
硬件初始化
初始化时钟,关闭看门狗防止复位cpu.建立中断向量表,初始化堆栈寄存器,.内存初始化
软件初始化
把RO(只读域):RW(读写域)复制到它们的运行域中去。初始化ZI(零初始化域)
初始化堆栈指针 初始化C库环境
堆栈的作用一个就是保存现场(上下文),如函数调用或者中断发送时,将当前执行地址压栈,调用完成再返回此处执行程序。另一个作用就是保存参数,如临时变量。因此,在启动阶段需初始化堆栈寄存器、堆栈的大小、起始地址等。
单片机启动过程: main之前干了啥_单片机在执行main函数之前-CSDN博客
STM32单片机启动流程分析_main函数,是单片机运行的第一个函数吗?-CSDN博客
单片机的启动过程(从上电到main)_单片机初始化流程图-CSDN博客
【stm32】stm32深入思考(1) 之 系统启动流程 main之前的过程,__main作用,start.s作用_stm32 main函数执行完后返回到哪里-CSDN博客
iic
这种总线允许多个设备在同一条总线上进行通信。
同步,半双工通信,由两根数据线串行时钟线(SCL)和串行数据线(SDA),标准速率为100kbits/s,支持一主多从,多主多从,时钟线用于数据收发同步,数据线即用来表示数据
一主多从是指单片机作为主机,主导I2C总线的运行。挂在I2C总线上的所有外部模块都是从机,只有被主机点名后才能控制I2C总线,不能在未经允许的情况下访问I2C总线,以防止冲突
多主多从模型,即多个主机。在总线冲突时,I2C协议会进行仲裁,仲裁胜利的一方取得总线控制权,失败的一方自动变回从机。由于时钟线也由主机控制,所以在多主机的模型下还要进行时钟同步
主要介绍一主多从的硬件结构和软件时序
硬件结构上:
(1) 所有的IIc设备的scl连接在一起,sda连接在一起,scl和sda的输出都要设置为开漏输出模式。scl和sda都要设置一个上拉电阻
(2) scl sda的输入是一个数据缓冲器或施密特触发器,输入对电路无影响,任何设备任何时刻都可以输入,输出采用开漏输出,scl和sda配上拉电阻的模式,可以杜绝scl sda电源短路的现象,不可能同时存在上拉和下拉的状态, 同时兼具输入和输出的功能,避免了引脚的频繁切换,输出的话直接输出就可以操纵数据线电平,输入只需要不操作电平,直接读取就可以了
就是这个模式会有一个“线与”的现象。就是只要有任意一个或多个设备输出了低电平,总线就处于低电平,只有所有设备都输出高电平,总线才处于高电平。I2C可以利用这个电路特性执行多主机模式下的时钟同步和总线仲裁,所以这里SCL虽然在一主多从模式下可以用推挽输出,但是它仍然采用了开漏加上拉输出的模式,因为在多主机模式下会利用到这个特征
(3) 主机对SCL拥有完全的控制权,不允许从机控制SCl。在空闲状态下,主机可以发起对SDA的控制,从机发发送数据和应答的时候,主机将SDA的控制器交给从机,从机不允许主动发起控制
软件时序
起始和终止都是由主机产生的
从机必须始终保持双手放开,不允许主动跳出来去碰总线。如果允许从机这样做,那么就会变成多主机模型,不在本节的讨论范围之内。这就是起始条件和终止条件的含义。
主机拉低SCL,把数据放在SDA上,主机松开SCL,从机读取SDA的数据,在SCL的同步下,依次进行主机发送和从机接收,循环8次,就发送了8位数据,也就是一个字节,另外注意,这里是高位先行,所以第一位是一个字节的最高位B7,然后依次是次高位B6…
SDA数据线在每个SCL的时钟周期传输一位数据,SCL为高电平的时候SDA表示的数据有效。
应答信号和非应答信号I2C的数据和地址传输都带响应。
主要有指定地址写,当前地址读和指定地址读这3种。主机可以访问总线上的任何一个设备,每个设备都有唯一的地址,主机发送地址,所有总线上的从机都能接收到,只有与发送地址匹配的设备才会响应,相同型号的芯片地址是一样的,可以通过引脚改变最后几位的地址
软件iic 使用gpio电平翻转模拟时序
起始,终止,发送一个字节,接受一个字节,发送应答,接收应答 六种时序
时序里面的RA是接收从机的应答位(Receive Ack, RA)
指定地址写
s salveaddress ra recadderss ra data ra p
当前位置读
对于从机在当前地址指针下读取从机的数据
s salveaddress ra data ra p
指定地址读
指定地址读=指定地址写+当前地址读
I2C指定地址读数据
I2C规定在主机寻址一旦读写标志位给1,立刻进行读的时序。
I2C在读的时候并不能指定特定寄存器进行读取,只会读取当前指针所在的位置的内容。若在0x09地址下写一个数据,接这转换为读,则会读出0x0a地址的内容。
所以为了指定读到特定及储存器的内容,可以在读之前,进行写数据的操作来进行指定地址。
Sr (Start Repeat)的意思就是重复起始条件,因为指定读写标志位只能是跟着起始条件的第一个字节,所以如果想切换读写方向,只能再来个起始条件。然后起始条件后,重新寻址并且指定读写标志位
spi
高速全双工通信,使用在ADC、LCD等设备与MCU间
SPI通讯使用3条总线及片选线,3条总线分别为SCK、MOSI、MISO,片选线为SS,它们的作用介绍如下:
当有多个SPI从设备与SPI主机相连时, 设备的其它信号线SCK、MOSI及MISO同时并联到相同的SPI总线上,即无论有多少个从设备,都共同只使用这3条总线;
每个从设备都有独立的这一条NSS信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线
当主机要选择从设备时,把该从设备的NSS信号线设置为低电平,该从设备即被选中,即片选有效, 接着主机开始与被选中的从设备进行SPI通讯。所以SPI通讯以NSS线置低电平为开始信号,以NSS线被拉高作为结束信号。
(1) SS ( Slave Select):从设备选择信号线,常称为片选信号线
(2) SCK (Serial Clock):时钟信号线,用于通讯数据同步,两个设备之间通讯时,通讯速率受限于低速设备
(3) MOSI (Master Output, Slave Input):主设备输出/从设备输入引脚
(4) MISO (Master Input,,Slave Output):主设备输入/从设备输出引脚。
NSS、SCK、MOSI信号都由主机控制产生,而MISO的信号由从机产生,主机通过该信号线读取从机的数据。 MOSI与MISO的信号只在NSS为低电平的时候才有效,在SCK的每个时钟周期MOSI和MISO传输一位数据。
1.通讯的起始和停止信号
在图 SPI通讯时序 中的标号处,NSS信号线由高变低,是SPI通讯的起始信号。NSS是每个从机各自独占的信号线, 当从机在自己的NSS线检测到起始信号后,就知道自己被主机选中了,开始准备与主机通讯。在图中的标号处,NSS信号由低变高, 是SPI通讯的停止信号,表示本次通讯结束,从机的选中状态被取消
2.数据有效性
MSB高位先行,LSB低位先行
MOSI及MISO信号线来传输数据,使用SCK信号线进行数据同步
MOSI及MISO数据线在SCK的每个时钟周期传输一位数据, 且数据输入输出是同时进行的。
MOSI及MISO的数据在SCK的上升沿期间变化输出,在SCK的下降沿时被采样。即在SCK的下降沿时刻, MOSI及MISO的数据有效,高电平时表示数据“1”,为低电平时表示数据“0”。在其它时刻,数据无效,MOSI及MISO为下一次表示数据做准备。
SPI每次数据传输可以8位或16位为单位,每次传输的单位数不受限制
时钟极性CPOL”和“时钟相位CPHA
时钟极性CPOL是指SPI通讯设备处于空闲状态时,SCK信号线的电平信号(即SPI通讯开始前、 NSS线为高电平时SCK的状态)。CPOL=0时, SCK在空闲状态时为低电平,CPOL=1时,
时钟相位CPHA是指数据的采样的时刻,当CPHA=0时,MOSI或MISO数据线上的信号将会在SCK时钟线的“奇数边沿”被采样。当CPHA=1时, 数据线在SCK的“偶数边沿”采样。见图 CPHA = 0时的SPI通讯模式 及图 CPHA = 1时的SPI通讯模式
无论CPOL=0还是=1,因为我们配置的时钟相位CPHA=0,在图中可以看到,采样时刻都是在SCK的奇数边沿
注意当CPOL=0的时候,时钟的奇数边沿是上升沿,而CPOL=1的时候,时钟的奇数边沿是下降沿
SPI的采样时刻不是由上升/下降沿决定的
MOSI和MISO数据线的有效信号在SCK的奇数边沿保持不变,数据信号将在SCK奇数边沿时被采样,在非采样时刻,MOSI和MISO的有效信号才发生切换。
CPHA=1时,不受CPOL的影响,数据信号在SCK的偶数边沿被采样,见图 CPHA=1时的SPI通讯模式_ 。
STM32的SPI外设可用作通讯的主机及从机, 支持最高的SCK时钟频率为fpclk/2 (STM32F103型号的芯片默认fpclk1为36MHz, fpclk2为72MHz),
其中SPI1是APB2上的设备,最高通信速率达36Mbtis/s,SPI2、SPI3是APB1上的设备,最高通信速率为18Mbits/s。
1.freertos优先级翻转,如何避免
在freertos里使用二值信号量的时候,低优先级的任务占有资源不释放,中优先级的任务可以抢占低优先级,高优先级任务因为不能占有资源而被阻塞,不能抢占中有优先级的任务
解决办法,使用互斥量,可以实现优先级继承,低优先级的任务继承高优先级的优先级,不被中优先级的任务抢占,执行完后释放互斥量。
虽然低优先级任务优先级提高了,但是还是要等优先级低的任务执行释放操作,高优先级任务才可以得以运行,这里只是解决了介于低优先级和高优先级之间中优先级任务带来的问题
一个高优先级的任务因为等待资源而被低优先级的任务阻塞。
3.上电启动流程包括__main函数执行的一些操作
4.freertos的svc中断,如何实现调用
【吐血总结】FreeRTOS难点、Systick中断-滴答定时器、PendSV中断-任务切换、SVC中断-系统底层、时间片调度-时钟节拍【已完结】-CSDN博客
7.pid如何调试出合适的参数
linux
1、Linux启动流程
2、OS裁剪,内核启动时间优化
3、zImage和rootfs存放位置
1.boot镜像由什么组成的
2.rootfs镜像由什么组成的
3.怎么构造根文件系统
4.linux操作系统有哪些文件系统,他们是怎么分类的
5.Linux操作系统在设备树之前是怎么管理设备的
6.虚拟内存的意义,以及页表管理的流程
7.怎么判断使用三级页表还是四级页表,他们的区别是什么
8.Linux是怎么启动的,为什么uboot地址要放在芯片的cache里面而不是内存里面
9.dtb文件是如何加载进内核的
挖了我项目的pinctl子系统、gpio子系统、中断子系统。
uboot启动流程(禁止中断、初始化硬件啥的)
可以自定义uboot命令吗?
字符设备驱动编写流程。cdev_init如何写
用过哪些芯片
camera
4、项目上位机QT实现内容
5、I2C子系统和V4L2子系统是如何结合实现Camera驱动的
6、Camera驱动编写过程中需要设置各种参数要如何处理
7、V4L2流程
8、V4L2视频缓冲内存是如何分配管理的
9、Camera获取到的视频帧格式是什么
10、Camera摄像头是如何去控制的,如何获取数据流
11、Camera驱动框架
12、mmap做了什么,底层实现
13、你知道映射是什么吗?
V4L2有用过吗?说下流程
内存管理
14、页表、虚拟内存、分页,映射、内存管理实现
15、讲一讲进程和线程
16、进程的地址空间是什么概念,有什么内容
有用过系统调用和多线程吗?
多线程和多进程的区别
用过哪些通讯外设
USB通讯有了解吗?
IIC读写时序。从机地址要分别发几次
violated关键字、static关键字
为什么默认析构函数不是虚函数
进程线程(不要八股考虑实际应用选择),TCPUDP(区别优缺点) ,网络七层协议,socket server和client流程,freertos和linux区别和优缺点,讲述linux内核的内存管理
1、 项目中socket通信的实现流程;
2、 多线程开发用过没?怎么实现的。
3、 各个线程的数据是怎么进行传输的,是用了什么信号进行传输的呢还是直接应用的全局变量。
4、 各个线程之间怎么能够实现线程的同步的,具体说说。
5、 你用的什么开发环境(QT),在这个环境下是如何实现的多线程
(我回答的是直接继承了QT提供的QThread类,重写run函数的内容,但是我觉得面试官更倾向于听到一些关于C++的多线程编程思路)
6、 Linux内核了解多少,linux启动之后会经历哪些过程。
(我有点不太会了,我回答的是内核态和用户态的一些区别,面试官提示了一下说,比如/boot下存放的内核文件,在启动时都起到了什么作用,怎么引导的)
7、 你编写的项目最后是怎么放到嵌入式设备上进行运行的。
(我跟面试官说我项目中利用的开发板是桌面版的,直接在开发板上进行开发,用到可能其他人负责的部分要移植的话直接生成的动态库、然后进行调用。)
8、 对交叉编译做过吗?
(我说交叉编译做过一些,一些深度学习算法在设备上需要用C++调用,在部署的时候编译过)
9、 对于嵌入式设备上的一些驱动了解吗,比如你的硬件设备是怎么读取的是自己写的驱动呢还是怎么用的?
(对于相机的话直接利用的OpenCV进行读取的,红外相机的话用的是V4L2了解过。还有其他的硬件设备是通过串口进行数据传输的,自己驱动写的不是很多,面试官说我可能更侧重与应用层开发)
10、 对于串口传输设置的停止位、波特率这些你知道是起什么作用吗?
1、关于硬件设备的通信协议比如I2C、SPI等需要了解吗?(需要知道原理)
熟悉FFmpeg、Gstreamer、V4L2框架者加分;
10月份 offer
1、视频编码,视频流处理,视频算法,熟悉图像识别
2、V4L2 接口开发, ARM Linux系统编程
3、Linux嵌入式平台下音视频技术栈、编解码,算法SDK/API
4、熟悉熟各码流,并运用硬件加速实现实时音视频算法
5、熟悉MMAP, 跨进程通信等机制
6、扎实的数据结构和算法基础
7、良好的英语阅读和理解能力
【任职要求】
1、语言:C/C++,ARM Linux系统编程
2、V4L2,OpenCV, 矩阵运算库
3、熟练掌握 Linux, Shell, gcc,Makefile/Cmake
4、以下框架有经验的加分:FFMpeg, ALSA, Neon加速