华为嵌入式
stm32单片机和51单片机的区别
-
架构:
- STM32单片机:基于ARM Cortex-M系列处理器,具有先进的32位处理能力和丰富的外设资源。
- 51单片机:基于Intel 8051系列处理器,是一种经典的8位单片机,具有较为简单的指令集和功能。
-
位宽:
- STM32单片机:是一种32位处理器,处理数据时一次可以处理32位数据。
- 51单片机:是一种8位处理器,处理数据时一次只能处理8位数据。
-
性能:
- STM32单片机:具有更高的性能,适用于处理复杂的任务和运行较大规模的程序。
- 51单片机:性能较低,主要用于简单的嵌入式应用和低成本项目。
-
外设资源:
- STM32单片机:拥有丰富的外设资源,包括多个通用定时器、串口、SPI、I2C、USB等,能够满足各种应用需求。
- 51单片机:外设资源相对较少,通常包括定时器、串口、IO口等基本外设。
-
开发环境:
- STM32单片机:常用的开发工具有Keil MDK、IAR Embedded Workbench等,支持C/C++编程,并提供丰富的软件库和示例代码。
- 51单片机:常用的开发工具有Keil C51、SDCC等,也支持C语言编程,但相对STM32的开发工具较为简单。
-
成本:
- STM32单片机:通常成本相对较高,但性能更强大,适用于需要较高性能的应用。
- 51单片机:成本较低,适用于对成本敏感的项目或简单的应用场景。
flash,rom,ram,e2prom的用法和不同
| Flash存储器(闪存) | 主要用于存储程序代码、固件和其他持久性数据 | 可擦写、可编程、非易失性。它可以多次擦除和编程,通常具有较长的寿命。 | 常见于嵌入式系统中,用于存储操作系统、应用程序和固件。 |
| ROM(只读存储器) | 用于存储固定的数据,如启动代码、固件等,通常在制造过程中被编程,并且只能读取。 | 只读、非易失性。内容在生产过程中被设定,无法修改。 | 常见于存储系统启动代码、基本固件以及其他不需要修改的数据。 |
| RAM(随机存取存储器) | 主要用于存储程序运行时的数据、堆栈和临时变量。 | 可读写、易失性。内容在断电时会丢失,需要电源持续供电来保持数据 | 在嵌入式系统中用于临时存储数据、程序堆栈和动态分配内存。 |
| EEPROM(电可擦除可编程只读存储器) | 用于存储需要经常更新或修改的数据,如配置参数、校准数据等。 | 可擦写、可编程、非易失性。相比Flash,EEPROM通常有更快的擦写速度和更少的擦写次数限制。 | 常见于存储用户配置、设备参数、校准数据等需要经常更新的信息。 |
iic通信故障怎么排查?
-
确认物理连接: 检查I2C总线的物理连接,包括线缆、连接器和电气连接。确保线缆没有损坏、连接器插入良好,并且供电电压稳定。
-
确认设备地址: 确保每个I2C设备的地址设置正确,并且与程序中使用的地址一致。地址冲突可能导致通信失败。
-
确认时钟频率: 检查I2C时钟频率设置是否正确。时钟频率过高可能导致通信错误,可以尝试降低时钟频率。
-
检查电源供应: 确保所有I2C设备都正常供电,并且电源电压符合设备要求。电源问题可能导致通信错误或不稳定性。
-
逐个排查设备: 逐个排查连接的I2C设备,确认每个设备的工作状态。可以通过将设备断开并重新连接,然后测试每个设备是否能够正常通信。
-
逻辑分析器: 使用逻辑分析器或示波器监视I2C总线上的信号。通过观察时钟和数据线上的信号波形,可以确定是否存在通信问题,如时钟线是否正确工作、数据线上是否有数据传输等。
-
软件调试: 检查程序代码中的I2C通信部分,确保使用正确的I2C库函数、正确的寄存器配置和正确的通信协议。检查是否正确处理了ACK(应答)信号和错误情况。
-
电磁干扰(EMI): 检查周围环境中是否存在电磁干扰源,如电机、高频设备等。电磁干扰可能导致I2C通信错误或中断。
spi和iic适用场景对比
-
SPI适用场景:
- 高速数据传输: SPI通信速度较快,适合对速度要求较高的应用场景。
- 短距离通信: SPI通常用于短距离通信,如在同一个PCB板上连接芯片。
- 设备间并行通信: SPI支持主从模式,可以连接多个从设备,实现并行通信。
- 单向通信需求: SPI通信一般是全双工的,但也可以实现单向通信,适用于不需要返回数据的情况。
-
I2C适用场景:
- 多设备连接: I2C支持多主机和多从机,适合连接多个设备的场景。
- 中等速度传输: I2C通信速度较SPI略慢,但对于中等速度要求的应用仍然很有效。
- 长距离通信: I2C通信可以在较长距离内传输数据,适用于设备之间距离较远的情况。
- 低功耗: I2C在设备空闲时可以进入低功耗模式,有利于节能。
综合来看,SPI更适合短距离、高速、单向通信的应用,而I2C则更适合多设备连接、长距离通信、低功耗等场景
Linux内核中的信号响应过程如下:
-
信号发送: 当用户空间或内核中的进程调用kill系统调用或者发送信号给进程组时,信号被发送到目标进程。
-
信号到达目标进程: 内核接收到信号后,确定目标进程,并将信号传递给该进程。
-
信号递送: 内核首先检查目标进程的信号掩码,如果信号被阻塞,则该信号被阻塞且不递送给进程。如果信号未被阻塞,内核将调用目标进程的信号处理函数(如果已经注册了)来处理信号。
-
信号处理: 目标进程收到信号后,会执行与该信号相关联的信号处理函数。如果进程未注册信号处理函数,则根据信号的默认处理方式执行相应操作,比如终止进程、忽略信号等。
-
信号处理完成: 一旦信号处理函数执行完毕,控制权返回到目标进程的用户空间代码,继续执行原来的程序。
信号处理函数的处理方式
-
默认处理:
- 每个信号都有一个默认的行为,这些行为可以是终止进程、忽略信号、停止进程或继续运行一个已停止的进程。例如,SIGKILL 和 SIGSTOP 信号的默认行为是不可被捕获或忽略,分别用于终止和停止进程。
-
忽略信号:
- 进程可以显式地忽略某些信号(除了SIGKILL和SIGSTOP),这是通过将信号的处理函数设置为
SIG_IGN
实现的。当进程收到这样的信号时,内核简单地不采取任何行动。
- 进程可以显式地忽略某些信号(除了SIGKILL和SIGSTOP),这是通过将信号的处理函数设置为
-
捕获信号并处理:
- 进程可以定义自己的信号处理函数,这些函数在信号到达时被调用。这是通过设置信号处理函数为用户定义的函数地址来实现的,通常使用
sigaction()
系统调用来设置。信号处理函数可以执行诸如清理资源、记录日志、发送通知等任务。 - 使用
sigaction()
而不是较老的signal()
函数进行信号处理设置,可以提供更多控制选项和更好的可移植性。
- 进程可以定义自己的信号处理函数,这些函数在信号到达时被调用。这是通过设置信号处理函数为用户定义的函数地址来实现的,通常使用
-
暂停并等待信号:
- 进程可以使用如
pause()
或sigsuspend()
等系统调用暂停执行,直到接收到信号。这些调用通常用在需要进程等待外部事件的情况。
- 进程可以使用如
-
自动重启被信号中断的系统调用:
- 使用
sigaction()
设置信号处理函数时,可以选择设置SA_RESTART
标志,这使得由于信号到达而中断的某些系统调用会自动重启,而不是返回错误。
- 使用
cache的作用
-
提高访问速度: 缓存存储了最近访问过的数据或指令的副本,当需要再次访问这些数据或指令时,可以直接从缓存中获取,而无需再次访问慢速的主存或磁盘。这样可以大大加快数据和指令的访问速度,提高系统的整体性能。
-
减轻主存和I/O负载: 缓存能够减轻主存和I/O设备的负载,因为它可以暂时存储一部分频繁访问的数据或指令。这样可以减少对主存和磁盘的访问次数,降低了系统对这些资源的竞争压力,提高了系统的整体吞吐量。
-
提高CPU利用率: 通过减少CPU等待主存或I/O设备的时间,缓存可以提高CPU的利用率,使CPU能够更有效地执行指令,从而提高系统的性能。
-
降低能耗: 缓存可以降低系统的能耗,因为它减少了对主存和磁盘的访问次数,从而减少了这些设备的功耗。此外,通过减少CPU等待时间,缓存还可以降低CPU的功耗。
-
提高响应速度: 缓存还可以提高系统的响应速度,因为它可以存储一些预先计算好的结果或常用的数据,使系统能够更快地响应用户的请求或操作。
进程(Process)和线程(Thread)
-
独立性:
- 进程是程序的执行实例,每个进程拥有独立的地址空间,即每个进程都拥有自己的内存空间,彼此之间相互隔离。进程之间通常通过进程间通信(IPC)来进行数据交换和同步。
- 线程是进程中的执行单元,多个线程共享同一个进程的地址空间,包括代码段、数据段和堆栈等。线程之间可以方便地共享数据和资源,但也需要注意同步和互斥的问题。
-
创建和销毁开销:
- 创建和销毁进程的开销通常比线程大,因为进程拥有独立的地址空间和资源,需要进行资源的分配和初始化。
- 创建和销毁线程的开销相对较小,因为线程共享进程的资源,只需要创建和销毁线程的控制块以及一些少量的线程私有数据。
-
切换开销:
- 由于进程拥有独立的地址空间,进程切换(即从一个进程切换到另一个进程)的开销通常比线程切换大。进程切换需要保存和恢复进程的完整状态,包括内存映像、寄存器状态、打开的文件等。
- 线程切换的开销相对较小,因为线程共享相同的地址空间,线程切换只需保存和恢复线程的寄存器状态即可。
-
通信和同步:
- 进程之间通信较为复杂,通常需要使用特定的IPC机制(如管道、消息队列、信号量、共享内存等)来实现进程间的数据交换和同步。
- 线程之间通信和同步相对简单,因为它们共享相同的地址空间,可以直接读写共享的数据,也可以使用线程同步机制(如互斥锁、条件变量、信号量等)来保护共享资源。
并发和并行的区别
并发是指多个任务在时间上可能交替执行,而并行是指多个任务在同一时刻同时执行