我可以在短时间内(0.5ms)禁用BBB上的中断吗?

时间:2015-03-20 07:19:13

标签: arm interrupt beagleboneblack

我正在尝试在Beaglebone Black上编写一个小驱动程序,需要发送一个信号,如下所示:

enter image description here

我需要发送360位信息。我想知道在发送信号时是否可以关闭电路板上的所有中断持续500μs。我不知道我是否可以关掉那样的所有中断。到目前为止,搜索对我来说是不友好的。 我有什么想法可以实现这个目标?我确实有一些汇编语言的原型用于信号,但我很确定它被中断打破了。

所以例如,我希望我能有这样的东西:

disable_irq();
/* asm code to send my bytes */
reenable_irq();

disable_irq()和reenable_irq()的主体是什么样的?

2 个答案:

答案 0 :(得分:6)

您要使用的呼叫是local_irq_disable()local_irq_enable()来禁用&在当前CPU上本地启用IRQ。这也具有禁用CPU上所有抢占的效果。

现在让我们谈谈你的一般方法。如果我理解正确的话,你会想要通过GPIO来协议你的协议,其时间精确到< 1/3我们。

这将是一个挑战。 Tests show Beaglebone黑色GPIO切换频率最高可达~2.78MHz,直接写入内核模式的SoC IO寄存器(~0.18 us最小脉冲宽度)。

所以,虽然通过在内核空间中编写原子代码可以通过最薄的边缘实现 ,但我提出了另一个概念:

在SPI总线上实现自定义串行协议。

为什么?

在Beaglebone Black上,SPI总线的时钟频率最高可达48MHz,可以缓冲,并可与DMA引擎配合使用。因此,您不必担心禁用中断并为这一个接口独占CPU。定时分辨率约为0.021us(@ 48MHz),您应该能够以可接受的误差范围达到定时需求。

总线配置为单通道连续传输仅发送主模式和30位字长(协议的每一位有2个30位字):

要使用您的协议写入'0',您需要在SPI(@ 48MHz)上写入2个字序列 - 17个1,然后是43个0。

要用你的协议写一个'1',你要在SPI(@ 48MHz)上写下2个字序列 - 43个1,然后是17个0。

答案 1 :(得分:1)

从您的信号时序中可以很容易地发现SPI或其他串行外设可以满足您的需求。在你的时间里,编码是基于脉冲的宽度。所以,让我们谈谈:

  

Q1 你可以在500μs的时间内关闭所有中断吗?

A: 0.5ms是嵌入式系统中相当长的一段时间。 ISR的诞生是为了实现多任务的并发性并提高实时性。您应该记住,ISR和上下文切换(在某些芯片架构中)都受全局中断的影响。 但如果你的首要任务是执行时间,并且其他任务的实时窗口是可以接受的,那么你可以在持续时间内禁用全局中断。甚至更长。如果没有,请不要在这么长时间内进行ATOM操作。

  

Q2 如何?

A:对于某个芯片,毫无疑问是开启/关闭全局中断的asm指令。查找操作系统提供的说明或API,执行以下3个步骤(伪代码):

state_t tState = get_interrupt_status( );
disable_interrupt( );
... /*your operation here*/
resume_interrupt( tState );