OSAL消息机制及使用示例

        上一次我们讲到OSAL通过定时器循环产生事件来触发任务,

        接下来分析一下消息机制,我们通过一个简单的例子来说明消息任何使用


/***********消息有效数据缓冲区结构***********/
typedef struct
{
  uint8  event;                                                     /*  事件                    */
  uint8  byMsgSendDat;                                              /*  消息要传递的有效数据    */
} osal_msg_send_dat;


/***********发送消息***********/
uint8 osalSendUserDat( uint8 byDat )
{
    osal_msg_send_dat *msgPtr;
  
    msgPtr = (osal_msg_send_dat *)osal_msg_allocate( sizeof(keyChange_t) );
    
    if ( msgPtr )
    {
      msgPtr->event         = SBP_MSG_DAT_OK_EVT;
      msgPtr->byMsgSendDat  = byDat;                                /*  装载消息的有效数据      */         

      osal_msg_send( SimpleBLETest_TaskID, (uint8 *)msgPtr );       /*  发送消息                */
    }
    return ( SUCCESS );
}


/***********用户处理消息函数***********/
static void simpleBLETest_ProcessOSALMsg( osal_msg_send_dat *pMsg )
{
  static uint8 led = 0x01;
  
  switch ( pMsg->event )
  {
    case SBP_MSG_DAT_OK_EVT:
     
      led = pMsg->byMsgSendDat;
      
      HalLedSet( (HAL_LED_ALL), HAL_LED_MODE_OFF );                 /* 关闭所有的4个led灯       */
      HalLedSet( (led), HAL_LED_MODE_ON );                          /* 点亮ledx灯               */
     
      break;
  }
}


/***********用户任务初始化函数***********/
void SimpleBLETest_Init( uint8 task_id )
{ 
    SimpleBLETest_TaskID = task_id;       
    osal_set_event( SimpleBLETest_TaskID, SBP_START_DEVICE_EVT );   /*  设置一个启动任务事件    */
}


/***********用户任务事件处理函数***********/
uint16 SimpleBLETest_ProcessEvent( uint8 task_id, uint16 events )
{
    VOID task_id;

    if ( events & SYS_EVENT_MSG )
    {
        uint8 *pMsg;
        /*  读取发送来的消息            */
        if ( (pMsg = osal_msg_receive( SimpleBLETest_TaskID )) != NULL ){
            /*  消息有效数据处理函数    */
            simpleBLETest_ProcessOSALMsg( (osal_msg_send_dat *)pMsg );
            /*  清除消息内存            */
            VOID osal_msg_deallocate( pMsg );
        } 
        return (events ^ SYS_EVENT_MSG); 
    }

    if ( events & SBP_START_DEVICE_EVT )
    {
        /*  每500毫秒发送一个事件       */
        if ( SBP_PERIODIC_EVT_PERIOD ){
            osal_start_reload_timer( SimpleBLETest_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );
        }  
        return ( events ^ SBP_START_DEVICE_EVT );   
    }
    
    if ( events & SBP_PERIODIC_EVT)
    { 
        static uint8 byTmp = 0;
        
        if(byTmp > 7) byTmp = 0;
        /*  发送消息及有效数据  byTmp   */
        osalSendUserDat(byTmp++);
        
        return (events ^ SBP_PERIODIC_EVT);
    }
    
    return 0;
}
      
















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值