LPC - Jak detekovat povolene/zakazane preruseni?

Pavel Hudecek edizon na seznam.cz
Pátek Říjen 14 19:31:18 CEST 2016


Už je naštěstí řádně vyřešeno, něco takovéhoto mě jako provizorium taky 
napadlo, ale byl by to zdroj velkých komplikací v obsluhách přerušení.

PH

-----Původní zpráva----- 
From: Miroslav Mraz

Je možné zavést počítadlo, podobně se to dělá při zamykání vláken
     volatile int gblMutex = 0;
     /// Uzamčení
     void        lock    (void) {
       asm volatile ("cpsid i");
       gblMutex++;
     };
     /// Odemčení
     void        unlock  (void) {
       if (--gblMutex) return;
       asm volatile ("cpsie i");
     };

Dne 14.10.2016 v 17:42 Pavel Hudecek napsal(a):
> mějme funkci v procesoru LPC11U68. Nějaká její část nesmí být přerušena.
> Nemůže v ní ale být natvrdo zákaz a povolení přerušení, protože funkce
> může být volána i v obsluze přerušení a kdyby ho povolila, hrozil by
> další problém.
>
> Potřebuji tedy detekovat, zda už je přerušení zakázáno, nebo není, aby
> po provedení kritické části byl stav zákazu/povolení obnoven.
>
> Díval jsem se, jak vypadají knihovní funkce pro zákaz a povolení a moc
> moudrý z toho nejsem:
> __attribute__( ( always_inline ) ) __STATIC_INLINE void 
> __disable_irq(void)
> {
>  __ASM volatile ("cpsid i" : : : "memory");
> }
> Syntaxe tohoto assembleru mi nedává smysl... 



Další informace o konferenci Hw-list