一、周期事件
1.1 定义周期事件
以multi_role工程为例,在multi_role.c的CONSTANTS常量定义中,加入CUSTOM_TIMER_EVT
,id号递增。
// Internal Events for RTOS application
#define MR_ICALL_EVT ICALL_MSG_EVENT_ID // Event_Id_31
#define MR_QUEUE_EVT UTIL_QUEUE_EVENT_ID // Event_Id_30
#define MR_STATE_CHANGE_EVT Event_Id_00
#define MR_CHAR_CHANGE_EVT Event_Id_01
#define MR_CONN_EVT_END_EVT Event_Id_02
#define MR_KEY_CHANGE_EVT Event_Id_03
#define MR_PAIRING_STATE_EVT Event_Id_04
#define MR_PASSCODE_NEEDED_EVT Event_Id_05
#define MR_PERIODIC_EVT Event_Id_06
#define CUSTOM_TIMER_EVT Event_Id_07 // 自定义周期事件
在MR_ALL_EVENTS事件集合定义中,加入刚刚的自定义周期事件。
#define MR_ALL_EVENTS (MR_ICALL_EVT | \
MR_QUEUE_EVT | \
MR_STATE_CHANGE_EVT | \
MR_CHAR_CHANGE_EVT | \
MR_CONN_EVT_END_EVT | \
MR_KEY_CHANGE_EVT | \
MR_PAIRING_STATE_EVT | \
MR_PERIODIC_EVT | \
MR_PASSCODE_NEEDED_EVT | \
CUSTOM_TIMER_EVT)
1.2 添加周期事件的处理
在multi_role.c的multi_role_taskFxn函数中尾部加入,注释掉部分为开启循环定时器功能,如果是一次性定时器可以不需要。
/*----------------- 自定义定时器事件 ------------------*/
if (events & CUSTOM_TIMER_EVT)
{
// 再次启动自定义定时器
// Util_startClock(&s_customClock);
// 自定义周期事件处理函数
timer_customPeriodicTask();
}
二、周期事件处理函数
2.1 定义周期事件处理函数
以multi_role工程为例,在multi_role.c尾部添加
static void timer_customPeriodicTask(void)
{
// 自定义功能
}
2.2 声明周期事件处理函数
在multi_role.c的LOCAL FUNCTIONS局部函数中加入
static void timer_customPeriodicTask(void);
三、定时器
3.1 定义定时器
static Clock_Struct s_customClock;
3.2 配置定时器时间
#define CUSTOM_TIMER_EVT_PERIOD 100 // 自定义定时器时间100ms
3.3 初始化定时器
以multi_role工程为例,在multi_role.c的multi_role_init函数中尾部加入
// 自定义定时器初始化
Util_constructClock(&s_customClock, multi_role_clockHandler,
CUSTOM_TIMER_EVT_PERIOD, 0, false, CUSTOM_TIMER_EVT);
四、触发周期事件函数
以multi_role工程为例,在multi_role.c中已经有了multi_role_clockHandler,当定时器到达时间时,会产生一个事件,进入上文的周期事件处理函数。其他工程也有类似的名字。
/*********************************************************************
* @fn multi_role_clockHandler
*
* @brief Handler function for clock timeouts.
*
* @param arg - event type
*/
static void multi_role_clockHandler(UArg arg)
{
// Wake up the application.
Event_post(syncEvent, arg);
}
五、启动定时器
在需要启动的地方添加
Util_startClock(&s_customClock);
开机自启定时器,则加在multi_role.c的multi_role_processRoleEvent函数中,GAP_DEVICE_INIT_DONE_EVENT事件尾部
// GAPRole started
case GAP_DEVICE_INIT_DONE_EVENT:
{
// Store max pdu size
maxPduSize = pEvent->initDone.dataPktLen;
Display_print0(dispHandle, MR_ROW_DEV_ADDR, 0, Util_convertBdAddr2Str(pEvent->initDone.devAddr));
Display_print0(dispHandle, MR_ROW_CONN_STATUS, 0, "Connected to 0");
Display_print0(dispHandle, MR_ROW_STATUS1, 0, "Initialized");
// Set device info characteristic
DevInfo_SetParameter(DEVINFO_SYSTEM_ID, DEVINFO_SYSTEM_ID_LEN, pEvent->initDone.devAddr);
Util_startClock(&s_customClock);
}
break;
• 由 Leung 写于 2019 年 3 月 5 日
• 参考:【CC2640R2F】香瓜CC2640R2F之自定义周期事件