Pergunta

Relacionado a:

Se você estiver escrevendo código para um microcontrolador está lá uma diferença real se você escrever em montagem ou C ou alguma outra linguagem de alto nível? Se você escreveu código C, como você compilá-lo?

Graças

Foi útil?

Solução

Vários comentários:

1) Absolutamente não montagem a menos de desempenho ou de otimização restrições justificar. As seguintes métricas atravessar o telhado com a montagem:

  • tempo de código-lo
  • tempo para depurá-lo
  • tempo para testá-lo
  • tempo para documentá-lo
  • tempo para descobrir (1 ano depois) o que era que estava fazendo quando você codificou-lo
  • chances de cometer um erro

2) Minha preferência seria C ++ em vez de C no namespace encapsulamento e sua facilitação de compilação em tempo práticas orientadas a objeto. C tem muitas oportunidades para variáveis ??globais e conflitos de namespace. (Real-time Java seria bom, mas pelo que eu entendo as suas exigências são ainda bastante alto)

Ou melhor um subconjunto de C ++: Excluir exceções, funções virtuais, tipo run-time de identificação, também de alocação de memória dinâmica na maioria dos casos - basicamente qualquer coisa que resta não especificado em tempo de compilação, já que normalmente vai exigir um monte de recursos extras durante a execução. Esse é o "inchaço" do C ++.

Eu usei ambos os compiladores da TI e IAR é para C ++, para o TMS320 e MSP430 microcontroladores (respectivamente) e com configurações de otimização adequada, eles fazem um trabalho fantástico de reduzir a sobrecarga que você pode esperar de C ++. (Especialmente se você ajudá-la a cabo por uso criterioso da palavra-chave inline)

Eu tenho modelos usado até mesmo para alguns de seus benefícios de tempo de compilação que promovem a boa reutilização de código: por exemplo, escrever um único arquivo de código-fonte para lidar com 8-bit, 16-bit, e CRCs de 32 bits; e tempo de compilação polimorfismo para permitir que você especifique o comportamento normal de uma classe, e em seguida, reutilizar esse mas substituir algumas de suas funções. Novamente, o compilador TI teve uma sobrecarga extremamente baixa com configurações de otimização apropriados.

Eu tenho procurado compilador C ++ para o Microchip PICs; a única empresa que eu encontrei que produz um é IAR. ($$$ tem sido um obstáculo, mas espero para comprar um sometime cópia) Os compiladores Microchip C18 / C30 são muito bons, mas eles são C, não C ++.

3) Uma advertência específicas sobre otimização do compilador: pode / vai fazer a depuração muito difícil; muitas vezes é impossível de etapa única por meio de código otimizado C / C ++ e suas janelas relógio pode mostrar variáveis ??que não têm nenhuma correlação com o que você acha que eles devem conter com código unoptimized. (Um bom depurador iria avisá-lo que uma determinada variável foi optimizada para fora da existência ou em um registo em vez de um local de memória. Muitas depuradores não.> :(

Além disso, um bom compilador iria deixá-lo pegar / escolher otimização no nível de função através #pragmas. Os que eu tenho usado apenas permitem especificar otimização no nível de arquivo.

4) de código C Interface para montagem: Este é geralmente difícil. A maneira mais fácil é fazer uma função stub que tem a assinatura que você quer, por exemplo uint16_t foo(uint16_t a, uint32_t b) {return 0; }, onde uint16_t = sem sinal curto, que geralmente fazem o # de bits explícitas. Em seguida, compilá-lo e editar o conjunto que produz (apenas certifique-se de deixar a começar / peças de saída do código) e ter cuidado para não espancar quaisquer registros sem restaurá-los depois que você está feito.

Inline montagem normalmente pode ter problemas a menos que você está fazendo algo muito simples como ativar / desativar interrupções.

A abordagem que eu mais gosto é intrínsecos do compilador / sintaxe "ASM estendida". compilador da Microchip C é baseado no compilador GNU C e tem " ASM estendida " que permite bits de código de linha de montagem, mas você pode dar muitas dicas para dizer-lhe que registra / variáveis ??que você está fazendo referência e ele vai lidar com todo o save / restore de registros para garantir que o código de montagem 'joga bonito' wcompilador do om C. TI para o TMS320 DSP não suporta estes; ele tem um conjunto limitado de intrínsecos que têm algum uso.

Eu usei montagem para otimizar algum código malha de controle que tem executado com freqüência, ou para o pecado calcular (), cos (), e arctan (). Mas caso contrário, eu ficaria longe montagem e vara com uma linguagem de alto nível.

Outras dicas

A maioria dos fabricantes de microcontroladores fornecer algum tipo de cross-compilador onde você pode compilar o código em seu PC e depois transferi-lo para o microcontrolador.

Por que C?
Uma vantagem de C é que seu código será mais fácil para a porta para outros microcontroladores no futuro. A história da computação mostrou que o código normalmente sobrevive implementações de hardware.
A segunda vantagem é estruturas de controle (se, por, tempo) que o código faça mais legível e de fácil manutenção.

Por Assembly Language?
Você pode entregar otimizações de artesanato.

Veredicto
Como é frequentemente o caso com este tipo de pergunta, os trade-offs são muito dependentes do uso específico.
Esteja ciente de que muitas vezes é possível misturar os dois, fazendo chamadas de montagem no código C, para que possa encontrar um equilíbrio que é certo para o seu projeto.

Específico para o hardware PIC
É parece que você não tem a opção de GCC com a maioria hardware PIC. Por outro lado, como um comentarista observou, o compilador Microchip C30 para o 16-bit PIC24 e dsPIC33 é gcc.
PIC ainda não é também apoiada por SDCC .
New Info: de acordo com um comentário, SDCC tem suporte viável para PIC
. Há alguma outra fonte aberta , mas eu não tenho experiência com eles.

A melhor opção é, provavelmente, para o código em C, e, em seguida, para os muito poucos casos em que você precisa para otimizar mão e pode fazer um trabalho melhor do que o compilador, você deve codificar o assembly em seus arquivos c.

Assembleia de codificação é uma coisa do passado para PCs, mas é muito relevante no incorporado.

Escrevendo montagem em incorporado é diferente do que escrever montagem em PCs. compiladores de PC são "melhor do que os seres humanos" na geração de instruções otimizadas. sistemas embarcados, muitas vezes têm arquiteturas de estranhos, e seus compiladores de otimização não são quase tão maduro quanto um compilador otimizar PC.

Uma questão eu tive com a escrita de montagem para um microcontrolador é a necessidade de ser muito cuidado como seu código foi colocado para fora. Ter uma tabela salto limites de memória cruzadas e fazendo com que seu código para saltar para lugares realmente estranho é bastante preocupante. Codificar em C, as tampas do compilador que a base para você.

Eu definitivamente ir com C. É mais rápido e cria software mais confiável. Assembléia tem muito pouco a oferecer e em ocasiões escassos. Tenha em mente que em C:

  • Você seria capaz de facilmente código de porta de plataformas existentes, mesmo a partir de PCs.
  • Você pode se desenvolver em uma linguagem de alto nível, sem comprometer a velocidade de execução ou tamanho do código. Desde que um compilador de qualidade está disponível (há muitas opções para PIC18), estas seriam provavelmente ser melhor com C do que a mão trabalhada montagem.
  • É muito mais fácil de depurar, testar e manter o código. C produz código mais confiável.

Outra coisa que tem especificamente a ver com PIC18. Você não terá que lidar com a arquitetura PIC não-intuitivo e coisas como bancos de memória.

Eu tive uma boa experiência com IAR C compiladores para 8051 de no passado.

A minha abordagem recente tem sido sempre esse: -

escrevê-lo em C com um bom compilador otimização, e só então se há um problema com o tamanho ou a velocidade, considere reescrever algumas partes em assembler.

No entanto, uma vez que esta abordagem Eu nunca necessário para escrever uma única linha de assembler ...

Vá para c!

Eu trabalhei para um grande fabricante. A última vez que vi a montagem estava lá era por volta de 1996 em algumas pequenas rotinas de serviços de interrupção para RC5 e RC6 decodificação e algoritmos de ajuste TV. Depois que c sempre utilizada, e C ++ (classes somente utilizadas, não stl, excepções ou rtti). Eu tenho boas experiências com o antigo compilador KEIL para 8051 e com o compilador greenhills (MIPS) eo conjunto de ferramentas VxWorks (PowerPC baseado).

Como Roddy diz, primeira gravação em C e otimizar na montagem mais tarde (se necessário).

Assembleia pode, em muitos casos, ser mais rápido; quando você estiver em um desktop, os compiladores tendem a ser otimizado para o ponto de que a mão de montagem raramente é uma necessidade, mas no mundo uC, é frequentemente. Além disso, se você precisa escrever interrupção manipulação rotinas e coisas assim, muitas vezes você não pode fazê-lo em C.

Como para a compilação, google em torno de um compilador C para o seu alvo.

Definitivamente C, exceto quando

  • memória de programa é extremamente limitada. Diga após meticulosa mão-otimizar seu código assembler você conseguir encaixar o seu programa neste 1024 bytes de Flash, com 0 bytes esquerda. Neste caso nenhum compilador C vai ser nada bom.

  • você quer ter controle de tempo absoluto. Se qualquer quantidade de latência de interrupção é muito longo você tem que confiar em assembler.

O problema é que estes dias incorporado pode ser qualquer coisa de um ATTINY com 6 pinos e alguns bytes de RAM para um SBC multi-core rodando um sistema operacional embutido que iria colocar computadores desktop de algumas pessoas à vergonha.

Como tal, a escolha das necessidades ambientais langauge / desenvolvimento de levar em conta o quão eficiente você precisa estar vs quão complexo é o sistema.

Primeiro -. C funciona em todos os lugares e escalas muito bem, quanto mais alto você for, mais você vai acabar chamando externo bibliotecas etc. para lidar com a complexidade

Para muito pequenas micros (medindo flash / ram em bytes) que você é melhor fora usando ASM, quando você chegar até a faixa kb, C ou qualquer uma das outras línguas tradicionais podem ser usados ??como você não precisa contar cada byte. Depois de ter megabytes para jogar com você tem tanto a capacidade e cada vez mais provável a necessidade de usar um RTOS para cuidar de tudo e reduzir o tempo de desenvolvimento. No momento em que você tem hardware você pode executar um sistema operacional soprado completo sobre você pode se provavelmente resumo do hardware e tudo apenas escrever em uma cela acolchoada, como Java ou algo assim sem se preocupar muito sobre como terrivelmente esbanjador tudo é e como você está não um verdadeiro programador mais ...;)

A exceção ao acima é quando você precisa de todo o desempenho que você pode torcer para fora do hardware, em que ponto você pode precisar cair para baixo um nível ou dois para manter as coisas eficiente.

Essa é a linha de fundo, se você usar C você pode entregar otimizar depois, eu não tomaria usar qualquer coisa que não seja C ou assembler (sem C ++, etc).

A chave é o conjunto de instruções microcontrolador se você estiver usando um PIC ou mesmo um 8051 eu usaria assembler somente. Se é um compilador amigável isa como braço ou avr ou msp430 em seguida, usar C para salvar a digitação, mas provavelmente você vai ter algumas rotinas em assembler por várias razões. Da mesma forma, você provavelmente quer evitar uma biblioteca C, mesmo newlib pode ser apenas demasiado volumoso, código emprestado ou idéias a partir deles, mas não apenas um link um em. Oh, de volta à pergunta, olhar para o que os compiladores C estão disponíveis para o alvo, mais uma vez armar e AVR você não terá quaisquer problemas. msp provável é bem assim. Só porque Keil ou Iar você vai vender um compilador não significa que você deve comprá-lo ou usá-lo, a saída de pagamento para, bem como compiladores livres pode ser terrível. Você precisa ser bem versado na asm qualquer maneira e examinar a saída (você provavelmente terá que escrever uma desmontador para fazer isso).

A linha inferior (outra linha de fundo), não existe uma resposta global (muito bem evitar anyhthing maior que C é uma resposta global) sempre depende do que a plataforma é o que seus recursos são o que sua tarefa é quais são os requisitos de desempenho que os requisitos de portabilidade são (se for realmente incorporado em um microcontrolador muito do que é, por definição, não portátil) que compiladores, depuradores, jTAG, etc são availble, mesmo tão longe como o que o sistema operacional hospedeiro você está desenvolvendo no pode ser um grande fator .

Há uma outra vez ao escrever na montagem pode ser necessário:. Se você precisa fazer algum teste RAM de baixo nível ou similar, que exige controle absoluto sobre onde os dados estão sendo armazenados

Por exemplo, software que confirma a SIL -2 (Nível de Integridade de Segurança) e acima podem exigir verificações contínuas na RAM, a fim de detectar qualquer possível corrupção de dados. A área de RAM você está verificando não pode estar mudando enquanto ele está sendo verificado, e assim que escrever o teste em assembler permite-lhe garantir que isso é verdade, por exemplo, armazenando todas as variáveis ??locais em registos específicos ou em outra área da RAM . Isso seria difícil, se não impossível, em C.

código de inicialização que zera a memória RAM e inicializa variáveis ??estáticas diferentes de zero também podem ser escritos em assembler para a mesma escrita, embora este tipo de código normalmente é fornecido.

Se você está escrevendo código que é altamente dependente de periféricos específicos do dispositivo e a cadeia de ferramenta que você está usando não fornece os intrínsecos necessários para utilizá-los de forma eficiente (como o compilador Freescale DSP563CC de baixa qualidade), então use montagem .

Além disso, eu acho que as regras não escritas do uso de montagem vs. uma linguagem de alto nível são mais ou menos as mesmas para o desenvolvimento de software de desktop: manter o código limpo, sustentável e otimizar o código quente com linguagem de máquina.

código em linguagem assembly são realmente rápida e pequena, mas o código escrito em linguagem assembler não são de código reutilizável. Este recurso reusibility para o código são característica mais importante para o projeto de software. Por exemplo, se você tem o código do projeto assembler para o processador x86, pode ser utilizado apenas para o processador x86, não para o processador ARM. Mas se você tem projeto C / C ++ código para o processador x86, você pode usar este código para o processador ARM. Então, é melhor assembler evitar para desenvolvimento de software.

É muito ruim ninguém mencionou Forth ou Esquema até agora. Ambos podem ser apropriado para ambientes pequenos, e pode dar ganhos de produtividade impressionantes.

Plain C ou Pascal, Modula-2. Mas, devido à disponibilidade compilador que significa C.

Os de extras de C ++ e similares só são interessante fora do recinto de estilo, uma vez que a alocação dinâmica e tamanho do programa é geralmente muito limitado.

Além disso, um tempo de execução mais complicada pode ser uma dor se seus aplicativos ficar apertado.

Assembler pode ser útil também, mas só se você vender quantidades realmente gigantescas e um firmware menor significa um, chips mais barato (menos flash) menor eo tamanho do programa é overseeable (leia-se: há alguma chance de que você vai buscá-la bugfree no tempo)

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