Перейти к содержанию
    

Доступ к аппаратным ресурсам с помощью объектно-ориентированного подхода на C++

В последнее время я разрабатываю микроконтроллерную систему на базе ATMega2560, поскольку в ней больше периферийных модулей, и в то же время я хочу разрабатывать другие платы в будущем, я могу немного изменить последний код, чтобы применить его к новой плате.
После проверки большого количества информации, я обнаружил, что APM использует такую идею: слой аппаратной абстракции; есть также система Android также использует концепцию слоя аппаратной абстракции, такой дизайн может значительно улучшить совместимость. Однако, изучив исходный код APM, я обнаружил, что не могу найти никакой информации о доступе к оборудованию, возможно ли, что C++ не может получить доступ к оборудованию напрямую?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, Aaronli said:

что C++ не может получить доступ к оборудованию напрямую?

Невозможно. Пишу драйвера на Си++ для STM32Fxxxx, LPC17xx, LPC43xx и, в своё время, для AVR8.

 

3 minutes ago, Aaronli said:

есть также система Android

А она-то при чём здесь? У вас же ATmega???

4 minutes ago, Aaronli said:

Однако, изучив исходный код APM, я обнаружил, что не могу найти никакой информации о доступе к оборудованию

Тут такой момент. Что до сих пор, даже в 2021 году, немногие пишут драйвера с использованием Си++ и ООП. Это не плохо и не хорошо. Каждый выбирает удобный для него инструментарий. Тем не менее, Си++ успешно живёт в микроконтроллерах с начала 2000-х годов.

5 minutes ago, Aaronli said:

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

Почитайте эти статьи, особенно про Си++. Многие вопросы со временем отпадут. Но ещё больше появится. Вам, в первую очередь, необходимо уверенное владение Си++ и методами ООП, чтобы всё реализовать. Просто так, автоматом, Вы ничего не получите.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, haker_fox said:

Невозможно.

Нет ничего невозможного. Ибо - никогда не говори никогда.

Это ИИ создал тему. Не ведитесь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

06.08.2021 в 06:33, Aaronli сказал:

Однако, изучив исходный код APM, я обнаружил, что не могу найти никакой информации о доступе к оборудованию, возможно ли, что C++ не может получить доступ к оборудованию напрямую?

Доступ к оборудованию осуществляется путем чтения/записи беззнаковых целых чисел по определенным адресам памяти (которые, в свою очередь, также являются беззнаковыми целыми числами) внутри единого линейного адресного пространства 4 ГБайт. Язык позволяет записать число по известному адресу. И прочитать оттуда же. Пусть по адресу 0x400А8000 размещается (отображается) 32-битный регистр какого-то периферийного устройства. Тогда:

#include <stdint.h>
// Создаём имя для доступа к целевому 32-битному регистру по адресу 0x400A8000
#define MY_TERGET_REG	(*((volatile uint32_t*)0x400A8000))
  
MY_TERGET_REG = 0x00000100;		// Запись значения 0x00000100 в 32-битный регистр по адресу 0x400A8000
uint32_t tmp_data = MY_TERGET_REG;	// Чтение в tmp_data 32-битного слова из регистра по адресу 0x400A8000 

Как видите, синтаксис языка позволяет работать с регистрами периферии, находящимися в едином адресном пространстве, напрямую.

Изменено пользователем Darth Vader

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 hours ago, Darth Vader said:

Доступ к оборудованию осуществляется путем чтения/записи беззнаковых целых чисел по определенным адресам памяти (которые, в свою очередь, также являются беззнаковыми целыми числами) внутри единого линейного адресного пространства 4 ГБайт. Язык позволяет записать число по известному адресу. И прочитать оттуда же. Пусть по адресу 0x400А8000 размещается (отображается) 32-битный регистр какого-то периферийного устройства. Тогда:

Как видите, синтаксис языка позволяет работать с регистрами периферии, находящимися в едином адресном пространстве, напрямую.

 

Только бывает что для сброса бит в периферии надо писать в один регистр, для установки в другой, а статус смотреть в третьем...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, _4afc_ сказал:

бывает что для сброса бит в периферии надо писать в один регистр, для установки в другой, а статус смотреть в третьем

Это нормальная ситуация. Обычная.

В любом случае, ВСЯ работа с периферией сводится к операциям чтения и записи по заранее известным адресам (адресам регистров) в едином адресном пространстве.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

06.08.2021 в 09:46, x893 сказал:

Это ИИ создал тему. Не ведитесь.

Кстати, да. Очень похоже. Посмотрим, что с этим делать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...