Aaronli 0 6 августа, 2021 Опубликовано 6 августа, 2021 · Жалоба В последнее время я разрабатываю микроконтроллерную систему на базе ATMega2560, поскольку в ней больше периферийных модулей, и в то же время я хочу разрабатывать другие платы в будущем, я могу немного изменить последний код, чтобы применить его к новой плате. После проверки большого количества информации, я обнаружил, что APM использует такую идею: слой аппаратной абстракции; есть также система Android также использует концепцию слоя аппаратной абстракции, такой дизайн может значительно улучшить совместимость. Однако, изучив исходный код APM, я обнаружил, что не могу найти никакой информации о доступе к оборудованию, возможно ли, что C++ не может получить доступ к оборудованию напрямую? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 6 августа, 2021 Опубликовано 6 августа, 2021 · Жалоба 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: и в то же время я хочу разрабатывать другие платы в будущем, я могу немного изменить последний код, чтобы применить его к новой плате Почитайте эти статьи, особенно про Си++. Многие вопросы со временем отпадут. Но ещё больше появится. Вам, в первую очередь, необходимо уверенное владение Си++ и методами ООП, чтобы всё реализовать. Просто так, автоматом, Вы ничего не получите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 6 августа, 2021 Опубликовано 6 августа, 2021 · Жалоба 3 hours ago, haker_fox said: Невозможно. Нет ничего невозможного. Ибо - никогда не говори никогда. Это ИИ создал тему. Не ведитесь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 6 августа, 2021 Опубликовано 6 августа, 2021 (изменено) · Жалоба 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 Как видите, синтаксис языка позволяет работать с регистрами периферии, находящимися в едином адресном пространстве, напрямую. Изменено 7 августа, 2021 пользователем Darth Vader Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 26 7 августа, 2021 Опубликовано 7 августа, 2021 · Жалоба 15 hours ago, Darth Vader said: Доступ к оборудованию осуществляется путем чтения/записи беззнаковых целых чисел по определенным адресам памяти (которые, в свою очередь, также являются беззнаковыми целыми числами) внутри единого линейного адресного пространства 4 ГБайт. Язык позволяет записать число по известному адресу. И прочитать оттуда же. Пусть по адресу 0x400А8000 размещается (отображается) 32-битный регистр какого-то периферийного устройства. Тогда: Как видите, синтаксис языка позволяет работать с регистрами периферии, находящимися в едином адресном пространстве, напрямую. Только бывает что для сброса бит в периферии надо писать в один регистр, для установки в другой, а статус смотреть в третьем... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 7 августа, 2021 Опубликовано 7 августа, 2021 · Жалоба 4 часа назад, _4afc_ сказал: бывает что для сброса бит в периферии надо писать в один регистр, для установки в другой, а статус смотреть в третьем Это нормальная ситуация. Обычная. В любом случае, ВСЯ работа с периферией сводится к операциям чтения и записи по заранее известным адресам (адресам регистров) в едином адресном пространстве. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Herz 6 8 августа, 2021 Опубликовано 8 августа, 2021 · Жалоба 06.08.2021 в 09:46, x893 сказал: Это ИИ создал тему. Не ведитесь. Кстати, да. Очень похоже. Посмотрим, что с этим делать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться