MCU中的状态机

本文介绍了在MCU开发中创建一个状态机框架的过程,包括定义状态枚举、回调函数、状态切换以及实例化状态如定时器和资源管理。作者展示了如何通过`enter_next_state`函数转换设备状态,如充电、休眠和佩戴等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近一直在写MCU代码,写了个状态机的框架,很简单。

定义状态:

enum watch_state_t {
  WATCH_INIT, //开机检测
  WATCH_IDLE,  //开机后没戴也没充电,(120秒后进入sleep)
  WATCH_WEAR,  //戴着
  WATCH_CHARGE, //充电
  WATCH_SLEEP,  //休眠省电
};

typedef void (*state_callback_t)(void);

切换状态:

static enum watch_state_t work_state;
state_callback_t state_exit_callback = NULL;

static void clear_callback(void) {
  state_exit_callback = NULL;
}

void enter_next_state(enum watch_state_t state) {
  if(state == work_state) return;

  work_state = state;

  if (state_exit_callback)
    state_exit_callback();

  clear_callback();

  switch (state) {
  case WATCH_INIT:
    watch_init_init();
    break;
  case WATCH_IDLE:
    watch_idle_init();
    break;
  case WATCH_WEAR:
    watch_wear_init();
    break;
  case WATCH_CHARGE:
    watch_charge_init();
    break;
  case WATCH_SLEEP:
    watch_sleep_init();
    break;
  default:
    break;
  }
}

定义一个状态:

//一个文件一个状态,非常容易理解
static void timer_1s_func(void *arg) {
   co_printf("1s\r\n");
}

static void state_exit(void) {//退出状态时,释放资源
  os_timer_stop(&user_timer_1s);
  os_timer_destroy(&user_timer_1s);
}

void watch_wear_init(void) {
  co_printf("wear\r\n");
 // init timer
  os_timer_init(&user_timer_1s, timer_1s_func, NULL);
  os_timer_start(&user_timer_1s, 1000, 1);
// state init
  state_exit_callback = state_exit;
}

转换各种状态

enter_next_state(WATCH_CHARGE);//进入充电状态
enter_next_state(WATCH_SLEEP); //休眠息屏状态
enter_next_state(WATCH_WEAR); //佩戴状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值