如何模拟调度程序?

时间:2013-02-02 15:55:57

标签: embedded scheduling scheduler spi

在我的固件中,我在后台任务中写入MicroSD,并且我启用了许多优先级较高的中断,其中一些可能需要几毫秒。

因此,SPI的写入/读取可以随时中断,对于写入可能不是这样的问题(如果SPI的行为类似于UART),但在读取期间,我担心我的硬件SPI FIFO会溢出如果在MicroSD卡发送数据块时恰好中断了该任务。

现在显而易见的解决方案是减少优先级较高的中断所需的时间,但这看起来非常困难,因为有时它们也必须等待其他外围设备,并且也阻止我必须重写大量代码现在轮询到一个中断结构,这将使整个代码更加复杂。

我认为在现代操作系统中,这可以通过让所有这些任务以相同的优先级同步运行来解决,并为它们提供相同的时间片。但我没有任何线程或操作系统的机制,那么最简单的解决方法是什么呢?

2 个答案:

答案 0 :(得分:4)

  

写信给MicroSD [...]   硬件SPI FIFO将溢出

是SPI的 Master :您控制SPI时钟。 SPI Master只有在有数据帧传输时才会产生时钟信号 - 否则时钟处于空闲状态。对于读操作也是如此:SPI总是同时读写。

简而言之,如果您是主人,SPI将从不溢出。硬件FIFO不会改变这一事实。

答案 1 :(得分:0)

“我认为在现代操作系统中,这可以通过让所有这些任务以相同的优先级同步运行来解决,并为它们提供相同的时间片。但是我没有任何线程或操作系统的机制,所以是最简单的解决方法吗?“

OS中的多任务处理与中断不同。

我会布置以下内容:

用于读写的SPI中断处理程序。您需要了解SPI FIFO。您可能会因溢出和“水印”条件而中断。一定要处理这些。阅读您的MCU用户指南以了解具体信息。通过软件为中断处理程序提供自己的循环队列。根据FIFO的大小适当调整队列大小(这是基于硬件FIFO大小,您正在读/写的设备的页面大小以及可用内存的选择。)

从您的应用程序调用状态机模块。这应该有自己的循环队列。状态机应该具有读取和写入数据的功能,以及“泵”功能(即从主循环定期调用的函数,也就是从主循环“调度”)。

从SPI设备状态机读取和写入的“任务”也应该是状态机,它们也应该能够处理无法写入或无法准备好数据。一般来说,不要阻止!编写你的函数,以便如果他们需要的东西没有准备/可用,他们就会退出,期待被调用,也就是稍后“安排”。

所以一般的流程是:

[想写的任务] - >队列 - > [设备状态机] - >队列 - > [SPI中断] - >硬件队列 - > [硬件] - >线

电线 - > [硬件 - >硬件队列 - > [SPI中断] - >队列 - > [设备状态机] - >队列 - > [想要阅读的任务]

如果没有具体的架构,很难提供更多细节。但我已经在许多嵌入式设备驱动程序中成功使用了这种模式。