Distribuisci uniformemente il carico su molti cicli

5

Sto cercando una soluzione che sia veloce e sempre leggibile. Devo farlo in C ma il codice sarà statico alla fine, il che significa che potrei usare qualsiasi strumento per generarlo.

Ho un compito che viene eseguito ciclicamente e chiama anche diverse funzioni ciclicamente

Main functions cycle is 1.

Function a has also cycle 1. So the main function calls it every time

Function b has cycle 2. Main function calls it every second cycle.

Function c has cycle 2.

Function d has cycle 4.

Function e has cycle 4.

Function f has cycle 4.

Function g has cycle 4.

... many more ....

Function X has cycle 500.

Se abbiamo molte funzioni che vengono eseguite nello stesso ciclo, proviamo a distribuirle.
Quindi per la funzione b la chiameremmo in un ciclo ec nell'altra. Distribuire il carico in modo uniforme.
Simile per d a g. Ognuno viene chiamato in un ciclo diverso.

La mia attuale implementazione è pessima.
Ogni sviluppatore che ha dovuto aggiungere il proprio compito alla funzione principale calcola il proprio modulo e chiama quando necessario. Questo porta a un codice molto illeggibile.

Stavo pensando di fare qualcosa del tipo:

uint32 mod4 = timer % 4;
bool fourth_1 = mod4 == 0;
bool fourth_2 = mod4 == 1;
bool fourth_3 = mod4 == 2;
bool fourth_4 = mod4 == 3;
bool second_1 = fourth_1 || fourth_3;
bool second_2 = fourth_2 || fourth_4;
/* and so on*/

Ma questo sembra complicato e troppo incline agli errori specialmente perché il tempo di ciclo più alto è troppo alto.

Come affrontare questo tipo di problema?

-Edit -

Come richiesto ho compilato alcune informazioni sul numero di funzioni che ho:

  • 32 funzioni ciclo 1
  • 9 funzioni ciclo 2
  • 14 funzioni ciclo 4
  • 3 funzioni ciclo 8
  • Ciclo 3 funzioni 32
  • 3 funzioni ciclo 40
  • 2 funzioni ciclo 200
  • Ciclo di 2 funzioni 400
posta RedX 07.08.2014 - 11:33
fonte

2 risposte

2

Il punto di partenza per risolvere questo problema è una struttura dati. Gli elementi della struttura sono nodi (structs) contenenti:

  • come chiamare una delle funzioni: un puntatore a funzione, qualsiasi argomento, qualsiasi altra informazione
  • quando chiamare una funzione: il 'ciclo' come lo metti.

È possibile utilizzare un elenco semplice creato in fase di compilazione, ma l'intero elenco dovrà essere ricercato almeno una volta per ogni ciclo e ciò potrebbe non essere positivo per le prestazioni. Un approccio migliore consiste nell'aggiungere ciascun nodo a una struttura dati progettata per ridurre al minimo la ricerca. Suggerirei un elenco per ogni ciclo modulo, quindi 8 liste per i dati dati.

  • Al momento dell'inizializzazione, aggiungere ciascun nodo funzione all'elenco (i) sul quale dovrebbe essere chiamato.
  • Ad ogni ciclo basta andare giù nella / e lista / i applicabile / a, richiamando ciascuna funzione a sua volta.

Semplice, verificabile, manutenibile, estensibile.

    
risposta data 08.08.2014 - 15:00
fonte
1

Potrei avere la tua definizione di "ciclo" sbagliata. Se "Cycle N" significa che deve essere chiamato un metodo quando "timer" modulo N è 0, perché non mettere i puntatori a quelle funzioni in una lista o una matrice di istanze di struttura e includere in ogni struttura la "N" che si desidera modulo? Quindi, dopo aver incrementato il "timer", controlla ciascuna struttura per vedere se il modulo N è 0. In tal caso, richiama il puntatore della funzione.

Dopo aver letto la descrizione del problema, vedo che "Cycle N" ha la restrizione aggiuntiva che solo una funzione può essere eseguita contemporaneamente per un dato N. Per soddisfare questo requisito, mantenere un flag aggiuntivo, "ultima esecuzione", nel struttura menzionata sopra. Metti ogni struttura per un dato valore N in una lista o matrice separata. In questo modo puoi contrassegnare l'ultima funzione di esecuzione, quindi deselezionarne una, eseguire quella successiva, contrassegnarla e così via, ogni volta.

    
risposta data 07.08.2014 - 23:54
fonte

Leggi altre domande sui tag