Use custom files.
[bertos.git] / bertos / kern / irq.c
index 23d19afac0ea76fb14abac4e87170822eb714807..42012db9cde0ea0268f2c76e49b74331bc5984d7 100644 (file)
  *
  * \version $Id: proc.h 1646 2008-08-17 13:49:48Z bernie $
  * \author Bernie Innocenti <bernie@codewiz.org>
+ *
+ * Still in development, disable nightly test for now
+ * notest: avr
+ * notest: arm
  */
 #include "irq.h"
 
 #include <cfg/module.h>
 #include <kern/proc_p.h>
+#include <kern/proc.h>
 
-#include <cfg/cfg_kern.h>
+#include "cfg/cfg_proc.h"
 
 #include <unistd.h> // FIXME: move POSIX stuff to irq_posix.h
 
@@ -52,34 +57,31 @@ static void (*irq_handlers[100])(void);
 /* signal handler */
 void irq_entry(int signum)
 {
+#if CONFIG_KERN_PREEMPT
        Process * const old_process = CurrentProcess;
+#endif
 
        irq_handlers[signum]();
 
 #if CONFIG_KERN_PREEMPT
-       if (!CurrentProcess)
+       ASSERT2(CurrentProcess, "no idle proc?");
+
+       if (old_process != CurrentProcess)
        {
-               TRACEMSG("no runnable processes!");
+               IRQ_DISABLE;
+
+               TRACEMSG("switching from %p:%s to %p:%s",
+                       old_process, old_process ? old_process->monitor.name : "---",
+                       CurrentProcess, proc_currentName());
+
+               if (old_process)
+                       swapcontext(&old_process->context, &CurrentProcess->context);
+               else
+                       setcontext(&CurrentProcess->context);
+
                IRQ_ENABLE;
-               pause();
-       }
-       else
-       {
-               if (old_process != CurrentProcess)
-               {
-                       TRACEMSG("switching from %p:%s to %p:%s",
-                               old_process, old_process ? old_process->monitor.name : "-",
-                               CurrentProcess, CurrentProcess->monitor.name);
-
-                       if (old_process)
-                               swapcontext(&old_process->context, &CurrentProcess->context);
-                       else
-                               setcontext(&CurrentProcess->context);
-
-                       // not reached
-               }
-               TRACEMSG("keeping %p:%s", CurrentProcess, CurrentProcess->monitor.name);
        }
+       TRACEMSG("resuming %p:%s", CurrentProcess, CurrentProcess->monitor.name);
 #endif // CONFIG_KERN_PREEMPT
 }
 
@@ -91,15 +93,14 @@ void irq_register(int irq, void (*callback)(void))
 void irq_init(void)
 {
        struct sigaction act;
+
        act.sa_handler = irq_entry;
        sigemptyset(&act.sa_mask);
        //sigaddset(&act.sa_mask, irq);
        act.sa_flags = SA_RESTART; // | SA_SIGINFO;
 
        sigaction(SIGUSR1, &act, NULL);
-       #if !(ARCH & ARCH_QT)
-               sigaction(SIGALRM, &act, NULL);
-       #endif
+       sigaction(SIGALRM, &act, NULL);
 
        MOD_INIT(irq);
 }