2013-01-21 124 views
5

我正在为嵌入式系统(Cortex M0)编写代码,并没有所有的互斥/自旋锁/等的奢侈品。有没有一种简单的方法将数据添加到共享缓冲区(日志文件),该缓冲区将从我的Main()循环刷新到磁盘?中断安全缓冲区

如果只有一个生产者(1中断)和单个消费者(主循环),我可以使用一个简单的缓冲区,其中生产者增加'头'和消费者'尾巴'。这将是完全安全的。但现在我有多个生产者(中断),似乎我卡住了。

我可以给每个中断自己的缓冲区,并将它们组合在Main()中,但这需要大量额外的RAM和复杂性。

+0

你有什么类型的运行时库你链接?也许它包含“原子”功能?或者没有这样的函数/库,那么CPU可能有指令来自动比较和增加/减少值?这些可用于您自己的信号量或互斥锁的实现。 –

+0

@JoachimPileborg这是一款恩智浦LPC11U35 CPU,它与RedLib库链接,据我所知,它不提供原子功能。 – Muis

+0

我不熟悉这个系统的中断结构。但是,您的中断是否具有相同的优先级,或者是否存在啄食顺序?无论哪种方式,似乎你可以使用一个缓冲区的堆栈。或者您是否可以预见此解决方案的堆栈溢出问题? –

回答

5

您可以通过一个简单的ring buffer(圆形阵列)实现这一点,在此访问期间关闭硬件中断源。它只需要函数init,add和remove。

我不确定您的特定MCU如何处理中断,但只要您只启用/禁用特定硬件外设的中断,他们很可能会保持挂起状态。根据您的应用程序的性质,您也可以禁用全局中断屏蔽,但这相当粗糙。

通常,您不必担心丢失中断,因为如果处理传入中断的代码比中断频率慢,世界上没有任何软件可以解决这个问题。你要么必须接受数据丢失,要么增加CPU时钟来躲避这种情况。但是,当然你应该总是尽量保持ISR中的代码尽可能的紧凑。

+0

对于单个生产者/单个消费者,只要生产者只移动头指针,并且消费者仅移动尾指针,则不需要关闭中断或锁访问。 – Lou

+0

@Lou这是不正确的,除非访问是原子,这不是这里的情况。 – Lundin

+0

@Lunding:访问什么不是原子?一个中断正在写入一个变量,另一个正在读取它。对于像Cortex M0这样的32位处理器,我不希望你可以获得部分32位的写入或读取。 – Lou