mirror of
https://github.com/stasenso/rp_pico_display_engine.git
synced 2026-06-26 21:32:41 +03:00
Remove timer-based frame pacing in Thermometr example
This commit is contained in:
@@ -11,16 +11,6 @@
|
|||||||
#define HEIGHT 240 // Высота экрана в пикселях.
|
#define HEIGHT 240 // Высота экрана в пикселях.
|
||||||
#define TEXT_H 22 // Высота глифа шрифта для расчета нижней границы текста.
|
#define TEXT_H 22 // Высота глифа шрифта для расчета нижней границы текста.
|
||||||
|
|
||||||
static volatile bool frame_tick_due = false; // Флаг "пришел тик кадра", устанавливается в прерывании таймера.
|
|
||||||
static repeating_timer_t frame_timer; // Дескриптор периодического таймера Pico SDK.
|
|
||||||
|
|
||||||
static bool frame_timer_cb(repeating_timer_t* t) // Callback аппаратного периодического таймера.
|
|
||||||
{
|
|
||||||
(void)t; // Параметр callback не используем, явно подавляем предупреждение компилятора.
|
|
||||||
frame_tick_due = true; // Помечаем, что можно обработать один кадр; лишние тики схлопываются.
|
|
||||||
return true; // Возвращаем true, чтобы таймер продолжал работать периодически.
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void wait_for_irq(void) // Вспомогательная функция для энергосберегающего ожидания прерываний.
|
static inline void wait_for_irq(void) // Вспомогательная функция для энергосберегающего ожидания прерываний.
|
||||||
{
|
{
|
||||||
__asm volatile ("wfi"); // Инструкция ARM Wait For Interrupt: CPU спит до любого IRQ.
|
__asm volatile ("wfi"); // Инструкция ARM Wait For Interrupt: CPU спит до любого IRQ.
|
||||||
@@ -71,10 +61,6 @@ int main()
|
|||||||
};
|
};
|
||||||
|
|
||||||
display_init(&cfg); // Инициализируем дисплей и внутренний контекст по заданной конфигурации.
|
display_init(&cfg); // Инициализируем дисплей и внутренний контекст по заданной конфигурации.
|
||||||
const int64_t frame_period_us = -16667; // Задаем период 60 Гц; отрицательное значение дает стабильный интервал.
|
|
||||||
bool timer_ok = add_repeating_timer_us(frame_period_us, frame_timer_cb, NULL, &frame_timer); // Запускаем периодический таймер.
|
|
||||||
hard_assert(timer_ok); // Останавливаемся в отладке, если таймер не создался.
|
|
||||||
|
|
||||||
float phase = 0.0f; // Фаза синусоиды для анимации волны.
|
float phase = 0.0f; // Фаза синусоиды для анимации волны.
|
||||||
const wchar_t* text1 = L"Проверка кириллицы"; // Текст первой строки.
|
const wchar_t* text1 = L"Проверка кириллицы"; // Текст первой строки.
|
||||||
const wchar_t* text2 = L"Latin character check"; // Текст второй строки.
|
const wchar_t* text2 = L"Latin character check"; // Текст второй строки.
|
||||||
@@ -103,16 +89,10 @@ int main()
|
|||||||
|
|
||||||
while (1) // Бесконечный основной цикл приложения.
|
while (1) // Бесконечный основной цикл приложения.
|
||||||
{
|
{
|
||||||
if (!frame_tick_due) // Если тик таймера еще не пришел.
|
|
||||||
{
|
|
||||||
wait_for_irq(); // Спим до прерывания, чтобы не крутить пустой busy-loop.
|
|
||||||
continue; // Переходим к следующей итерации цикла.
|
|
||||||
}
|
|
||||||
frame_tick_due = false; // Сбрасываем флаг и разрешаем обработать ровно один кадр на этот тик.
|
|
||||||
|
|
||||||
uint16_t* buf = display_begin_paint_try(); // Пытаемся начать новый кадр и получить буфер рисования.
|
uint16_t* buf = display_begin_paint_try(); // Пытаемся начать новый кадр и получить буфер рисования.
|
||||||
if (buf == NULL) // Если кадр ещё выводится или paint уже начат, пропускаем этот тик.
|
if (buf == NULL) // Если кадр ещё выводится или paint уже начат, пропускаем этот тик.
|
||||||
{
|
{
|
||||||
|
wait_for_irq(); // Спим до прерывания, чтобы не крутить пустой busy-loop.
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
render_begin(&rc, buf, WIDTH, HEIGHT); // Привязываем контекст рендера к буферу и размерам экрана.
|
render_begin(&rc, buf, WIDTH, HEIGHT); // Привязываем контекст рендера к буферу и размерам экрана.
|
||||||
|
|||||||
Reference in New Issue
Block a user