Вот объясните мне, либо я туплю, либо стм-ы, либо кто-то еще.
Дано: RM0091, стр. 741, описание регистра USARTx_ICR. Из описания явствует, что регистр работает только на запись. Запись единицы в конкретное битовое поле приводит к тому, что сбрасывается соответствующий бит в регистре статуса USARTx_ISR. Пишем в один регистр, биты сбрасываются в другом. Запись нуля ничего не меняет и ни к каким результатам не приводит. До этого момента все просто, понятно и логично. Непонятки начинаются с приложения А.19 (стр. 984), где приводятся примеры реализации некоторых режимов работы USART. Так вот в этих чудных примерах при манипуляциях с регистром USARTx_ICR везде используются конструкции вида:
Код:
USART1->ICR |= USART_ICR_TCCF; /* Clear transfer complete flag */
В этой строчке сначала происходит считывание регистра, потом операция логического "ИЛИ" с его значением, а затем запись результата обратно в регистр. Внимание, как говорится, вопрос: нахрена читать USART1->ICR, если известно, что он работает только на запись? Причем, эти обезьяны делают так везде: и в мануле и в кодснайпетах и пр. примерах. Это, типа, такой животный рефлекс у них выработался, что раз битовая запись, то обязательно через дизъюнкцию ? По другому никак? Зла не хватает.
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
Это, типа, такой животный рефлекс у них выработался, что раз битовая запись, то обязательно через дизъюнкцию ? По другому никак? Зла не хватает.
Допускаю, что в каком-то чипе, ну может же быть такое, эти биты RW. Переписывать либы под каждый чип? Не индусский подход. Хотя, скорее всего, именно животный рефлекс. Пишите сами и с головой будет полный порядок.
Допускаю, что в каком-то чипе, ну может же быть такое, эти биты RW. Переписывать либы под каждый чип? Не индусский подход.
Какие либы, если разговор идет про RM ? Допущения, конечно, хорошо, но RM0091 накрывает большую часть линейки F0 и апеллировать к "какому-то чипу" здесь немного странно. Это уж не говоря про то, что название "Interrupt flag clear register" как-то не очень предполагает интересного содержимого.
Цитата:
Пишите сами и с головой будет полный порядок.
Чувствую, сегодняшний день будет обилен на сверх-ценные советы.
Настроение, наверное, такое. Кстати, тут попутно заинтересовался, а если ли возможность в языке Си определить write-only конструкцию? Армы наворотили вот таких макросов, только непонятно, с какой целью:
Код писали армы (Copyright (c) 2009-2018 Arm Limited. All rights reserved), т.ч. это компилятор тут скорее ни при чем, а армы очень даже причем. Тужились изобразить то, чего не существует в природе.
нет. армы перестраховались от того, что компилятор порежет какую-то инициализацию/работу с областью памяти и использовали стандартный подход. Спойлер"А зачем вообще тогда нужно ключевое слово volatile? Джеймс Канзе пишет, что задумывался volatile для работы с memory mapped IO (MMIO). Интересно он пишет, переведу кусок подробно
На уровне железа многие процессоры просто резервируют блок адресов памяти для портов ввода-вывода. Большинство процессоров имеют отдельное пространство адресов ввода-вывода, со специальными инструкциями для доступа туда, но это не универсально (на PDP-11 такого не было, например) и даже сейчас, производители железа могут предпочесть использовать для этого адресное пространство памяти, по разным причинам. Я сомневаюсь, что кто-то так делает на архитектуре 8086 - различные адресные ограничения делают это очень сложным. Я видел это на 8080, это очень частое решение на старой TI 9900. И это был единственный способ организовать ввод-вывод на наборе инструкций PDP-11, там просто не было отдельного адресного пространства ввода-вывода (Я думаю, то же самое верно и для VAX. И не забывайте, что большинство работы на С раньше проходило именно на этих двух процессорах). Теперь рассмотрим один из первых последовательных портов, что я использовал: Intel 8051. Нормальным способом его инициализации было записать 0 три раза в порт управления. Если у вас MMIO, то код на С мог бы выглядеть примерно так:
Что прекрасно работало на всех компиляторах С. Но вы можете себе представить, что могла бы с этим сделать сама простая оптимизация. По этой причине и нужно было ключевое слово volatile, чтобы сказать компилятору не оптимизировать." http://alenacpp.blogspot.com/2006/04/volatile.html но погуглить это не наши методы.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения