https://mp.weixin.qq.com/s/Q1awjcC572ukkRuAGXIRaAhttps://mp.weixin.qq.com/s/Q1awjcC572ukkRuAGXIRaA

FreeRTOS的软件定时器的核心机制是回调函数触发 当你调用xTimerStart()启动定时器时,系统会在指定时间后,自动调用你创建定时器时绑定的回调函数,例如:

// 创建定时器时,绑定回调函数 
na_timer = xTimerCreate( 
"NA_Timer",                        // 定时器名称 
pdMS_TO_TICKS(DEFAULT_NA_PERIOD * 1000),   // 默认周期 
pdTRUE,                           // 自动重载(周期触发) 
NULL,                            // 定时器ID 
NaTimerCallback                     // 绑定的回调函数 
);

当定时器到期,FreeRTOS会自动调用CallBack函数 在这里介绍一个机制,就是FreeRTOS的事件驱动框架:FreeRTOS的Queue提供了任务到任务、任务到中断、中断到任务、中断到任务间的通讯机制。对于这些事件,可以定义如下枚举:

typedef enum{
 TASK0_EVENT_0,
 TASK0_EVENT_1,
 TASK0_EVENT_2,
 ...
}Task0EventType;

我们可能会这样做逻辑执行:

typedef struct Task0Event_t{
 Task0EventType type;
 xxx;
}Task0Event;

static void ChangeState(Task0Event* event)
{
 switch(event->type)
 {
  case TASK0_EVENT_0:
  ...
  break;
  
  case TASK0_EVENT_1:
  ...
  break;
  
  default:
  ..
  break;
 }
}

这是很常见的写法,在一些业务中,另一种写法会更好一些:就是通过事件回调函数表

typedef struct EventProcessor_t
{
    Task0Event     event;
    Event_Handler  handler;
} EventProcessor;

EventProcessor task0_event_table[] = {
  {TASK0_EVENT_0, event0_handler},
  {TASK0_EVENT_1, event1_handler},
  {TASK0_EVENT_2, event2_handler},
  ......
}
Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐