《Zigbee学习》OSAL 按键

学习ZigBee Stack协议栈时,使用到按键,发现OSAL里面有关于按键的任务调度。

相关文件

hal_key.c
hal_key.h
hal_board_cfg.h
zmain.c
OnBoard.c

函数调用过程

  • InitBoard( OB_READY )调用HalKeyConfig(HAL_KEY_INTERRUPT_DISABLE,
    OnBoard_KeyCallback)

    在HalKeyConfig()函数中主要是非中断使能,执行下面的代码。将按键事件添加到应用程序任务中,该Hal_TaskID在Hal_Init( taskID++ )函数里面完成初始化。当系统查询到该任务有按键事件时,执行Hal_ProcessEvent( uint8 task_id, uint16 events )响应程序。

osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_POLLING_VALUE); 
  • Hal_ProcessEvent(),在该函数中有下列事件
SYS_EVENT_MSG			系统事件
HAL_LED_BLINK_EVENT 		LED闪烁事件
HAL_KEY_EVENT			按键事件
HAL_SLEEP_TIMER_EVENT		睡眠事件
  • 在按键事件中执行HalKeyPoll()按键查询扫函数,然后如果有按键发生,如果键值halKeySavedKeys发生改变,那么存储键值。
  • 然后执行回调函数pHalKeyProcessFunction,该函数在HalKeyConfig()中初始化为OnBoard_KeyCallback()。
  • 在OnBoard_KeyCallback()函数中执行OnBoard_SendKeys()函数,该函数向OSAL任务(即任务ID为registeredKeysTaskID,该ID在SampleApp_Init()函数中调用RegisterForKeys()函数初始化)发送板载资源消息事件。
    按键消息事件内容是:
    msgPtr->hdr.event = KEY_CHANGE;//事件类型
    msgPtr->state = state;//按键状态
    msgPtr->keys = keys;//按键键值
uint8 OnBoard_SendKeys( uint8 keys, uint8 state )
{
  keyChange_t *msgPtr;
  if ( registeredKeysTaskID != NO_TASK_ID )
  {
    // Send the address to the task
    msgPtr = (keyChange_t *)osal_msg_allocate( sizeof(keyChange_t) );
    if ( msgPtr )
    {
      msgPtr->hdr.event = KEY_CHANGE;
      msgPtr->state = state;
      msgPtr->keys = keys;
      osal_msg_send( registeredKeysTaskID, (uint8 *)msgPtr );
    }
    return ( ZSuccess );
  }
  else
    return ( ZFailure );
}
  • 然后该任务的服务程序(SampleApp_ProcessEvent())接收到该消息事件,并处理该事件。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值