Защитить критическую секцию кода между обработчиком прерываний и потоком


#include <sys/neutrino.h>
void InterruptLock( intrspin_t *spinlock );


The spinlock (a variable shared between the interrupt handler and a thread) to use.

Note: If spinlock isn't a static variable, you must initialize it by calling:

memset( spinlock, 0, sizeof( *spinlock ) );

before using it with InterruptLock().




The InterruptLock() function guards a critical section by locking the specified spinlock. You can call this function from a thread or from an interrupt handler. Before calling this function, the thread must request I/O privileges by calling:

ThreadCtl( _NTO_TCTL_IO, 0 );

If the thread doesn't do this, it might SIGSEGV when it calls InterruptLock().

This function tries to acquire the spinlock (a variable shared between the interrupt handler and a thread) while interrupts are disabled. The code spins in a tight loop until the lock is acquired. It's important to release the lock as soon as possible. Typically, this is a few lines of code without any loops:

InterruptLock( &spinner );
/* ... critical section */
InterruptUnlock( &spinner );

InterruptLock() solves a common need in many realtime systems to protect access to shared data structures between an interrupt handler and the thread that owns the handler. The traditional POSIX primitives used between threads aren't available for use by an interrupt handler.

The InterruptLock() and InterruptUnlock() functions work on single-processor or multiprocessor machines.

Note: Any kernel call results in the re-enabling of interrupts, and many library routines are built on kernel calls. Masked interrupts are not affected.


ЗОСРВ «Нейтрино»

Точка остановки потока
Обработчик прерываний
Обработчик сигналов
В потоке

Тематические ссылки:

InterruptDisable(), InterruptEnable(), InterruptMask(), InterruptUnlock(), InterruptUnmask(), ThreadCtl()

Предыдущий раздел: Описание API системной библиотеки