Это зависит от архитектуры вашего конкретного встроенного устройства.Я приведу три примера, которые охватывают общие случаи.Основная суть этого, однако, заключается в том, что в основном ядро ЦП не может работать непосредственно с регистрами устройств ввода / вывода, кроме как для чтения и записи их в байтовом или даже пословом виде.
1) Серия 68HC08, 8-разрядный автономный микроконтроллер.
Сюда входит команда «установка битов» и «очистка битов».Они, если вы внимательно прочитаете руководство, на самом деле сами выполняют цикл чтения-изменения-записи.У них есть преимущество в том, что они являются атомарными операциями, поскольку как отдельные инструкции они не могут быть прерваны.
Вы также заметите, что они занимают больше времени, чем отдельные инструкции чтения или записи, но меньше времени, чем использование трех инструкций для задания.(см. ниже).
2) ARM или PowerPC, обычные 32-разрядные RISC-процессоры (также часто встречающиеся в высокопроизводительных микроконтроллерах).
Они не включают любой инструкции, которые могут одновременно обращаться к памяти и выполнять вычисления (и / или).Если вы напишите на C:
*register |= 0x40;
, он превратится в следующую сборку (для этого примера PowerPC r8 содержит адрес регистра):
LBZ r4,r8
ORI r4,r4,#0x40
STB r4,r8
, потому чтоэто несколько инструкций, это не атомарный, и он может быть прерван.Сделать его атомарным или даже SMP-безопасным выходит за рамки этого ответа - для него есть специальные инструкции и методики.
3) IA32 (x86) и AMD64.Почему вы используете их для «встроенных», мне не понятно, но они на полпути между двумя другими примерами.
Я забываю, есть ли в памяти битовый набор с одной инструкцией и битясно на x86.Если нет, то смотрите раздел RISC выше, он просто принимает только две инструкции вместо трех, потому что x86 может загружать и изменять в одной инструкции.
Предполагая, что такие инструкции есть, они также нужнывнутренне загрузить и сохранить регистр, а также изменить его.Современные версии явно разбивают инструкцию на три RISC-подобные операции внутри.
Странность заключается в том, что x86 (в отличие от HC08) может прерываться на шине памяти в середине транзакции мастером шины, а не толькообычным прерыванием процессора.Таким образом, вы можете вручную добавить префикс LOCK в инструкцию, для выполнения которой необходимо выполнить несколько циклов памяти, как в этом случае.Вы не получите это из простой C, хотя.