Цитата(Rash @ Apr 4 2016, 16:53)

Про работу DMA я ни чего не писал, так что не пойму к чему это.
Так я писал. Графический ускоритель - это DMA2D. В исполнении ST, по сути, обычный DMA канал умеющий копировать квадратную, а не линейную область памяти, с попутным преобразованием содержимого.
Для чего я его у себя приспособил, на сегодняшний момент:
1) Вывод прямой (вертикальной и горизонтальной).
2) Заливка области цветом.
3) Вывод текста. (Представляет собой вывод символа из сжатого состояния А4). При повороте используется программная часть (пока).
4) Вывод картинки из сжатого состояния L8.
Рассмотрим что есть отображения виджета, в общем случае. Вывод фона виджета с распаковкой L8 за 1 или N раз в зависимости от типа виджета. Вывод ндписи и/или иконки с распаковкой L8.
То есть всё делается ускорителем.
Теперь к вопросу о динамическом выделении памяти. В целом у меня отторжения нет. Я его использую. Использовал и для гуи. Но, в данном случае
для себя не вижу смысла. У меня статические экраны. Они представляют собой окна с набором виджетов. Вырежу пример из прошлого проекта...
Код
// @@ 261.
MenuItem_t mnuitDc[MNUDCMAX] = // Меню "Каналы управления"/ Пункты меню
{
{&imResult, // 2611 Мгновенное значение
0,DCResultView,&DCdin,SetDCType},
{&imTypDc, // 2612. Тип канала управления
(struct Menu_t *)&txlTypDc,(void(*)(void))TextListCh,&DCdin,SetDCmnuViewAndHlp},
{&imPortIntelChan, // 2613 Порт связи для интелектуального канала
(struct Menu_t *)&rbtPortLink,RadioBtnCh,&DCdin,SetDCmnuViewAndHlp},
{&imNMO, // 2614 № вых.канала.
(struct Menu_t *)&dgeNChan,EditIntCh,&DCdin,EditIntHlp},
{&imNetAdr, // 2615 Сетевой адрес для интелектуального канала
(struct Menu_t *)&dgeNetAdrSlave,EditIntCh,&DCdin,EditIntHlp},
{&imTeleParam, // 2616 Параметр
0,TeleControlEdit,&DCdin,TeleControlHlp},
{&imPolar, // 2617 Полярность, +/-
(struct Menu_t *)&rbtPolar,RadioBtnCh,&DCdin,RadioBtnHlp},
И есть описание самого объекта... ну например
Код
// @@ 261С.
RadioBtn_t rbtTelesignlgh = // Меню "Световая индикац."
{
0, // непрямое
2, // Всего 2 пункта
offsetof(ControlChannel_t,light), // light
PRGEDIT, 0, // Редактировать по паролю, не сохранять (сохранять по выходу из PRG)
rbtsSwitch
};
Таким образом вся структура экранов прибора лежит у меня во флэши, элементарно редактируется.
В озу у меня расположены будут только свойства виджета... Ну там
Код
// Состояния графических объектов (Общие)
enum
{
// состояния
FOCUSED = 0x0001, // фокус на объекте
DISABLED = 0x0002, // объект заблокирован
DRAWN = 0x0004, // объект отрисован
// действия
DRAW_FOCUS = 0x2000, // навести фокус
DRAW = 0x4000, // перерисовать
HIDE = 0x8000; // погасить
};