首页 [原创]奥特曼Zigbee读书日记

[原创]奥特曼Zigbee读书日记

举报
开通vip

[原创]奥特曼Zigbee读书日记[原创]奥特曼Zigbee读书日记(一) [导言]   本人做过几年单片机的开发工作,主要用的是8051内核的和瑞萨740系列的,在这个ARM大行其道的时代,也曾经试着接触过,不过很容易在复杂的内核中迷失了自己~~~一直对这种能全局掌控的小系统痴迷,一个国外朋友无意间提到Zigbee这种技术,从百度百科开始了解,然后疯狂搜集资料,对这种技术甚是感兴趣,加上最近媒体对“物联网”的吹捧,终于坐不住了,买书,买开发板,动工啦~~~~   此笔记将从零开始,记录本人的学习过程里遇到的问题及答案,希望对大家能有所帮助,也...

[原创]奥特曼Zigbee读书日记
[原创]奥特曼Zigbee读书日记(一) [导言]   本人做过几年单片机的开发工作,主要用的是8051内核的和瑞萨740系列的,在这个ARM大行其道的时代,也曾经试着接触过,不过很容易在复杂的内核中迷失了自己~~~一直对这种能全局掌控的小系统痴迷,一个国外朋友无意间提到Zigbee这种技术,从百度百科开始了解,然后疯狂搜集资料,对这种技术甚是感兴趣,加上最近媒体对“物联网”的吹捧,终于坐不住了,买书,买开发板,动工啦~~~~   此笔记将从零开始,记录本人的学习过程里遇到的问题及答案,希望对大家能有所帮助,也希望得到高手的指点。 [注:本文源自www.feibit.com--“飞比”Zigbee论坛,为尊重劳动者成果,如需转载请保留此行] [问题记录] 1. 买开发板之前的先略去不写了,以后有空补上。第一个问题就是开发板到手了,从哪开始?   毕竟对单片机有些了解,基础实验只是大概跑了下看了看结果,心里大概对开发板的外设有个底。然后进入最关键的通信部分,不知道有没有“大跃进”了,后面如果学起来有难度,再把课补上。下载了“数据传输实验”的程序到开发板,看了下运行结果,然后下一步就是读程序,看下这个结果是如何产生的? 2. 用source insight如何阅读IAR的项目源码?    答案见本版“如何用source insight编辑IAR项目源码?”及“IAR的workspace文件组织” 3. 多年来学习单片机的习惯,从"main"函数开始,但是"main"在哪里? ..\Projects\zstack\ZMain\TI2430DB\ZMain.c 4. "ROOT"是什么意思? 以下是“8051 IAR Assembler”中对此的解释: NOROOT, ROOT NOROOT means that the segment part may be discarded by the linker if no symbols in this segment part are referred to. Normally all segment parts except startup code and interrupt vectors should set this flag. The default mode is ROOT which indicates that the segment part must not be discarded. 简单翻译下: NOROOT 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示如果此部分代码从来没有被调用到,那么这部分代码会被linker抛弃。一般来讲,除了startup和中断的代码都应该设为NOROOT。默认的模式为ROOT,即linker不会抛弃。 --by outman from feibit.com 2010.4.7 5. 到底学习zigbee应该从哪开始?   走马观花地看过一本入门书,本以为买了开发板,调试一下里面的通信程序就能快速入门了。昨天看了一天的程序才发现这种想法太急功近利了,有句古话怎么讲来着--“欲速则不达”,古人的话还是有道理的,于是决定调整思路,放平心态。但是到底从哪开始呢?国内Zigbee方面的书寥寥无几,大多数又总感觉有种功利色彩。罢了,读英文的吧(借机感谢下我大学良师albert,亏着他当时的提点,现在读英文书还不算吃力)。近期准备从两个地方下手,一个是TI的Zstack手册,另外一个是国外的朋友推荐的一本叫Newnes.ZigBee.Wireless.Networks.and.Transceivers的电子书,不想读电子版的,只是在深圳的书店还没找到。这是一本360多页的大部头,个人比较欣赏国外这种风格的书,往往深入浅出,让一个没太有基础的人也容易读得懂,不用搞一大堆书去看同一个东西。国内的大部头也不少,但很多感觉像我小时候写作文的风格--扯远了,抓紧时间吧~~~ --by outman from feibit.com  2010.4.8 6. cc2430后面的的DB,BB,EB代表什么意思? BB: Battery Board DB: Development Board EB: Evaluation Board 分别对应TI公司开发的三种板型,其功能按上顺序依次变强。可以参看"Z-Stack User's Guide for CC2430"的图片,以获得直观认识(具体位置在:开始==》程序==》Texas Instruments ==》ZStack-1.4.3-1.2.1) --by outman 2010.4.8 HYPERLINK "http://www.feibit.com/bbs/attachment.php?aid=MTY3fGZlNzFhOWRifDEyOTYxODczMzh8MDBhM2JqOTlMcmdMSXBlNTZqb0VPUTdNN08rQ09TcENIUDhEeGQ4" \t "_blank" INCLUDEPICTURE "http://www.feibit.com/bbs/attachments/month_1006/10060115591589fe5400c23101.jpg" \* MERGEFORMATINET BB.JPG DB.JPG EB.JPG 7. Coordinator, Router与End Device有什么区别? 好本与烂书的区别在于,好书在开头的时候就知道你在想什么,而烂书呢,到读到最后你也不知道他在想什么。。。 这个问题的答案在那本英文“大部头”的前面章节: 1.7 Device Types There are two types of devices in an IEEE 802.15.4 wireless network: full-function devices (FFDs) and reduced-function devices (RFDs). An FFD is capable of performing all the duties described in the IEEE 802.15.4 standard and can accept any role in the network. An RFD, on the other hand, has limited capabilities. For example, an FFD can communicate with any other device in a network, but an RFD can talk only with an FFD device. RFD devices are intended for very simple applications such as turning on or off a switch. The processing power and memory size of RFD devices are normally less than those of FFD devices. 1.8 Device Roles In an IEEE 802.15.4 network, an FFD device can take three different roles: coordinator, PAN coordinator, and device. A coordinator is an FFD device that is capable of relaying messages. If the coordinator is also the principal controller of a personal area network (PAN), it is called a PAN coordinator . If a device is not acting as a coordinator, it is simply called a device . The ZigBee standard uses slightly different terminology (see Figure 1.5 ). A ZigBee coordinator is an IEEE 802.15.4 PAN coordinator. A ZigBee router is a device that can act as an IEEE 802.15.4 coordinator. Finally, a ZigBee end device is a device that is neither a coordinator nor a router. A ZigBee end device has the least memory size and fewest processing capabilities and features. An end device is normally the least expensive device in the network. device type.JPG 咦,那位同学举手干吗?~~~什么?翻译一下?唉,都说了让你上学的时候读好英文的~~~ 那好吧,不过俺也是非专业水平,写得不好别扔砖啊。。。。 1.7 设备类型 IEEE 802.15.4无线网络 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 中定义了两种设备:全功能设备(FFDs)和半功能设备(RFDs)。FFD可以执行IEEE 802.15.4 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 中的所有功能,并且可以在网络中扮演任何角色,那反过来讲,RFD就有功能限制啦。比如FFD能与网络中的任何设备“说话”,而RFD就只能和FFD“私聊”啦。RFD设备的用途是为了做一些简单功能的应用,比如做个开关之类的。而其功耗与内存大小都比FFD要小很多。 1.8 设备角色 IEEE 802.15.4网络中,一个FFD可以扮演三个角色-协调器(Coordinator)、PAN协调器(PAN coordinator)和设备(device),其中协调器是一个全功能设备(FFD),它可以在网络中传递信息(做传话筒)。如果一个协调器在一个PAN(personal area network,个人区域网络)网络中做主控制器(老大的位置呃),那我们把它叫做PAN协调器。除此之外,就不用多说啦,就叫设备(你我一样的平头百姓) Zigbee协议中的定义与IEEE 802.15.4的定义大同小异,Zigbee中的“Coordinator”是IEEE 802.15.4中的“PAN Coordinator";Zigbee中的“router”就是IEEE 802.15.4中的“Coordinator”,而“end device”就是指上面的平头百姓“device”啦。。。end device的内存、处理能力及功能都是最小的,当然也是网络中最便宜的了--这不是说我吗~~~ --by outman from feibit.com  2010.4.8 8. 网络拓扑结构 这算是个问题吗?星形、网形、树形。。。很多人是不是能脱口而出?对于俺们这些非网络专家又对这个有点了解的人来说,脑子里好像总有那么点印象,又有点模糊。“学问来不得半点虚假”,这是谁说的来?我们可是要做网络专家的人哪,来一起把它弄清楚吧。。。 上“葵花宝典”第一式第9节(“大部头”有新名字了,这本书写得真不错,免费打个广告~~) 再扯一句,这个世界本来没有 规则 编码规则下载淘宝规则下载天猫规则下载麻将竞赛规则pdf麻将竞赛规则pdf ,规则都是上级定的~ End device==>Router==>Coordinator==>人==>? 言归正传: 网络结构是由zigbee网络层来管理的,它必须是IEEE 802.15.4中规定的两种(知道谁是上级了~)--星形和点对点形(这个名字怎么没太听过。。。) 图1.6所示的星形结构中,每个节点都只能和PAN Coordinator(以后这种名字都不叫中文了,作为一个程序员见得多的其实是英文)通讯。一个典型的星形网络构建过程是这样的:一个被注入PAN coordinator程序(软件)的FFD(硬件)开始工作后,开始着手构建网络,他要做的第一件事就是要在他无线电波所覆盖到的空间区域内,先选择一个唯一的PAN网络标识号--他也有上级啊,不能乱搞~~,这个标识号一定要是附近其他网络没用到的。 在图1.7所示的“点对点”形的拓扑结构中,任意两个节点只要靠得足够近,都可以建立连接并通讯。在点对点形的网络结构中,任何FFD都可以扮演PAN coordinator的角色,大家都是老大?那到底谁是真正的老大呢?那就看谁是这个网络的创史人了--谁第一个建的这个网络,谁就是老大!在点对点网络中,所有担任“传话筒”的设备都是FFD,因为RFD没有这个功能(被阉割了嘛~),但RFD也可以作为网络的一员,他只能和指定设备(coordinator或者 router)通讯。 一个“点对点”的网络可以通过限制设备的一些功能,实现不同“形状”的网络。如果完全没有限制,那就是一个“网状”拓扑,另外一种是图1.8所示的“树状”拓扑,在这种结构中,Zigbee coordinator搭建了原始网络,router形成了树枝进行信息传递(传话筒),end device就是最后的树叶了,不能往下级传递信息了(它本来就是最下级嘛)。而router可以扩展coordinator所搭建的网络。 图1.8也展示了router是如何扩展网络,甚至如何绕过障碍物的。比如A想和B说话,但是中间有墙挡的,信号强度又穿透不了,这个时候树形的网络结构就可以通过其它router传递信息,并最终到达B。我们有时把这种方式叫“多次反射”(multihopping),因为信息从一个节点反射到另外一个节点,最终到达目的地。这样就扩大了整个网络的信息覆盖面。 在一个IEEE 802.15.4网络中,无论是哪种拓扑结构,网络总是由PAN coordinator来创建,PAN coordinator控制整个网络,并至少完成以下任务: ●给本网络中每个设备指定一个16位或者64位的地址 ●通过网络发起、结束和传递信息 ●为本网络选定唯一的PAN网络标识号,这个标识号允许本网络内的设备使用16位的短地址方式,并且可以与其他的独立网络进行通讯 在整个网络中,只有一个PAN coordinator,所以PAN coordinator往往需要长时间在工作状态,所以它常需要连接稳压电源,而不是电池。但其他设备往往都是用电池来供电的,一个最小的网络包括两个设备,一个PAN coordinator与一个device. -- by outman 2010.4.8 from feibit.com 附英文原文: 1.9 ZigBee Networking Topologies The network formation is managed by the ZigBee networking layer. The network must be in one of two networking topologies specified in IEEE 802.15.4: star and peer-to-peer. In the star topology , shown in Figure 1.6 , every device in the network can communicate only with the PAN coordinator. A typical scenario in a star network formation is that an FFD, programmed to be a PAN coordinator, is activated and starts establishing its network. The first thing this PAN coordinator does is select a unique PAN identifier that is not used by any other network in its radio sphere of influence —the region around the device in which its radio can successfully communicate with other radios. In other words, it ensures that the PAN identifier is not used by any other nearby network. In a peer-to-peer topology (see Figure 1.7 ), each device can communicate directly with any other device if the devices are placed close enough together to establish a successful communication link. Any FFD in a peer-to-peer network can play the role of the PAN coordinator. One way to decide which device will be the PAN coordinator is to pick the first FFD device that starts communicating as the PAN coordinator. In a peer-to-peer network, all the devices that participate in relaying the messages are FFDs because RFDs are not capable of relaying the messages. However, an RFD can be part of the network and communicate only with one particular device (a coordinator or a router) in the network. star mesh.JPG A peer-to-peer network can take different shapes by defining restrictions on the devices that can communicate with each other. If there is no restriction, the peer-to-peer network is known as a mesh topology . Another form of peer-to-peer network ZigBee supports is a tree topology (see Figure 1.8 ). In this case, a ZigBee coordinator (PAN coordinator) establishes the initial network. ZigBee routers form the branches and relay the messages. ZigBee end devices act as leaves of the tree and do not participate in message routing. ZigBee routers can grow the network beyond the initial network established by the ZigBee coordinator. Figure 1.8 also shows an example of how relaying a message can help extend the range of the network and even go around barriers. For example, device A needs to send a message to device B, but there is a barrier between them that is hard for the signal to penetrate. The tree topology helps by relaying the message around the barrier and reach device B. This is sometimes referred to as multihopping because a message hops from one node to another until it reaches its destination. This higher coverage comes at the expense of potential high message latency. An IEEE 802.15.4 network, regardless of its topology, is always created by a PAN coordinator. The PAN coordinator controls the network and performs the following minimum duties: ● Allocate a unique address (16-bit or 64-bit) to each device in the network. ● Initiate, terminate, and route the messages throughout the network. ● Select a unique PAN identifier for the network. This PAN identifier allows the devices within a network to use the 16-bit short-addressing method and still be able to communicate with other devices across independent networks. There is only one PAN coordinator in the entire network. A PAN coordinator may need to have long active periods; therefore, it is usually connected to a main supply rather than a battery. All other devices are normally battery powered. The smallest possible network includes two devices: a PAN coordinator and a device. tree.JPG 9. TI协议栈所用系统框架探讨。 51的系统往往不是太大,但是几十K的程序,也足以让一个初学者望而却步。我们首先忽略C语言本身的难度,光是系统框架也让生手读起来很吃力,再加上这种到处是API跟"define"的程序,还没有正式学习协议部分就已经让人在丛林中“迷路”了。 在接下来的一段时间内,我会以TI所用的系统框架为主线进行学习,希望大家共同探讨。。。 [注:本文源自www.feibit.com--“飞比”Zigbee论坛,为尊重劳动者成果,如需转载请保留此行] 在层层迷雾中摸索了两天,终于拨云见日,那个心情啊,怎一个“爽”字了得~~~ 可是怎么能把这么复杂的一个问题讲得清楚呢?嗯。。。还是先上图吧 主循环函数处理机制.JPG 注:为了便于直观,以下涉及到数据地址的地方都是由上而下,地址由高变低 第1节、各个任务是如何被调用到的? 我们还是先从main()函数开始,看看各个任务之间是如何协调工作的。 插播一句广告:在一切都看不清的时候,忽略次要,看主要因素 -- by outman from feibit.com 我们直接进入主循环的核心部分,看一下系统中的几个主要的任务是如何被调用,并开始自己的使命的? 看一段程序的时候,往往要从它的数据结构入手。我们先看一下,主循环中的两个关键数组,*tasksEvents与*tasksArr,从图一中我们可以看出来,tasksEvents这个数组存放的是从序号为0到tasksCnt,每个任务在本次循环中是否要被运行,需要运行的任务其值非0(用橙色表示),否则为0。而tasksArr数组则存放了对应每个任务的入口地址,只有在tasksEvents中记录的需要运行的任务,在本次循环中才会被调用到。--这节讲完了。。。 又有同学举手?什么?还没明白?恩。。。好像是不能讲这么短的。。。 那好吧,把main函数贴过来,我们一点一点看 初始化过程“先不管”,我们先看主循环(dead loop) for(;;)  // Forever Loop {     uint8 idx = 0;     Hal_ProcessPoll();  // 先不管1     do {       if (tasksEvents[idx])  // 寻找最高优先级的任务来运行       {         break;       }     } while (++idx < tasksCnt);     if (idx < tasksCnt) //如果有任务需要运行     {       uint16 events;       halIntState_t intState;       HAL_ENTER_CRITICAL_SECTION(intState);       events = tasksEvents[idx];       tasksEvents[idx] = 0;  // 本任务运行完了,要对其清空,为后面要运行的任务让路       HAL_EXIT_CRITICAL_SECTION(intState);       events = (tasksArr[idx])( idx, events );//最关键的一句话,如图一中,运行对应的任务       HAL_ENTER_CRITICAL_SECTION(intState);       tasksEvents[idx] |= events;  // 本任务可能没完全完成,如果是这样,再次设置标志位,在下一次循环中继续执行       HAL_EXIT_CRITICAL_SECTION(intState);       }     } 第2节、系统时间 我们知道,每个操作系统(虽然我不认为OSAL是一个标准的操作系统,但我们先这么叫着吧)都有一个“节拍”-tick,就像每一个“活人”都有心跳一样。那么OSAL的心跳有多快呢?--1ms。当然这个速度是可以设置的,在osal_timer_activate函数中开启了系统节拍,用TICK_TIME来定义其速度 #define TICK_TIME   1000   // Timer per tick - in micro-sec 注意:这个1000是micro-sec(微秒),而不是milli-sec(毫秒)!我刚开始的时候就是误以为是1000ms而耽误了不少时间。 那这个心脏是怎么跳动起来的呢? 这得从“定时器”说起,由于本文的重点不是讲单片机基础的,如果对这个名字还陌生的同学,那还是回去先看看基础再来看这个吧。2430有4个定时/计数器,其中timer4用来做系统计时。如果认为是timer2的同学请看一下halTimerRemap这个函数。在上述osal_timer_activate函数中,开启了系统计时,并将timer4的初始设为TICK_TIME(1000),这样timer4就开始了从1000开始的减计数,减到0以后呢?寄存器TIMIF会产生一个溢出标志,那么它会立即产生中断并进入中断服务程序吗?不会的。 我们看一下第1节主函数里的“Hal_ProcessPoll();  // 先不管1”(不管的东西早晚要管的,只是时间的问题而已)  这个函数里调用了HalTimerTick,这个函数就是专门来检查是否有硬件定时器溢出的,如果有的话会调用halTimerSendCallBack这个函数,对溢出事件做处理。 回过头来说系统节拍,那timer4在计数满1000(即1ms)后做了些什么事呢,那我们看一下halTimerSendCallBack 这个函数 void halTimerSendCallBack (uint8 timerId, uint8 channel, uint8 channelMode) {   uint8 hwtimerid;   hwtimerid = halTimerRemap (timerId);   if (halTimerRecord[hwtimerid].callBackFunc)     (halTimerRecord[hwtimerid].callBackFunc) (timerId, channel, channelMode); } 这里面调用了“callBackFunc”函数,也就是说每个定时器溢出后都有一个callBackFunc函数,它在哪里呢,我们再看一下HalTimerConfig这个函数,它可以对每个定时器进行定义。那什么时候定义的呢?--InitBoard,即板子上电初始化的时候就做了这个定义的。我说什么来?“先不管”的东西,“后要管”的。。。 我们看到timer4的callBackFunc函数是Onboard_TimerCallBack,最终指向osalTimerUpdate,这个函数厉害了~ 从上面的 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 中我们知道它是每1ms被调用一次的,这样它就为应用程序提供了一个ms计时器,应用程序所用的定时往往以ms为单位足够了,这样的话就不用另外再占用硬件计时器了,毕竟只有4个嘛。。。同时这个函数还提供了一个系统时钟-osal_systemClock,看看它能计时多久吧,它是“uint32”型的,也就是2^32ms=49.7天,怎么样?你不会让这个系统时钟overflow吧:) 第3节、系统的消息处理机制 结合第1、2节中的内容,让我们一起进入到系统最核心的部分-消息处理中来吧(这个句型怎么这么耳熟~~~) 第1节中我们说了,tasksEvents数组存放了一个任务是否该被运行的序列,但是这个序列是如何产生的呢?如果了解了这个问题,那也就知道了OSAL系统的运作方式。 再插句广告:在浩如烟海的程序中搜索最重要的东西,就像大浪淘沙,其实也是蛮享受的一件事情--by outman from feibit.com source insight "ctr+/",整个项目搜索,我们发现了一个“osal_set_event”的函数是专门来设置tasksEvents的,但是似乎并不能帮到我们。继续搜!有两个很重要的地方引起了我们的注意:osalTimerUpdate和osal_msg_send这两个函数 osalTimerUpdate,这个称得上“厉害”的函数还记得吧?它会去设置tasksEvents?那不就是说,它可以让任务在主循环中被运行到?答对了,这就是它“厉害”的地方。。。那看看它运行任务的条件吧?       // When timeout, execute the task       if ( srchTimer->timeout == 0 )       {         osal_set_event( srchTimer->task_id, srchTimer->event_flag ); ... ... 也就是说,计时器溢出--恩。。。不多说了,我们埋个伏笔,先介绍另一个朋友-osal_start_timerEx,先看下它的自我介绍 /********************************************************************* * @fn      osal_start_timerEx * * @brief * *   This function is called to start a timer to expire in n mSecs. *   When the timer expires, the calling task will get the specified event. * * @param   byte taskID - task id to set timer for * @param   UINT16 event_id - event to be notified with * @param   UNINT16 timeout_value - in milliseconds. * * @return  ZSUCCESS, or NO_TIMER_AVAIL. */ byte osal_start_timerEx( byte taskID, UINT16 event_id, UINT16 timeout_value ) 也就是说,它会开始一个timeout_value(ms)的计时器,当这个计时器溢出时,则会对taskID这个task,设置一个event_id,让这个任务在后面的主循环中运行到,但是是怎么实现的呢?还是要请osalTimerUpdate来帮忙。。。 那位同学说啥?复杂了,听不懂? 唉,还是上图吧 图二、软件定时器数据链表.JPG 还是先从数据结构说起吧,不知道啥是“数据链表”的同学,把谭老师的书拿过来再读几遍。。。 这个表就是osalTimerUpdate函数的“任务表”,上面不是说过这个函数给应用程序提供了“软计时”了吗?就是体现在这里,osal_start_timerEx通过osalAddTimer向链表里添加了“定时任务”,由osalTimerUpdate来以ms为单位对这些“软定时器”减计数,溢出时,即调用osal_set_event,实现主循环里对任务的调用。 好了,到此讲了上面提到的"set event"函数中的一个osal_start_timerEx, 还有一个更厉害的还在外面呢,osal_msg_send,这就渐入佳境,进入最重要的消息处理机制了。。。 -- by outman from feibit.com 2010-4-14 18:00  下班啦,老婆在家等着回去一起做饭哪~~~晚上见~~~ 为了更好地说明这个问题,还是拿一个具体的例子来讲比较直观。不过在这个笔记中,我尽量不涉及具体开发板,而讲一些通用的知识,因为这样会让更多的人受益。在TI官方zstack 2006中有4个例子,其中一个叫GenericApp最基本的通信的例程,如果没有安装zstack的同学可以到“本站专用下载贴”中下载。当然由于讲的是些比较通用的东西,所以手头有开发板的同学可以用自己的开发板来试验,效果更好。。。 在这样的通信例程中,一般会有一个按键触发,然后会和相邻的模块进行通信,当然由于这部分是讲OSAL的系统框架的,我们先不涉及通信的内容,只是看一下按键是如何产生的,及如何调用相应的接口程序。 按OSAL的模块定义,按键可能在哪层来?硬件服务相关的,恩。。。是不是在HAL层呢?到Hal_ProcessEvent看看?有个HalKeyPoll函数不是?恩,这就是检测按键的地方~~不过,我可不是像上面这样这么容易猜出来的,这几句话足足用了我大半个钟头呢。。。过程我不细说了,有兴趣的话我可以再补充一下。 在HalKeyPoll函数中,无论按键是ADC方式,或者是扫描IO口的方式,最后都会生成一个键值keys, 然后通过下面的语句来调用按键服务程序   /* Invoke Callback if new keys were depressed */   if (keys && (pHalKeyProcessFunction))   {     (pHalKeyProcessFunction) (keys, HAL_KEY_STATE_NORMAL);   } 这里调用的服务程序,在InitBoard中被初始化为OnBoard_KeyCallback,这个函数又通过OnBoard_SendKeys运行下面语句   {     // Send the address to the task     msgPtr = (keyChange_t *)osal_msg_allocate( sizeof(keyChange_t) );     if ( msgPtr )     {       msgPtr->hdr.event = KEY_CHANGE;       msgPtr->state = state;       msgPtr->keys = keys;       osal_msg_send( registeredKeysTaskID, (uint8 *)msgPtr );     }     return ( ZSuccess );   } 下面我们就看下osal_msg_send是如何向上级应用程序发送消息的。终于要讲消息量的数据结构了,好像绕得有点远。。。。还是先上图 图三、消息数据链表.JPG 在理解了消息量的数据链表后,再来理解osal_msg_send里的语句就不难了   OSAL_MSG_ID( msg_ptr ) = destination_task;//设置消息数据对应是属于哪个任务的   // 将要发送的消息数据链接到以osal_qHead开头的数据链表中   osal_msg_enqueue( &osal_qHead, msg_ptr );   // 通知主循环有任务等待处理   osal_set_event( destination_task, SYS_EVENT_MSG ); 这样用户任务GenericApp_ProcessEvent就收到一个按键的处理任务,并通过GenericApp_HandleKeys来执行相应的操作。 好了,现在应该对OSAL的消息处理机制有个了解了吧?我们再来复习一下这个按键的处理过程:任务驱动层Hal_ProcessEvent负责对按键进行持续扫描,发现有按键事件后OnBoard_KeyCallback函数向应用层GenericApp_ProcessEvent发送一个有按键需要处理的消息,最终由GenericApp_HandleKeys来负责执行具体的操作。 让我们再回到最初的问题,任务处理表tasksEvents是怎么被改动的呢?初始化程序、其他任务或者本任务主要通过下面几种方式对其操作: 1、设置计时器,当其溢出时,触发事件处理 2、直接通过任务间的消息传递机制触发 3、...(等我想到了再补充) 原创]奥特曼Zigbee读书日记(三)-- 设备“对话”专题(1) 前两篇的笔记基本上都在“补课”,对zigbee协议的学习做了铺垫,了解了OSAL系统的基本原理,相信仔细读过前面笔记的同学,现在看起程序来不会那么吃力了吧?--如果真的能达到这个效果,那这两天“挑灯苦读”也算没白费了。先赞自己一个,也趁机感谢下一直关心、支持我的老婆大人~(背景音:切,这个人真臭P~~~)   接下来才回到第一篇笔记里的第1个问题--数据传输是如何实现的?到现在为止,我们还没搞清楚各个设备之间到底是怎么建立连接,怎么“说上话”的--还是个“门外汉”,对于在座的这么喜欢钻研的同学们,被人这样讲,肯定是要丢面子的。。。那就让我们一起进入无线电波的美妙世界吧。。。(怎么又是这个句型?~) [注:本文源自www.feibit.com--“飞比”Zigbee论坛,为尊重劳动者成果,如需转载请保留此行] 10. "老王,吃了没?"--中国人老是喜欢用这样的开场白跟别人打招呼(建立连接),那zigbee设备之间呢?他们是怎么建立连接,怎么交谈的呢? (欲知后事如何,且听下回分解。。。) --by outman from feibit.com 2010.4.16 11:08 最近杂事太多,一直也没时间更新笔记。多怀念上学时的时光,有那么多时间可以做自己想做的事情。实在对不住还在关心我笔记的网友,评书过了12天可能也没人听了,不过我还得硬着头皮写下去,要不然连自己也对不住了。。。 当决定要做一件事情后,无论多难,我都会坚持下去,因为我相信“坚持就是一种力量”--by outman "老王,吃了没?",多简单的一句话。之所以我们认为简单,那是因为第一,我们都是人,第二我们都说汉语。但对机器来说,这个情况这有点复杂了,因为我们要创造它的认知系统,创造它的语言。所以。。。呃。。。对不住大家了,这个问题没那么容易说清楚,要分几部分,让我们一点点地共同学习,也许这个问题10要分N个子问题了。。。 Zigbee及802.15.4是一个比较复杂的系统,TI 2430的IC对我们来说也同样陌生。那么面对这样一个“大胖子”,我们的目的是什么?--吃掉它!但是,一口能行吗?不行,不但不行,还不能那么急着下口,要先认识它,了解它,把它分解成一块块的,然后再吃掉--怎么听起来这么血腥。。。 我的想法是这样的,由应用开始,先做几个简单的程序,然后一步步深入,对协议的应用基本掌握后就进入协议底层。我的性格让我不得不把这几十K的程序彻底弄明白。。。 第一个简单的应用程序打算从TI提供的最简单例程为基础,做一个点对点的传输的例子,模拟一个人与人打招呼的过程,场景是这样的:老张(end device)遇到了(建立连接)老王(coordinator),对老王说(按下一个按键发送数据):“老王,吃了没?”(发送字符串“lao wang, chi le mei?”),老王听到这话(确认字符串是否包含“chi le mei?”)想了想(在这里,利用2430的IC温度检测功能,如果温度高于25度,则回答“吃了”,否则回答“还没有”),回答道:“吃了”(回复字符数据:"chi le")。老张听到后,点了点头(接收到数据后,输出到串口,同时,如果“吃了”LED闪烁一次,否则闪烁两次)。本实验目的是了解Zigbee设备的基本通信原理、Zstack的常用API及串口的基本应用,可以在任意至少有一个按键及LED的“最小化”实验板中运行。 --by outman from feibit.com 2010.4.27 22:35 (下次更新只能到5.1后了) 4月份湖北还在下雪,今天重庆又开始刮龙卷风了。不知道2012来了,到底要发生什么???不管发生什么,我能做的只是继续做自己喜欢做的事情,如果真的有那么一天,最应该做的事倒是应该提前几天回去陪陪父母。。。 时间过得太快了,这一个多周的业余时间基本都花在“老王,吃了没”一句话上了,连个理发的时间都没挤出来~~让这个笨机器说话还真不是件容易的事~~~不过,如果手头有开发板,而且也成功做过“点对点”数据传输例程的同学,可以不用那么痛苦,直接改下面这两个地方,把一个字节的数据传输,改成传输字符串就OK了 [子问题]10.1、我已经实现了点对点的单字符传输,如何在两个zigbee设备中传输字符串数据? 1. 发送端发送点对点数据的函数(具体在哪就不用我教了吧?)   char say_hello[] = "lao wang, chi le mei?";   if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,                        SAMPLEAPP_PTOP_CLUSTERID, //                       1, //                       (uint8*)&SampleAppPeriodicCounter,                        (byte)osal_strlen( say_hello) + 1,                        (byte *)&say_hello,                        &SampleApp_TransID,                        AF_DISCV_ROUTE,                        AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ) 看到其中改掉的两行了吧?其中数据长度“1”改为“say_hello”的数组长度,而数据内容改为"lao wang, chi le mei?" 2.接收端的“APP任务”的,AF_INCOMING_MSG_CMD事件(XXX_MessageMSGCB)中,在对应的“CLUSTERID”下面增加: rec_msg = pkt->cmd.Data; UART_Send_String(rec_msg,pkt->cmd.DataLength); 这样,就从接收到的数据包“pkt”中,提取了从发送端送出的字符串的内容和长度,UART_Send_String是串口数据的发送函数,感兴趣的同学,我会在后面详细介绍。 /********************************************************/ 先休息一下,下面是广告时间~~ 英语里有个短语叫“reinventing the wheel”,大多数人用这句话告诉别人,轮子别人已经发明好了,不用再重新发明了。不过我要说的是,对于学习,最有效和最深入的方式就是“reinventing the wheel”!-- by outman from feibit.com 802.15.4和TI的2430和Zstack这几个大轮子我们是暂时没有机会去“reinventing”了,真希望中国有点良知的教授们抽出点赚钱的时间去做点这样的事情,虽然是个“re-”,但是至少不至于让俺们这些小工程师天天围着别人的轮子转。。。跑题了~~~ 不过,除了底盘那几个大轮子,变速箱里的小齿轮,我们还是可以玩一玩滴~~既然不能从零,那我们就从壹(TI提供的“库”)开始,完成上面“吃饭了没”的简单应用。 [子问题]10.2、如何用TI提供的库函数实现基本的点对点数据传输? 首先,我们来剖析一下TI Zstack 2006中的基本通信例程“GenericApp”中的文件,区别开“应用”与“库”(我暂时把在GenericApp中所有TI提供的函数,都叫做“库”,不去理会,只关心我们的“应用”),然后从零开始建立一个IAR的工程,编译并在板子上仿真。 老规矩,先上图吧~ generic.PNG 在这个例程里,除了APP这个文件夹是用来存用户程序的,其他都是由Zstak提供的,APP里有三个文件GenericApp.c(用户程序)、GenericApp.h(用户程序头文件)和OSAL_GenericApp.c(用户程序与OSAL交互程序),三个文件不复杂吧? 又有同学举手了?什么?文件里面的内容太复杂了? 我们来看看,GenericApp.c有五、六百行,这也算复杂??那好吧,待会我们把它全删了,只留一个按键,一个LED,保证程
本文档为【[原创]奥特曼Zigbee读书日记】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_587021
暂无简介~
格式:doc
大小:1MB
软件:Word
页数:75
分类:互联网
上传时间:2013-10-24
浏览量:21