Last active 1776395259

一个轻量级、可移植的C宏,用于按固定时间间隔执行代码,不阻塞主循环。适用于裸机STM32或FreeRTOS等嵌入式项目。

demo.c Raw
1// 例1:每500ms翻转一次LED
2void main_loop(void) {
3 RUN_EVERY(500, led_tick, {
4 HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
5 });
6
7 // 其他非阻塞任务
8 read_sensor();
9 process_data();
10}
11
12// 例2:每100ms读取一次ADC
13void task_handler(void) {
14 RUN_EVERY(100, adc_tick, {
15 adc_value = HAL_ADC_GetValue(&hadc);
16 });
17}
18
19// 例3:多个不同间隔的任务
20void system_loop(void) {
21 RUN_EVERY(10, tick1, {
22 // 每10ms执行:按键扫描
23 scan_keys();
24 });
25
26 RUN_EVERY(100, tick2, {
27 // 每100ms执行:更新显示
28 update_display();
29 });
30
31 RUN_EVERY(1000, tick3, {
32 // 每1秒执行:心跳LED
33 toggle_heartbeat_led();
34 });
35}
nonblocking_timer_macro.h Raw
1// 获取当前系统时间(毫秒)
2//#define GET_TICK() (osKernelSysTick()) // FreeRTOS/CMSIS-RTOS
3#define GET_TICK() (HAL_GetTick()) // STM32 HAL 用户可换这行
4
5// 非阻塞延时宏:每 interval_ms 执行一次 {code}
6#define RUN_EVERY(interval_ms, static_tick_var, code) \
7 do { \
8 static uint32_t static_tick_var = 0; \
9 if ((GET_TICK() - static_tick_var) >= (interval_ms)) { \
10 static_tick_var = GET_TICK(); \
11 code; \
12 } \
13 } while(0)