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