Last active 1776395259

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

PowLu revised this gist 1776395259. Go to revision

1 file changed, 0 insertions, 0 deletions

nonblocking_timer_macro.c renamed to nonblocking_timer_macro.h

File renamed without changes

PowLu revised this gist 1776395182. Go to revision

2 files changed, 48 insertions

demo.c(file created)

@@ -0,0 +1,35 @@
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.c(file created)

@@ -0,0 +1,13 @@
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)
Newer Older