Domanda

Simile a questa domanda , mi piacerebbe per limitare il tempo di esecuzione di una funzione - preferibilmente con precisione microsecondo - in C. immagino che le eccezioni C ++ potrebbero essere utilizzati per ottenere un risultato simile a questo soluzione Python. Anche se non è l'ideale, un tale approccio è del tutto disponibile in pianura C.

I stupore, allora, come potrebbe mi interrompere l'esecuzione di una funzione dopo un certo intervallo di tempo in C su un sistema Posix? Per le situazioni relativamente semplici un po 'di sciocco affari funziona bene, ma che aggiunge una buona dose di codice ortogonale alla soluzione del problema. Diciamo che ho una funzione in questo modo:

void boil(egg *e) {
    while (true)
    do_boil(e);
}

Voglio correre ebollizione eseguito su un uovo *, interrompendo ogni 50µs per controllare fare qualcosa in questo modo:

egg *e = init_egg();
while (true) {
    preempt_in(50, (void) (*boil), 1, e);
    /* Now boil(e) is executed for 50μs, 
       then control flow is returned to the
       statement prior to the call to preempt_in.
     */
    if (e->cooked_val > 100)
        break;
}

mi rendo conto che pthreads potrebbero essere utilizzati per fare questo, ma io sono un po 'più interessati ad evitare il loro utilizzo. I potrebbe passare da ucontext_t è in un gestore SIGALRM, ma le note standard POSIX che l'uso di setContext / swapcontext non deve essere utilizzato in un gestore di segnale e, anzi, faccio notare comportamenti differenti tra Linux e Solaris sistemi quando farlo.

E 'questo effetto possibile di ottenere? Se è così, in un modo portatile?

È stato utile?

Soluzione

Basta notare che la capacità generale che stai cercando qui è chiamato l'applicazione dei costi . Per esempio si veda questo articolo di Wellings o in Leung , et. al. del libro grande . Le risposte di cui sopra sono focalizzati sul raggiungimento in userspace; alcuni RTOS o le lingue lo supportano (non Linux) come un meccanismo generale.

Un esempio del sistema operativo che fornisce questo è il AUTOSAR OS (spec legato) . Si noti che questo sistema operativo fornisce Esecuzione tempo di esecuzione , che è leggermente diverso da Esecuzione scadenza. di applicazione Tempo di esecuzione mantiene sempre più difficile, in quanto si basa su una certa capacità di misurare il costo effettivo speso (di solito con la cooperazione hardware). Con la complessità dei processori di oggi, è difficile e costoso per misurare questo - per non parlare che il significato delle misure (a causa di esecuzione non lineare e ogni sorta di altre cose interessanti) sono difficili da interpretare - e quindi eventi difficili da calcolare una ( peggio- o common) stima nel caso di una particolare sezione del tempo di esecuzione del codice.

Un po 'off-topic, ma Ada fornisce un insieme più rigorosa delle capacità a livello di lingua qui, che non ti aiuta, ma si riusciva a capire come questi requisiti Ada sono stati implementati in Linux. Le specifiche linguaggio Ada è unica nel fornire un documento di logica, vedere la sezione in tempo reale preemptive abort come punto di partenza.

Altri suggerimenti

È possibile utilizzare le discussioni, o che hanno la funzione di sondaggio un timer (o un insieme variabile globale dal gestore SIGALRM), quindi salvare il suo stato e uscire quando il tempo a disposizione è scaduto. L'uso del ucontext_t è deprecato e non dovrebbe mai essere usato in nuovo codice, a tutti, e tanto meno da gestori di segnale.

La soluzione che desidero improvvisamente mi viene in mente: goto! Io impostare un punto di salto subito dopo la funzione desidero limite, impostare un timer e nel gestore di segnale che si occupa della SIG * ALRM semplicemente saltare le istruzioni dopo la funzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top