Qual a diferença entre microcontroladores de 8 bits e microcontroladores de 32 bits quando se trata de programá-los

19

Certo, então temos microcontroladores de 8, 16 e 32 bits neste mundo no momento. Todos eles são frequentemente usados. Qual é a diferença de programar microcontroladores de 8 e 16 bits? Quero dizer, isso requer técnica ou habilidade diferente? Vamos pegar o microchip, por exemplo. Quais são as novidades que uma pessoa precisa aprender se deseja fazer a transição de microcontroladores de 8 bits para microcontroladores de 32 bits?

quantum231
fonte
Não. Certamente existem preocupações diferentes, mas essas são em grande parte no nível de detalhes específicos do dispositivo. Por exemplo, o acesso desalinhado a palavras é permitido? (No ARM não é - ainda no x86 é). Esta questão não é realmente específica o suficiente.
Chris Stratton
Uau pessoal, obrigado pelas respostas. Portanto, existem diferenças muito importantes que precisamos levar em consideração ao programar processadores de 32 bits versus processadores de 8 bits. Aqui eu estava me referindo a C, pois acho que a maioria das pessoas não se aprofunda na Assembléia por programação por razões que todos sabemos muito. Obrigado por respostas detalhadas, eu realmente aprecio isso.
precisa saber é o seguinte
Com os uc's de 32 bits, há muito mais opções e muito mais registros que você precisa para acertar. Eu acho que depende do que você está fazendo. Dito isto, hoje em dia você pode obter uma placa de desenvolvimento, compilador, depurador, IDE por cerca de US $ 50. Voltar no dia que custaria cerca de US $ 1000.

Respostas:

33

Em geral, passar de microcontroladores de 8 a 16 a 32 bits significa que você terá menos restrições de recursos, principalmente memória, e a largura de registros usados ​​para operações aritméticas e lógicas. Os monikers de 8, 16 e 32 bits geralmente se referem ao tamanho dos barramentos de dados internos e externos e também ao tamanho do (s) registro (s) interno (s) usado (s) para operações aritméticas e lógicas (costumava ser apenas um ou dois chamados acumuladores , agora geralmente existem bancos de registro de 16 ou 32).

Os tamanhos das portas de E / S também geralmente seguem o tamanho do barramento de dados; portanto, um micro de 8 bits terá portas de 8 bits, um de 16 bits terá portas de 16 bits etc.

Apesar de possuir um barramento de dados de 8 bits, muitos microcontroladores de 8 bits têm um barramento de endereço de 16 bits e podem endereçar 2 ^ 16 ou 64K bytes de memória (isso não significa que eles tenham algo próximo ao implementado). Porém, alguns micros de 8 bits, como os PICs low-end, podem ter apenas um espaço de RAM muito limitado (por exemplo, 96 bytes em um PIC16).

Para contornar seu esquema de endereçamento limitado, algumas micros de 8 bits usam paginação, onde o conteúdo de um registro de página determina um dos vários bancos de memória a serem usados. Geralmente haverá alguma RAM comum disponível, independentemente do registro de página.

O microcontrolador de 16 bits geralmente é restrito a 64 K de memória, mas também pode usar técnicas de paginação para contornar isso. Os microcontroladores de 32 bits obviamente não têm essas restrições e podem endereçar até 4 GB de memória.

Juntamente com os diferentes tamanhos de memória, está o tamanho da pilha. Nas micros de extremidade inferior, isso pode ser implementado em uma área especial da memória e ser muito pequeno (muitos PIC16s têm uma pilha de chamadas profundas de 8 níveis). Nos micros de 16 e 32 bits, a pilha geralmente terá RAM geral e será limitada apenas pelo tamanho da RAM.

Também existem grandes diferenças na quantidade de memória - tanto no programa quanto na RAM - implementada nos vários dispositivos. Os micros de 8 bits podem ter apenas algumas centenas de bytes de RAM e alguns milhares de bytes de memória de programa (ou muito menos - por exemplo, o PIC10F320 possui apenas 256 palavras de flash de 14 bits e 64 bytes de RAM). Micros de 16 bits podem ter alguns milhares de bytes de RAM e dezenas de milhares de bytes de memória do programa. Os micros de 32 bits geralmente têm mais de 64 KB de RAM e talvez 1/2 MB ou mais de memória de programa (o PIC32MZ2048 possui 2 MB de flash e 512 KB de RAM; o PIC32MZ2064DAH176, recém-lançado, otimizado para gráficos, possui 2 MB de flash e impressionantes 32 MB de RAM no chip).

Se você estiver programando em linguagem assembly, as limitações de tamanho do registro serão muito evidentes, por exemplo, adicionar dois números de 32 bits é uma tarefa árdua em um microcontrolador de 8 bits, mas trivial em um de 32 bits. Se você estiver programando em C, isso será amplamente transparente, mas é claro que o código compilado subjacente será muito maior para os 8-amargos.

Eu disse em grande parte transparente, porque o tamanho de vários tipos de dados C pode ser diferente de um tamanho micro para outro; por exemplo, um compilador que visa um micro de 8 ou 16 bits pode usar "int" para significar uma variável assinada de 16 bits, e em um micro de 32 bits isso seria uma variável de 32 bits. Muitos programas usam #defines para dizer explicitamente qual é o tamanho desejado, como "UINT16" para uma variável de 16 bits não assinada.

Se você estiver programando em C, o maior impacto será o tamanho de suas variáveis. Por exemplo, se você souber que uma variável sempre será menor que 256 (ou no intervalo -128 a 127 se assinado), use um 8 bits (caracter não assinado ou caractere) em um micro de 8 bits (por exemplo, PIC16 ), pois usar um tamanho maior será muito ineficiente. Da mesma forma, re variáveis ​​de 16 bits em um micro de 16 bits (por exemplo, PIC24). Se você estiver usando um micro de 32 bits (PIC32), isso realmente não fará diferença, pois o conjunto de instruções MIPS possui instruções de byte, palavra e palavra dupla. No entanto, em alguns micros de 32 bits, se eles não tiverem essas instruções, manipular uma variável de 8 bits pode ser menos eficiente do que uma variável de 32 bits devido ao mascaramento.

Como o membro do fórum vsz apontou, em sistemas nos quais você tem uma variável maior que o tamanho padrão do registro (por exemplo, uma variável de 16 bits em um micro de 8 bits), e essa variável é compartilhada entre dois threads ou entre o thread base e um manipulador de interrupção, é preciso fazer qualquer operação (incluindo apenas a leitura) na variável atômica , ou seja, fazer parecer que ela é executada como uma instrução. Isso é chamado de seção crítica. A maneira padrão de atenuar isso é cercar a seção crítica com um par de interrupção de desativação / ativação.

Portanto, passando de sistemas de 32 bits para 16 bits ou 16 bits para 8 bits, todas as operações em variáveis ​​desse tipo que agora são maiores que o tamanho padrão do registro (mas não antes) precisam ser consideradas críticas seção.

Outra diferença principal, passando de um processador PIC para outro, é o manuseio de periféricos. Isso tem menos a ver com o tamanho da palavra e mais com o tipo e o número de recursos alocados em cada chip. Em geral, o Microchip tentou tornar a programação do mesmo periférico usado em chips diferentes o mais semelhante possível (por exemplo, timer0), mas sempre haverá diferenças. O uso de suas bibliotecas periféricas ocultará essas diferenças em grande parte. Uma diferença final é o tratamento de interrupções. Novamente, há ajuda aqui das bibliotecas do Microchip.

tcrosley
fonte
Pode ser interessante notar que, no nível da linguagem assembly, os processadores de 8 bits tendem a ter menos registros e menos instruções ortogonais (o AVR é ​​uma exceção mais RISCy), uma consequência das restrições de design quando elas foram desenvolvidas. Os processadores de 32 bits tendem a ser descendentes de RISC (o RX da Renesas, um CISC moderno, é uma exceção, e o ColdFire da Freescale desce de m68k).
Paul A. Clayton
9
Para não iniciar uma nova resposta apenas para essa adição, acho importante adicionar que a transição de 32 bits para 16 de 16 para 8 pode causar surpresas desagradáveis, pois a aritmética deixa de ser atômica. Se você adicionar dois números de 16 bits em um microcontrolador de 8 bits e usá-los em uma interrupção, terá que cuidar de torná-los seguros para threads, caso contrário, poderá acabar adicionando apenas metade dele antes que a interrupção seja acionada, resultando em um valor inválido na sua rotina de serviço de interrupção.
Vsz
2
@ vsz - Bom ponto, esqueci disso. Geralmente, deve-se desativar as interrupções em torno de qualquer acesso (incluindo apenas a leitura) a qualquer variável volátil que seja maior que o tamanho padrão do registro.
tcrosley
1
É verdade que o uC de 32 bits geralmente possui interfaces de E / S de 32 bits? Eu acho que de qualquer maneira é mais comum apenas comunicação serial.
clabacchio
1
@clabacchio Minha experiência é que todos os registros de porta de E / S são definidos como 32 bits, mas às vezes os 16 bits principais 16-31 não são utilizados, portanto uma porta paralela ainda possui 16 pinos físicos. Em outros casos, como um registro RTCC, todos os 32 bits são usados.
precisa saber é o seguinte
8

Uma diferença comum entre os microcontroladores de 8 e 32 bits é que os de 8 bits geralmente têm um intervalo de memória e espaço de E / S que pode ser acessado em uma única instrução, independentemente do contexto de execução, enquanto os microcontroladores de 32 bits frequentemente requer uma sequência de instruções múltiplas. Por exemplo, em um microcontrolador típico de 8 bits (HC05, 8051, PIC-18F, etc.), pode-se alterar o estado de um bit de porta usando uma única instrução. Em um ARM típico (32 bits), se o conteúdo do registro fosse inicialmente desconhecido, seria necessária uma sequência de instruções com quatro instruções:

    ldr  r0,=GPIOA
    ldrh r1,[r0+GPIO_DDR]
    ior  r1,#64
    strh r1,[r0+GPIO_DDR]

Na maioria dos projetos, o controlador passa a maior parte do tempo fazendo outras coisas além de definir ou limpar bits de E / S individuais, portanto, o fato de operações como limpar um pino de porta exigirem mais instruções geralmente não importa. Por outro lado, há momentos em que o código terá que "big bang" muitas manipulações de portas, e a capacidade de fazer essas coisas com uma única instrução pode ser bastante valiosa.

Por outro lado, os controladores de 32 bits são invariavelmente projetados para acessar com eficiência muitos tipos de estruturas de dados que podem ser armazenadas na memória. Muitos controladores de 8 bits, em comparação, são muito ineficientes para acessar estruturas de dados que não são alocadas estaticamente. Um controlador de 32 bits pode executar em uma instrução um acesso à matriz que levaria meia dúzia ou mais de instruções em um controlador de 8 bits típico.

supercat
fonte
Suponho que você quis dizer "bit-bang". Pode ser interessante notar que o ARM suporta regiões de banda de bits (onde operações de palavras são operações de bit único) e a Extensão Específica de Aplicativo do MCU para MIPS fornece Bit Ativado / Apagado Atomicamente dentro das instruções de Byte (ASET / ACLR).
Paul A. Clayton
@ PaulA.Clayton: Eu realmente não olhei para o MIPS nos últimos 20 anos; quanto às regiões de banda de bits, eu nunca descobri uma maneira de usá-las em códigos de aparência razoável, e mesmo que eu pudesse usá-las, elas salvariam apenas uma instrução, a menos que alguém usasse algum truque insano de programação. Nesse caso, eles podem salvar dois [carregar R0 com um endereço par ou ímpar, com base na definição ou eliminação do bit, e ajustar o deslocamento na instrução de armazenamento conforme apropriado para compensar]. BTW, você tem alguma idéia de por que a região de banda de bits usa endereços de palavras?
Supercat
@supercat: Palavra de endereçamento permite acessar as regiões de banda bit de C ou C ++ via subscripting ponteiro ( region_base[offset])
Ben Voigt
@BenVoigt E por que não se pode fazer isso com o endereçamento de bytes? (Talvez uma possível razão seria remover a expectativa / esperança de que as operações de dois bits e quatro bits seria suportado.)
Paul A. Clayton
@BenVoigt: Ter que escalar o número de bits por um fator 4 geralmente custa uma instrução extra. Na verdade, o que eu gostaria de ver, em vez de uma área de banda de bits, seria um conjunto de áreas que ficavam em um deslocamento fixo em relação aos acessos de memória "normais", mas especificam que gravam em uma área se possível, apenas "definir" os bits e gravar no outro apenas "limpar" os bits. Se o barramento tivesse bits de controle "write-ones-enable" e "write-zeroes-enable" separados, seria possível obter o que a banda de bits permite, mas em muitos casos evite ler-modificar-gravar.
Supercat
6

A maior diferença prática é a quantidade de documentação, realmente, para entender completamente o chip inteiro. Existem microcontroladores de 8 bits disponíveis com quase 1000 páginas de documentação. Compare isso com cerca de 200-300 páginas para uma CPU de 8 bits dos anos 80 e os populares chips periféricos com os quais ela seria usada. Um dispositivo de 32 bits rico em periféricos exigirá que você percorra de 2000 a 10.000 páginas de documentação para entender a peça. As peças com gráficos 3D modernos são bordadas em 20 mil páginas de documentação.

Na minha experiência, leva cerca de 10x o tempo para saber tudo o que há para saber sobre um determinado controlador moderno de 32 bits, como seria para uma parte moderna de 8 bits. Com "tudo", quero dizer que você sabe como usar todos os periféricos, mesmo de maneiras não convencionais, e conhece a linguagem da máquina, o montador que a plataforma usa, além de outras ferramentas, as ABI (s), etc.

Não é inconcebível que muitos, muitos projetos sejam feitos com entendimento parcial. Às vezes é inconseqüente, às vezes não é. A troca de plataformas deve ser feita com o entendimento de que haverá um preço de curto e médio prazo na produtividade que você paga pelos ganhos de produtividade percebidos de uma arquitetura mais poderosa. Faça a sua diligência.

Restabelecer Monica
fonte
3

Pessoalmente, não me preocuparia muito em atualizar (8 bits-> 32 bits) uC da mesma família e você está aumentando as especificações em geral. Geralmente, eu não faço nada fora do padrão com os tipos de dados, pois pode ser difícil mantê-lo no caminho.

O downgrade de um código de dispositivo é uma história diferente.

Nick Tullos
fonte
3
O tamanho dos tipos de dados é determinado pelo compilador, não pela arquitetura do processador. Um processador de 8 bits pode ter entradas de 32 bits, mesmo que sejam necessárias várias instruções para manipulá-las.
Joe Hass
bom comentário- Eu removi a primeira linha devido à correção.
Nick Tullos
@JoeHass: Um compilador para um processador de 8 bits pode definir inta ser de 32 bits, ou mesmo 64 para que o assunto, mas tenho conhecimento de quaisquer compiladores 8 bits existentes que na verdade não definem inta ser maior do que 16 bits, ou promover Valores de 16 bits para algo maior.
Supercat
-1

Os MCUs de 32 bits consumirão muito mais energia para um. E requer mais circuitos de suporte.

Na verdade, não é possível fazer a transição para 8 bits de 32 bits ... Você continuará usando os dois, geralmente juntos. A linha inferior é que você deve usar (e aprender) o que for apropriado para o trabalho. Aprenda o ARM porque, agora, ele agita o mundo incorporado e continuará a fazê-lo. Aprenda também o AVR ou o PIC porque são controladores de placa impressionantes.

Você provavelmente experimentará tanta alternância de AVRs para ARMs quanto de ARM para x86 de qualquer maneira, o tamanho do barramento realmente não faz muita diferença. Todo o hardware extra avançado faz embora. Passar de interrupções padrão para uma matriz de interrupções vetorial com 6 níveis de prioridade será muito mais difícil do que descobrir como contar até quatro bilhões.

Hugo
fonte
4
Não sei se é preciso afirmar que os MCUs de 32 bits estão intrinsecamente mais famintos por energia. Pelo menos uma linha de produtos inteira da empresa ( energia micro ) é composta por MCUs de potência ultra baixa e todos eles são baseados no núcleo ARM de 32 bits.
Connor Lobo
3
Apenas funcionou um circuito stm32l1 que deve ser executado por 7 anos em um cr2032
Scott Seidman
2
Você pode justificar o comentário de que um MCU de 32 bits precisa de mais "circuitos de suporte"? Eu acho que você está expressando várias opiniões injustificadas aqui.
quer
1
Além disso, seu comentário sobre interrupções vetoriais não faz muito sentido, pois você pode obter vários níveis de prioridade em microcontroladores de 8 bits (consulte MCUs Atmel xmega, que têm três níveis de prioridade), e ter interrupções vetoriais é irrelevante quando todos os dispositivos de hardware possuem. próprios vetores independentes de qualquer maneira.
Connor Lobo
2
Estou usando um processador Cortex-M0 de 32 bits para controlar um carregador de bateria inteligente para um veículo elétrico. Ele usa uma única fonte de 3,3 V. Ele tem um oscilador interno e PLL, então nem preciso de um cristal. Estou usando um pacote DIP de 28 pinos, mas posso obter um Cortex-M0 em um DIP de 8 pinos, se quiser. Como isso pode ser mais complexo que um PIC ou AVR típico?
precisa