collapse

* Posts Recentes

Enrolador elétrico de fio/corda por m90mine
[24 de Setembro de 2021, 13:29]


Dessalinizador usado em navios por SerraCabo
[19 de Setembro de 2021, 14:53]


Três pequenas palestras fantásticas de Rust na RustConf 2021 por blabla
[16 de Setembro de 2021, 08:44]


Meu novo robô por josecarlos
[13 de Setembro de 2021, 21:58]


localizador carro. por dropes
[13 de Setembro de 2021, 21:00]


Fonte para Circuito - Qual escolher? por almamater
[12 de Setembro de 2021, 00:07]


Limpeza por ultra-sons por KammutierSpule
[10 de Setembro de 2021, 09:08]


Programação assíncrona Async e Await em Rust com Tokio. por blabla
[08 de Setembro de 2021, 14:46]


My arm por josecarlos
[06 de Setembro de 2021, 21:56]


Digitalização 3D por senso
[05 de Setembro de 2021, 14:45]

Autor Tópico: c reduzir codigo  (Lida 3166 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.009
c reduzir codigo
« em: 07 de Dezembro de 2020, 23:37 »
Boa noite,
Acontece que esgotei os 64kb da memoria flash,a ram está 14%, no entanto ainda me falta 2 coisas gravar a informação de 20 variáveis para 24lc256 e ler novamente, que ja tenho feito mas noutro projecto de teste.
No entanto já andei a organizar as sms de resposta e já ganhei 5kb.

Cheguei a parte de processar os sms chegados.
Tenho um ciclo for e dentro do mesmo há 32 if para chegar a sms final.   
Código: [Seleccione]
if((mensagem[msg_count] == '\0') && (count_space == 2) && (strcmp((char *)command, "BATTERY") == 0)){
No entanto a minha duvida é:
O meu uso intensivo de strcmp, e algum uso memcpy , itoa, sprintf  e 4 variaveis double há alguma coisa que se consiga melhorar e optimizar .

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.557
    • Tróniquices
Re: c reduzir codigo
« Responder #1 em: 08 de Dezembro de 2020, 02:05 »
E repetes as mesmas 3 comparações desse if nos 32 (só mudando a string)?
Talvez fique mais pequeno se usares uma tabela com as strings (que podes colocar na EEPROM, poupando assim muito espaço).

Algumas dicas gerais para encolher o código:

Declara a tua main assim:
int __attribute__((noreturn)) main(void)

Declara todas as funções com static.
ex.: static int getAddr..

Declara todas as variáveis globais com static.
ex.: static int gCounter;

Coloca as strings na EEPROM, assim não ocupam nem FLASH nem SRAM:
ex.: static char EEMEM  sBATTERY[] = "BATTERY";
Para as usar tens que escrever uma rotina para fazer uso directo ou copiá-la para SRAM e usar normalmente.

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.777
  • NERD!
Re: c reduzir codigo
« Responder #2 em: 08 de Dezembro de 2020, 11:58 »
Ia mandar um bitaite de meter as strings constantes para eeprom, mas o Njay já explicou isso e muito mais, e melhor do que sou capaz.
Só acrescento que o custo de memória de uma função de uma biblioteca está todo na primeira vez que se usa, se a usares mais 20 vezes não tem "penalização" extra, só ocupa mais uns bytes das chamadas.

Offline KammutierSpule

  • Mini Robot
  • *
  • Mensagens: 1.443
Re: c reduzir codigo
« Responder #3 em: 08 de Dezembro de 2020, 18:49 »
Só acrescento que o custo de memória de uma função de uma biblioteca está todo na primeira vez que se usa, se a usares mais 20 vezes não tem "penalização" extra, só ocupa mais uns bytes das chamadas.

Pois
E mesmo o caso pratico de "tenho 32 linhas iguais a estas num loop" nao parece justificar 64K, por isso, podias arranjar maneira de ver onde estao a ser gastos os bytes da Flash.
E atacar esse problema, nas funcoes que ocupam mais espaco..

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.777
  • NERD!
Re: c reduzir codigo
« Responder #4 em: 08 de Dezembro de 2020, 19:13 »
Lembrei-me também que o Arduíno "esconde" a "complicação" das ferramentas de compilação, que ajuda muito os iniciantes, mas pode atrapalhar quem quer mais um bocado.
Elas conseguem gerar um ficheiro ".map" que indica onde é que está a ser ocupada a memória, o que ajuda bastante a otimizar o código em termos de espaço.
Para não ter de andar a usar linha de comandos, com a complicação dos diretórios do arduino, encontrei esta solução para que seja gerado "automaticamente": https://arduino.stackexchange.com/a/31208
Não testei porque estou no tlm.

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.009
Re: c reduzir codigo
« Responder #5 em: 12 de Dezembro de 2020, 22:38 »
Boa noite,
Estive a verificar a questão do espaço ocupado e no memory details ele diz-me onde esta o espaço ocupado. (imagem em anexo. )
No entanto estou a 60.58k / 95.06% ocupados.
Uma função que ocupa me ocupa muito é o CalculateDistance  8.57kb  13.5% da flash , que calcula a distancia em metros até 1º km /e depois kms entre 2 coordenadas.

Depois em relação as sms  é assim:layout é PIN COMANDO SET1 SET2 SET3
São 20commandos alguns depois alguns tem mais que uma função. por exemplo saída 1 pode ser ON/OFF  ou temporizador ou impulsos ou ainda sinal de arm/disarm.
Então para chegar a tudo tenho uma variável só com sms.
Depois com um ciclo for vou contando o espaços e calculo a partir dai o conteúdo da mensagem e strcmp para identificar o commando e 4 set.
 

Agora  vi na net e depois experimentei que na build options tenho 2 opções debug que vem activa por defeito, e release , ao activar este coloca  Optimization level em Os -Optimize for size, e ganho muito espaço. Fico 67% ocupado.
 Será de fiar esta redução grande?

Offline KammutierSpule

  • Mini Robot
  • *
  • Mensagens: 1.443
Re: c reduzir codigo
« Responder #6 em: 12 de Dezembro de 2020, 23:18 »
Agora  vi na net e depois experimentei que na build options tenho 2 opções debug que vem activa por defeito, e release , ao activar este coloca  Optimization level em Os -Optimize for size, e ganho muito espaço. Fico 67% ocupado.
 Será de fiar esta redução grande?

É de confiar :)

tens ali a usar várias funcões "nao muito recomendáveis" strtod, pow, doa, isso soa a scanfs ou printfs com doubles ?

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.009
Re: c reduzir codigo
« Responder #7 em: 13 de Dezembro de 2020, 14:26 »
Boa tarde,

O que estou a usar é:atof e atoi para passar da variavel char mensagem  para  para double ou  Inteiro.

Depois sprintf para converter de double para char quando tenho de enviar o valor por sms, no caso dos inteiros itoa.

Ainda memcpy quando é directo char para char.

Nas coordenadas gps strcpy e *strtok_single , mas aqui muito sincero vi o codigo na net exprimentei e funciona bem, nem lhe mexi, ficou assim. Apenas deixei as variáveis 4 como globais e as restantes locais porque nao me interessa.

Offline KammutierSpule

  • Mini Robot
  • *
  • Mensagens: 1.443
Re: c reduzir codigo
« Responder #8 em: 14 de Dezembro de 2020, 09:55 »
isso volta ao assunto do post anterior
https://lusorobotica.com/index.php?topic=9711.0

em que uns dizem "Usa! nao tem problema nenhum!" e outros "Nao devias usar...porque etc etc"

So' por alto, conto ali uns 11.8Kbytes de bibliotecas relacionadas com o uso de floats/doubles. quase 20% da memora do MCU :)

agora podes decidir onde cortar queres cortar :)


Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.557
    • Tróniquices
Re: c reduzir codigo
« Responder #9 em: 14 de Dezembro de 2020, 10:56 »
Acho que era o itoa() das libs GCC do AVR que tinha, pelo menos há uns anos, um bug esquisito em que corrompia memória se lhe fosse dado um buffer na pilha. Eu tinha que usar um buffer estático para receber a string. Ou vice-versa, agora fiquei na dúvida...