Distribuir a carga uniformemente em muitos ciclos

5

Estou procurando uma solução rápida e legível. Eu tenho que fazer isso em C, mas o código será estático no final, o que significa que eu poderia usar qualquer ferramenta para gerá-lo.

Eu tenho uma tarefa que roda ciclicamente e chama diferentes funções também 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 tivermos muitas funções que são executadas no mesmo ciclo, tentamos distribuí-las.
Então, para a função b, podemos chamá-la em um ciclo e c na outra. Distribuindo a carga uniformemente.
Semelhante para d a g. Cada um é chamado em um ciclo diferente.

Minha implementação atual é muito ruim.
Cada desenvolvedor que teve que adicionar sua tarefa à função principal calcula seu módulo e chama quando necessário. Isso leva a um código muito ilegível.

Eu estava pensando em fazer algo como:

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*/

Mas isso parece incômodo e propenso a erros, especialmente porque o tempo de ciclo mais alto é muito alto.

Como abordar esse tipo de problema?

-Editar -

Conforme solicitado, eu compilei algumas informações sobre o número de funções que tenho:

  • 32 ciclo de funções 1
  • 9 ciclo de funções 2
  • 14 funções ciclo 4
  • ciclo de 3 funções 8
  • 3 ciclo de funções 32
  • 3 ciclo de funções 40
  • ciclo de funções de 200
  • 2 ciclo de funções 400
por RedX 07.08.2014 / 11:33
fonte

2 respostas

2

O ponto de partida para resolver esse problema é uma estrutura de dados. Os elementos da estrutura são nós (structs) contendo:

  • como chamar uma das funções: um ponteiro de função, quaisquer argumentos, qualquer outra informação
  • quando chamar uma função: o 'ciclo' como você coloca.

Você pode usar uma lista simples criada em tempo de compilação, mas a lista inteira precisará ser pesquisada pelo menos uma vez para cada ciclo, e isso pode não ser bom para o desempenho. Uma abordagem melhor é adicionar cada nó a uma estrutura de dados projetada para minimizar a pesquisa. Eu sugeriria uma lista para cada módulo de ciclo, então 8 listas para os dados fornecidos.

  • No momento da inicialização, adicione cada nó de função à (s) lista (s) na (s) qual (is) ele deve ser chamado.
  • Em cada ciclo, basta descer a (s) lista (s) aplicável (is), chamando cada função por vez.

Simples, testável, sustentável, extensível.

    
por 08.08.2014 / 15:00
fonte
1

Eu posso ter sua definição de "ciclo" errada. Se "Cycle N" significa que um método deve ser chamado quando "timer" módulo N é 0, por que não colocar ponteiros para essas funções em uma lista ou matriz de instâncias de estrutura, e incluir em cada estrutura, o "N" que você deseja modulo? Então, depois de incrementar o "timer", verifique cada estrutura para ver se o módulo N é 0. Em caso afirmativo, invoque o ponteiro de função.

Depois de ler a descrição do problema, vejo que "Cycle N" tem a restrição adicional de que apenas uma função pode ser executada de uma vez para um determinado N. Para satisfazer esse requisito, mantenha um sinalizador adicional, "last run", no estrutura mencionada acima. Coloque cada estrutura para um determinado valor N em uma lista ou matriz separada. Dessa forma, você pode marcar a última função de execução, desmarcar essa, executar a próxima, marcá-la e assim por diante, a cada vez.

    
por 07.08.2014 / 23:54
fonte