我正在研究一种基于ARM的嵌入式系统,该系统使用FIQ中断来发出断电信号。发生此中断时,将有几秒钟刷新缓冲区缓存。我原本以为从ISR调用sync()可能会起到作用,但是我想立即强制将脏缓冲区刷新到磁盘,而不仅仅是将页面标记为脏并等待系统刷新脏缓冲区(这显然是sync()做什么)。提前感谢任何建议。
DJW
答案 0 :(得分:1)
嵌入式系统编程的第一条规则是:
从来没有,永远永远,从ISR做任何工作。
ISR以非常奇怪的处理器模式运行,您无法从它们访问操作系统服务。你当然不能做任何阻止他们的事情(比如磁盘访问)。关于大多数操作系统允许你做的唯一事情是发布事件和释放信号量。
构造此类问题的常用方法是让一个正常的用户空间任务等待信号量。当中断进入时,ISR将释放信号量并退出;任务将变为可运行,然后它只是用户空间代码。
isr()
{
clear_interrupt_condition(); // to avoid the interrupt being retriggered
post(semaphore);
}
task()
{
for (;;)
{
wait(semaphore);
sync();
}
}
根据操作系统的不同,您可能会对此类操作有特定的帮助。如果你问的话,我已经使用了自动执行上述操作的操作系统。或者他们允许你将它构建为一个事件机制,ISR会将消息发布到队列中,并且工作将从事件处理程序完成。
顺便说一下,sync()
没有(或者至少不应该)只是将页面标记为脏; Posix指定在数据刷新到磁盘之前不能返回(因为内核可以)。