|
回复 1# cyril3
首先赞一个,谢谢楼主的无私分享。菜鸟的我们就是因为你们的无私分享才会进步得更快!
这里我对你这篇教程有些许不懂之处:“ 那么如何向OSAL声明处理按键事件的任务是GenericApp呢?”
这里我还不是很明白:
"在GenericApp_Init(GenericApp的任务初始化函数)中有这么一个语句:
{
RegisterForKeys( GenericApp_TaskID );
}
"
这句话为什么是向OSAL声明处理按键事件的任务是GenericApp呢??
处理按键事件的任务是GenericApp_ProcessEvent,在tasksArr[] 定义并初始化时已经确定的了,见贴在最后的代码。
那么,对于下面这个函数,它的作用是什么呢?求详解。
uint8 RegisterForKeys( uint8 task_id )
{
// Allow only the first task
if ( registeredKeysTaskID == NO_TASK_ID )
{
registeredKeysTaskID = task_id;
return ( true );
}
else
return ( false );
}
在楼主的详解之前,请允许我把我自己的见解说出来跟大家讨论:{
在Onboard.c中搜索可得:
registeredKeysTaskID是在本文件Onboard.c中定义的全局变量:static uint8 registeredKeysTaskID = NO_TASK_ID;初始化为NO_TASK_ID。
而另外,对于 registeredKeysTaskID,它有如下这种用法:(调用 osal_msg_send()函数向registeredKeysTaskID发送信息,而这个registeredKeysTaskID估计就是按键处理任务的ID了)。
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 );
}
那么,这意味着, RegisterForKeys()函数的“注册”意义只在于本文件内(如果registeredKeysTaskID变量没有在别的文件内被extern声明),作用就是让osal_msg_send( )用来向taskarr[]中的GenericApp_ProcessEvent发送消息。
貌似registeredKeysTaskID在这里做了无用功:
osal_init_system( void )--->
osalInitTasks()--->
GenericApp_Init( taskID )/*在osalInitTasks里的taskID已经是Taskarr[]数组里面对应于按键处理函数的标号了because of按顺序注册*/--->
RegisterForKeys( GenericApp_TaskID );--->/*在这个函数里面,GenericApp_TaskID = task_id; task_id是GenericApp_Init( taskID )的参数 taskID*/
那么,RegisterForKeys( uint8 task_id )不就是拿了一个已经确定了的按键处理函数ID去注册确定按键处理函数的ID吗?怎么理解这种行为?
FILE NAME:OSAL_GenericApp.c
/*********************************************************************
* GLOBAL VARIABLES
*/
// The order in this table must be identical to the task initialization calls below in osalInitTask.
const pTaskEventHandlerFn tasksArr[] = {
macEventLoop,
nwk_event_loop,
Hal_ProcessEvent,
#if defined( MT_TASK )
MT_ProcessEvent,
#endif
APS_event_loop,
#if defined ( ZIGBEE_FRAGMENTATION )
APSF_ProcessEvent,
#endif
ZDApp_event_loop,
#if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )
ZDNwkMgr_event_loop,
#endif
GenericApp_ProcessEvent
}; |
|