Zstack 学习笔记之——按键
关于 Zstack 中按键的来龙去脉,总结如下
1、应 用 层任务初始 化 函 数 , 比 如 SerialApp_inIt 里 调 用 RegisterForKeys( ) , 执 行
registeredKeysTaskID = task_id
2、Main()函数的 InitBoard( OB_READY )里面对按键进行配置,包括是否开启中断和
设 置 中 断 回 调 函 数 HalKeyConfig(HAL_KEY_INTERRUPT_DISABLE,
OnBoard_KeyCallback)。
这里,有两种情况,一种是开中断,一种是不开。分别讨论:
一、若 开 中 断 , 则 在 中 断 函 数 HAL_ISR_FUNCTION( halKeyPort2Isr,
P2INT_VECTOR ) 或 者 HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR ) 里 调 用
halProcessKeyInterrupt(),这个函数对 BUTTON 和 JOY 两种按键分别作判断,若有按键按
下 , 则 调 用 osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT,
HAL_KEY_DEBOUNCE_VALUE),定时器计时溢出时,系统会给任务号为 Hal_TaskID 的
任务发送一个 HAL_KEY_EVENT 事件
二、若 不 开 中 断 , 则 代 表 采 用 轮 询 方 式 查 看 按 键 情 况 , HalKeyConfig 调 用
osal_set_event(Hal_TaskID, HAL_KEY_EVENT),给任务号为 Hal_TaskID 的任务发送一个
HAL_KEY_EVENT 事件,tosal_set_event 函数执行 TasksEvents[task_id] |= event_flag
3、主 函 数 轮 询 任 务 事 件 列 表 TasksEvents[] , 若 有 按 键 按 下 , 则
TasksEvents[Hal_TaskID] 对用的回调函数 Hal_ProcessEvent 被执行。Hal_ProcessEvent 找到
对用的 HAL_KEY_EVENT 事件,执行 HalKeyPoll(),判断按键来源并调用按键回调函数
OnBoard_KeyCallback
4、按键回调函数 OnBoard_KeyCallback 里面执行 OnBoard_SendKeys( keys, shift ),继
续追踪 , 发 现里 面 调 用了 osal_msg_send( registeredKeysTaskID, (uint8 *)msgPtr ) ,其中
msgPtr->hdr.event = KEY_CHANGE; msgPtr->state = state; msgPtr->keys =
keys。osal_msg_send 里继续调用 osal_set_event( destination_task, SYS_EVENT_MSG ),此
时 , 目 的 任 务 ( 即 自 己 添 加 的 应 用 任 务 中 ) if ( events & SYS_EVENT_MSG ) 为 真 ,
MSGpkt->hdr.event 匹配 case KEY_CHANGE,这样,在此 case 语句下添加自己的按键处理
函数即可
评论2