PowLu bu gisti düzenledi . Düzenlemeye git
1 file changed, 0 insertions, 0 deletions
nonblocking_timer_macro.c yeniden adlandırıldı nonblocking_timer_macro.h
Dosya değişiklik yapılmadan yeniden adlandırıldı
PowLu bu gisti düzenledi . Düzenlemeye git
2 files changed, 48 insertions
demo.c(dosya oluşturuldu)
| @@ -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(dosya oluşturuldu)
| @@ -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) | |