collapse

* Posts Recentes

localizador carro. por dio123
[Ontem às 22:37]


Portátil LG R500 por dropes
[25 de Fevereiro de 2021, 21:25]


GSM SIM900A por jm_araujo
[25 de Fevereiro de 2021, 18:00]


Compilador C por SerraCabo
[23 de Fevereiro de 2021, 17:27]


Transicão C ... C++ por Njay
[23 de Fevereiro de 2021, 13:02]


PlatformIO, excelente vídeo por SerraCabo
[23 de Fevereiro de 2021, 01:29]


Problema com Tablet por senso
[20 de Fevereiro de 2021, 20:35]


I2C a 400KHz por SerraCabo
[17 de Fevereiro de 2021, 16:32]


Glitch em linha I2C por SerraCabo
[17 de Fevereiro de 2021, 16:24]


A Arduino rp2040 connect por zordlyon
[17 de Fevereiro de 2021, 13:13]

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

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

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 997
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.551
    • 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.736
  • 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.425
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.736
  • 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: 997
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.425
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: 997
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.425
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.551
    • 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...