Otimização
A programação de baixo nível para sistemas embarcados é bem diferente da programação para dispositivos de uso geral, como computadores e telefones celulares. A eficiência (em termos de velocidade e espaço) é muito mais importante porque os recursos são escassos. Isso significa que a primeira coisa a fazer se você ficar sem espaço é olhar para quais partes do seu código você pode otimizar.
Em termos de redução do uso do espaço do programa (Flash), o tamanho do código pode ser bastante difícil de otimizar se você não tiver experiência ou se está mais acostumado a programar para computadores desktop que não tendem a precisar dessa habilidade. Infelizmente, não existe uma abordagem de 'bala mágica' que funcione para todas as situações, embora ajude se você considerar seriamente o que seu esboço realmente precisa ter. Se um recurso não for necessário, remova-o.
Às vezes, também é útil identificar onde várias partes do seu código são iguais (ou muito semelhantes). Você pode condensá-los em funções reutilizáveis, que podem ser chamadas de vários locais. No entanto, esteja ciente de que, às vezes, tentar tornar o código muito reutilizável acaba por torná-lo mais detalhado. É um equilíbrio difícil de atingir que tende a vir com a prática. Passar algum tempo olhando como as alterações de código afetam a saída do compilador pode ajudar.
A otimização dos dados de tempo de execução (SRAM) tende a ser um pouco mais fácil quando você está acostumado. Uma armadilha muito comum para programadores iniciantes é usar muitos dados globais. Qualquer coisa declarada no escopo global existirá durante toda a vida útil do esboço, e isso nem sempre é necessário. Se uma variável for usada apenas dentro de uma função e não precisar persistir entre as chamadas, torne-a uma variável local. Se um valor precisar ser compartilhado entre funções, considere se você pode passá-lo como um parâmetro em vez de torná-lo global. Dessa forma, você só usará SRAM para essas variáveis quando realmente precisar.
Outro fator importante para o uso da SRAM é o processamento de texto (por exemplo, usando a String
classe). De um modo geral, você deve evitar operações de String, se possível. Eles são enormes porcos da memória. Por exemplo, se você estiver enviando muito texto para serial, use várias chamadas para, em Serial.print()
vez de usar a concatenação de cadeias. Tente também reduzir o número de literais de string no seu código, se possível.
Evite recursão, se possível também. Cada vez que é feita uma chamada recursiva, a pilha aumenta ainda mais o nível. Refatorar suas funções recursivas para serem iterativas.
Usar EEPROM A
EEPROM é usada para armazenamento de longo prazo de itens que mudam apenas ocasionalmente. Se você precisar usar listas grandes ou tabelas de consulta de dados fixos, considere armazená-las na EEPROM com antecedência e retire apenas o necessário quando necessário.
Obviamente, a EEPROM é bastante limitada em tamanho e velocidade e possui um número limitado de ciclos de gravação. Não é uma ótima solução para limitações de dados, mas pode ser suficiente para aliviar a carga no Flash ou SRAM. Também é possível interagir com armazenamento externo semelhante, como um cartão SD.
Expansão
Se você esgotou todas as outras opções, a expansão pode ser uma possibilidade. Infelizmente, não é possível expandir a memória Flash para aumentar o espaço do programa. No entanto, é possível expandir a SRAM. Isso significa que você pode refatorar seu esboço para reduzir o tamanho do código às custas do aumento do tamanho dos dados.
Obter mais SRAM é realmente bastante simples. Uma opção é usar um ou mais chips 23K256 . Eles são acessados via SPI e existe a biblioteca SpiRAM para ajudá-lo a usá-los. Apenas tenha cuidado que eles operam em 3.3V e não em 5V!
Se você estiver usando o Mega, poderá obter os escudos de expansão SRAM em Lagrangian Point ou Rugged Circuits .