Jump to content

    

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

Recommended Posts

Aaronli

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

Share this post


Link to post
Share on other sites

haker_fox
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:

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

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

Share this post


Link to post
Share on other sites

x893
3 hours ago, haker_fox said:

Невозможно.

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

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

Share this post


Link to post
Share on other sites

Darth Vader
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 

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

Edited by Darth Vader

Share this post


Link to post
Share on other sites

_4afc_
15 hours ago, Darth Vader said:

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

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

 

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.