GCC, ARM и побайтовая загрузка/сохранение

Есть ли способ (например, встроенная функция) создать хранилище байтов (strb), используя C/C++ с gcc?

Для следующей инструкции gcc обязательно использует 32-битное хранилище (str) в регистре.

USART1->TDR = 0x01;

Это правильно, потому что старшие биты регистра не используются и им присваивается значение 0 (значение сброса, как указано в ARM Ref-Manual, правильное).

Можно ли использовать (встроенную) функцию gcc для запуска хранилища байтов (strb) в ARM-Assembler?

Разыгрывание volatile uint8_t *?

Nate Eldredge 18.08.2023 08:26

Какова цель?

Codo 18.08.2023 12:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы разыменуете указатель uint8_t, будет сгенерирована инструкция strb.

uint8_t* ptr = ...;
*ptr = 42;

Смотрите также: https://godbolt.org/z/n8v1vcafz

Вы не должны делать это для регистров STM32, поскольку к ним необходимо обращаться с помощью словесных (32-битных) операций. В противном случае поведение не определено.

Откуда вы взяли информацию, что доступ к 32-битным регистрам STM с помощью strb приводит к UB? UB — это термин C/C++. Я думаю, вы имеете в виду, что это не указано на стороне HW. Можете ли вы дать мне ссылку, что это не разрешено STM32 или другим микроконтроллерам?

wimalopaan 18.08.2023 09:55

32-битный доступ является общим правилом. Вот почему все отображаемые в память регистры STM32 определяются как volatile uint32_t*. Если разрешен полусловный или даже байтовый доступ, это обычно упоминается в начале главы о регистре XXX в справочном руководстве микроконтроллера. Найдите «доступ». Помните: отображаемые в память регистры не реализуются как память. Вместо этого периферийное устройство слушает внутреннюю шину и действует, если появляется соответствующий адрес.

Codo 18.08.2023 12:01

Вот ссылка на основные концепции ввода-вывода с отображением памяти: developer.arm.com/documentation/102618/0100/Basic-concepts.

Codo 18.08.2023 12:11

Хорошо, спасибо за подсказку к документу! Например. для STM32G431 DR SPI/I2S может быть доступен побайтно, тогда как DR I2C и USART не могут. Может баг документа? Только что проверил для любопытства с помощью USART TDR, и он работает ...

wimalopaan 18.08.2023 13:06

Другие вопросы по теме