Pergunta

Eu preciso de código otimizar para obter espaço para algum novo código. Eu não tenho o espaço para todas as mudanças. Eu não posso usar o código de mudança de banco (80C31 com 64k).

Foi útil?

Solução

Você não tem realmente dado um monte de ir aqui, mas existem dois principais níveis de otimizações que você pode considerar:

Micro-Optimizations: por exemplo. XOR A em vez de MOV A, 0 Adam cobriu algumas delas bem mais cedo.

Macro-Optimizations: Olhada na estrutura do seu programa, as estruturas de dados e algoritmos utilizados, as tarefas realizadas, e pensar muito sobre como estes poderiam ser reorganizadas ou mesmo eliminados. Há pedaços inteiros de código que realmente não são usados? É o seu código completo de instruções de saída de depuração que o usuário nunca vê? Existem funções específicas a um único cliente que você poderia deixar de fora de uma liberação geral?

Para obter um bom controle sobre isso, você vai precisar trabalhar para fora onde sua memória está sendo usado para cima. O mapa Linker é um bom lugar para começar com isso. Macro-otimizações são onde as vitórias GRANDES pode ser feita.

Como um aparte, você pode - tentativa sério- reescrever partes do seu código com uma boa otimização de compilador C. Você pode se surpreender com o quão apertado o código pode ser. Um verdadeiro hotshot montador pode ser capaz de melhorá-lo, mas ele pode facilmente ser melhor do que a maioria dos programadores. Eu usei o IAR um cerca de 20 anos atrás, e que deslumbrou as minhas meias.

Outras dicas

Com linguagem assembly, você vai ter que optimize a mão. Aqui estão algumas técnicas:

Nota:. IANA8051P (eu não sou um programador 8501, mas eu tenho muitas done de montagem em outros 8 chips bit)

Go através do código à procura de qualquer bits duplicados, não importa quão pequena e torná-los funções.

Saiba algumas das instruções mais incomuns e veja se você pode usá-los para otimizar, por exemplo. Um bom truque é usar XOR A para limpar o acumulador ao invés de MOV A, 0 -. Ele salva um byte

Outro truque é se você chamar uma função antes de retornar, basta saltar para ele, por exemplo, em vez de:

CALL otherfunc
RET

Basta fazer:

JMP otherfunc

Certifique-se sempre que você está fazendo saltos relativos e ramos, sempre que possível, eles usam menos memória do que saltos absolutos.

Isso é tudo que eu posso pensar em cima da minha cabeça para o momento.

Desculpe eu estou vindo para esta tarde, mas uma vez que eu tinha exatamente o mesmo problema, e tornou-se um problema repetido que manteve voltando para mim. No meu caso o projeto foi um telefone, em um processador 8051 família, e eu tinha totalmente estourou a memória ROM (código). Ele manteve a voltar para mim porque a administração manteve solicitar novos recursos, de modo que cada novo recurso tornou-se um processo de duas etapas. 1) Optimize material velho para dar espaço 2) Implementar o novo recurso, utilizando-se o quarto que eu apenas fiz.

Existem duas abordagens para otimização. Táticas e estratégicas. otimizações táticas economizar alguns bytes de cada vez com uma ideia micro otimização. Acho que você precisa otimizações estratégicas que envolvem um repensar mais radical sobre como você está fazendo as coisas.

Algo Lembro-me trabalhou para mim e pode funcionar para você;

Olhe para a essência do que seu código tem que fazer e tentar destilar algumas muito fortes operações primitivas flexíveis. Em seguida, reconstruir o seu código de nível superior para que ele faz de baixo nível absolutamente nada exceto chamada nas primitivas. Idealmente usar uma abordagem de tabela com base, sua tabela contém coisas como; estado de entrada, evento, estado da saída, primitivas .... Em outras palavras, quando um evento acontece, procure uma célula na tabela para esse evento no estado atual. Essa célula diz-lhe o novo estado para mudar para (opcionalmente) e o primitivo (s) (se houver) para executar. Você pode precisar de vários conjuntos de estados / eventos / mesas / primitivas para diferentes camadas / subsistemas.

Um dos muitos benefícios desta abordagem é que você pode pensar nisso como a construção de uma linguagem personalizada para o seu problema particular, em que você pode muito eficiente (ou seja, com código extra mínima) criar uma nova funcionalidade simplesmente modificar a tabela.

lamento meses de atraso e você provavelmente não tem tempo para fazer algo isso de qualquer maneira radical. Pelo que sei você já está usando uma abordagem semelhante! Mas a minha resposta poderia ajudar alguém um dia quem sabe.

No departamento whacked-out, você poderia também considerar comprimir parte do seu código e só mantendo alguma parte que está ativamente usado descompactados em qualquer ponto específico no tempo. Eu tenho um tempo difícil acreditar que o código necessário para o sistema compactar / descompactar seria pequeno o suficiente uma parte da pequena memória do 8051 para fazer este maravilhas que valem a pena, mas já trabalhou em sistemas ligeiramente maiores.

No entanto, outra abordagem é a vez de um formato byte-code ou o tipo de código baseado em tabela que algum estado máquinas-ferramentas de saída - ter uma máquina entender o que seu aplicativo está fazendo e gerando uma implementação completamente incompreensível pode ser um grande maneira de economizar espaço:)

Finalmente, se o código está realmente compilado em C, gostaria de sugerir a compilação com uma gama de diferentes opções para ver o que acontece. Além disso, eu escrevi uma peça sobre compacto C codificam para a parte de trás do CES em 2001 que ainda é muito atual. Veja esse texto para outros truques para pequenas máquinas.

1) Sempre que possível salvar suas variáveis ??em iData não em xdata
2) Olhe para as suas declarações Jmp - fazer uso de SJMP e AJmp

Eu suponho que você sabe que não vai caber porque você escreveu / cumprido e tem a "falta de memória" de erro. :) Parece as respostas abordar a sua pergunta bastante precisão; curta de obter exemplos de código.

Gostaria, no entanto, recomendar alguns pensamentos adicionais;

  1. Certifique-se de todo o código é realmente sendo usado - teste de cobertura de código? A sub utilizada é uma grande vitória - este é um etapa difícil - se você é o original autor, pode ser mais fácil - (bem, talvez):)
  2. Verifique se o nível de "verificação" e inicialização - às vezes nós têm uma tendência a ser mais zeloso em segurar temos inicializado variáveis ??/ memória e com certeza com razão, quantas vezes nós sido mordido por ele. Não estou dizendo que não fazer initialize (duh), mas se estamos fazendo um movimento de memória, o destino não necessidade para ser zero'd primeiro - este se encaixa com

    1 -

  3. Eval os novos recursos - pode um sub existente ser ser melhorada a tampa ambas as funções ou talvez uma recurso existente substituído?
  4. Break up grande de código se um pedaço da grande código pode salvar criar um novo pouco código.

ou talvez há um argumento para hardware versão 2.0 sobre a mesa agora ...:)

relação

Além dos já mencionados (mais ou menos) otimizações óbvias, aqui está uma muito estranho (e quase impossível de conseguir) um: A reutilização de código. E com reutilização de código Eu não significa a reutilização normal, mas a) reutilizar o seu código como dados ou b) para reutilizar o seu código como outro código. Talvez você possa criar um lut (ou qualquer de dados estáticos) que pode representados pelos opcodes asm hexagonais (aqui você tem que olhar harvard vs von Neumann arquitetura).

A outra seria a reutilização de código, dando código um significado diferente quando você tratá-lo diferente. Aqui um exemplo para tornar claro o que quero dizer. Se os bytes para o seu olhar um código como este: AABCCCDDEEFFGGHH no endereço X, onde cada letra representa um código de operação, imagine que você seria agora saltar para X + 1. Talvez você tem uma funcionalidade diferente completa, onde o agora por um espaço bytes separados formar os novos opcodes: ABC CCD DE EF GH.

Mas cuidado: Este não é apenas difícil de conseguir (talvez o seu impossível), mas é um horror de manter. Então, se você não é um código de demonstração (ou algo semelhante exótica), eu recomendo usar os já outras formas mencionadas para salvar mem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top