TI06版Zigbee协议栈学习01.docx
《TI06版Zigbee协议栈学习01.docx》由会员分享,可在线阅读,更多相关《TI06版Zigbee协议栈学习01.docx(7页珍藏版)》请在冰豆网上搜索。
TI06版Zigbee协议栈学习01
TI_06版Zigbee协议栈学习_01
整个协议栈是以一个OS贯穿的,我们要加入自己的应用,就要添加一个任务,在任务中执行,与协议栈连接。
首先在OSAL_Task.h头文件中声明函数,在OSAL_Task.c中实现这些函数,完成以下的功能:
任务系统的初始化,加一个任务到任务列表,调用每个任务的初始化函数,指到下一个任务,返回任务指针到任务(从任务ID中找到的任务)。
Int*p;
Inti;
P=&i;//指针P指向一个整形变量i,即指针P的值是i的的址;
OSAL_Task.h
1.CONSTANTS
/*********************************************************************
*CONSTANTS
**********************************************************************/
#defineTASK_NO_TASK0xFF
//Taskprioritylevel定义任务优先级
#defineOSAL_TASK_PRIORITY_LOW50
#defineOSAL_TASK_PRIORITY_MED130
#defineOSAL_TASK_PRIORITY_HIGH230
2.TYPEDEFS
/*********************************************************************
*TYPEDEFS
**********************************************************************/
//TaskInitializationfunctionprototype任务初始化函数原型
typedefvoid(*pTaskInitFn)(unsignedchartask_id);
//Eventhandlerfunctionprototype事件处理函数原型
//pTaskInitFn所定义‘函数指针类型’的别名,用此类型生成一个指向函数的指针(如下面的pTaskInitFnpfnInit,则当pfnInit获取函数的地址后,就可以像调用原函数一样来使用这个函数指针:
pfnInit(unsignedchartask_id))
typedefunsignedshort(*pTaskEventHandlerFn)(unsignedchartask_id,unsignedshortevent);
//(解释同上,pTaskEventHandlerFnpfnEventProcessor后,可以像调用原函数一样来使用这个函数指针pfnEventProcessor(unsignedchartask_id,unsignedshortevent))
typedefstructosalTaskRec//任务是以栈的形式存在的
{
structosalTaskRec*next;
pTaskInitFnpfnInit;//pfnInit是指向任务初始化函数的指针
pTaskEventHandlerFnpfnEventProcessor;//pfnEventProcessor是指向事件处理函数的指针
bytetaskID;
bytetaskPriority;
uint16events;
}osalTaskRec_t;//osalTaskRec_t是一个结构体类型(别名)
3.GLOBALVARIABLES
/*********************************************************************
*GLOBALVARIABLES
**********************************************************************/
externosalTaskRec_t*activeTask;//指针activeTask指向osalTaskRec_t这种结构体类型的首地址
4.FUNCTIONS
/*********************************************************************
*FUNCTIONS
**********************************************************************/
//InitializationfortheTaskingSystem.任务系统的初始化
externvoidosalTaskInit(void);
//特别注意这个函数,osalTaskAdd():
//Addatasktothetasklist加一个任务到任务列表
externvoidosalTaskAdd(pTaskInitFnpfnInit,
pTaskEventHandlerFnpfnEventProcessor,
bytetaskPriority);//(指向任务初始化函数的指针,指向事件处理函数的指针,任务优先级别)
//Calleachofthetasksinitailizationfunctions.调用每个任务的初始化函数
externvoidosalInitTasks(void);
//Thisfunctionwillreturnthenextactivetask.指到下一个任务
externosalTaskRec_t*osalNextActiveTask(void);
//?
?
?
指针函数osalNextActiveTask(void)指向osalTaskRec_t这种结构体的首地址
//Thisfunctionwillreturnataskpointertothetask,foundwiththepassedintaskID.
//返回任务指针到任务(从任务ID中找到的任务)
externosalTaskRec_t*osalFindTask(bytetaskID);
OSAL_Task.c
1.INCLUDES
/*********************************************************************
*INCLUDES
**********************************************************************/
#include"ZComDef.h"
#include"OSAL.h"
#include"OSAL_Tasks.h"
#include"OSAL_Custom.h"
2.GLOBALVARIABLES
/*********************************************************************
*GLOBALVARIABLES
**********************************************************************/
//TaskControl
osalTaskRec_t*tasksHead;//指针tasksHead指向osalTaskRec这类结构体
osalTaskRec_t*activeTask;//同上
bytetaskIDs;
(任务列表头;激活任务;任务ID)
3.FUNCTIONS
/*********************************************************************
*FUNCTIONS
*********************************************************************/
//初始化任务系统(任务是以栈的形式存在的)
voidosalTaskInit(void)
{
tasksHead=(osalTaskRec_t*)NULL;//指针tasksHead指向空。
=应是一个地址(osalTaskRec_t类型空结构体NULL的地址)
activeTask=(osalTaskRec_t*)NULL;
taskIDs=0;
}
//特别注意这个函数,osalTaskAdd();
//添加一个任务到列表,保持任务的优先级
voidosalTaskAdd(pTaskInitFnpfnInit,
pTaskEventHandlerFnpfnEventProcessor,
bytetaskPriority)////(指向任务初始化函数的指针,指向任务处理函数的指针,任务优先级别)
{
osalTaskRec_t*newTask;
osalTaskRec_t*srchTask;
osalTaskRec_t**ptr;//指针变量ptr指向另一指针变量
newTask=osal_mem_alloc(sizeof(osalTaskRec_t));//任务以栈的形式存在,为其分配空间,空间大小即描述任务的结构体的大小
if(newTask)
{
//Fillinnewtask
newTask->pfnInit=pfnInit;//pfnInit是指向任务初始化函数的指针
大意应该是新任务结构体中的任务初始化函数=pfnInit(这个指针所指的函数肯定还要定义过)
newTask->pfnEventProcessor=pfnEventProcessor;//同上,任务处理函数
newTask->taskID=taskIDs++;//赋给新任务taskID后自增1
newTask->taskPriority=taskPriority;
newTask->events=0;
newTask->next=(osalTaskRec_t*)NULL;
//'ptr'istheaddressofthepointertothenewtaskwhenthenewtaskisinserted.Initiallyitissettoaddressof'tasksHead'incasethenew
taskishigherprioritythantheexistingheadorthequeueisempty.
ptr=&tasksHead;//ptr双重指针,其值应为ptr所指向的指针变量的地址
srchTask=tasksHead;//
while(srchTask)
{
if(newTask->taskPriority>srchTask->taskPriority)
{
//inserthere.Newtaskhasahigherprioritythanthetask
//withwhichisbeingcomparedandalowerorequalpriority
//toanytaskthatprecedesit.
newTask->next=srchTask;
*ptr=newTask;//指针变量*ptr的值(指向一个osalTaskRec类型结构体的首地址)=指针变量newTask的值(即其所指向的osalTaskRec类型结构体的首地址)//注意ptr是双重指针?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
return;
}
//set'ptr'toaddressofthepointerto'next'inthecurrent
//(soontobeprevious)taskcontrolblock
ptr=&srchTask->next;//双重指针ptr指向指针变量srchTask->next的地址
srchTask=srchTask->next;//指针变量srchTask的值(即其所指向的osalTaskRec类型结构体的首地址)=指针变量srchTask->next的值(同样即其所指向的osalTaskRec类型结构体的首地址)
}
//We'reattheendofthecurrentqueue.Newtaskisnothigher
//prioritythananyotheralreadyinthelist.Makeitthetail.
//(Itisalsotheheadifthequeuewasinitiallyempty.)
*ptr=newTask;
}
return;
}
//调用每个任务的初始化函数
voidosalInitTasks(void)
{
//Startatthebeginning
activeTask=tasksHead;//激活任务(初始化任务)
//两个指针都是指向osalTaskRec这类结构体
//Stopattheend
while(activeTask)
{
if(activeTask->pfnInit)
activeTask->pfnInit(activeTask->taskID);//任务初始化函数pfnInit(taskID),实参activeTask->taskID
activeTask=activeTask->next;
}
activeTask=(osalTaskRec_t*)NULL;
}
//指向下一个任务
osalTaskRec_t*osalNextActiveTask(void)
{
osalTaskRec_t*srchTask;
//Startatthebeginning
srchTask=tasksHead;
//Whenfoundornot
while(srchTask)//找到有任务,执行while()里面的程序
{
if(srchTask->events)//此任务有事件未处理,返回这个任务
{
//taskishighestprioritythatisready
returnsrchTask;
}
srchTask=srchTask->next;//此任务无事件要处理,指向下一任务
}
returnNULL;//没有找到任务,返回null
}
//返回任务指针到任务(在任务ID中找到的任务)
osalTaskRec_t*osalFindTask(bytetaskID)
//这个函数返回一个指向osalTaskRec_t类结构体的指针
{
osalTaskRec_t*srchTask;//srch=search
//Startatthebeginning
srchTask=tasksHead;
//Whenfoundornot
while(srchTask)//找到有任务
{
//Lookforanyactivity
if(srchTask->taskID==taskID)//任务ID相同,即是我们所要找的任务
return(srchTask);//则返回这个任务(任务是以堆栈的形式存在的)
srchTask=srchTask->next;//任务ID不相同,往下找
}
return((osalTaskRec_t*)NULL);//没有任务,返回NULL,即空的结构体
}