display: simplify safe buffer contract and update Thermometr example

This commit is contained in:
Stanislav N Mikhailov
2026-03-27 22:27:44 +03:00
parent b1c511fdf3
commit e21f5f8c1f
3 changed files with 48 additions and 15 deletions
+3 -4
View File
@@ -109,12 +109,11 @@ int main()
} }
frame_tick_due = false; // Сбрасываем флаг и разрешаем обработать ровно один кадр на этот тик. frame_tick_due = false; // Сбрасываем флаг и разрешаем обработать ровно один кадр на этот тик.
if (!display_ready()) // Если прошлый кадр все еще передается DMA на дисплей. uint16_t* buf = display_try_acquire_draw_buffer(); // Пытаемся неблокирующе получить draw-буфер.
if (buf == NULL) // Если в SAFE+1 DMA еще занят, просто пропускаем тик кадра.
{ {
continue; // Пропускаем этот кадр, не накапливая задержку. continue;
} }
uint16_t* buf = display_get_draw_buffer(); // Получаем буфер, в который разрешено рисовать текущий кадр.
render_begin(&rc, buf, WIDTH, HEIGHT); // Привязываем контекст рендера к буферу и размерам экрана. render_begin(&rc, buf, WIDTH, HEIGHT); // Привязываем контекст рендера к буферу и размерам экрана.
render_clear(&rc, RGB16(9,19,9)); // Очищаем кадр темно-зеленым фоном. render_clear(&rc, RGB16(9,19,9)); // Очищаем кадр темно-зеленым фоном.
+17 -6
View File
@@ -100,13 +100,24 @@ void display_init(const display_config_t* cfg);
============================================================ */ ============================================================ */
/* /*
* Буфер для рисования. * Неблокирующая попытка получить буфер для рисования.
* *
* SAFE + 1 буфер: * Возвращает NULL если буфер сейчас недоступен
* может блокировать пока DMA активен. * (например, SAFE + 1 буфер и DMA активен).
* */
* RAW: uint16_t* display_try_acquire_draw_buffer(void);
* никогда не блокирует.
/*
* Блокирующее получение буфера для рисования.
*/
uint16_t* display_acquire_draw_buffer_blocking(void);
/*
* Совместимость со старым API.
* Начиная с текущей версии работает как non-blocking alias:
* эквивалентно display_try_acquire_draw_buffer().
*/ */
uint16_t* display_get_draw_buffer(void); uint16_t* display_get_draw_buffer(void);
+26 -3
View File
@@ -286,14 +286,14 @@ void display_init(const display_config_t* cfg)
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
uint16_t* display_get_draw_buffer(void) uint16_t* display_try_acquire_draw_buffer(void)
{ {
if (ctx.mode == DISPLAY_MODE_SAFE && if (ctx.mode == DISPLAY_MODE_SAFE &&
ctx.buffer_count == 1) ctx.buffer_count == 1)
{ {
while (ctx.dma_busy) if (ctx.dma_busy)
{ {
/* активное ожидание */ return NULL;
} }
} }
@@ -301,6 +301,29 @@ uint16_t* display_get_draw_buffer(void)
} }
/* ------------------------------------------------------------ */
uint16_t* display_acquire_draw_buffer_blocking(void)
{
uint16_t* buf = NULL;
while (buf == NULL)
{
buf = display_try_acquire_draw_buffer();
}
return buf;
}
/* ------------------------------------------------------------ */
uint16_t* display_get_draw_buffer(void)
{
return display_try_acquire_draw_buffer();
}
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
uint16_t* display_get_scanout_buffer(void) uint16_t* display_get_scanout_buffer(void)