01嵌入式Linux

本文详细比较了STM32和51单片机在架构、性能、外设资源、开发环境和成本方面的差异,以及Flash、ROM、RAM和EEPROM的用法,并讨论了I2C和SPI通信的特点。同时,还涵盖了Linux内核信号处理和并发与并行的概念。
摘要由CSDN通过智能技术生成

stm32单片机和51单片机的区别

  1. 架构:

    • STM32单片机:基于ARM Cortex-M系列处理器,具有先进的32位处理能力和丰富的外设资源。
    • 51单片机:基于Intel 8051系列处理器,是一种经典的8位单片机,具有较为简单的指令集和功能。
  2. 位宽:

    • STM32单片机:是一种32位处理器,处理数据时一次可以处理32位数据。
    • 51单片机:是一种8位处理器,处理数据时一次只能处理8位数据。
  3. 性能:

    • STM32单片机:具有更高的性能,适用于处理复杂的任务和运行较大规模的程序。
    • 51单片机:性能较低,主要用于简单的嵌入式应用和低成本项目。
  4. 外设资源:

    • STM32单片机:拥有丰富的外设资源,包括多个通用定时器、串口、SPI、I2C、USB等,能够满足各种应用需求。
    • 51单片机:外设资源相对较少,通常包括定时器、串口、IO口等基本外设。
  5. 开发环境:

    • STM32单片机:常用的开发工具有Keil MDK、IAR Embedded Workbench等,支持C/C++编程,并提供丰富的软件库和示例代码。
    • 51单片机:常用的开发工具有Keil C51、SDCC等,也支持C语言编程,但相对STM32的开发工具较为简单。
  6. 成本:

    • STM32单片机:通常成本相对较高,但性能更强大,适用于需要较高性能的应用。
    • 51单片机:成本较低,适用于对成本敏感的项目或简单的应用场景。

flash,rom,ram,e2prom的用法和不同

| Flash存储器(闪存) | 主要用于存储程序代码、固件和其他持久性数据 | 可擦写、可编程、非易失性。它可以多次擦除和编程,通常具有较长的寿命。 | 常见于嵌入式系统中,用于存储操作系统、应用程序和固件。 |

| ROM(只读存储器) | 用于存储固定的数据,如启动代码、固件等,通常在制造过程中被编程,并且只能读取。 | 只读、非易失性。内容在生产过程中被设定,无法修改。 | 常见于存储系统启动代码、基本固件以及其他不需要修改的数据。 |

| RAM(随机存取存储器) | 主要用于存储程序运行时的数据、堆栈和临时变量。 | 可读写、易失性。内容在断电时会丢失,需要电源持续供电来保持数据 | 在嵌入式系统中用于临时存储数据、程序堆栈和动态分配内存。 |

| EEPROM(电可擦除可编程只读存储器) | 用于存储需要经常更新或修改的数据,如配置参数、校准数据等。 | 可擦写、可编程、非易失性。相比Flash,EEPROM通常有更快的擦写速度和更少的擦写次数限制。 | 常见于存储用户配置、设备参数、校准数据等需要经常更新的信息。 |

iic通信故障怎么排查?

  1. 确认物理连接: 检查I2C总线的物理连接,包括线缆、连接器和电气连接。确保线缆没有损坏、连接器插入良好,并且供电电压稳定。

  2. 确认设备地址: 确保每个I2C设备的地址设置正确,并且与程序中使用的地址一致。地址冲突可能导致通信失败。

  3. 确认时钟频率: 检查I2C时钟频率设置是否正确。时钟频率过高可能导致通信错误,可以尝试降低时钟频率。

  4. 检查电源供应: 确保所有I2C设备都正常供电,并且电源电压符合设备要求。电源问题可能导致通信错误或不稳定性。

  5. 逐个排查设备: 逐个排查连接的I2C设备,确认每个设备的工作状态。可以通过将设备断开并重新连接,然后测试每个设备是否能够正常通信。

  6. 逻辑分析器: 使用逻辑分析器或示波器监视I2C总线上的信号。通过观察时钟和数据线上的信号波形,可以确定是否存在通信问题,如时钟线是否正确工作、数据线上是否有数据传输等。

  7. 软件调试: 检查程序代码中的I2C通信部分,确保使用正确的I2C库函数、正确的寄存器配置和正确的通信协议。检查是否正确处理了ACK(应答)信号和错误情况。

  8. 电磁干扰(EMI): 检查周围环境中是否存在电磁干扰源,如电机、高频设备等。电磁干扰可能导致I2C通信错误或中断。

spi和iic适用场景对比

  1. SPI适用场景:

    • 高速数据传输: SPI通信速度较快,适合对速度要求较高的应用场景。
    • 短距离通信: SPI通常用于短距离通信,如在同一个PCB板上连接芯片。
    • 设备间并行通信: SPI支持主从模式,可以连接多个从设备,实现并行通信。
    • 单向通信需求: SPI通信一般是全双工的,但也可以实现单向通信,适用于不需要返回数据的情况。
  2. I2C适用场景:

    • 多设备连接: I2C支持多主机和多从机,适合连接多个设备的场景。
    • 中等速度传输: I2C通信速度较SPI略慢,但对于中等速度要求的应用仍然很有效。
    • 长距离通信: I2C通信可以在较长距离内传输数据,适用于设备之间距离较远的情况。
    • 低功耗: I2C在设备空闲时可以进入低功耗模式,有利于节能。

综合来看,SPI更适合短距离、高速、单向通信的应用,而I2C则更适合多设备连接、长距离通信、低功耗等场景

Linux内核中的信号响应过程如下:

  1. 信号发送: 当用户空间或内核中的进程调用kill系统调用或者发送信号给进程组时,信号被发送到目标进程。

  2. 信号到达目标进程: 内核接收到信号后,确定目标进程,并将信号传递给该进程。

  3. 信号递送: 内核首先检查目标进程的信号掩码,如果信号被阻塞,则该信号被阻塞且不递送给进程。如果信号未被阻塞,内核将调用目标进程的信号处理函数(如果已经注册了)来处理信号。

  4. 信号处理: 目标进程收到信号后,会执行与该信号相关联的信号处理函数。如果进程未注册信号处理函数,则根据信号的默认处理方式执行相应操作,比如终止进程、忽略信号等。

  5. 信号处理完成: 一旦信号处理函数执行完毕,控制权返回到目标进程的用户空间代码,继续执行原来的程序。

信号处理函数的处理方式

  1. 默认处理:

    • 每个信号都有一个默认的行为,这些行为可以是终止进程、忽略信号、停止进程或继续运行一个已停止的进程。例如,SIGKILL 和 SIGSTOP 信号的默认行为是不可被捕获或忽略,分别用于终止和停止进程。
  2. 忽略信号:

    • 进程可以显式地忽略某些信号(除了SIGKILL和SIGSTOP),这是通过将信号的处理函数设置为 SIG_IGN 实现的。当进程收到这样的信号时,内核简单地不采取任何行动。
  3. 捕获信号并处理:

    • 进程可以定义自己的信号处理函数,这些函数在信号到达时被调用。这是通过设置信号处理函数为用户定义的函数地址来实现的,通常使用sigaction()系统调用来设置。信号处理函数可以执行诸如清理资源、记录日志、发送通知等任务。
    • 使用sigaction()而不是较老的signal()函数进行信号处理设置,可以提供更多控制选项和更好的可移植性。
  4. 暂停并等待信号:

    • 进程可以使用如 pause()sigsuspend() 等系统调用暂停执行,直到接收到信号。这些调用通常用在需要进程等待外部事件的情况。
  5. 自动重启被信号中断的系统调用:

    • 使用sigaction()设置信号处理函数时,可以选择设置SA_RESTART标志,这使得由于信号到达而中断的某些系统调用会自动重启,而不是返回错误。

cache的作用

  1. 提高访问速度: 缓存存储了最近访问过的数据或指令的副本,当需要再次访问这些数据或指令时,可以直接从缓存中获取,而无需再次访问慢速的主存或磁盘。这样可以大大加快数据和指令的访问速度,提高系统的整体性能。

  2. 减轻主存和I/O负载: 缓存能够减轻主存和I/O设备的负载,因为它可以暂时存储一部分频繁访问的数据或指令。这样可以减少对主存和磁盘的访问次数,降低了系统对这些资源的竞争压力,提高了系统的整体吞吐量。

  3. 提高CPU利用率: 通过减少CPU等待主存或I/O设备的时间,缓存可以提高CPU的利用率,使CPU能够更有效地执行指令,从而提高系统的性能。

  4. 降低能耗: 缓存可以降低系统的能耗,因为它减少了对主存和磁盘的访问次数,从而减少了这些设备的功耗。此外,通过减少CPU等待时间,缓存还可以降低CPU的功耗。

  5. 提高响应速度: 缓存还可以提高系统的响应速度,因为它可以存储一些预先计算好的结果或常用的数据,使系统能够更快地响应用户的请求或操作。

进程(Process)和线程(Thread)

  1. 独立性:

    • 进程是程序的执行实例,每个进程拥有独立的地址空间,即每个进程都拥有自己的内存空间,彼此之间相互隔离。进程之间通常通过进程间通信(IPC)来进行数据交换和同步。
    • 线程是进程中的执行单元,多个线程共享同一个进程的地址空间,包括代码段、数据段和堆栈等。线程之间可以方便地共享数据和资源,但也需要注意同步和互斥的问题。
  2. 创建和销毁开销:

    • 创建和销毁进程的开销通常比线程大,因为进程拥有独立的地址空间和资源,需要进行资源的分配和初始化。
    • 创建和销毁线程的开销相对较小,因为线程共享进程的资源,只需要创建和销毁线程的控制块以及一些少量的线程私有数据。
  3. 切换开销:

    • 由于进程拥有独立的地址空间,进程切换(即从一个进程切换到另一个进程)的开销通常比线程切换大。进程切换需要保存和恢复进程的完整状态,包括内存映像、寄存器状态、打开的文件等。
    • 线程切换的开销相对较小,因为线程共享相同的地址空间,线程切换只需保存和恢复线程的寄存器状态即可。
  4. 通信和同步:

    • 进程之间通信较为复杂,通常需要使用特定的IPC机制(如管道、消息队列、信号量、共享内存等)来实现进程间的数据交换和同步。
    • 线程之间通信和同步相对简单,因为它们共享相同的地址空间,可以直接读写共享的数据,也可以使用线程同步机制(如互斥锁、条件变量、信号量等)来保护共享资源。

并发和并行的区别

并发是指多个任务在时间上可能交替执行,而并行是指多个任务在同一时刻同时执行

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想和我重名?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值