Почему в моем Arduino есть часы?

9

Конечно, я знаю, что это полезно для контроля времени задержки, но какое-либо другое использование?

С тактовой частотой 16 МГц каждая строка моей программы займет 1/16000000 секунды, верно?

даже очень очень большая линия займет всего 1/16000000 секунды?

С тактовой частотой 8 МГц каждая строка займет удвоенное время, верно? Таким образом, весь «основной цикл» займет двойное время, верно?

n0tis
источник
3
Вы путаете инструкции C и инструкции машины (сборки). Но даже если вы написали непосредственно на ассемблере, вы можете найти хорошее применение этому, потому что программа НЕ является линейной. Я имею в виду, что прерывания, как следует из названия, прерывают нормальный поток кода, переходя к другой инструкции и затем возобновляя работу. Поэтому, возможно, между одной строкой и следующей должна быть выполнена ISR, которая может быть очень длинной
frarugi87
2
Если вы используете тактовую частоту в восемь миллигерц, даже самая простая строка кода будет длиться вечно. Я предлагаю вам использовать часы в мега герц диапазона (МГц).
Эдгар Бонет
Количество циклов, необходимое для выполнения каждой машинной инструкции, указано в Руководстве по набору инструкций .
Эдгар Бонет
Блин, мне пора спать;), отредактировал спасибо
n0tis

Ответы:

13

Почему в моем Arduino есть часы?

Потому что так работают компьютеры, микроконтроллеры и т. Д.

С тактовой частотой 16 МГц каждая строка моей программы займет 1/16000000 секунды, верно?

Нет.

даже очень очень большая линия займет всего 1/16000000 секунды?

Нет.

Часы определяют, с какой скоростью команды машинного кода извлекаются из памяти и выполняются. Большинство инструкций занимает 1 такт, а некоторые - больше.

Одна строка кода C может быть скомпилирована в любое количество инструкций по сборке, которые затем преобразуются в машинный код (необработанные числа). Это может быть где-то от 1 инструкции по сборке до тысяч инструкций по сборке, в зависимости от того, что делает строка.

С тактовой частотой 8 МГц каждая линия займет удвоенное время, верно? Таким образом, весь «основной цикл» займет двойное время, верно?

Каждая операция в чипе регулируется часами. Если тактовая частота равна половине скорости, то чип работает на половине скорости, поэтому каждая операция займет вдвое больше времени, да.

Маженко
источник
также прерывает.
njzk2
1
Незначительная мелочь: должно быть "... где-нибудь из 0 инструкций по сборке ...", даже без оптимизатора, но тем более после оптимизации.
Питер
2
Не путай бедного мальчика. У него достаточно тяжелое время, как есть.
Majenko
@Majenko: путаница является необходимостью. Это трудно.
intelfx
@intelfx "IT"? Это программирование, а не ЭТО ....
BalinKingOfMoria Восстановление CM
10

В ответе @ Majenko нет ответа: Да, с тактовой частотой 8 МГц каждая строка будет занимать двойное время. Если линия не ожидает чего-то, что не управляется часами - например, внешний вход.

В дополнение к ответу @ Majenko, у CPU есть часы, чтобы убедиться, что инструкции выполнены до начала следующего шага. Процессор состоит из множества транзисторов (я обнаружил ссылку, в которой указывалось, что AtMega находилась в диапазоне низких миллионов, на порядок или меньше).

В течение цикла электричество протекает через микросхему, включая / выключая транзисторы, в результате чего большее количество транзисторов включается и выключается и так далее по линии. В то время как это происходит, некоторые части чипа имеют «неправильное» значение - вы можете подумать, что это посередине вычислений (вы добавили столбец 1 и столбец 10 с и собираетесь начать с Колонка 100-х годов). Вы не хотите, чтобы это влияло на внешний мир, поэтому (например) ваши выходные контакты фиксируются - удерживаются на любом значении - пока инструкция не будет завершена. Время, необходимое для выполнения инструкции, варьируется, но производитель вырабатывает самую медленную инструкцию при худших обстоятельствах.

Для AtMega (который является чипом на Arduino), Atmel (который разработал чип) объявил, что это 1/20 000 000 секунд - это 20 МГц.

Обратите внимание, что не все микропроцессоры выполняют все свои инструкции по 1 инструкции за цикл - некоторые инструкции могут занимать 1, 2 или 10 циклов. Конвейерная обработка делает вещи еще более сложными - процессор может выполнять часть работы (например, извлекать следующую инструкцию) в одном цикле, выполнять ее в следующем - но пока он выполняет инструкцию 1, он также может извлекать следующую инструкцию. Чтобы сделать это, может потребоваться угадать, какая инструкция будет следующей (в случае машинного кода, эквивалентного «goto» - такой используется для циклов), и если он угадывает неправильно, он должен справиться с который; выбросить извлеченную инструкцию и получить следующую, потеряв цикл.

На странице Википедии, посвященной конвейерной обработке команд, показан пример конвейерной обработки чипа RISC в 5 этапов - выборка команд, декодирование команд, выполнение, доступ к памяти и обратная запись. Таким образом, вы можете иметь 5 инструкций на каком-то этапе выполнения, перекрывая друг друга. До фазы «обратной записи» инструкции не имеют реального эффекта. Вы можете думать об этом как о сборочной линии - сборка виджета занимает 7 минут, но его можно разбить на 5 этапов, самый длинный этап занимает 2 минуты. Каждые две минуты каждый частично завершенный виджет перемещается сборочной линией на следующую станцию. Вы получаете один виджет каждые две минуты. «Часы» могут работать только с самым медленным шагом. Если вы выдвинете виджет быстрее, «узкое место» будет ставить все больше и больше виджетов в очередь.

AMADANON Inc.
источник
У AVR очень мелкий конвейер: только извлекай и выполняй. Затем условные переходы выполняются либо за один цикл (переход не выполнен), либо за два цикла (переход выполнен).
Эдгар Бонет
Дополнительное усложнение: отсутствует кеш.
Мартин-Блас Перес Пинилья
Есть много вещей, которые я не упомянул: кеш (любого типа), многопоточность, многоядерность ... Я, наверное, уже слишком углубился в свой пост.
AMADANON Inc.