Почему некоторые микроконтроллеры имеют такие большие задержки синхронизации?

11

В микроконтроллерах серии Atmel SAM-D21 многие периферийные устройства используют тактовую частоту, которая является асинхронной по отношению к основной тактовой частоте ЦП, и доступ к этим периферийным устройствам должен проходить через логику синхронизации; на периферийных устройствах, часы которых работают медленнее, чем время процессора, это может привести к большим задержкам. Например, если RTC настроен на использование тактовой частоты 1024 Гц (что, как представляется, является намерением проекта), а процессор работает на частоте 48 МГц, чтение регистра «текущего времени» приведет к тому, что логика шины вставит более 200 000 состояний ожидания (минимум из пяти циклов тактовой частоты 1024 Гц). Хотя процессор может выдать запрос на чтение, выполнить какой-то другой несвязанный код и вернуть более 200 000 циклов позже, чтобы извлечь время, похоже, нет никакого способа на самом деле прочитать время быстрее.

По моему пониманию синхронизации, однобитовая схема синхронизации будет задерживать сигнал на 2-3 такта тактового генератора; Синхронизация многобитовой величины немного сложнее, но существует множество подходов, которые могут гарантировать надежное поведение в течение пяти циклов тактового сигнала назначения, если он быстрее, чем тактовый генератор источника, и всего на несколько циклов больше, если это не так. Что бы сделал Atmel SAM-D21, для синхронизации которого потребовалось бы шесть тактов в исходной тактовой области, и какие факторы будут благоприятствовать конструкции, задержки синхронизации которой настолько велики, что требуют прерывания «сделано синхронизацией», а не того, который обеспечивает Задержки синхронизации достаточно короткие, чтобы сделать такие прерывания ненужными?

Supercat
источник
2
Спасибо за этот вопрос. Это заставило меня наконец понять проблему в моих руках. Я пришел сюда, потому что не мог понять, почему очистка сторожевого таймера (WDT) займет около 5 огромных миллисекунд на SAMD20 / 21. Теперь я знаю, что это по конструкции оборудования, а не моя ошибка. (WDT работает на частоте 1024 Гц, что является единственным разумным вариантом.) Теперь я могу, по крайней мере, справиться с этим соответствующим образом.
T-Bull
2
@ T-Bull: действительно забавная вещь в сторожевом таймере этих частей заключается в том, что он отключен между временем, когда программное обеспечение выдает команду сброса, и временем, когда команда проходит через синхронизатор. Если устройство перейдет в спящий режим в течение этого интервала, сторожевой таймер не будет работать до тех пор, пока деталь не разбудит что - либо еще .
Суперкат

Ответы:

2

Это другой способ сделать что-то для меня, я привык к своей архитектуре, где мои регистры либо на тактовой частоте моего процессора, либо, по крайней мере, на половине тактовой частоты. Итак, вы пишете свои регистры, и они сразу готовы. Возможно, они делают это таким образом для экономии энергии? Если они размещают периферийные регистры в своем собственном очень медленном домене тактов, возможно, им не нужно просыпаться и запускать тактовый генератор или тактовую частоту процессора, а продолжать обновлять значения на периферии.

Если это так, то вы могли бы записать регистр в свой супер медленный периферийный блок, затем отключить остров питания для всего процессора или тактового генератора и позволить медленному синхронизатору читать его до тех пор, пока он не будет счастлив, а затем прерывать процессор, чтобы вывести его из строя. сна.

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

Относительно того, почему они используют так много циклов синхронизации, это может быть паранойей, или они могут соответствовать какому-то высокому стандарту надежности для одного из своих клиентов. Не могу сказать наверняка, но знаю, что видел клиентов с такими требованиями, как у каждого барана должен быть ecc, предустановка на заданное значение и т. Д.

Я думаю, что это не окончательный ответ, но это мои мысли после просмотра таблицы.

Какой-то аппаратный парень
источник
2
«Шесть циклов» - это шесть циклов периферийных часов; если установить, например, модуль часов реального времени на 1024 Гц (что, по-видимому, является рекомендацией Atmel), а тактовая частота процессора равна 48 МГц, шесть тактов периферийных тактовых импульсов составят 281 250 тактов тактовой частоты ЦП, что очень много время крутиться, особенно если есть какие-то прерывания, которые требуют обслуживания. Спиннинг только умеренно ужасен, если медленные тактовые частоты составляют 8 МГц (что означает вращение с циклом в 36 процессоров), но серьезная ошибка будет лучше, чем вращение на тактовой частоте 1024 Гц.
суперкат