嵌入式QTGit面试题
自己在秋招过程中遇到的QT和嵌入式和Git相关的面试题,因为比较少就一起放了
QT
connect第5个参数是什么?
Qt::AutoConnection: 默认值,使用这个值则连接类型会在信号发送时决定。
如果接收者和发送者在同一个线程,则自动使Qt::DirectConnection类型。
如果接收者和发送者不在一个线程,自动使用Qt::QueuedConnection类型。
Qt::DirectConnection:槽函数会在信号发送的时候直接被调用,槽函数运行于信号发送者所在线程。效果看上去就像是直接在信号发送位置调用了槽函数。这个在多线程环境下比较危险,可能会造成奔溃。
Qt::QueuedConnection:槽函数在控制回到接收者所在线程的事件循环时被调用,槽函数运行于信号接收者所在线程。发送信号之后,槽函数不会立刻被调用,等到接收者的当前函数执行完,进入事件循环之后,槽函数才会被调用。多线程环境下一般用这个。
Qt::BlockingQueuedConnection:槽函数的调用时机与Qt::QueuedConnection一致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运行完。接收者和发送者绝对不能在一个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个。
Qt::UniqueConnection:这个flag可以通过按位或(|)与以上四个结合在一起使用。当这个flag设置时,当某个信号和槽已经连接时,再进行重复的连接就会失败。也就是避免了重复连接
qss
一般在HTML中我们把样式表叫做CSS,在Qt中我们称之为QSS。QSS和CSS并不完全等同,语法完全类似,定义上存在一些差别。
什么是QSS
QSS是Qt程序界面中用来设置控件的背景图片、大小、字体颜色、字体类型、按钮状态变化等属性,用于美化UI界面。实现界面和程序的分离,快速切换皮肤。
QSS最大的优点就是简单便捷,我们可以通过它快速实现应用程序的外观界面。
QT中的信号与槽机制
用于处理事件和通信的机制,一个对象的变化可以触发另一个对象的响应
// 例子:定义一个信号 signals:
void mySignal();
// 例子:定义一个槽函数public slots:
void mySlot();
// 例子:建立连接
QObject::connect(senderObject, SIGNAL(mySignal()), receiverObject, SLOT(mySlot()));
// 例子:发射信号
emit mySignal();
//例子:自动连接
connect(senderObject, &SenderClass::mySignal, receiverObject, &ReceiverClass::mySlot);
connect连接了信号与槽之间的关系,当信号被发射时,与其对应的槽函数被调用
界面的布局怎么调整
layout布局管理器
水平布局
垂直布局
网格布局
表单布局
弹簧填充空白区域
QT里面的MVC
MVC是Model-View-Controller的缩写,是一种源自Smalltalk的设计模式,在构建用户界面时经常使用。Model是应用程序对象,View是屏幕显示,Controller定义用户界面对用户输入的反应。
嵌入式
串口通讯是什么?
通过总线在一个时间点连续发送一位数据的方法。如同弓箭手频繁射出弓箭一般,嗖、嗖、嗖……
大白话:就是串口通信时所使用的协议传输方式。
串口通信协议
系统间协议
用于通信两个不同设备的系统间协议。就像计算机与微控制器套件之间的通信一样。通过内部总线系统进行通信。
UART协议
- UART代表通用异步发送器和接收器。UART协议是具有两个有线协议的串口通信。数据电缆信号线标记为Rx和Tx。串口通信通常用于发送和接收信号。它被传输并与串口通信接收数据,而没有类脉冲。UART接收数据字节并按顺序发送各个位。
- USAT协议在嵌入式系统中,通常作为 MCU 的外设; 一般来说,由芯片引脚直接引出的一般是 TTL 电平;而中间接有转换芯片的可能就是RS232电平。详情可查看:串行通讯的标准
- UART是半双工协议。半双工意味着具有传输和接收数据的功能,但不能同时进行。大多数控制器在电路板上都有硬件UART。它使用一条数据线来发送和接收数据。它具有一个起始位、一个8位数据和一个停止位,表示8位数据传输一个人的信号是从高到低。例如:电子邮件、短信、对讲机,工业物联网传输设备串口服务器。
USART协议
USART代表通用的同步和异步发送器和接收器。它是两线协议的串口通信。数据电缆信号线标记为Rx和TX。该协议用于逐字节发送和接收数据以及时钟脉冲。这是一种全双工协议,意味着同时以不同的板速发送和接收数据。不同的设备通过此协议与微控制器通信。例如电信。
USB协议
USB代表通用串行总线。同样,它是两线协议的串行通信。数据电缆信号线标记为D +和D-。此协议用于与系统外围设备进行通信.USB协议用于向主机和外围设备串行发送和接收数据.USB通信需要基于系统功能的驱动程序软件.USB设备可以在其上传输数据主机上没有任何请求的总线。现在,当今大多数设备都在使用这种技术与USB协议进行通信。像计算机一样使用USB与ARM控制器通信。USB以不同的模式传输数据。第一个是10 kbps至100 kbps的慢速模式;第二个是全速模式500kbps至10mbps,高速模式25mbps至400Mbps。USB最大电缆长度为4米。
例如:鼠标、键盘、集线器、开关、笔式驱动器。
内部系统协议
内部系统协议用于通信电路板上的两个设备。在使用这些系统内协议时,我们将不使用系统内协议而扩展微控制器的外围设备。使用系统内协议会增加电路复杂度和功耗。使用系统内协议,电路复杂度和功耗降低,成本降低,并且访问数据非常安全。
I2C协议
I2C代表内部集成电路。I2C只需两条线即可将所有外设连接到微控制器。I2C只需两条线SDA(串行数据线)和SCL(串行时钟线)即可在设备之间传输信息。它是从属通信协议的主控。每个从站都有一个唯一的地址。主设备发送目标从设备的地址和读/写标志。该地址与该设备打开的任何从设备匹配,其余从设备处于禁用模式。一旦地址匹配,在主机和该从机之间进行通信,并发送和接收数据。发送器发送8位数据,接收器回复1位确认。通讯完成后,主站发出停止条件。
其最初目的是提供一种将CPU连接到外围设备芯片的简便方法。嵌入式系统中的外围设备通常作为内存映射设备连接到微控制器。I2C仅需要两条线即可将所有外设连接到微控制器。这些称为SDA和SCL的有源线都是双向的。SDA线是串行数据线,而SCA线是串行时钟线。
为什么在I2C SCL和SDA线路中使用上拉电阻。
SDA和SCL线均为漏极开路驱动器。
它可以将输出驱动为低电平,将其驱动为高电平。
为了使线路能够变高,您必须提供上拉电阻
SPI协议
SPI代表串行外设接口。有时SPI协议也称为4线协议。它需要四线MOSI,MISO,SS和SCLK.SPI协议用于通信主设备和从设备。主机首先使用频率配置时钟。然后,主机通过拉片选按钮选择特定的从设备进行通信。选择该特定设备并开始主机与该特定从机之间的通信。主机一次仅选择一个从机。它是一种全双工通信协议。在位传输的情况下,不限于8位字。
CAN协议
CAN代表控制器局域网。它是一个串行通信协议。它需要两条线CAN高(H +)和CAN低(H-)。用于车载网络。它基于面向消息的传输协议。
1970年代是汽车制造商开始引入新功能的时代,例如防抱死制动,空调,齿轮控制,中央操作门锁等。这些功能确保了额外的接线和复杂的设计,从而增加了成本和风险。为了克服这些问题,Robert Bosch在1980年代引入了CAN协议。此串行通信协议在1993年进一步标准化为ISO11898。正是CAN协议完全改变了高级传感器之间的通信。
CAN协议常用于汽车、飞机和医疗系统中的电子网络。常见产品有Can转以太网设备USR-CANET200
嵌入式软件远程在线升级,你的方法是什么?
1)软件升级服务器发送升级指令,嵌入式设备收到回复
2)服务器收到设备的回复,发送升级包
3)设备进行解析安装升级
git
git常用命令
- $ git init # 初始化仓库
- $ git commit # 提交到远程仓库(默认的master分支) 用的蛮多的
- $ git push -f -u origin 远程分支 # 强制提交到远程分支
- $ git pull <远程主机名><远程分支名>:<本地分支名># 取回远程仓库的变换,并与本地分支合并
提交代码的流程
克隆项目代码
1)git clone:整个代码库克隆到本地
2)git branch:查看分支
3) git checkout -b :基于开发分支检出自己分支
本地写自己的代码
3)git add:添加到暂存区
4)git commit:提交到本地
5)git pull:拉取一下最新的改动
6)git merge:合并到本地开发分支
7) git push:推送到远程仓库
以后开始工作前:git pull 原创最新代码
其它
1)git delete 删除分支
2)git rebase:合并分支的方式,干净线性的提交历史,在公共分支上应避免使用
git merge:保留详细的分支历史,根据团队习惯使用
3)git diff:比较工作树和暂存区的差异:
4) git revert:通过创建一个新的提交来撤销之前的提交
5)git reset:撤销到某个提交,但要小心使用,可能会改变项目历史