您的位置:首页 > 其它

osal_msg_send 以及OSAL消息发送示例

2015-08-26 12:20 483 查看
TI z-stack协议栈中加入了RTOS,所以整个协议栈的各层功能的实现是以OS的Task形式调用的

一、用于发送消息的函数为osal_msg_send

原型:OSAL.c中

uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr );

参数destination_task为要接收此Message的目标任务ID,msg_ptr 为所要发送的消息Message指针。

uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr )

{

if ( msg_ptr == NULL )

return ( INVALID_MSG_POINTER );

if ( destination_task >= tasksCnt )

{

osal_msg_deallocate( msg_ptr );

return ( INVALID_TASK );

}



// Check the message header

if ( OSAL_MSG_NEXT( msg_ptr ) != NULL ||

OSAL_MSG_ID( msg_ptr ) != TASK_NO_TASK )

{

osal_msg_deallocate( msg_ptr );

return ( INVALID_MSG_POINTER );

}

OSAL_MSG_ID( msg_ptr ) = destination_task;

// queue message

osal_msg_enqueue( &osal_qHead, msg_ptr );

// Signal the task that a message is waiting

osal_set_event( destination_task, SYS_EVENT_MSG );

return ( SUCCESS );

}

发送Message,此OS做了两件事:

1,将此Message加入“消息队列” :osal_msg_enqueue( &osal_qHead, msg_ptr );

2,设置系统消息事件,等待目标任务响应:osal_set_event( destination_task, SYS_EVENT_MSG );

但是为了了代码的可靠性,在此之前加入了判断目标任务ID以及Message的合法性的语句。



二,如何向SampleApp_ProcessEvent发送与接收消息?

简单示例:通过按键事件(即在处理所有按键事件的case下面),向SampleApp_ProcessEvent中发送自定义的LED闪烁的Message。

准备工作与步骤如下:

Message定义。

在ZComDef.h中定义了系统用到的Message的宏定义,如

#define ZDO_STATE_CHANGE 0xD1

#define AF_INCOMING_MSG_CMD 0x1A

注意下面一条注释:

// OSAL System Message IDs/Events Reserved for applications (user applications)

// 0xE0 – 0xFC

所以应用程序定义的Message只能从0xE0 – 0xFC

因此:

1、在注释下面定一条Message 宏定义偏移量:

#define __MSG_OFFSET 0xE0 //避免自定的Marco与系统重复,所以加两条下划线。

2、如果自定的Message中只在SampleApp中使用,则在SampleApp.h中定义,否则应在ZComDef.h中

2.1在SampleApp.h中定义

#define MYMSG_LED_BLIND __MSG_OFFSET+0x00

2.2自定义消息的格式结构体,用于消息的发送,以及携带数据,在定义的头文件在2.1节中
typedef struct
{
osal_event_hdr_t hdr; //事件头
uint8 state; //闪烁次数
} LedBlind_t;

3、在SampleApp_ProcessEvent函数中的switch ( MSGpkt->hdr.event )下添加一条case-break语句

switch ( MSGpkt->hdr.event )

...

case MYMSG_LED_BLIND :

HalLedBlink( HAL_LED_1, ((LedBlind_t *)MSGpkt)->state, 50,1000 ); //LED1,闪烁次数((LedBlind_t *)MSGpkt)->state,每次占空比50%,周期1000ms

break;

...

然后在case KEY_CHANGE:下添加一条发送MYMSG_LED_BLIND闪烁的Message,在发送消息前要定义一个消息指针,并且使用osal_msg_allocate为指针分配内存

...

case KEY_CHANGE:

...

LedBlind_t *msgPtr;

msgPtr = (LedBlind_t *)osal_msg_allocate( sizeof(LedBlind_t) );

if(msgPtr)

{

msgPtr->hdr.event=MYMSG_LED_BLIND;//消息

msgPtr->state=0x04;//闪烁次数

osal_msg_send(SampleApp_TaskID, (uint8 *)msgPtr );

}

...



以上代码只是演示消息的发送与接收,没有实用价值,因为可直接在按键部分加入HalLedBlink()函数,不用这么绕一大圈子
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: