Remove timer-based frame pacing in Thermometr example

This commit is contained in:
Stanislav N Mikhailov
2026-04-04 23:32:07 +03:00
parent 21e6654ee4
commit 545652c0fd
+1 -21
View File
@@ -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); // Привязываем контекст рендера к буферу и размерам экрана.