zigbee协议栈OSAL分析

Haile ·
更新时间:2024-09-21
· 503 次阅读

本文从源程序出发,分享本人学习zigbee协议栈的一些理解,介绍zigbee协议栈OSAL任务调度及用户自定义任务的调度处理过程。为了便于抓住本质,理清思路,本文剔除一些无关部分。

程序的入口是ZMain.c文件下的main(),是系统的主流程,核心为 osal_init_system()(初始化操作系统)和osal_start_system()(启动操作系统)。

在 osal_init_system()中主要需要关注的是osalInitTasks()(初始化系统任务),该函数为tasksEvents[idx]分配内存空间,用于存储任务号为idx的任务所触发的事件。当某一任务发生某个事件时,系统会自动填写该表。用户创建的任务SampleApp_Init( taskID )添加在该函数的末尾。

void osalInitTasks( void ) { uint8 taskID = 0; // 分配tasksEvents内存空间,并设置为0 tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt); osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt)); //各任务初始化 macTaskInit( taskID++ ); nwk_init( taskID++ ); Hal_Init( taskID++ ); MT_TaskInit( taskID++ ); APS_Init( taskID++ ); APSF_Init( taskID++ ); ZDApp_Init( taskID++ ); ZDNwkMgr_Init( taskID++ ); SampleApp_Init( taskID ); //用户创建的任务 }

tasksArr[]是定义好的事件处理函数表,里面按照osalInitTasks()中任务初始化的顺序存放各个任务的事件处理函数,这样就可以保证各任务与其事件处理函数一致。

const pTaskEventHandlerFn tasksArr[] = { macEventLoop, nwk_event_loop, Hal_ProcessEvent, MT_ProcessEvent, APS_event_loop, APSF_ProcessEvent, ZDApp_event_loop, ZDNwkMgr_event_loop, SampleApp_ProcessEvent//用户创建的任务事件处理函数 };

 tasksEvents与tasksArr关系如下图。

用tasksEvents[idx]事件表记录任务号为idx的任务发生的事件; 用tasksArr[idx]函数表任务号为idx的任务事件处理函数; 通过任务号idx关联事件表和函数表;

在osal_start_system中扫描tasksEvents[idx],找到tasksEvents[idx]!=0的任务号idx,并通过 (tasksArr[idx])( idx, events )调用tasksArr[idx]中的函数处理该任务的事件;

在事件处理函数中判断事件类型,如SYS_EVENT_MSG(系统消息事件)、用户自定义事件等。针对SYS_EVENT_MSG,需先从消息队列中获取本任务的消息,再判断该消息的类型,如:KEY_CHANGE(按键事件)、AF_INCOMING_MSG_CMD(接收数据事件)、ZDO_STATE_CHANGE(网络状态改变事件)等。

前面有点散,最后总结一下,osal工作原理:

建立tasksArr[idx]函数表,用于记录任务号为idx的任务事件处理函数; 建立tasksEvents[idx]事件表,用于记录任务号为idx的任务发生的事件; 循环扫描tasksEvents[idx]事件表,找到tasksEvents[idx]!=0的任务号idx,并通过 (tasksArr[idx])( idx, events )调用tasksArr[idx]中的函数处理该任务的事件。

 

zzlqzzlq 原创文章 1获赞 1访问量 14 关注 私信 展开阅读全文
作者:zzlqzzlq



zigbee协议 zigbee

需要 登录 后方可回复, 如果你还没有账号请 注册新账号