Chinaunix首页 | 论坛 | 博客
  • 博客访问: 186641
  • 博文数量: 50
  • 博客积分: 2567
  • 博客等级: 少校
  • 技术积分: 495
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-14 10:44
文章分类

全部博文(50)

文章存档

2011年(3)

2010年(29)

2009年(11)

2008年(7)

我的朋友

分类: 嵌入式

2010-03-09 17:07:04

说明: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;
}
阅读(1443) | 评论(0) | 转发(0) |
0

上一篇:VDD,VSS,VCC区别

下一篇:二级指针的使用

给主人留下些什么吧!~~