Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: вопрос о макросе #define __O volatile
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Cree
Здравствуйте! Практически ничего не знаю о контроллерах. Только начал читать первую книгу в жизни по этой теме.
Нашел не очень понятный момент. В core_cm3.h есть такой код.
Код
/* IO definitions (access restrictions to peripheral registers) */
#ifdef __cplusplus
  #define   __I     volatile             /*!< defines 'read only' permissions                 */
#else
  #define   __I     volatile const       /*!< defines 'read only' permissions                 */
#endif
#define     __O     volatile             /*!< defines 'write only' permissions                */
#define     __IO    volatile             /*!< defines 'read / write' permissions              */

/*@} end of group CMSIS_core_definitions */

Вот я не могу понять, что значит write only? Кто мне запретит читать оттуда? В случае volatile const все ясно - получится только читать, а писать нет. Будет здорово если поможете мне понять что значит write only permissions в данном контексте.
Сергей Борщ
Никто не запретит читать. Тут комментарий не совсем отражает код. Они имели ввиду, что этот макрос (за неимением ничего лучшего) будут использовать для описания write only регистров. В языке нет средств для объявления write only переменных.

Добавил: Отдельный макрос сделан для облегчения жизни программисту - чтобы он видел этот намек на write-only, когда объявление регистра будет появляться во всплывающих подсказках редактора.
Genadi Zawidowski
В даташите на STM32-й какой-то про write only было написано, что читается reset state value - оно написано для каждого регистра. т.е., можно не читать - толку никакого. А где-то чтение откуда нельзя может привести (например) к стиранию флэша... Или ещё чего.
SSerge
Такие файлы надо начинать читать с конца wink.gif
Вот определена там функция
static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
ну и замечательно, используем её для разрешения прерываний.
Захотелось самостоятельно поработать с регистрами - смотрим выше по тексту определение NVIC и структуру NVIC_Type.

Все это дефайны типа __IO играют вспомогательную роль, нужны только для описания других - более полезных вещей, пока на них можно не обращать внимания.
WitFed
Если бы это были встроенные слова компилятора, то он мог бы проверить на запись одноимённую переменную и поругаться.
Но т.к. всё сделано через "#define", это чисто информация юзеру о правилах приличия в поведении с данным адресом.
Ну мож сэкономили они на интерфейсе чтения из конкретного регистра -- ты ж сам писал в него когда-то, запомни это значение в памяти и читай его при необходимости, а им окажется 3 цента выигрыш ! wink.gif
Может не только дефолтное значение читаться (для квалификатора __O его придумывать бессмысленно), а 0, -1, мусор, прошлое читаемое из этого региона, ну или самая жесть -- зависание.
Хотя обычно в последнее время чтение из недопустимых адресов возвращает 0, а запись туда игнорируется.
Cree
Большое спасибо всем ответившим! Я просто немного обезкуражился этим write only. Теперь все ясно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.