当前位置: 首页 > news >正文

主循环SYS_TICK无阻塞延迟

#include "stm32f4xx_hal.h"
#include <stdint.h>typedef enum {EVT_RELAY_ON = 0,EVT_RELAY_OFF
} evt_type_t;typedef struct {uint8_t  active;uint8_t  relay_id;uint8_t  type;uint8_t  token;        // 防止旧事件误执行(可选但强烈推荐)uint32_t deadline_ms;
} event_t;#define MAX_EVENTS 32
#define RELAY_NUM  8static event_t g_events[MAX_EVENTS];
static uint8_t g_relay_token[RELAY_NUM];  // 每路继电器的版本号// 你自己实现:根据 relay_id 控制对应 GPIO
void Relay_On(uint8_t id);
void Relay_Off(uint8_t id);// 添加事件:在 delay_ms 后执行 ON/OFF
static int Scheduler_Add(uint8_t relay_id, evt_type_t type, uint32_t delay_ms, uint8_t token)
{uint32_t now = HAL_GetTick();uint32_t deadline = now + delay_ms;for (int i = 0; i < MAX_EVENTS; i++) {if (!g_events[i].active) {g_events[i].active = 1;g_events[i].relay_id = relay_id;g_events[i].type = (uint8_t)type;g_events[i].deadline_ms = deadline;g_events[i].token = token;return 0; // ok}}return -1; // 队列满了
}// 主循环里一直调用
void Scheduler_Poll(void)
{uint32_t now = HAL_GetTick();for (int i = 0; i < MAX_EVENTS; i++) {if (!g_events[i].active) continue;// 到期判断(防溢出)if ((int32_t)(now - g_events[i].deadline_ms) >= 0) {uint8_t id = g_events[i].relay_id;// token 检查:不一致说明被更新过,丢弃旧事件if (g_events[i].token == g_relay_token[id]) {if (g_events[i].type == EVT_RELAY_ON)  Relay_On(id);else                                   Relay_Off(id);}g_events[i].active = 0; // 释放槽位}}
}// 继电器“脉冲”:立即开,ms 后关
int Relay_Pulse(uint8_t id, uint32_t ms)
{if (id >= RELAY_NUM) return -2;g_relay_token[id]++;       // 更新版本号Relay_On(id);              // 立即执行// 安排 ms 后关return Scheduler_Add(id, EVT_RELAY_OFF, ms, g_relay_token[id]);
}

主循环内运行

int main(void)
{HAL_Init();// ... GPIO/时钟初始化while (1) {Scheduler_Poll();// 比如某条件触发// Relay_Pulse(3, 80);}
}
http://www.jsqmd.com/news/310121/

相关文章:

  • Java毕设项目:基于springboot的小区公共收益管理系统(源码+文档,讲解、调试运行,定制等)
  • 【毕业设计】基于springboot的小区公共收益管理系统(源码+文档+远程调试,全bao定制等)
  • 计算机等级考试—CMMI CL讲解KTV收银系统—东方仙盟练气期
  • 【课程设计/毕业设计】基于springboot的小区物业费公共收益管理系统【附源码、数据库、万字文档】
  • 高驰二手运动手表回收价格全解析:看懂这几点,闲置变现不亏
  • 勇闯博客世界之我的Java大冒险之善良的小动态sql
  • 成果展示
  • 2026高驰二手运动手表回收价格,支持全国上门回收
  • java: 找不到符号方法 getCode()
  • 【双指针】盛水最多的容器
  • 【双指针】接雨水
  • 告别同质化竞争,先知AI赋予男装品牌独特智慧基因
  • 【数组】分糖果问题
  • 【优先级队列】主持人调度(二)
  • 【鸿蒙PC命令行适配】xxHash 在鸿蒙 PC 上的适配移植实战与部署详解
  • Java毕设项目推荐-基于springboot的台球开台运营管理系统基于springboot的台球厅管理球房会员服务与桌台调度系统【附源码+文档,调试定制服务】
  • Java毕设项目推荐-基于springboot的服装制造有限公司综合管理系统【附源码+文档,调试定制服务】
  • 浅谈 HNSW
  • Intellij IDEA常用快捷方式
  • 1月新专利下证!亚马逊爆款品类侵权预警
  • 66666666666666666666
  • 【计算机毕业设计案例】基于java-springboot台球俱乐部管理系统基于springboot的台球厅管理系统(程序+文档+讲解+定制)
  • 【计算机毕业设计案例】基于springboot的服装生产流程监控与管理系统服装制造有限公司综合管理系统(程序+文档+讲解+定制)
  • Java毕设选题推荐:基于SpringBoot+Vue的服装生产管理设计与实现管理系统基于springboot的服装制造有限公司综合管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 计算机Java毕设实战-基于springboot的服装制造有限公司综合管理系统基于Vue和SpringBoot服装生产管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 【联邦学习入门指南】Part 1:概述与核心逻辑
  • 【联邦学习入门指南】 Part 2:核心挑战与安全机制
  • first blog
  • Java计算机毕设之基于springboot的服装制造业流程管理平台综合管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • 【课程设计/毕业设计】基于springboot+vue的服装公司生产管理系统 基于springboot的服装制造有限公司综合管理系统【附源码、数据库、万字文档】