- 1、本文档共20页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ZIGBEE协议栈OSAL运行 机理及任务添加
授课内容
□ OSAL的调度机制 □ OSAL任务添加
OSAL的简介
?OSAL是一种支持多任务运行的系统资源分配机 制。
?OSAL与标准的操作系统有一定的区别,它实现 了类似操作系统的功能,如:任务切换、提供了 内存管理功能等,但OSAL并不是真正意义的操 作系统。
OSAL的调度机制
OSAL的调度机制可分为三部分:
、任务调度
、时间管理 三、原语通信
任务调度
□协议栈的每一层都设计了一个事件处理函数, 用来处理与这一层操作相关的各种事件。
ZigBee协议栈的实时性要求不高,所以OSAL 采用了轮询任务调度队列的方法来进行任务调 度管理。
OSAL采用一个链表结构来管理协议栈各层相应 的任务。
任务调度
OSAL
OSAL的工作原理示意图
任务调度:链表中数据结构
typedef void (*pTasklnitFn)(unsigned char task_id); 〃指向任务初始化函数 typedef void (*pTaskEventHandlerFn)(usigned char taskjd unsigned short event_flag) ; 旨向事件处理函数
typedef struct osalTaskRec
上面是链表中每一项数据结构,与任务链表有 关的主要操作有:添加任务到列表、获取下一 个任务、根据taskID查找相应的任务。
uintl6
}
osalTaskRec_t;
eve nts;
〃需要被处理的事件
〃链表中的每一项数据结构
任务调度
根据taskID查找任务
系统主循环函数 设置事件发生的标志
时间管理
?协议栈中每层都有事件发生,这些事件发生的 时间顺序不同。
OSAL调度程序设计了与时间管理相关的函数,用 来各种不同的要被处理的事件。
?对事件进行时间管理,OSAL采用了链表的方 式进行,有时发生一个要被处理的事件,就启 动一个逻辑上的定时器,并将此定时器添加到 链表当中。
原语通信
edef struct
程:byte task_id; byte dst_task_id;
程:
0 byte send Jen; }osal_msg_rec_header_t;
typedef struct
{
osal_msg_rec_header_t hdr;
byte *msg_ptr;
}osaLmsg_receivedJ; 〃消息结构(上面结构体包含在里
extern osal_msg_received_t osal_rcvd; 〃全局变量
extern osal_msg_received_t *osal_msg_receive(byte tack irl\- ~ ~
OSAL
OSAL添加新任务
添加新任务只要对两个函数进行编程:
?1、新任务初始化函数 ?2、新任务的事件处理函数
后:const pTaskEventHandlenFn tasksArr[] = { macEventLoop, nwk_event_loop;
后:
const pTaskEventHandlenFn tasksArr[] = { macEventLoop, nwk_event_loop;
Hal_ProcessExent;
#if defind(MT_TASK) MT_ProcessEvevt;
#endif APS_event_loop;
#if defined
(ZIGBEE.FRAGMENTATION)
APSF_ProcessEvent;
#endif ZDApp_event_loop, #if defind(ZIGBEE_FREQ_AGILITY)|| defined (ZIGBELPANID_CO NFLI CT)
ZDNwkMgr_event_loop;
#endif
Gen ericApp_ProcessEvent
};
□事件处理函数的地址加入tasksAr叩数组, 代码:
Const pTaskExentHandlerFn taskArr[] =
{
macEve ntLoop;
n wk_eve nt_ loop;
Hal_ProcessEve nt;
#if defind(MT_task)
MT_ProcessEvent;
#endif
APS_eve nt_ loop;
#if defined (ZIGBEE_FRAGMENTATION)
APSF_ProcessEvent;
#endif
ZDApp_eve nt_loop;
#if defind
(ZIGBEE_FREQ_AGILITY)||defined(ZIGBEE_PANID_CONFLICT)
ZDNwkMgr_eve nt」o op『
#endif
Genen
文档评论(0)