Página 1 de 1

Otimizar código

MensagemEnviado: 26 Jul 2021 07:04
por vtrx
Alguém tem uma ideia para otimizar o código abaixo?
Tentou usar um loop encaixado,pois os valores são múltiplos,mas não funcionou no Hardware.
Compilador CCS.

Código: Selecionar todos
                     for(d=0;d<8;d++)
                       {                       
                        scroll_buf[d+256]>>=1;
                        if(bit_test(scroll_buf[d+248],0)==1){bit_set(scroll_buf[d+256],7);}                     
                        scroll_buf[d+248]>>=1;
                        if(bit_test(scroll_buf[d+240],0)==1){bit_set(scroll_buf[d+248],7);}
                        scroll_buf[d+240]>>=1;
                        if(bit_test(scroll_buf[d+232],0)==1){bit_set(scroll_buf[d+240],7);}
                        scroll_buf[d+232]>>=1;
                        if(bit_test(scroll_buf[d+224],0)==1){bit_set(scroll_buf[d+232],7);}
                        scroll_buf[d+224]>>=1;
                        if(bit_test(scroll_buf[d+216],0)==1){bit_set(scroll_buf[d+224],7);}
                        scroll_buf[d+216]>>=1;
                        if(bit_test(scroll_buf[d+208],0)==1){bit_set(scroll_buf[d+216],7);}
                        scroll_buf[d+208]>>=1;
                        if(bit_test(scroll_buf[d+200],0)==1){bit_set(scroll_buf[d+208],7);}
                        scroll_buf[d+200]>>=1;
                        if(bit_test(scroll_buf[d+192],0)==1){bit_set(scroll_buf[d+200],7);}
                        scroll_buf[d+192]>>=1;
                        if(bit_test(scroll_buf[d+184],0)==1){bit_set(scroll_buf[d+192],7);}
                        scroll_buf[d+184]>>=1;
                        if(bit_test(scroll_buf[d+176],0)==1){bit_set(scroll_buf[d+184],7);}
                        scroll_buf[d+176]>>=1;
                        if(bit_test(scroll_buf[d+168],0)==1){bit_set(scroll_buf[d+176],7);}
                        scroll_buf[d+168]>>=1;
                        if(bit_test(scroll_buf[d+160],0)==1){bit_set(scroll_buf[d+168],7);}
                        scroll_buf[d+160]>>=1;
                        if(bit_test(scroll_buf[d+152],0)==1){bit_set(scroll_buf[d+160],7);}
                        scroll_buf[d+152]>>=1;
                        if(bit_test(scroll_buf[d+144],0)==1){bit_set(scroll_buf[d+152],7);}
                        scroll_buf[d+144]>>=1;
                        if(bit_test(scroll_buf[d+136],0)==1){bit_set(scroll_buf[d+144],7);}
                        scroll_buf[d+136]>>=1;
                        if(bit_test(scroll_buf[d+128],0)==1){bit_set(scroll_buf[d+136],7);}
                        scroll_buf[d+128]>>=1;                       
                        if(bit_test(scroll_buf[d+120],0)==1){bit_set(scroll_buf[d+128],7);}                               
                        scroll_buf[d+120]>>=1;
                        if(bit_test(scroll_buf[d+112],0)==1){bit_set(scroll_buf[d+120],7);}                     
                        scroll_buf[d+112]>>=1;
                        if(bit_test(scroll_buf[d+104],0)==1){bit_set(scroll_buf[d+112],7);}
                        scroll_buf[d+104]>>=1;
                        if(bit_test(scroll_buf[d+96],0)==1){bit_set(scroll_buf[d+104],7);}
                        scroll_buf[d+96]>>=1;
                        if(bit_test(scroll_buf[d+88],0)==1){bit_set(scroll_buf[d+96],7);}
                        scroll_buf[d+88]>>=1;
                        if(bit_test(scroll_buf[d+80],0)==1){bit_set(scroll_buf[d+88],7);}
                        scroll_buf[d+80]>>=1;
                        if(bit_test(scroll_buf[d+72],0)==1){bit_set(scroll_buf[d+80],7);}
                        scroll_buf[d+72]>>=1;
                        if(bit_test(scroll_buf[d+64],0)==1){bit_set(scroll_buf[d+72],7);}
                        scroll_buf[d+64]>>=1;
                        if(bit_test(scroll_buf[d+56],0)==1){bit_set(scroll_buf[d+64],7);}
                        scroll_buf[d+56]>>=1;
                        if(bit_test(scroll_buf[d+48],0)==1){bit_set(scroll_buf[d+56],7);}
                        scroll_buf[d+48]>>=1;
                        if(bit_test(scroll_buf[d+40],0)==1){bit_set(scroll_buf[d+48],7);}
                        scroll_buf[d+40]>>=1;
                        if(bit_test(scroll_buf[d+32],0)==1){bit_set(scroll_buf[d+40],7);}
                        scroll_buf[d+32]>>=1;
                        if(bit_test(scroll_buf[d+24],0)==1){bit_set(scroll_buf[d+32],7);}
                        scroll_buf[d+24]>>=1;
                        if(bit_test(scroll_buf[d+16],0)==1){bit_set(scroll_buf[d+24],7);}
                        scroll_buf[d+16]>>=1;
                        if(bit_test(scroll_buf[d+8],0)==1){bit_set(scroll_buf[d+16],7);}
                        scroll_buf[d+8]>>=1;
                        if(bit_test(scroll_buf[d],0)==1){bit_set(scroll_buf[d+8],7);}
                        scroll_buf[d]>>=1;                       
                       }   

Re: Otimizar código

MensagemEnviado: 26 Jul 2021 12:22
por cfreund
O que o código deveria fazer?

Re: Otimizar código

MensagemEnviado: 26 Jul 2021 13:11
por vtrx
cfreund escreveu:O que o código deveria fazer?

O código faz o seguinte;
1-desloca a variavel scroll_buf[d+256] a direita,d+256 é a posição de memoria.
2-Verificar qual o o bit da variavel anterior(diferença de 8 endereços) e seta ou não o bit da variável deslocada.
Faz isso sucessivamente em 256 posições.
O algorítmico seria ir deslocando oito variáveis por vez.
É uma rotina para acerto de matrizes de Led.

Código: Selecionar todos
letter x:       letter y:       result x:   result y:
1000 0000  ->   1000 0101   =   0100 0000   0100 0100
1010 1010  ->   1111 1111   =   0101 0101   0111 1111
0000 0000  ->   0101 0101   =   0000 0000   0010 1010
1000 0000  ->   1001 1001   =   0100 1000   0100 1100

Re: Otimizar código

MensagemEnviado: 26 Jul 2021 13:14
por vtrx
vtrx escreveu:
cfreund escreveu:O que o código deveria fazer?

O código faz o seguinte;
1-desloca a variavel scroll_buf[d+256] a direita,d+256 é a posição de memoria.
2-Verificar qual o o bit da variavel anterior(diferença de 8 endereços) e seta ou não o bit da variável deslocada.
Faz isso sucessivamente em 256 posições.
O algorítmico seria ir deslocando oito variáveis por vez.
É uma rotina para acerto de matrizes de Led sem alterar o Hardware.

Código: Selecionar todos
letter x:       letter y:       result x:   result y:
1000 0000  ->   1000 0101   =   0100 0000   0100 0100
1010 1010  ->   1111 1111   =   0101 0101   0111 1111
0000 0000  ->   0101 0101   =   0000 0000   0010 1010
1000 0000  ->   1001 1001   =   0100 1000   0100 1100


O exemplo da figura acima seria de 4 posições mas na realidade são 8.
Imagine o esquema acima com 256 bytes.

Re: Otimizar código

MensagemEnviado: 26 Jul 2021 13:38
por andre_luis
vtrx escreveu:Alguém tem uma ideia para otimizar o código abaixo?
Tentou usar um loop encaixado,pois os valores são múltiplos,mas não funcionou no Hardware.
Compilador CCS.

Código: Selecionar todos
                     for(d=0;d<8;d++)
                       {                       
                        scroll_buf[d+256]>>=1;
                        if(bit_test(scroll_buf[d+248],0)==1){bit_set(scroll_buf[d+256],7);}                     
                        scroll_buf[d+248]>>=1;
                        if(bit_test(scroll_buf[d+240],0)==1){bit_set(scroll_buf[d+248],7);}
                        scroll_buf[d+240]>>=1;
                        if(bit_test(scroll_buf[d+232],0)==1){bit_set(scroll_buf[d+240],7);}
                        scroll_buf[d+232]>>=1;
                        if(bit_test(scroll_buf[d+224],0)==1){bit_set(scroll_buf[d+232],7);}
                        scroll_buf[d+224]>>=1;
                        if(bit_test(scroll_buf[d+216],0)==1){bit_set(scroll_buf[d+224],7);}
                        scroll_buf[d+216]>>=1;
                        if(bit_test(scroll_buf[d+208],0)==1){bit_set(scroll_buf[d+216],7);}
                        scroll_buf[d+208]>>=1;
                        if(bit_test(scroll_buf[d+200],0)==1){bit_set(scroll_buf[d+208],7);}
                        scroll_buf[d+200]>>=1;
                        if(bit_test(scroll_buf[d+192],0)==1){bit_set(scroll_buf[d+200],7);}
                        scroll_buf[d+192]>>=1;
                        if(bit_test(scroll_buf[d+184],0)==1){bit_set(scroll_buf[d+192],7);}
                        scroll_buf[d+184]>>=1;
                        if(bit_test(scroll_buf[d+176],0)==1){bit_set(scroll_buf[d+184],7);}
                        scroll_buf[d+176]>>=1;
                        if(bit_test(scroll_buf[d+168],0)==1){bit_set(scroll_buf[d+176],7);}
                        scroll_buf[d+168]>>=1;
                        if(bit_test(scroll_buf[d+160],0)==1){bit_set(scroll_buf[d+168],7);}
                        scroll_buf[d+160]>>=1;
                        if(bit_test(scroll_buf[d+152],0)==1){bit_set(scroll_buf[d+160],7);}
                        scroll_buf[d+152]>>=1;
                        if(bit_test(scroll_buf[d+144],0)==1){bit_set(scroll_buf[d+152],7);}
                        scroll_buf[d+144]>>=1;
                        if(bit_test(scroll_buf[d+136],0)==1){bit_set(scroll_buf[d+144],7);}
                        scroll_buf[d+136]>>=1;
                        if(bit_test(scroll_buf[d+128],0)==1){bit_set(scroll_buf[d+136],7);}
                        scroll_buf[d+128]>>=1;                       
                        if(bit_test(scroll_buf[d+120],0)==1){bit_set(scroll_buf[d+128],7);}                               
                        scroll_buf[d+120]>>=1;
                        if(bit_test(scroll_buf[d+112],0)==1){bit_set(scroll_buf[d+120],7);}                     
                        scroll_buf[d+112]>>=1;
                        if(bit_test(scroll_buf[d+104],0)==1){bit_set(scroll_buf[d+112],7);}
                        scroll_buf[d+104]>>=1;
                        if(bit_test(scroll_buf[d+96],0)==1){bit_set(scroll_buf[d+104],7);}
                        scroll_buf[d+96]>>=1;
                        if(bit_test(scroll_buf[d+88],0)==1){bit_set(scroll_buf[d+96],7);}
                        scroll_buf[d+88]>>=1;
                        if(bit_test(scroll_buf[d+80],0)==1){bit_set(scroll_buf[d+88],7);}
                        scroll_buf[d+80]>>=1;
                        if(bit_test(scroll_buf[d+72],0)==1){bit_set(scroll_buf[d+80],7);}
                        scroll_buf[d+72]>>=1;
                        if(bit_test(scroll_buf[d+64],0)==1){bit_set(scroll_buf[d+72],7);}
                        scroll_buf[d+64]>>=1;
                        if(bit_test(scroll_buf[d+56],0)==1){bit_set(scroll_buf[d+64],7);}
                        scroll_buf[d+56]>>=1;
                        if(bit_test(scroll_buf[d+48],0)==1){bit_set(scroll_buf[d+56],7);}
                        scroll_buf[d+48]>>=1;
                        if(bit_test(scroll_buf[d+40],0)==1){bit_set(scroll_buf[d+48],7);}
                        scroll_buf[d+40]>>=1;
                        if(bit_test(scroll_buf[d+32],0)==1){bit_set(scroll_buf[d+40],7);}
                        scroll_buf[d+32]>>=1;
                        if(bit_test(scroll_buf[d+24],0)==1){bit_set(scroll_buf[d+32],7);}
                        scroll_buf[d+24]>>=1;
                        if(bit_test(scroll_buf[d+16],0)==1){bit_set(scroll_buf[d+24],7);}
                        scroll_buf[d+16]>>=1;
                        if(bit_test(scroll_buf[d+8],0)==1){bit_set(scroll_buf[d+16],7);}
                        scroll_buf[d+8]>>=1;
                        if(bit_test(scroll_buf[d],0)==1){bit_set(scroll_buf[d+8],7);}
                        scroll_buf[d]>>=1;                       
                       }   


Tenta isso:

Código: Selecionar todos
for(d=0;d<8;d++)
     {     
     for(e=0;e<32;e++)
   {                    
   scroll_buf[d+(256-(8*e))]>>=1;
   if(bit_test(scroll_buf[d+(256-(8*(e+1)))],0)==1){bit_set(scroll_buf[d+(256-(8*e))],7);} 
   }
}

Re: Otimizar código

MensagemEnviado: 26 Jul 2021 14:19
por edsont
Antes de otimizar, se não funcionou, tem que ver como está organizada sua matriz de LEDs.
Os primeiros bytes são todas as linhas de todas as matrizes de LEDs ou são todas as linhas da primeira matriz ou ainda todas as colunas da primeira (ou última) matriz?
As matrizes estão mapeadas da direita para a esquerda ou da esquerda para a direita?
Se a sequencia estiver errada os bits dos "Carries" vão parar em lugar errado ou se perder.
Se for scroll de mensagem e estiver com os bits menos significativos para a direita na matriz, tem que fazer o shift para a esquerda, já que o texto tem que correr para a esquerda, a não ser que seja texto em árabe.

Re: Otimizar código

MensagemEnviado: 26 Jul 2021 14:22
por vtrx

Re: Otimizar código

MensagemEnviado: 26 Jul 2021 19:13
por vtrx
aluis-rcastro escreveu:
vtrx escreveu:Alguém tem uma ideia para otimizar o código abaixo?
Tentou usar um loop encaixado,pois os valores são múltiplos,mas não funcionou no Hardware.
Compilador CCS.

Código: Selecionar todos
                     for(d=0;d<8;d++)
                       {                       
                        scroll_buf[d+256]>>=1;
                        if(bit_test(scroll_buf[d+248],0)==1){bit_set(scroll_buf[d+256],7);}                     
                        scroll_buf[d+248]>>=1;
                        if(bit_test(scroll_buf[d+240],0)==1){bit_set(scroll_buf[d+248],7);}
                        scroll_buf[d+240]>>=1;
                        if(bit_test(scroll_buf[d+232],0)==1){bit_set(scroll_buf[d+240],7);}
                        scroll_buf[d+232]>>=1;
                        if(bit_test(scroll_buf[d+224],0)==1){bit_set(scroll_buf[d+232],7);}
                        scroll_buf[d+224]>>=1;
                        if(bit_test(scroll_buf[d+216],0)==1){bit_set(scroll_buf[d+224],7);}
                        scroll_buf[d+216]>>=1;
                        if(bit_test(scroll_buf[d+208],0)==1){bit_set(scroll_buf[d+216],7);}
                        scroll_buf[d+208]>>=1;
                        if(bit_test(scroll_buf[d+200],0)==1){bit_set(scroll_buf[d+208],7);}
                        scroll_buf[d+200]>>=1;
                        if(bit_test(scroll_buf[d+192],0)==1){bit_set(scroll_buf[d+200],7);}
                        scroll_buf[d+192]>>=1;
                        if(bit_test(scroll_buf[d+184],0)==1){bit_set(scroll_buf[d+192],7);}
                        scroll_buf[d+184]>>=1;
                        if(bit_test(scroll_buf[d+176],0)==1){bit_set(scroll_buf[d+184],7);}
                        scroll_buf[d+176]>>=1;
                        if(bit_test(scroll_buf[d+168],0)==1){bit_set(scroll_buf[d+176],7);}
                        scroll_buf[d+168]>>=1;
                        if(bit_test(scroll_buf[d+160],0)==1){bit_set(scroll_buf[d+168],7);}
                        scroll_buf[d+160]>>=1;
                        if(bit_test(scroll_buf[d+152],0)==1){bit_set(scroll_buf[d+160],7);}
                        scroll_buf[d+152]>>=1;
                        if(bit_test(scroll_buf[d+144],0)==1){bit_set(scroll_buf[d+152],7);}
                        scroll_buf[d+144]>>=1;
                        if(bit_test(scroll_buf[d+136],0)==1){bit_set(scroll_buf[d+144],7);}
                        scroll_buf[d+136]>>=1;
                        if(bit_test(scroll_buf[d+128],0)==1){bit_set(scroll_buf[d+136],7);}
                        scroll_buf[d+128]>>=1;                       
                        if(bit_test(scroll_buf[d+120],0)==1){bit_set(scroll_buf[d+128],7);}                               
                        scroll_buf[d+120]>>=1;
                        if(bit_test(scroll_buf[d+112],0)==1){bit_set(scroll_buf[d+120],7);}                     
                        scroll_buf[d+112]>>=1;
                        if(bit_test(scroll_buf[d+104],0)==1){bit_set(scroll_buf[d+112],7);}
                        scroll_buf[d+104]>>=1;
                        if(bit_test(scroll_buf[d+96],0)==1){bit_set(scroll_buf[d+104],7);}
                        scroll_buf[d+96]>>=1;
                        if(bit_test(scroll_buf[d+88],0)==1){bit_set(scroll_buf[d+96],7);}
                        scroll_buf[d+88]>>=1;
                        if(bit_test(scroll_buf[d+80],0)==1){bit_set(scroll_buf[d+88],7);}
                        scroll_buf[d+80]>>=1;
                        if(bit_test(scroll_buf[d+72],0)==1){bit_set(scroll_buf[d+80],7);}
                        scroll_buf[d+72]>>=1;
                        if(bit_test(scroll_buf[d+64],0)==1){bit_set(scroll_buf[d+72],7);}
                        scroll_buf[d+64]>>=1;
                        if(bit_test(scroll_buf[d+56],0)==1){bit_set(scroll_buf[d+64],7);}
                        scroll_buf[d+56]>>=1;
                        if(bit_test(scroll_buf[d+48],0)==1){bit_set(scroll_buf[d+56],7);}
                        scroll_buf[d+48]>>=1;
                        if(bit_test(scroll_buf[d+40],0)==1){bit_set(scroll_buf[d+48],7);}
                        scroll_buf[d+40]>>=1;
                        if(bit_test(scroll_buf[d+32],0)==1){bit_set(scroll_buf[d+40],7);}
                        scroll_buf[d+32]>>=1;
                        if(bit_test(scroll_buf[d+24],0)==1){bit_set(scroll_buf[d+32],7);}
                        scroll_buf[d+24]>>=1;
                        if(bit_test(scroll_buf[d+16],0)==1){bit_set(scroll_buf[d+24],7);}
                        scroll_buf[d+16]>>=1;
                        if(bit_test(scroll_buf[d+8],0)==1){bit_set(scroll_buf[d+16],7);}
                        scroll_buf[d+8]>>=1;
                        if(bit_test(scroll_buf[d],0)==1){bit_set(scroll_buf[d+8],7);}
                        scroll_buf[d]>>=1;                       
                       }   


Tenta isso:

Código: Selecionar todos
for(d=0;d<8;d++)
     {     
     for(e=0;e<32;e++)
   {                    
   scroll_buf[d+(256-(8*e))]>>=1;
   if(bit_test(scroll_buf[d+(256-(8*(e+1)))],0)==1){bit_set(scroll_buf[d+(256-(8*e))],7);} 
   }
}


Muito bom!
Funcionou igual ao 'original'.
Pelo tempo e respostas,posso te chamar de 'fera' :mrgreen:
Vou postar esta solução no Forum CCS,que estou aguardando alguma ideia.
Antes de testar essa rotina,um usuario me deu uma sugestão,mas não entendi direito:
Código: Selecionar todos
void scroll(int16 index)
{   
   scroll_buf[index] >>= 1;
   if(bit_test(scroll_buf[index-8],0)==1)
      scroll_buf[index]+=128;
}

      for(d=256;d>=0;d--)
      {
         scroll(d);     
      }

//d has to be a signed int16 to use like this

Re: Otimizar código

MensagemEnviado: 27 Jul 2021 17:39
por cfreund
vtrx escreveu:
cfreund escreveu:O que o código deveria fazer?

O código faz o seguinte;
1-desloca a variavel scroll_buf[d+256] a direita,d+256 é a posição de memoria.
2-Verificar qual o o bit da variavel anterior(diferença de 8 endereços) e seta ou não o bit da variável deslocada.
Faz isso sucessivamente em 256 posições.
O algorítmico seria ir deslocando oito variáveis por vez.
É uma rotina para acerto de matrizes de Led.


Isso é pra rolar a mensagem mostrada?

A curiosidade é por isso não me cheirar bem. Percebo muito tempo de CPU desperdiçado.

Re: Otimizar código

MensagemEnviado: 27 Jul 2021 19:02
por vtrx
cfreund escreveu:
vtrx escreveu:
cfreund escreveu:O que o código deveria fazer?

O código faz o seguinte;
1-desloca a variavel scroll_buf[d+256] a direita,d+256 é a posição de memoria.
2-Verificar qual o o bit da variavel anterior(diferença de 8 endereços) e seta ou não o bit da variável deslocada.
Faz isso sucessivamente em 256 posições.
O algorítmico seria ir deslocando oito variáveis por vez.
É uma rotina para acerto de matrizes de Led.


Isso é pra rolar a mensagem mostrada?

A curiosidade é por isso não me cheirar bem. Percebo muito tempo de CPU desperdiçado.
.

sim isso mesmo,mas como citei no post,essa matriz que estou usando tem ligações diferentes das mais antigas,isso que dizer que se eu usar um código 'padrão' e otimizado,terei que desconectar as matrizes,que ja vem de 4 em 4,e montá-las com os conectores 'virado',isso faria elas perderem o sentido de ja virem montadas.

Ainda falta 1 % para acertar a dica postada.
A ultima letra,se não for espaço,gera um rastro...
Na rotina 'gigante 'não gera o rastro na ultima letra deslocada.

Re: Otimizar código

MensagemEnviado: 28 Jul 2021 11:03
por tcpipchip
eu tive problema com rastro uma vez pq não dei o delay pequeno pq não dava CE do DISPLAY (4 displays de 7seg) no momento certo...então aparecia o 4 digito no primeiro (MIXADO)

Re: Otimizar código

MensagemEnviado: 28 Jul 2021 20:08
por cfreund
vtrx escreveu:sim isso mesmo,mas como citei no post,essa matriz que estou usando tem ligações diferentes das mais antigas,isso que dizer que se eu usar um código 'padrão' e otimizado,terei que desconectar as matrizes,que ja vem de 4 em 4,e montá-las com os conectores 'virado',isso faria elas perderem o sentido de ja virem montadas.

Ainda falta 1 % para acertar a dica postada.
A ultima letra,se não for espaço,gera um rastro...
Na rotina 'gigante 'não gera o rastro na ultima letra deslocada.


Uma alternativa seria preparar o buffer de certa forma que seja necessário apenas avançar um ponteiro quando enviar os dados para o display. Penso que, seria possível fazer que cada byte do buffer representasse uma coluna do display. Rotina de scroll ficaria bem reduzida, por ex.:

Código: Selecionar todos
uchar buffer[100*8+1], *ptr_buffer;

void scroll()
{
    if (*buffer == 0)
        return;

    for (u = 0; u < 32; ++u)
    {
        display_write(*ptr_buffer++);

        if (*ptr_buffer == 0)
            ptr_buffer = buffer;
    }
}


O maior bônus seria economia de RAM.