说明:ZStack1.4.2,1.4.3实现了zigbee2007
下面将以"ZStack2006学习"为标题,展开近期关于TI公司zigbee2006协议栈的学习笔记。更多精彩,敬请关注!
无废话,下面就开始!
//任务的数据结构
typedef struct osalTaskRec
{
struct osalTaskRec *next;
pTaskInitFn pfnInit;
pTaskEventHandlerFn pfnEventProcessor;
byte taskID;
byte taskPriority;
uint16 events;
}osalTaskRec_t;
其中:
typedef void (*pTaskInitFn)( unsigned char task_id ); //任务的初始化代码
typedef unsigned short (*pTaskEventHandlerFn)( unsigned char task_id, unsigned short event );//任务的事件处理函数
(1)在操作系统的初始化函数byte osal_init_system( void )中调用3个函数
// Initialize the tasking system
osalTaskInit();
osalAddTasks();
osalInitTasks();
进行相关任务的初始化,其中第一个函数:
void osalTaskInit( void )
{
tasksHead = (osalTaskRec_t *)NULL;
activeTask = (osalTaskRec_t *)NULL;
taskIDs = 0;
}
是对任务链表的初始化,tasksHead,activeTask是定义在OSAL_Tasks.c中的两个全局变量,分别表示任务链表的头和当前任务。其中的activeTask在OSAL_Tasks.h中声明如下:
extern osalTaskRec_t *activeTask;
便于在其它的.c文件中使用该变量(包含OSAL_Tasks.h头文件即可)
(2)第二个个函数:
void osalAddTasks( void )
{
osalTaskAdd (Hal_Init, Hal_ProcessEvent, OSAL_TASK_PRIORITY_LOW);
#if defined( ZMAC_F8W )
osalTaskAdd( macTaskInit, macEventLoop, OSAL_TASK_PRIORITY_HIGH );
#endif
#if defined( MT_TASK )
osalTaskAdd( MT_TaskInit, MT_ProcessEvent, OSAL_TASK_PRIORITY_LOW );
#endif
osalTaskAdd( nwk_init, nwk_event_loop, OSAL_TASK_PRIORITY_MED );
osalTaskAdd( APS_Init, APS_event_loop, OSAL_TASK_PRIORITY_LOW );
osalTaskAdd( ZDApp_Init, ZDApp_event_loop, OSAL_TASK_PRIORITY_LOW );
osalTaskAdd( SAPI_Init, SAPI_ProcessEvent, OSAL_TASK_PRIORITY_LOW );
}
是向系统中加入任务,其中的任务添加函数函数:
void osalTaskAdd( pTaskInitFn pfnInit,
pTaskEventHandlerFn pfnEventProcessor,
byte taskPriority)
第一个参数是任务的初始化代码,第二个参数是任务的事件处理代码,第三个参数是优先级。第1,2个变量的类型分别定义成了函数指针类型,见本文上面部分。
(3)第三个函数是初始化添加的各任务,即执行每个任务自己的初始化代码:
/*********************************************************************
* @fn osalInitTasks
*
* @brief Call each of the tasks initailization functions.
*
* @param none
*
* @return none
*/
void osalInitTasks( void )
{
// Start at the beginning
activeTask = tasksHead;
// Stop at the end
while ( activeTask )
{
if ( activeTask->pfnInit )
activeTask->pfnInit( activeTask->taskID );
activeTask = activeTask->next;
}
activeTask = (osalTaskRec_t *)NULL;
}
阅读(1474) | 评论(0) | 转发(0) |