在嵌入式应用中撞击SPI / I2C有什么缺点

时间:2013-12-26 19:48:24

标签: embedded i2c spi

我已经明白,当涉及到GPIO上的SPI / I2C时,位敲击是一种可怕的做法。为什么这样?

5 个答案:

答案 0 :(得分:15)

Bit-banging带有软件开销消耗CPU周期,否则您可以将其用于其他目的。这可能会对系统对其他事件的响应性产生明显影响,并且在硬实时系统中可能会显着影响系统满足实时截止日期的能力。

如果bit-banged接口不会对实时性能产生不利影响,那么它必须被赋予低优先级,因此在数据吞吐量和延迟方面本身就是不确定的。

通过使用硬件接口和DMA传输实现最高CPU效率的传输,以最大限度地减少软件开销。比特爆炸处于相反的极端。

我不会说这是可怕的;如果在您的应用程序中您可以实现响应性和实时约束,并且使用bit-banging可能会降低所需部件的成本,或者允许您使用现有硬件,那么它可能是完全合理的。

答案 1 :(得分:3)

我不知道它是可怕的,但是如果你已经有了SPI或I2C外设,那么肯定会有一个“不要重新发明轮子”的论点来反对比特冲击,特别是因为您的代码中可能存在错误 - 例如,您可能在SPI时钟的错误边缘进行采样,并且根据所涉及的容差和您测试的硬件,您可能不会注意到它直到您已经在生产。 wikipedia文章还指出,您正在使用额外的处理能力,并且您可能会在您生成的任何信号中引入抖动。

所有这一切都说,如果您的硬件没有内置外围设备,或者如果它已经被其他设备用尽,那么bit-banging是唯一可用的选择。如果内置SPI外设由高速带宽设备使用,您必须不断与之通信,也许您可​​以选择另一个不需要在您的应用中实时的SPI设备。

答案 2 :(得分:3)

位敲击是可移植的,例如,请参阅Linux内核驱动程序中的I2C代码。你可以快速启动并运行它只是工作。基于硬件的解决方案通常不需要花费一些时间来启动和运行,并且受到硬件实现的限制。并非所有spi,尤其是i2c都符合可在通用硬件解决方案中实现的标准。你必须始终能够落后于撞击。

比特敲击消耗更多的处理器资源,这使得它从前端不受欢迎。它更便携,或者可以取决于它的编写方式,因此在这方面是可取的。硬件SPI / I2C与那些相反,带走了一些cpu开销,不可移植,并不总是足够灵活地处理所有外设。

作为一名专业人士,您需要对两者都感到满意,就像您在设计中所做的任何其他嵌入式权衡一样。

答案 3 :(得分:0)

这不会被称为可怕的。但是,是的,当我们使用bit-banging实现协议时,控制器很可能会错过执行其他更重要的任务,因为协议可能比专用硬件消耗的CPU时间更多。因此,应该避免在实时环境中或说,时间关键的环境 除此之外,还有一个问题就是位冲击,通常在读取和/或写入引脚时,产生的信号通常会产生更多的抖动或毛刺,特别是如果控制器在通信时也执行其他任务。如果在使用bit-banging是不可避免的,然后至少尝试使用中断而不是轮询。

答案 4 :(得分:0)

在非实时系统中进行位冲击是不可能的。如果你将它放在不可中断的内核中,那么你真的必须确保在重新安排用户进程之前只能咬掉一定数量的位。

考虑一下:你有一个以1/1000秒间隔运行的调度计时器。当它运行时,您检查某个进程是否想要通过bitbanged接口发送数据并处理此请求。该请求要求您以9600波特比特为一个字节(例如)。现在你遇到了一个问题:bitbang一个字节需要0.8ms。你无法承受这一点,因为当调度中断运行时,它必须完成它的工作并加载运行然后退出所需的下一个进程。这通常比1ms花费的时间短得多,并且1ms主要用于运行用户进程直到下一次中断。但是,如果你开始咬棒,那么你大部分时间都在做什么。

对此的一个解决方案可能是使用定时器外围设备仅用于bitbanging目的。这将提供一个相当自主的和中断驱动的bitbanging代码,它根本不需要空闲 - 但这只是以使用专用定时器为代价。如果你可以使用专用的硬件计时器,那么bitbanging可能会很好用。但总的来说,在多任务处理环境中进行高速可靠的bitbanging非常困难。