TI06版Zigbee协议栈学习01.docx

上传人:b****8 文档编号:27927289 上传时间:2023-07-06 格式:DOCX 页数:7 大小:17.80KB
下载 相关 举报
TI06版Zigbee协议栈学习01.docx_第1页
第1页 / 共7页
TI06版Zigbee协议栈学习01.docx_第2页
第2页 / 共7页
TI06版Zigbee协议栈学习01.docx_第3页
第3页 / 共7页
TI06版Zigbee协议栈学习01.docx_第4页
第4页 / 共7页
TI06版Zigbee协议栈学习01.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

TI06版Zigbee协议栈学习01.docx

《TI06版Zigbee协议栈学习01.docx》由会员分享,可在线阅读,更多相关《TI06版Zigbee协议栈学习01.docx(7页珍藏版)》请在冰豆网上搜索。

TI06版Zigbee协议栈学习01.docx

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,即空的结构体

    }

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 英语考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1