Сегодняшние компьютерные технологии почти на 20 лет опережают встраиваемые технологии. Сегодняшние встроенные системы эквивалентны передовым компьютерным технологиям 1980-х годов с точки зрения ресурсов, теории и методологии. Горгон Медусер глупый мальчик,Публичный аккаунт: мышление на голом железеЧто встроено (Часть 2)—— «Гравитация» и «Осадки»
Это означает,Применение в начале этого векасуществовать Некоторые технологии на персональных компьютерах также могут постепенно внедряться в глубоко встроенные системы.(Deep Embedded System)——Типичные системы этого типа также известны какМикроконтроллерИли, скорее,Процессор Кортекс-М。
Нет, компания Arm выпустила на Github библиотеку ускорения 2D-графики специально для «всех» процессоров Cortex-M — Arm-2D:
https://github.com/ARM-software/Arm-2D
в соответствии сGithubНа складеREADMEОписание,Мы можем просто понимать эту библиотеку ускорения 2D-графики как стандартный «драйвер видеокарты» специально для Процессор Кортекс-М.。Хотя Вот“Драйвер видеокарты”Просто преувеличение——Кажется, никого нет Процессор Кортекс-М“достойный”Так называемая видеокарта,Но на самом деле это не так уж и далеко – ведь согласно последним тенденциям,С постепенным обогащением ресурсов Микроконтроллера (технологические узлы более высокого уровня постепенно снижают цены),Не только процессоры работают все быстрее и быстрее, но и их память становится все больше и больше.,Более того, большое количество производителей имеют или в настоящее времясуществовать Рассмотрите возможность предоставления Процессор Кортекс-М оснащен специальным механизмом ускорения 2D-графики.——существоватьэтот аспект,STиNXPИди первым——полагатьChrome-Art(позвони еще разDMA2D)С этим уже все знакомы。на самом деле,Некоторыйчип Компаниясуществоватьучитывать(Даже уже)следующему поколениюCortex-MПроцессор оснащен реальным2D-GPU。существовать В этом контексте,Arm-2DЗапуск компании дает четкий сигнал отрасли.:Братья, это не тренировка, наступила эра специализированного ускорения 2D-графики Cortex-M.。
[Каково значение драйвера видеокарты Cortex-M? 】
Arm — «старый» экологический игрок в отрасли — почти все действия будут рассматриваться с экологической точки зрения — поэтому, если вы хотите выяснить, почему Arm в настоящее время настраивает драйвер видеокарты для «Cortex-M», вы должны найти out Понять, что происходит во всей глубоко укоренившейся экосистеме. Для этого представьте:
Вы менеджер по продукту в компании по производству чипов:
Вы являетесь поставщиком программного обеспечения с графическим интерфейсом пользователя:
Подводить итоги:
вдруг однажды,Мы двое, уставшие и болтавшие, вдруг почувствовали, что что-то не так.,Затем все молча повернули головыArm — нейтральная третья сторона в этой экосистеме.……
Поэтому Арм слабо выложил на Github стандарт драйвера видеокарты под названием Arm-2D на глазах у всех и предложил следующее предложение:
«Как насчет… я предоставляю уровень абстракции API?»
«Что что?» Пользователи голого металла воскликнули: «Разве это не B2B? Почему у нас вдруг появились преимущества?»
Давайте сначала отойдём от темы и поговорим об этом позже в статье.
[Оценки 2D-обработки для глубокого внедрения]
Хотя не намерен устанавливать сторонние 2D-тесты.,Arm-2D предназначен для демонстрации возможностей обработки 2D различных процессоров (и разных аппаратных ускорителей) при типичных нагрузках графического интерфейса.,Хонкари“Если вы не можете найти настоящую вещь, вам придется стиснуть зубы и получить ее самостоятельно.”отношение,предоставляет ссылку2DОценки производительности——Официальное название:Минимальная частота, необходимая для 30 кадров в секунду (МГц)。
Фактический принцип таков:
Стоит пояснить, что:
Если вас действительно волнует реальный FPS системы при определенном методе подключения LD, просто измерьте дополнительное время (например, миллисекунды), потраченное на «обновление видеопамяти», а затем прибавьте его к количеству миллисекунд, необходимых для рендеринга кадра. Например, в рендеринге, показанном на GIF-изображении выше, задержка ЖК-дисплея (то есть время, необходимое для «обновления видеопамяти») составляет 43 мс, а среднее время, необходимое для рендеринга кадра, составляет 4 мс (229 кадров в секунду). , фактическое время, необходимое для кадра, составляет 4 мс. Затраченное время составляет 43 + 4 = 47 мс (для простоты оно рассчитывается непосредственно как 50 мс). На данный момент мы можем считать, что конечная частота кадров составляет примерно 20 кадров в секунду (1/). 50 мс).
Таблица выше,Перечислил всехЧасто используемые типы Процессор Кортекс-Мсуществоватьполагаться исключительно на“справиться с этимсам”не прибегая к“специализированный2Dграфический ускоритель”случай,Ориентировано на разрешение 320*240 (RGB565), минимальную частоту, необходимую для достижения частоты обновления 30 кадров в секунду.,например:
Raspberry Pi Pico экстази с двухъядерным процессором Cortex-M0+, работающим на частоте 250 МГц
более интуитивный,Вот официальный2DСравнение коэффициентов производительности(кCortex-M4производительность как эталон)。Cortex-M55 Helium на самом деле почти в 6 раз превосходит Cortex-M4 и в 10 раз превосходит Cortex-M0!——Если Arm-2D — драйвер видеокарты, то Cortex-M55 Helium — это процессор, поставляемый со «встроенной видеокартой». Кортекс-МПонятно。
существоватьразвертыватьспособ,После обширных отзывов и тестирования сообщества,наконец прибыл Понятно“Щелкните мышкой несколько раз”может легкоразвертыватьэпоха——какиспользоватьCMSIS-Packсуществоватьтри минуты Внутри Воля Arm-2D Развертывание на месте — это основное содержание, о котором пойдет речь в этой статье.。
【Подготовка】
void Disp0_DrawBitmap (uint32_t x,
uint32_t y,
uint32_t width,
uint32_t height,
const uint8_t *bitmap)
Здесь связь между 5 параметрами показана на рисунке ниже:
Проще говоря, эта функция предназначена для bitmap «Область непрерывного хранения», на которую указывает указатель Информация о пикселях, сохраненная вLCDизодин Укажите прямоугольную область Внутри,Эта прямоугольная область содержит информацию о местоположении.(x,y)и Информация об объеме(width,height)совместно определенные。
многоLCDВсе поддерживают программу под названием“Операционное окно”концепция,Окно здесь на самом деле представляет собой прямоугольную область на рисунке выше — как только вы установите окно с помощью команды,Впоследствии непрерывно записываемые пиксели будут автоматически последовательно заполняться в указанной прямоугольной области (без необходимости пользователя учитывать, когда их следует переносить).
Кроме того, если вам посчастливилось использовать чип с контроллером ЖК-дисплея — буфер дисплея ЖК-дисплея отображается непосредственно в адресное пространство 4 ГБ чипа Cortex-M, тогда мы можем использовать простые операции чтения и записи из памяти для реализации вышеописанного. Функции для платы разработки STM32F746G-Discovery в качестве примера:
//! STM32F746G-Discovery
#define GLCD_WIDTH 480
#define GLCD_HEIGHT 272
#define LCD_DB_ADDR 0xC0000000
#define LCD_DB_PTR ((volatile uint16_t *)LCD_DB_ADDR)
void Disp0_DrawBitmap (uint32_t x,
uint32_t y,
uint32_t width,
uint32_t height,
const uint8_t *bitmap)
{
volatile uint16_t *phwDes = LCD_DB_PTR + y * GLCD_WIDTH + x;
const uint16_t *phwSrc = (const uint16_t *)bitmap;
for (int_fast16_t i = 0; i < height; i++) {
memcpy ((uint16_t *)phwDes, phwSrc, width * 2);
phwSrc += width;
phwDes += GLCD_WIDTH;
}
}
[Как получить установочный пакет]
существовать MDK средний отдел Arm-2DПервым шагом является получение соответствующего cmsis-pack,для Можетк Плавный доступ Github Друзья могут напрямую найти последние новости по следующему URL-адресу. .pack Файл - это самый прямой путь:
https://github.com/ARM-software/Arm-2D/releases
конечно,тытакже МожетксуществоватьPack Installerнайден непосредственно вArm-2D:
Для удобства отечественных пользователей,для Для друзей, у которых нет доступа к Github,Можетксуществоватьсосредоточиться на Официальный аккаунт【мышление на голом железе】Отправить ключевые слова после“arm-2d”Чтобы получить ссылку на сетевой диск。
получать Arm-2D изcmsis-packназад,Вы можете напрямую дважды щелкнуть, чтобы установить:
Если у вас есть MDK более новой версии, например 5.38 или обновить,В общем, безмозглой установки Next достаточно. Напротив,Настоятельно рекомендуется установить последнюю версию MDK, чтобы избежать ряда ненужных неприятностей.——Это также общий совет, обобщенный многими предшественниками в сообществе на протяжении всей истории крови и слез.——если Используйте последнюю версию с самого началаиз MDK Вы можете сэкономить много времени.
[Руководство по развертыванию для чайников]
Arm-2D Развертывание не очень простое, в принципе можно использовать существующие. RTE Проверьте соответствующие параметры, чтобы выполнить большую часть работы. Подробную информацию можно найти в следующем пошаговом руководстве:
Шаг 1. Добавьте компоненты
существовать MDK Выбрать в проекте Project -> Manage -> Run-Time Environment открыть RTE Окно конфигурации:
Фактически, той же цели можно достичь и с помощью кнопок быстрого доступа на панели инструментов:
существовать нашел в окне Acceleration,и разверните его:
Как показано на рисунке, проверьте следующие компоненты:
Чтобы упростить подключение к драйверу ЖК-дисплея, нам необходимо проверить следующие службы:
потому что Display Adapter полагаться Понятно Некоторыйдополнительный(Extra)измодуль,поэтому,Если вы проверили только вышеуказанные разделы,В окне существования вы увидите оранжевое предупреждение:
здесьпредупреждатьиз含义даобъяснять:Display Adapterполагаться Понятномодуль Controls и LCD ASCII Printf,Но вы их не отметили. Просто нажмите кнопку «Разрешить» RTE автоматически проверяет зависимые модули в левом нижнем углу.
Нажмите кнопку «ОК», чтобы завершить добавление компонента.
Чтобы облегчить последующую разработку, настоятельно рекомендуется скачать и установить perf_counter модуль,Пожалуйста, обратитесь к статье для конкретных шагов.《[Модули, которые на слуху] Супервстроенная система инструментов «производительность/время»》,Вот краткое изложение основных шагов:
Шаг 2. Настройте среду компиляции
еслитыиспользоватьArm Compiler 6(armclang),вам нужно открытьC11иРасширения GNUизподдерживать,То есть непосредственносуществовать"Language C"Выбирать“gnu11”:
еслитыиспользоватьиздаArm Compiler 5(armcc),вам нужно открытьC99иРасширения GNUизподдерживать,Как показано ниже:
также,потому чтоArm-2D зависит от CMSIS вы можете настроить RTE MDK для поддержки последней версии CMSIS.
1. Как показано на рисунке ниже, откройте Pack Installer с помощью кнопки в правой части панели инструментов.
Мы увидим примерно такое окно:
Во вкладке Packs в правой половине существования,Найдите ARM::CMSIS,Убедитесь, что написано «Обновлено».,еслибезиметь Сразущелкнутьпереписыватьсяизкнопка Сделать обновление。Версия CMSIS, от которой зависит Arm-2D, не должна быть ниже 5.7.0 (если вы хотите использовать Cortex-M55, версия не должна быть ниже 5.8.0)。
2. Откройте RTEОкно конфигурации через кнопку посередине панели инструментов, как показано ниже:
существоватьSoftware Componentв списке,РасширятьCMSIS,и проверьначальствоCOREиDSP。здесьнужно вниманиеизда,DSPчастьеслииметьSourceиз Параметры Пожалуйста, выберитеSourceПараметры——Это позволит нам напрямуюиспользоватьисходный кодиз Приходите в формекомпилироватьCMSIS-DSPиз Библиотека。
также,еслитынеопределенныйRTEНакадокороиспользоватьизCMSISда否为最新из Версияизразговаривать,МожеткщелкнутьSelect Packsкнопка:
см. начало формы “Use latest Software Packs for Target” проверено,В принципе, можно сесть и расслабиться. После нажатия кнопки ОК, чтобы закрыть диалоговое окно,我们Сразу成功из ВоляCMSISприсоединиться к Понятнокомпилироватьсередина。здесь,потому чтомы выбираем Понятноиспользоватьисходный кодизспособкомпилироватьCMSIS,поэтому Также может потребоватьсяCMSIS-DSPизисходный кодруководитьдополнительныйизнастраивать。
На этом этапе мы сможем успешно завершить компиляцию.
Шаг 3: Настройка модуля
существуют Развернуть в Менеджере проектов Acceleration,и Найдено новое, чтобы присоединитьсяизфайл адаптера драйвера дисплея(arm_2d_disp_adapter_0.h)
После двойного щелчка мыши, чтобы открыть его, выберите Мастер настройки в левом нижнем углу редактора существования.
Войдите в графический интерфейс настройки:
Заполните правильную информацию в зависимости от вашего экрана:
После сохранения закройте окно.
существоватьAccelerationсерединаоказаться arm_2d_cfg.h,
Откройте и его Configuration Wizard Графический интерфейс настройки:
потому что Мы использовали это Extraв Некоторыймодуль,например Contols и LCD ASCII Printf,поэтому需要提供переписыватьсяизинформация:например Экраниз Количество цветовых битов, резолюций printf буфер строки печатиизразмер(Значение по умолчанию:64индивидуальныйASCIIхарактер)。
для Arm-2D General Configuration Здесь необходимо объяснить некоторые варианты:
Patches for improving performance Есть несколько вариантов в обмен на повышение производительности путем взлома некоторых функций или функций, которые нельзя использовать. Рекомендуемый подход:
Шаг 4. Добавьте код
существовать main() Файл исходного кода функции существует, содержит файлы заголовков:
#include "arm_2d.h"
исуществовать main()функциясередина Завершить пару arm-2d Инициализация:
int main(void)
{
system_init(); // включать LCD Инициализация системы в пределах существующего
...
arm_irq_safe {
arm_2d_init(); // инициализация arm-2d
}
...
while(1) {
...
}
}
Вышеупомянутое завершает пару arm-2d Инициализация модуля.
Если вы используете Display Adapter Чтобы облегчить перенос, вам также необходимо включить следующие файлы заголовков:
#include "arm_2d_disp_adapters.h"
исуществовать main() Добавьте код в функцию:
int main(void)
{
system_init(); // включать LCD Инициализация системы в пределах существующего
...
arm_irq_safe {
arm_2d_init(); // инициализация arm-2d
}
// инициализация Display Adapter 0
disp_adapter0_init();
while (true) {
...
// осуществлять Display Adapter обновить задачу
disp_adapter0_task();
...
}
}
Скомпилируйте и скачайте,если все пойдет хорошо,На экране вы должны увидеть что-то похожее на следующее:
В середине экрана находится постоянно вращающийся «круг загрузки», а внизу экрана информация о текущей частоте кадров — здесь число после FPS представляет частоту кадров «отрисовки» (число после двоеточия — время, соответствующее частоте кадров) Этот отдельный метод отображения полностью подготовлен для того, чтобы облегчить нам поиск узких мест в производительности.
На данный момент мы завершили всю Arm-2Dизразвертывать。
【Как начать играть? 】
Полагаю, что многие друзья рады такому существованию, но и сбиты с толку:
Как мне играть?
Как здесь распечатать текст?
Как нарисовать закругленный прямоугольник?
Как нарисовать малый круг смерти?
Что мне делать со своим собственным интерфейсом?
Здесь слишком много дизайнерского контента,Вполне стоит посвятить этому еще одну статью. Но существуют то, что раньше,Пожалуйста, позвольте мне поделиться некоторыми идеями и советами для умных друзей:
static
IMPL_PFB_ON_DRAW(__pfb_draw_handler)
{
ARM_2D_UNUSED(pTarget);
ARM_2D_UNUSED(ptTile);
ARM_2D_UNUSED(bIsNewFrame);
arm_2d_canvas(ptTile, __top_container) {
arm_2d_fill_colour(ptTile, NULL, GLCD_COLOR_WHITE);
arm_2d_align_centre(__top_container, 100, 100) {
draw_round_corner_box( ptTile,
&__centre_region,
GLCD_COLOR_BLACK,
64,
bIsNewFrame);
}
busy_wheel2_show(ptTile, bIsNewFrame);
}
arm_2d_op_wait_async(NULL);
return arm_fsm_rt_cpl;
}
__WEAK
IMPL_PFB_ON_LOW_LV_RENDERING(__glcd0_pfb_render_handler)
{
const arm_2d_tile_t *ptTile = &(ptPFB->tTile);
ARM_2D_UNUSED(pTarget);
ARM_2D_UNUSED(bIsNewFrame);
Disp0_DrawBitmap(ptTile->tRegion.tLocation.iX,
ptTile->tRegion.tLocation.iY,
ptTile->tRegion.tSize.iWidth,
ptTile->tRegion.tSize.iHeight,
(const uint8_t *)ptTile->pchBuffer);
arm_2d_helper_pfb_report_rendering_complete(
&DISP0_ADAPTER.use_as__arm_2d_helper_pfb_t,
(arm_2d_pfb_t *)ptPFB);
}
Если присмотреться, то легко обнаружить, что эта функция на самом деле вызывается одна за другой. Disp0_DrawBitmap() и arm_2d_helper_pfb_report_rendering_complete() функция.
【ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ】
Если вы устанавливаете существование cmsis-pack Сделав это, вы столкнетесь со следующими проблемами:
Не паникуйте,в целомУстановите последнюю версию MDK и не изменяйте каталог установки по умолчанию.Сразу Можеткрешать。Боюсь неприятностейиз小伙伴Можетксуществоватьсосредоточиться на【мышление на голом железе], а затем отправьте ключевое слово «MDK», чтобы получить последнюю ссылку на сетевой диск MDK.
Стоит подчеркнуть, что MDK предоставляет версию Community для сообщества открытого исходного кода, которая практически не имеет ограничений (нет ограничений по чипам, размеру кода или отладке), за исключением того, что ее нельзя использовать в коммерческих целях. Версия сообщества по сути является лицензией, и используемые установочные файлы ничем не отличаются от других версий. Друзья, которым интересна эта «официальная версия белой проституции», могут получить ее по ссылке ниже:
https://www.keil.arm.com/mdk-community/
еслитыиз Очень не повезло,Даже установка последней версии MDK не может решить вышеуказанную проблему.,还МожеткпроходитьPack-Installerиз Функция импорта является наиболееназад“Попробуйте”——Открыть Pack Installer затем нажмите File->Import:
Во всплывающем окне выберите «Загрузить получение». cmsis-pack установить.
Если это по-прежнему не работает, пожалуйста, подтвердите свой MDK Стоит ли устанавливатьсуществоватьпо умолчаниюиз В каталоге установки(C:\Keil_v5),если не,Попробуйте переустановить в каталог по умолчанию.
Если не работает... если не работает, просто смените компьютер.
Вопрос 4: Время компиляции сообщает о повторяющихся определениях определенных системных функций, таких как __set_PRIMASK и т. д.
Это потому что чтопроектсередина Принесите свой собственныйизcmsisВерсия слишком низкая,ииRTEМесторазвертыватьизcmsisконфликтпривести киз。Пожалуйста, обратитесь к статье для конкретных решений.《Руководство для игроков CMSIS по «Достижениям преступного мира»》。
Вопрос 3: Ошибки, связанные с ARM_PRIVATE(), обнаруженные во время компиляции
Такие вопросы, потому что чтоваш MDK Проект сохранения существования является независимым CMSIS и CMSIS и Добавлено в RTE CMSIS житьсуществоватьконфликт(проектв CMSIS Версия слишком старая),Пожалуйста, обратитесь к статье для конкретных решений.《Руководство для игроков CMSIS по «Достижениям преступного мира»》,Я не буду здесь вдаваться в подробности.
Также проверьте, включена ли у вас Расширения GNUипереписыватьсяизCстандартный(Arm Compiler 5, чтобы открыть C99,Arm Compiler 6, чтобы открыть gnu99)
Вопрос 4: Подскажите, что __aeabi_assert не найден
Это потому что что Мы существуем выбрано в проекте microLib,и microLib не для assert.h Предоставляется базовой реализацией. Просто добавьте следующий код:
#include "arm_2d.h"
#include "cmsis_compiler.h"
#if defined(__MICROLIB)
void __aeabi_assert(const char *chCond, const char *chLine, int wErrCode)
{
ARM_2D_UNUSED(chCond);
ARM_2D_UNUSED(chLine);
ARM_2D_UNUSED(wErrCode);
while(1) {
__NOP();
}
}
#endif
Вопрос 4: Подскажите, что Disp0_DrawBitmap не найден
когда ты выбираешь Display Adapter При обслуживании пользователи должны предоставить LCD Функция обновления данных Требуется, если у вас имеется несколько экранов. RTE Ливэй Display Adapter Выберите соответствующее количество:
На этом этапе мы можем существовать Acceleration См. добавленные файлы кода:
Обратите внимание, что здесь после каждого файла указан соответствующий номер, относящийся к соответствующему номеру. Display Adapter шаблон. И каждый Display Adapter Всем им нужна собственная базовая функция обновления: Dispn_DrawBitmap(). Подробности см. в главе [Подготовка] этой статьи.
Вопрос 5: Возникает аппаратный сбой
Проверьте размер стека, рекомендуемое существование 0xC00 (3K) и выше — легко.
[Произнесите слова, стоящие за существованием]
Эта статья кажется такой длинной,На самом деле это потому, что он содержит множество объяснений для «разрешения сомнений» и множество подробностей о том, как избежать ловушек для пользователей. После того, как вы успешно выполнили руководство,,Увидимся в следующий разразвертывать时Сразу Может谓轻车熟路Понятно——Если возможно, попробуйте использовать последнюю версию MDK. Это рекомендация многих пожилых людей в сообществе. Это поможет вам избежать 90% ошибок и избежать большого количества ненужной траты времени.。
новая версия cmsis-pack Помимо упрощения пользовательского развертывания, он также представляет простой и удобный инструмент разработки для пользователей «голого железа». GUI приложениеиз Служить:игрок сцены(scene player)——Это позволяет нам разделить интерфейс на несколько сцен.:
Хотя arm_2d_disp_adapter_0.c Нам уже продемонстрировали Понятноигрок сценыизиспользовать,Но чтобы снизить порог обучения каждого,В следующей статье я подробно познакомлю вас с этим недорогим методом проектирования графического интерфейса, основанным на сценариях.。