demo.c
· 750 B · C
Raw
// 例1:每500ms翻转一次LED
void main_loop(void) {
RUN_EVERY(500, led_tick, {
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
});
// 其他非阻塞任务
read_sensor();
process_data();
}
// 例2:每100ms读取一次ADC
void task_handler(void) {
RUN_EVERY(100, adc_tick, {
adc_value = HAL_ADC_GetValue(&hadc);
});
}
// 例3:多个不同间隔的任务
void system_loop(void) {
RUN_EVERY(10, tick1, {
// 每10ms执行:按键扫描
scan_keys();
});
RUN_EVERY(100, tick2, {
// 每100ms执行:更新显示
update_display();
});
RUN_EVERY(1000, tick3, {
// 每1秒执行:心跳LED
toggle_heartbeat_led();
});
}
| 1 | // 例1:每500ms翻转一次LED |
| 2 | void 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 |
| 13 | void task_handler(void) { |
| 14 | RUN_EVERY(100, adc_tick, { |
| 15 | adc_value = HAL_ADC_GetValue(&hadc); |
| 16 | }); |
| 17 | } |
| 18 | |
| 19 | // 例3:多个不同间隔的任务 |
| 20 | void 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
· 518 B · C
Raw
// 获取当前系统时间(毫秒)
//#define GET_TICK() (osKernelSysTick()) // FreeRTOS/CMSIS-RTOS
#define GET_TICK() (HAL_GetTick()) // STM32 HAL 用户可换这行
// 非阻塞延时宏:每 interval_ms 执行一次 {code}
#define RUN_EVERY(interval_ms, static_tick_var, code) \
do { \
static uint32_t static_tick_var = 0; \
if ((GET_TICK() - static_tick_var) >= (interval_ms)) { \
static_tick_var = GET_TICK(); \
code; \
} \
} while(0)
| 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) |