上一次我们讲到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;
}