网站大量收购独家精品文档,联系QQ:2885784924

网友zigbee学习感悟.docx

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
网友zigbee学习感悟

有关zstack的osal机制的理解? ? ? ? 本文就浅谈一下有关osal的事件驱动消息响应的机制。我是菜鸟,没有做过什么软件,没有搞过VC,没有学过linux,所以理解起来就有点吃力,所以现在感觉没有不懂软件的it民工真可怕。ok,切入正题。? ? ? 一、windows OS的事件驱动消息响应机制? ? ? ?osal是面向多用户的操作系统,现在活着的操作系统基本上都是多用户的,所以我们现在先来了解一下windows OS的基于事件驱动消息响应的机制,先以基于windows窗口程序为例吧。? ? ? ?假设现在有一个按键按下,windows OS就会首先知道有这个按键事件按下,那么这个时候windows OS就会向这个窗口发送消息,告诉这个这个窗口程序现在又按键事件发生了,并调用相应的事件处理函数来处理这个事件,并且windows OS会向这个事件发送相应的消息信息,并将这个消息放到这个窗口的消息队列中。消息信息中包含相关参数信息,比如是哪一个按键按下。在这里我们可以看到很多这里有很多的事情是windows OS来为这个窗口程序来处理的,而不是窗口程序本身,也就是说是windows OS为调用了窗口程序而不是窗口程序调用了windows OS的API函数来处理事件。? ? ? ?在windows OS调用了相应事件的处理函数以后,那么就会执行这个函数,并对消息作出相应的处理。当进入到事件处理函数以后,首先会读取从消息队列中读取消息,然后作出处理,看看是鼠标按键按下了还是数字键按下等等。? ? ? ?二、ZStack中消息响应的过程? ? ? ?有了上面的理解基础之后,我们来看看zstack中是如何来进行事件驱动消息响应的。? ? ? ?前面的一篇“ZStack任务”文章讲过如下一段话:Any OSAL Task must implement two methods:one to perform task initialization and the other to handle task?events. 也就是说任何一个任务包含两个必需成分:初始化和处理。初始化主要是进行任务id,端点的配置等等。处理部分就是一个处理函数,用于处理事件发生的事情。voidosalInitTasks( void ){? uint8taskID = 0;?? tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);? osal_memset(tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));? ...? SAPI_Init(taskID );}? ? ? ?这是初始化函数,这里实现了两个功能,第一个是初始化任务,并且将任务加入到任务队列中。这里主要是依据后面的一个tasksArr[]数组中对应的顺序决定哪一个初始化函数对已哪一个事件处理函数。接着看下面的。在完成各类初始化以后,系统就调用这个osal_start_system();这就意味着进入到了操作系统的死循环中,也就是任务调度中。先看代码,亲们。voidosal_start_system( void ){#if !defined ( ZBIT ) !defined ( UBIT )? for(;;) ?// Forever Loop#endif? {? ? uint8idx = 0;?? ? osalTimeUpdate();? ? Hal_ProcessPoll(); ?// This replaces MT_SerialPoll() and osal_check_timer().? ??? ? do {? ? ? if (tasksEvents[idx]) ?// Task is highest priority that is ready.? ? ? {? ? ? ? break;? ? ? }? ? } while (++idx tasksCnt);?? ? if (idx tasksCnt)? ? {? ? ? uint16 events;? ? ? halIntState_tintState;?? ? ? HAL_ENTER_CRITICAL_SECTION(intState);? ? ? events = tasksEvents[idx];? ? ? tasksEvents[idx] = 0; ?// Clear the Events for this task.? ? ? HAL_EXIT_CRITICAL_SECTION(intState);?? ?? events = (tasksArr[idx])( idx, events );??

文档评论(0)

383947923 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档