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?
oscillator-clock
n0tis
fonte
fonte
Respostas:
Porque é assim que computadores e microcontroladores, etc, funcionam.
Não.
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.
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.
fonte
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.
fonte