Por que há um relógio no meu arduino?

9

Claro que sei que é útil controlar o tempo de um atraso, mas qualquer outro uso?

Com um relógio de 16Mhz, cada linha do meu programa leva 1/16000000 segundo, certo?

mesmo uma linha muito grande levará apenas 1/16000000 de segundo?

Com um relógio de 8 MHz, cada linha leva o dobro do tempo, certo? Então todo o "loop principal" também levará o dobro do tempo, certo?

n0tis
fonte
3
Você está confuso entre as instruções C e as instruções da máquina (montagem). Mas, mesmo que você tenha escrito diretamente na montagem, poderá encontrar um bom uso disso, porque o programa NÃO é linear. Quero dizer, interrompe, como o nome sugere, interrompe o fluxo normal do código, seguindo outra instrução e depois retomando. Então, talvez entre uma linha e na próxima ele é forçado a executar o ISR, o que pode ser muito longo
frarugi87
2
Se você acertar seu chip em oito milihertz, até a linha de código mais simples levará uma eternidade. Eu sugiro que você use um relógio na faixa de mega hertz (MHz).
Edgar Bonet
O número de ciclos necessários para executar cada instrução da máquina é indicado no Manual do conjunto de instruções .
Edgar Bonet
Droga, eu deveria ir dormir;), obrigado editada
n0tis 4/16

Respostas:

13

Por que há um relógio no meu arduino?

Porque é assim que computadores e microcontroladores, etc, funcionam.

Com um relógio de 16 mhz, cada linha do meu programa leva 1/16000000 segundo, certo?

Não.

mesmo uma linha muito grande levará apenas 1/16000000 de segundo?

Não.

O relógio define a que velocidade as instruções do código da máquina são buscadas na memória e executadas. A maioria das instruções leva 1 ciclo de relógio, mas algumas demoram mais.

Uma linha de código C pode ser compilada em qualquer número de instruções de montagem, que são convertidas em código de máquina (números brutos). Isso pode variar de 1 instrução de montagem a milhares de instruções de montagem, dependendo do que a linha faz.

Com um relógio de 8 mhz, cada linha leva o dobro do tempo, certo? Então todo o "loop principal" também levará o dobro do tempo, certo?

Toda operação no chip é governada pelo relógio. Se o relógio estiver na metade da velocidade, o chip estará funcionando na metade da velocidade; portanto, toda operação levará o dobro do tempo, sim.

Majenko
fonte
também interrompe.
Njzk2
11
Nitpick menor: deve estar "... em qualquer lugar entre 0 instruções de montagem ...", mesmo sem o otimizador, mas ainda mais após a otimização.
Peter
2
Não confunda o pobre garoto. Ele está tendo um tempo difícil o suficiente.
Majenko
@ Mahenko: a confusão é uma necessidade. É difícil.
Intelfx
@intelfx "IT"? Esta é a programação, não de TI ....
BalinKingOfMoria Reintegrar CMs
10

Não respondida na postagem de @ Majenko: Sim, com um relógio de 8 MHz, cada linha leva o dobro do tempo. A menos que a linha aguarde algo que não é acionado por relógio - por exemplo, entrada externa.

Além da resposta de @ Majenko, uma CPU possui um relógio para garantir que as instruções sejam completas antes do início da próxima etapa. Uma CPU é composta de muitos transistores (eu encontrei uma referência que indicava que o AtMega estava na faixa de milhões baixos, em ordem de magnitude).

Durante um ciclo, a eletricidade flui através do chip, ativando / desativando os transistores, cujos resultados ativam / desativam mais transistores e assim por diante. Enquanto isso está acontecendo, algumas partes do chip têm um valor "errado" - você pode pensar nisso como sendo um meio de cálculo (você adicionou a coluna da pessoa e a coluna dos 10s e está prestes a começar no Coluna 100s). Você não quer que isso afete o mundo exterior, portanto (por exemplo) seus pinos de saída ficam travados - mantidos em qualquer valor que sejam - até que a instrução seja concluída. Quanto tempo leva para concluir uma instrução varia, mas o fabricante trabalha as instruções mais lentas nas piores circunstâncias.

Para o AtMega (que é o chip do Arduino), o Atmel (que projetou o chip) declarou que isso é de 1 / 20.000.000 de segundo - são 20MHz.

Observe que nem todos os microprocessadores executam todas as instruções em uma instrução por ciclo - algumas instruções podem levar 1, 2 ou 10 ciclos. O pipelining torna as coisas ainda mais complicadas - um processador pode fazer parte do trabalho (por exemplo, buscar a próxima instrução) em um ciclo, executá-lo no próximo - mas enquanto estiver executando a instrução 1, também poderá buscar a próxima instrução. Para fazer isso, pode ser necessário adivinhar qual instrução vem a seguir (no caso do código de máquina equivalente a um "goto" - usado para loops) e, se achar que está errado, terá de lidar com isso. aquele; jogue fora a instrução recuperada e recupere a próxima, perdendo um ciclo.

A página da Wikipedia sobre pipelining de instruções mostra um exemplo de pipelining de chips RISC em 5 estágios - busca de instruções, decodificação de instruções, execução, acesso à memória e write-back. Portanto, você pode ter 5 instruções em algum estágio de execução, sobrepostas. Até a fase "writeback", as instruções não têm efeito real. Você pode pensar nisso como uma linha de montagem - leva 7 minutos para montar um widget, mas pode ser dividido em 5 estágios, o estágio mais longo em 2 minutos. A cada dois minutos, cada widget parcialmente concluído é movido pela linha de montagem para a próxima estação. Você obtém um widget a cada dois minutos - O "relógio" pode marcar tão rápido quanto o passo mais lento. Se você empurrar o widget mais rapidamente, o "gargalo" terá cada vez mais widgets na fila.

AMADANON Inc.
fonte
O AVR tem um pipeline muito raso: apenas busque e execute. Então, os saltos condicionais levam um ciclo (salto não realizado) ou dois ciclos (salto realizado).
Edgar Bonet
Complicação adicional: falha de cache.
Martín-Blas Pérez Pinilla
Há muitas coisas que eu não mencionei: cache (de qualquer tipo), multi-threading, multi-core ... Eu provavelmente já me aprofundou muito no meu post.
AMADANON Inc.