1、TI06版Zigbee协议栈学习01TI_06版Zigbee协议栈学习_01 整个协议栈是以一个OS贯穿的,我们要加入自己的应用,就要添加一个任务,在任务中执行,与协议栈连接。首先在OSAL_Task.h头文件中声明函数,在OSAL_Task.c中实现这些函数,完成以下的功能:任务系统的初始化,加一个任务到任务列表,调用每个任务的初始化函数,指到下一个任务,返回任务指针到任务(从任务ID中找到的任务)。Int *p;Int i;P=&i;/指针P指向一个整形变量i,即指针P的值是i的的址;OSAL_Task.h1. CONSTANTS/* * CONSTANTS */#define TASK_
2、NO_TASK 0xFF/ Task priority level 定义任务优先级#define OSAL_TASK_PRIORITY_LOW 50#define OSAL_TASK_PRIORITY_MED 130#define OSAL_TASK_PRIORITY_HIGH 2302. TYPEDEFS/* * TYPEDEFS */ Task Initialization function prototype 任务初始化函数原型typedef void (*pTaskInitFn)( unsigned char task_id );/ Event handler function pro
3、totype 事件处理函数原型 / pTaskInitFn所定义函数指针类型的别名,用此类型生成一个指向函数的指针(如下面的pTaskInitFn pfnInit,则当pfnInit获取函数的地址后,就可以像调用原函数一样来使用这个函数指针:pfnInit(unsigned char task_id)typedef unsigned short (*pTaskEventHandlerFn)( unsigned char task_id, unsigned short event );/(解释同上,pTaskEventHandlerFn pfnEventProcessor后,可以像调用原函数一样
4、来使用这个函数指针pfnEventProcessor( unsigned char task_id, unsigned short event ))typedef struct osalTaskRec/任务是以栈的形式存在的 struct osalTaskRec *next; pTaskInitFn pfnInit;/ pfnInit是指向任务初始化函数的指针 pTaskEventHandlerFn pfnEventProcessor;/ pfnEventProcessor是指向事件处理函数的指针 byte taskID; byte taskPriority; uint16 events; o
5、salTaskRec_t;/ osalTaskRec_t是一个结构体类型(别名)3. GLOBAL VARIABLES/* * GLOBAL VARIABLES*/extern osalTaskRec_t *activeTask;/ 指针activeTask指向osalTaskRec_t这种结构体类型的首地址4. FUNCTIONS/* * FUNCTIONS */ Initialization for the Tasking System. 任务系统的初始化extern void osalTaskInit( void );/ 特别注意这个函数,osalTaskAdd():/ Add a ta
6、sk to the task list 加一个任务到任务列表extern void osalTaskAdd( pTaskInitFn pfnInit, pTaskEventHandlerFn pfnEventProcessor, byte taskPriority);/(指向任务初始化函数的指针,指向事件处理函数的指针,任务优先级别)/ Call each of the tasks initailization functions. 调用每个任务的初始化函数extern void osalInitTasks( void );/ This function will return the nex
7、t active task. 指到下一个任务extern osalTaskRec_t *osalNextActiveTask( void );/?指针函数osalNextActiveTask(void)指向osalTaskRec_t这种结构体的首地址/ This function will return a task pointer to the task ,found with the passed in task ID./ 返回任务指针到任务(从任务ID中找到的任务)extern osalTaskRec_t *osalFindTask( byte taskID );OSAL_Task.c1
8、. INCLUDES/* * INCLUDES */#include ZComDef.h#include OSAL.h#include OSAL_Tasks.h#include OSAL_Custom.h2. GLOBAL VARIABLES/* * GLOBAL VARIABLES */ Task ControlosalTaskRec_t *tasksHead;/指针tasksHead指向osalTaskRec这类结构体osalTaskRec_t *activeTask;/同上byte taskIDs;(任务列表头;激活任务;任务ID)3. FUNCTIONS/* * FUNCTIONS *
9、/ 初始化任务系统(任务是以栈的形式存在的)void osalTaskInit( void ) tasksHead = (osalTaskRec_t *)NULL;/指针tasksHead指向空。 = 应是一个地址(osalTaskRec_t类型空结构体NULL的地址) activeTask = (osalTaskRec_t *)NULL; taskIDs = 0;/ 特别注意这个函数,osalTaskAdd();/ 添加一个任务到列表,保持任务的优先级void osalTaskAdd( pTaskInitFn pfnInit, pTaskEventHandlerFn pfnEventProc
10、essor, byte taskPriority)/ /(指向任务初始化函数的指针,指向任务处理函数的指针,任务优先级别) osalTaskRec_t *newTask; osalTaskRec_t *srchTask; osalTaskRec_t *ptr;/指针变量ptr指向另一指针变量 newTask = osal_mem_alloc( sizeof( osalTaskRec_t ) );/任务以栈的形式存在,为其分配空间,空间大小即描述任务的结构体的大小 if ( newTask ) / Fill in new task newTask-pfnInit = pfnInit;/ pfnI
11、nit是指向任务初始化函数的指针大意应该是新任务结构体中的任务初始化函数= pfnInit(这个指针所指的函数肯定还要定义过) newTask-pfnEventProcessor = pfnEventProcessor;/同上,任务处理函数 newTask-taskID = taskIDs+; /赋给新任务taskID后自增1 newTask-taskPriority = taskPriority; newTask-events = 0; newTask-next = (osalTaskRec_t *)NULL; / ptr is the address of the pointer to t
12、he new task when the new task is inserted. Initially it is set to address of tasksHead in case the newtask is higher priority than the existing head or the queue is empty. ptr = &tasksHead;/ptr双重指针,其值应为ptr所指向的指针变量的地址 srchTask = tasksHead; / while (srchTask) if (newTask-taskPriority srchTask-taskPrio
13、rity) / insert here. New task has a higher priority than the task / with which is being compared and a lower or equal priority / to any task that precedes it. newTask-next = srchTask; *ptr = newTask; / 指针变量*ptr的值(指向一个osalTaskRec类型结构体的首地址)=指针变量newTask的值(即其所指向的osalTaskRec类型结构体的首地址)/注意ptr是双重指针? return;
14、 / set ptr to address of the pointer to next in the current / (soon to be previous) task control block ptr = &srchTask-next;/双重指针ptr指向指针变量srchTask-next的地址 srchTask = srchTask-next;/ 指针变量srchTask的值(即其所指向的osalTaskRec类型结构体的首地址)=指针变量srchTask-next的值(同样即其所指向的osalTaskRec类型结构体的首地址) / Were at the end of the
15、current queue. New task is not higher / priority than any other already in the list. Make it the tail. / (It is also the head if the queue was initially empty.) *ptr = newTask; return;/ 调用每个任务的初始化函数void osalInitTasks( void ) / Start at the beginning activeTask = tasksHead;/激活任务(初始化任务)/ 两个指针都是指向osalT
16、askRec这类结构体 / Stop at the end 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
17、; / Start at the beginning srchTask = tasksHead; / When found or not while ( srchTask ) /找到有任务,执行while()里面的程序 if (srchTask-events)/此任务有事件未处理,返回这个任务 / task is highest priority that is ready return srchTask; srchTask = srchTask-next;/此任务无事件要处理,指向下一任务 return NULL;/没有找到任务,返回null/ 返回任务指针到任务(在任务ID中找到的任务)o
18、salTaskRec_t *osalFindTask( byte taskID )/这个函数返回一个指向osalTaskRec_t类结构体的指针 osalTaskRec_t *srchTask; /srch=search / Start at the beginning srchTask = tasksHead; / When found or not while ( srchTask )/找到有任务 / Look for any activity if ( srchTask-taskID = taskID )/任务ID相同,即是我们所要找的任务 return ( srchTask );/则返回这个任务(任务是以堆栈的形式存在的) srchTask = srchTask-next;/ 任务ID不相同,往下找 return ( (osalTaskRec_t *)NULL );/没有任务,返回NULL,即空的结构体
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1