2012-03-13 4 views
3

Я работаю с регистрами ARM Cortex M3. В документации некоторые из бит могут быть «зарезервированы». Мне непонятно, как я должен обрабатывать эти зарезервированные биты при записи в регистры.Работа с зарезервированными битами регистра чипа ARM

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

+0

Какой чип вы используете точно? Cortex-M3 - это только ядро, потому что вы (возможно) спрашиваете об этом из-за периферийных регистров. – DipSwitch

+0

@DipSwitch: Ну, например, я говорю о регистрах GPIO. – Randomblue

+0

Регистры GPIO NXP, Freescale, Atmel? STM или, возможно, LPC? – jeb

ответ

5

Это классическая проблема в мире, касающаяся того, что делать с зарезервированными битами! Во-первых, вы должны NOT произвольно писать в него, чтобы ваш код не был переносимым. Что происходит, когда архитектура назначает новое значение зарезервированным битам в будущем? Ваш код сломается. Таким образом, лучшая мантра при работе с регистрами с зарезервированными битами - Read-Modify-Write. т.е. прочитать содержимое регистра, изменить только биты, которые вы хотите, а затем записать значение, чтобы зарезервированные биты были нетронутыми (нетронутыми, это не значит, что мы не записываем в них, но в том смысле, что мы написали то, что было там до)

Например, есть регистр, в котором только LSBit имеет значение, а все остальные зарезервированы. Я хотел бы сделать это

ldr r0,=memoryAddress 
ldr r1,[r0] 
orr r1,r1,#1 
str r1,[r0] 
+0

Это не атомный. Другой процесс (или прерывание, вызванное аппаратным обеспечением, использующим эти зарезервированные биты), может изменить зарезервированный бит в этом регистре между вашим загрузкой и хранилищем, и вы перезапишите это изменение, так называемую проблему «потерянного обновления». Таким образом, вы должны либо делать это в атомном контексте (приостановка ОС и прерывания отключены), либо вы используете инструкцию атомного сравнения и свопа. Или вы получаете проблемы с одновременным доступом к датчикам температуры ПК из BIOS и ОС. –

+1

@ Z.T. Вы правы насчет атомарности здесь. Я поместил этот код только для иллюстрации концепции «read-modify-write». Не стесняйтесь редактировать его! –

+1

@ Z.T .: Некоторые разработчики аппаратного обеспечения не знают, какое программное обеспечение может или не может сделать? Я видел, что некоторые части с регистрами включают в себя как флажки «write 1 to clear», так и несколько состояний. Если в регистр включены только настройки состояния, можно использовать функцию битового диапазона для обновления одного состояния, не затрагивая других. Если бы он включал только флаги, можно было бы написать «1» флажкам, которые нужно было очистить, и «0» ко всему остальному. Но вместе с двумя, нет чистого способа обновления. – supercat

0

Зарезервировано в большинстве случаев означает, что они не используются в этом чипе, но они могут использоваться на специальных устройствах (в другой линейке продуктов). (Большинство производителей чипов производят один периферийный драйвер, и они используют его для всех чипов. Таким образом, в основном это копирование прошлой работы, а для ошибок меньше). В большинстве случаев неважно, записываете ли вы зарезервированные биты в периферийных регистрах , это потому, что к нему нет никакой логики.

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

2

Если в документации нет другой информации, напишите нуль. Вы не можете избежать записи нескольких зарезервированных битов в 32-битном регистре.

+1

Мы не можем написать 0 из своего выбора, даже если в документации ничего не говорится. Пожалуйста, см. Мой ответ. –

2

чтение-модификация-запись должна работать большую часть времени, однако бывают случаи, когда зарезервированные биты не определены на прочитан, но должны быть написаны с определенным значением. См. this post из группы LPC2000 (весь поток тоже интересен). Поэтому всегда внимательно проверяйте документы, а также любые исправления, которые доступны. Если у вас возникли сомнения или документы неясны, не стесняйтесь писать производителю.

1

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

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

Суть в том, что нет никакой гарантии, предположим, что вся документация и примеры программ имеют ошибки, и вы должны взломать свой путь, чтобы выяснить, что правильно и что не так.Независимо от того, какой путь вы принимаете (чтение-изменение-запись, запись нулей и т. Д.), Вы будете время от времени ошибаться и должны повторно выполнить код в соответствии с аппаратным изменением. Я настоятельно рекомендую, чтобы, если у продавца есть идентификатор чипа, то ваше программное обеспечение считывает этот идентификатор, и если это идентификатор, с которым вы не протестировали ваш код, объявите о сбое, а не пропустите эту часть. При тестировании продукции задолго до того, как клиент увидит продукт, будет обнаружено изменение детали, и программное обеспечение будет задействовано в понимании причины смены детали, разрешение, являющееся альтернативной частью, несовместимо и отклонено или программное обеспечение изменяется и т. Д.

Смежные вопросы