IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 2022届嵌入式软件校招题(嵌入式基础知识) -> 正文阅读

[嵌入式]2022届嵌入式软件校招题(嵌入式基础知识)

3.1 GPIO口一般有哪三个寄存器?

以S3C2410为例,有控制寄存器、数据寄存器、上拉寄存器。

3.2 GPIO的输入输出模式有哪些?

答案:

(1)输入模式:浮空输入、带上拉输入、带下拉输入、模拟输入。

(2)输出模式:开漏输出、推挽输出、开漏复用输出、推挽复用输出。

解读:

浮空输入_IN_FLOATING

浮空输入,可以做KEY识别。

带上拉输入_IPU

IO内部上拉电阻输入。

带下拉输入_IPD

IO内部下拉电阻输入。

模拟输入_AIN

应用ADC模拟输入,或者低功耗下省电。

开漏输出_OUT_OD

IO输出0接GND,IO输出1则悬空,需要外接上拉电阻才能输出高电平。当输出为1时,IO口的状态由上拉电阻拉高,但同时IO口也可由外部电路拉低,可以通过输入数据寄存器读取电平变化,实现C51的IO双向功能。

推挽输出_OUT_PP

IO输出0接GND,?IO输出1接VCC,读输入值是未知的。

复用功能的推挽输出_AF_PP

片内外设功能(I2C的SCL,SDA)。

复用功能的开漏输出_AF_OD

片内外设功能(TX1,MOSI,MISO.SCK.SS)

3.3请说明总线接口UARTUSBSPIIIC的异同点。

总线接口

串/并

同步/异步

工作方式

速率

线路

距离

大小端

UART

串行

异步

全双工

慢,最快只有1.5Mbps

3线:RX、TX、GND

远,RS-485可达1200m

小端模式

USB

串行

同步

半双工

快,USB3.0可达5Gbps

4线:Vbus、GND、D+、D-

近,不超过5m

小端模式

SPI

串行

同步

全双工

快,可达50Mbps

3线或4线:SCLK、SIMO、SOMI、SS

远,可达10m

大端模式

IIC

串行

同步

半双工

慢,最快只有3.4Mbps

2线:SCL、SDA

近,不超过30cm

大端模式

3.4什么是异步串行?什么是同步串行?

(1)异步串行方式的特点:

①以字符为单位传送信息,相邻两个字符间的间隔是任意长;即字符内部各位同步,字符间异步;

②因为一个字符中的比特位长度有限,所以接收时钟和发送时钟只要相近就可以了。

(2)同步串行方式的特点:

①以数据块为单位传送信息,在一个数据块内,字符与字符之间无间隔;即字符内部各位同步,字符间也同步;

②因为一次传输的数据块中包含的数据较多,所以接收时钟与发送时钟需要严格同步。

3.5 IIC总线时序图?

(1)时序总结:

总线空闲状态

SCL和SDA均为高电平,接上拉电阻。

启动信号(START)

在SCL保持高电平期间,SDA由高电平被拉低。由主控器发出。

数据位传送(DATA)

在SCL保持高电平期间,SDA上的电平保持稳定,低电平为数据0、高电平为数据1。用法:主控器和被控器都可发出。

应答信号(ACK)

在SCL保持高电平期间,SDA保持低电平。IIC总线上所有数据都是以8位字节传送的,发送器每发送一个字节,就在第9个时钟脉冲期间释放SDA(高电平),由接收器反馈一个ACK。

非应答信号(NACK)

在SCL保持高电平期间,SDA保持高电平。如果接收器是主控器,则它在收到最后一个字节后,发送一个NACK,通知被控器结束数据发送,并释放SDA(高电平),以便主控器发送一个STOP。

停止信号(STOP)

在SCL保持高电平时间,SDA由低电平被释放(拉高)。由主控器发出。

(2)写数据步骤:

①主机发起一个启动信号(START)。

②主机发送7bit从机地址+1bit读写选择位,1表示读、0表示写。

③从机产生应答信号(ACK)。

④主机发送8bit从机寄存器地址。

⑤从机产生应答信号(ACK)。

⑥主机发送一个字节数据。

⑦从机产生应答信号(ACK)。

⑧主机发送一个停止信号(STOP)。

(3)读数据步骤

①主机发送一个启动信号(START)。

②主机发送7bit从机地址+1bit读写选择位,1表示读、0表示写。

③从机产生一个应答信号(ACK)。

④主机发送8bit从机寄存器地址。

⑤从机产生一个应答信号。

⑥主机再次发送一个启动信号(START)。

⑦主机再次发送7bit从机地址+1bit读写选择位,1表示读、0表示写。

⑧从机产生一个应答信号(START)。

⑨主机读取一个字节数据。

⑩主机产生一个非应答信号(NACK)。之后产生一个停止信号(STOP)。

3.6 SPI的四种操作时序分别是什么?

SPI的时钟极性CPOL和时钟相位CPHA可以分别为0或1,由此构成了四种组合:

①CPOL = 0,CPHA = 0:空闲时SCLK为低电平,在第一个边沿开始采样。

②CPOL = 0,CPHA = 1:空闲时SCLK为低电平,在第二个边沿开始采样。

③CPOL = 1,CPHA = 0:空闲时SCLK为高电平,在第一个边沿开始采样。

④CPOL = 1,CPHA = 1:空闲时SCLK为高电平,在第二个边沿开始采样。

3.7哪种总线方式是全双工类型?哪种总线方式的传输距离较短?

(1)UART、SPI是全双工类型。

(2)IIC、USB的传输距离较短。

3.8编写一个通用型串口接收程序,如何实现判断未知设备的端口号和波特率?

(1)判断端口号:首先搜索计算机可用端口,然后逐个打开,分别定时1.5秒,有数据进来则认为是目标端口。

(2)波特率判断:将本机波特率分别设置为2400、4800、9600、19200、38600、57600、115200,每个波特率定时1.5秒,对收到的ASCII码进行分析,将小于等于127的认为是正常的字符,将大于127的认为是乱码,当正常字符数目大于等于10倍乱码数目则认为当前波特率为正确波特率,并终止往后搜索。另外,也可以通过示波器判断。

3.9串口如何发送浮点型数据?

可将多字节的浮点型数据分解成单字节逐个发送,接收后组合还原。

(1)使用共用体来分解

union  
{  
    float f;  
    unsigned long l;  
}data_TX;  
data_TX.f = 123.456;  

(2)发送时发送4字节(小端模式,低位先发)

TX = (unsigned char)data_TX.l;       // 低8位  
TX = (unsigned char)(data_TX.l >> 8);  
TX = (unsigned char)(data_TX.l >> 16);  
TX = (unsigned char)(data_TX.l >> 24);  // 高8位  

(3)接收端也定义同样的结构体,并接收4字节数据

union  
{  
    float f;  
    unsigned long l;  
}data_RX;  
data_RX.l = RX;      // 低8位  
data_RX.l |= RX << 8;  
data_RX.l |= RX << 16;  
data_RX.l |= RX << 24; // 高8位  

(4)最后data_RX.f == data_TX.f。

3.10 UARTTTLRS-232RS-485的关系?

答案:

(1)UART是一种具有协议特征的收发器/接口/总线,也就是说它是一个按照特定协议来收发数据的硬件,它规定了数据按照什么格式和时序来传输。

(2)而TTL、RS-232、RS-485是三种不同的电气协议,是对电气特性的规定,作用于数据传输通路,但它并不包含对数据的处理方式。UART可以使用TTL电平,也可以使用RS-232、RS-485电平。

解读:三种电气协议的区别:

TTL(晶体管-晶体管逻辑电平)

规定+5V(或>=2.4V)等于逻辑“1”,0V(或<=0.4V)等于逻辑“0”,噪声容限为0.4V。

RS-232

采用负逻辑传输,规定-5V ~ -15V等于逻辑“1”,+5V ~ + 15V为逻辑“0”,噪声容限为2V。

RS-485

采用差分传输,规定A线电平比B线电平高200mV以上时为逻辑“1”,A线电平比B线电平低200mV以上时为逻辑“0”。

3.11 RS-232RS-485的区别和联系?

(1)区别:

①抗干扰性:RS-485接口的抗干扰性比RS-232接口强,因为RS-485采用差分传输。

②传输距离:RS-485接口(1200m)的传输距离比RS-232接口(50m)远。

③通信能力:RS485接口在总线上允许连接多达128个收发器,而RS-232接口只允许一对一通信。

④传输速率:RS-485接口的最高传输速率为10Mbps,而RS-232接口为20Kbps。

⑤信号线:RS-485接口组成半双工网络需要两根信号线,组成全双工网络需要四根信号线;RS-232接口一般使用RXD、TXD、GND三根线组成全双工网络。

⑥电气电平值:RS-485接口规定A线电平比B线电平高200mV以上时为逻辑“1”,A线电平比B线电平低200mV以上时为逻辑“0”。RS-232接口规定-5V ~ -15V等于逻辑“1”,+5V ~ + 15V为逻辑“0”,噪声容限为2V。

(2)联系:

①都可通过DB-9连接器连接。

②均可采用屏蔽双绞线传输。

③都是串行通信。

④通信方式都是全双工(一般RS-485是半双工)。

3.12 uart如何保证数据传输的正确性?

(1)在数据位的两端添加了起始位、奇偶校验位、停止位等用于数据的同步和纠错。

(2)在接收端用16倍波特率对数据进行采样,取中间的采样值,很大程度上确保了采样数据的正确性。

3.13保证数据无串扰,参数设置正确,但是串口A传输float类型给串口B,总是出现错误,请问可能是什么原因?

可能是发送端和接收端的大小端不一致。

3.14什么是MSB,什么是LSB

(1)MSB(Most Significant Bit):最高有效位,是指二进制中最高值的比特。

(2)LSB(Least Significant Bit):最低有效位,是指二进制中最低值的比特。

3.15 UART一帧可以传5/6/7/8位,IIC必须是8位,SPI可以8/16位。

3.16请列举常用的串行通信方式(两种以上),并简述串行通信和并行通信不同之处、优缺????点。

(1)异步通信(UART)和同步通信(SPI、IIC、USB等)。

(2)串行速度慢但占用资源少、线间干扰小;并行速度快但占用资源多、线间干扰相对大。

3.17 CAN总线接口相对于RS-232接口、RS-485接口的优点是什么?

(1)CAN总线接口相对于RS-232接口的优点是抗干扰能力强、传输距离远。它采用差分传输,内置CRC校验,传输可靠性强。

(2)CAN总线接口相对于RS-485接口的优点是能构成多主系统,同一时刻可以有两个或两个以上的设备处于发送状态,适用于实时性要求高的工控领域。

1.进程&线程(16道)

1.1异步IO和同步IO区别?

答案:如果是同步IO,当一个IO操作执行时,应用程序必须等待,直到此IO执行完。相反,异步IO操作在后台运行,IO操作和应用程序可以同时运行,提高系统性能,提高IO流量。

解读:在同步文件IO中,线程启动一个IO操作然后就立即进入等待状态,直到IO操作完成后才醒来继续执行。而异步文件IO中,线程发送一个IO请求到内核,然后继续处理其他事情,内核完成IO请求后,将会通知线程IO操作完成了。


1.2进程间通信方式?

管道

(pipe)

是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程之间使用,通常是父子进程。

有名管道

(named pipe)

也是半双工的通信方式,但是它允许用于无亲缘关系的进程之间的通信。

信号量

(semophore)

是一个计数器,通常作为一种同步机制,用于进程和线程间的同步。

消息队列

(message queue)

是一个消息链表,存放在内核中并且由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限的缺点。

共享内存

(shared memory)

一段能够被多个进程共同访问的内存,由一个进程创建。共享内存是最快的IPC方式,它是针对其他进程间通信方式运行效率低而设计的,往往与其他通信方式如信号量配合使用,来实现进程间同步与通信。

套接字(socket)

可用于不同主机间的进程通信。

信号(signal)

用于通知接收进程某个事件已经发生,是一种比较复杂的通信方式。

1.3进程的地址空间模型?

text segment

存储代码的区域。

data segment

存储初始化不为0的全局变量和静态变量、const型常量。

bss segment

存储未初始化的、初始化为0的全局变量和静态变量。

heap(堆)

用于动态开辟内存空间。

memory mapping space

(内存映射区)

mmap系统调用使用的空间,通常用于文件映射到内存或匿名映射(开辟大块空间),当malloc大于128k时(此处依赖于glibc的配置),也使用该区域。在进程创建时,会将程序用到的平台、动态链接库加载到该区域。

stack(栈)

存储函数参数、局部变量。

kernel space

存储内核代码。

1.4进程的五种状态分别是?

(1)就绪态:所有运行条件已就绪,只要得到了CPU时间就可运行。

(2)运行态:得到CPU时间正在运行。

(3)僵尸态:进程已经结束了但父进程还没来得及回收。

(4)等待态:包括浅度睡眠跟深度睡眠。进程在等待某种条件,条件成熟后即进入就绪态。浅度睡眠时进程可以被信号唤醒,但深度睡眠时必须等到条件成熟后才能结束睡眠状态。

(5)暂停态:暂时停止参与CPU调度(即使条件成熟),可以恢复。

1.5子进程从父进程继承的资源有哪些?

答案:子进程继承父进程的绝大部分资源,包括堆栈、内存、用户号和组号、打开的文件描述符、当前工作目录、根目录。

注意:子进程独有进程号、不同的父进程号、自己的文件描述符。

1.6什么是进程上下文、中断上下文?

(1)进程上文:是指进程由用户态切换到内核态时需要保存用户态时CPU寄存器中的值,进程状态以及堆栈上的内容。即保存当前进程的状态,以便再次执行该进程时,能够恢复切换时的状态,继续执行。

(2)进程下文:是指切换到内核态后执行的程序,即进程运行在内核空间的部分。

(3)中断上文:硬件通过中断触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。中断上文可以看作硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被中断的进程环境)。

(4)中断下文:执行在内核空间的中断服务程序。

1.7如何防止僵尸进程过多导致系统空间爆满?

答案:每当子进程退出,父进程都会收到SIGCHLD信号,故可在父进程中设置SIGCHLD信号的捕获函数,在捕获函数中回收子进程。

void*?handler(int?sig)??

{??

????int?status;??

????if(waitpid(-1,?&status,?WNOHANG)?>=?0)??

????{??

????????printf("child?is?die\n");??

????}??

}??

int?main()??

{??

????signal(SIGCHLD,?handler);??

????int?pid?=?fork();??

????if(pid?>?0)??//父进程循环等待??

????{??

????????while(1)??

????????{??

????????????sleep(2);??

????????}??

????}??

????else?if(0?==?pid)??

????{???//子进程说自己die后就结束生命周期,之后父进程就收到SIGCHLD??

????????//信号调用handler函数接收结束子进程,打印child?is?die。??

????????printf("i?am?child,?i?die\n");??

????????exit(0);??

????}??

}?

解读:

(1)僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。

(2)可用top命令查看僵尸进程的数量(zombie),也可用ps -aux | grep Z(僵尸进程的状态显示为Z)来查看僵尸进程的PID等信息。

1.8 /proc目录下,以数字命名的目录表示什么?

以数字命名的目录表示当前一个运行的进程,目录名即为进程PID,其内的目录和文件给出了一些关于该进程的信息。

1.9进程和线程有什么区别?

(1)进程是系统中程序执行和资源分配的基本单位,线程是CPU调度的基本单位。

(2)一个进程个拥有多个线程,线程可以访问其所属进程地址空间和系统资源(数据段、已经打开的文件、I/O设备等),同时也拥有自己的堆栈。

(3)同一进程中的多个线程可以共享同一地址空间,因此它们之间的通信实现也比较简单,而且切换开销小、创建和消亡的开销也小。而进程间的通信则比较麻烦,而且进程切换开销、进程创建和消亡的开销也比较大。

1.10什么时候用多进程?什么时候用多线程?

(1)当程序的安全性、稳定性要求较高时用多进程。

(2)需要频繁通信/切换程序/创建跟销毁程序时用多线程。

1.11线程可以独立运行吗?一个线程崩溃会导致整个进程崩溃吗?

答案:线程不能独立运行,但一个线程崩溃不一定导致整个进程崩溃。

解读:

(1)线程属于进程,线程的运行需要依赖进程的地址空间和系统资源。

(2)线程崩溃的本质就是内存出错,若出错的内存没有被其他线程访问,则不会导致其他线程出错,也就不会导致进程崩溃。

1.12写出下列线程、互斥锁、信号量相关代码。

定义一个线程ID变量

pthread_t tid;

创建线程

pthread_create(&tid, NULL, pthread_func, NULL);

等待子线程结束,并回收资源

pthread_join(tid, NULL);

与当前进程分离

pthread_detach(tid);

退出调用线程

pthread_exit(NULL);

取消线程

pthread_cancel(tid);

创建互斥锁

pthread_mutex mutex = PTHREAD_MUTEX_INITIALIZER;

初始化一个互斥锁

pthread_mutex_init(&mutex, NULL);

对互斥锁上锁

pthread_mutex_lock(&mutex);

对互斥锁解锁

pthread_mutex_unlock(&mutex);

定义一个信号量

sem_t sem;

创建信号量并初始化它的值

sem_init(&sem, 0, 1);

信号量的值减1

sem_wait(&sem);

信号量的值加1

sem_post(&sem);

1.13线程间通信和同步方式有哪些?

信号、信号量、互斥锁、条件变量、自旋锁、读写锁。

1.14如何防止同时产生大量的线程?

(1)方法是使用线程池。

(2)线程池可以提高调度效率和限制资源使用,线程池中的线程达到最大数时,其他线程就会排队等候。

1.15互斥锁与信号量的区别?

(1)信号量用于线程同步,互斥锁用于线程互斥。

(2)信号量可以为非负整数,可以实现多个同类资源的多线程同步;互斥锁只能为0/1,只能用于一个资源的互斥访问。

(3)信号量可以由一个线程释放,另一个线程得到;互斥锁的加锁和解锁必须由同一线程分别对应使用,且多个线程使用多个互斥锁必须注意统一顺序,否则可能造成死锁。

1.16孤儿进程是什么?

(1)父进程先于子进程结束,此时子进程成为一个孤儿进程。

(2)Linux系统规定:所有孤儿进程都成为一个特殊进程(进程1,也就是init进程)的子进程。.

如果感觉写的还可以 但是还想再学一点点 可以去看这个专栏

(本文的出处是专栏的C语言专栏 总结出的高频考题(侵权联系删除即可))

1. 专刊及作者介绍_牛客博客(嫌贵的再刷一些算法题和arm架构的知识即可)

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-01-17 11:38:55  更:2022-01-17 11:39:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 1:20:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码