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

Oct*_*pus 4 arm interrupt beagleboneblack

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

在此输入图像描述

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

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

disable_irq();
/* asm code to send my bytes */
reenable_irq();
Run Code Online (Sandbox Code Playgroud)

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

shi*_*ley 6

你想使用的电话是local_irq_disable()local_irq_enable()禁用与当前的CPU上启用本地的IRQ.这还具有禁用CPU上所有抢占的效果.

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

这将是一个挑战. 测试表明,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.