3. Техника высоких напряжений. Под ред. М.В. Костенко. Учебное пособие для вузов. М., »Высшая школа», 1973.
4. Щеглов Н.В. Современные виды изоляции. Ч. 1. Элегазовая изоляция : учеб. пособие / Н.В. Щеглов Новосибирск : Изд-во НГТУ, 2009. 64 с.
5. Щеглов Н.В., Современные виды изоляции. Ч. 3. Вакуумная изоляция : учеб. пособие / Н.В. Щеглов Новосибирск : Изд-во НГТУ, 2011 94 с.
6. Щеглов Н.В. Современные виды изоляции. Ч. 6 : учеб. пособие / Н. В. Щеглов ; Новосиб. гос. техн. ун-т. - Новосибирск : Изд-во НГТУ, 2013. 68 с.
ГРАФИЧЕСКИЙ ИНТЕРФЕЙС ПОЛЬЗОВАТЕЛЯ ВО ВСТРАИВАЕМЫХ LINUX СИСТЕМАХ Петров А.А.1, Еремеев В.А.2
'Петров Алексей Александрович — бакалавр, кафедра систем автоматического контроля и управления; 2Еремеев Владимир Александрович — студент,
кафедра системной среды качества, Национальный исследовательский университет Московский институт электронной техники, г. Зеленоград
Аннотация: разработчики встраиваемых систем крайне редко встречаются с задачей создания графического интерфейса пользователя, это связано с тем, что микроконтроллеры для таких целей не предназначены и в основном они выполняют другие задачи. В данной статье рассмотрен один из методов вывода графической информации на экран, используя средства Linux (Linux-embedded), в данном случае это Linux framebuffer. Стоит отметить, что данный метод возможно использовать лишь для однопалатных компьютеров, но никак не для микроконтроллеров.
Ключевые слова: фреймбуфер, Linux, встраиваемые системы, графический интерфейс пользователя (GUI), Linux-embedded.
Не часто перед разработчиками встраиваемых систем стоит задача создания графического интерфейса (GUI), но все же такие задачи возникают и имеют место быть. Встраиваемые системы (одноплатные компьютеры, контроллеры и прочее) имеют слабую вычислительную мощность, этого достаточно для выполнения узкоспециализированных задач, но для работы с большими объемом информации, а именно работа с графикой, они подходят меньше всего, особенно если приходится работать с экранами высокого разрешения, в данной статье я не буду рассматривать как работать с графическими интерфейсами на микроконтроллерах, статья посвящена использованию фреймбуфера Linux на одноплатных компьютерах, но она так же подойдет и тем кто разрабатывает GUI на ЭВМ со слабой вычислительной мощностью, но все же способных запустить Linux.
Linux framebuffer (фреймбуфер Linux, fbdev от англ. Linux Frame Buffer Device) — это графический аппаратно-независимый уровень абстракций для вывода графики на монитор, обычно на консоль [1]. Фреймбуфер — это участок видеопамяти, предназначенный для кратковременного хранения видеокадров, а Linux framebuffer — это метод доступа к фреймбуферу через ядро Linux, не полагаясь на системно-ориентированные библиотеки. На просторах русскоязычного интернета, фрейбуферу посвящено не так много информации.
Чтобы увидеть результат работы фреймбуфера стоит достаточно лишь выполнить Linux следующие действия [2]:
1. Ctrl + Alt + F1
2. sudo su
3. service lightdm stop
4. cat /dev/urandom > /dev/fb0
5. service lightdm start
Выполнив эти действия, если все работает правильно на экране вы получите следующее изображение (рис. 1).
Рис. 1. Результат работы фреймбуфера
К фреймбуферу можно получить доступ так же, как и к файлу, /dev/fb0 это стандартный путь к фреймбуферу. Вы можете читать и записывать пиксельные данные. Чтобы разместить пиксель, туда куда мы хотим, не используя перезапись всего экрана, требуется знать размер всего буфера. Для таких целей используется функция ioctl, а для того чтобы рисовать то или иное изображение будет использоваться функция mmap Листинг когда:
1. int fb = open("/dev/fb0", O_RDWR);
2. assert(fb > 0);
3. struct fb_var_screeninfo info;
4. assert(0 == ioctl(fb, FBIOGET_VSCREENINFO, &info));
5. size_t len = 4 * info.xres * info.yres;
6. uint32_t *buf = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0);
7. assert(buf != MAP_FAILED);
1. Инициируется переменная fb, содержит информацию об открытии фреймбуфера в режиме чтения и записи.
2. Функция assert оценивает выражение, которое передается ей в качестве аргумента, через параметр expression. Если аргумент-выражение этого макроса в функциональной форме равно нулю (т.е. выражение ложно), сообщение записывается на стандартное устройство вывода ошибок и вызывается функция abort, работа программы прекращается.
3. Определяем структуру fb_var_screeninfo, которая будет содержать всю информацию о фрейбуфере.
4. Функция ioctl позволяет записывает информацию в структуру fb_var_screeninfo
5. size_t len = 4 * info.xres * info.yres - размер фреймбуффера.
6. *buf указатель, который содержит в себе адресное пространство фреймбуфера.
7. Определяем все ли правильно функционирует.
Теперь в Linux фреймбуфер можно рисовать. Чтобы отобразить пиксель необходимо выполнить следующее.
buf[bottom * info.xres + x] = 0xFFFFFF; OxFFFFFF цвет пикселя, в данном случае черный.
Список литературы
1. Linux framebuffer. [Электронный ресурс]. Режим доступа: https://ru.wikipedia.org/wiki/Linux_framebuffer/ (дата обращения: 14.05.2018).
2. Embedded GUI Using Linux Frame Buffer Device with LittlevGL. [Электронный ресурс]. Режим доступа: https://littlevgl.com/blog/23/embedded-gui-using-linux-frame-buffer-device-with-littlevgl/ (дата обращения: 13.05.2018).