我正在为嵌入式系统(Cortex M0)编写代码,并没有所有奢侈的互斥锁/自旋锁/等等。有没有一种简单的方法可以将数据添加到共享缓冲区(日志文件)中,该缓冲区将从Main()循环刷新到磁盘?
如果只有一个生产者(1个中断)和单个消费者(主循环),我可以使用一个简单的缓冲区,生产者增加'head',消费者增加'tail'。这将是非常安全的。但是现在我有多个生产者(中断)似乎我被卡住了。
我可以为每个中断提供自己的缓冲区,并将它们组合在Main()中,但这需要大量额外的RAM和复杂性。
答案 0 :(得分:5)
您可以通过简单的ring buffer(循环数组)实现此目的,您可以在访问期间关闭硬件中断源。它只需要函数init,add和remove。
我不确定您的特定MCU如何处理中断,但只要您只启用/禁用特定硬件外设的中断,它们很可能会保持未决状态。根据应用程序的性质,您还可以禁用全局中断屏蔽,但这相当粗糙。
通常,您不必担心错过中断,因为如果处理传入中断的代码比中断频率慢,那么世界上没有任何软件会修复它。您可能必须接受数据丢失或增加CPU时钟以避开此类情况。但是,当然你应该尽量保持ISR内的代码尽可能紧凑。