【问题标题】:Flushing buffer cache from ISR从 ISR 刷新缓冲区缓存
【发布时间】:2011-03-02 15:47:01
【问题描述】:

我正在开发一个基于 ARM 的嵌入式系统,该系统使用 FIQ 中断来发出断电信号。当这个中断发生时,会有几秒钟的时间刷新缓冲区缓存。我最初认为从 ISR 调用 sync() 可能会解决问题,但我想立即强制将脏缓冲区刷新到磁盘,而不仅仅是将页面标记为脏并等待系统刷新脏缓冲区(这显然是sync() 做了什么)。提前感谢您的任何建议。

djw

【问题讨论】:

  • 下面的答案在一般意义上肯定是正确的;但是,除非您提供更多详细信息,否则无法提供具体答案:RTOS、开发环境、处理器详细信息等。

标签: caching buffer flush


【解决方案1】:

嵌入式系统编程的第一条规则是:

永远,永远,永远永远,从 ISR 做任何工作。

ISR 在非常奇怪的处理器模式下运行,您无法从它们访问操作系统服务。您当然不能做任何阻止他们的事情(例如磁盘访问)。大多数操作系统允许您做的唯一一件事就是发布事件和释放信号量。

解决这类问题的常用方法是让一个普通的用户空间任务等待信号量。当中断到来时,ISR 将释放信号量并退出;该任务将变为可运行的,然后它只是用户空间代码。

isr()
{
  clear_interrupt_condition(); // to avoid the interrupt being retriggered
  post(semaphore);
}

task()
{
  for (;;)
  {
    wait(semaphore);
    sync();
  }
}

根据操作系统,您可能会在执行此类操作时获得特定帮助。如果您要求,我已经使用了自动为您完成上述所有操作的操作系统。或者他们会让你将其构建为一种事件机制,其中 ISR 会将消息发布到队列中,并且工作将从事件处理程序中完成。

顺便说一句,sync() 不(或至少不应该)只是将页面标记为脏; Posix 指定在数据刷新到磁盘之前它不能返回(只要内核可以)。

【讨论】:

    猜你喜欢
    • 2018-07-11
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多