下载

0下载券

加入VIP
  • 专属下载券
  • 上传内容扩展
  • 资料优先审核
  • 免费资料无限下载

上传资料

关闭

关闭

关闭

封号提示

内容

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

复件 [原创]奥特曼Zigbee读书日记.doc

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

xiao244164200
2011-10-28 0人阅读 举报 0 0 0 暂无简介

简介:本文档为《复件 [原创]奥特曼Zigbee读书日记doc》,可适用于IT/计算机领域

原创奥特曼Zigbee读书日记(一)湘南学院Zigbee读书笔记原创奥特曼Zigbee读书日记(一)用sourceinsight如何阅读IAR的项目源码? 多年来学习单片机的习惯从"main"函数开始但是"main"在哪里?ProjectszstackZMainTIDBZMainc"ROOT"是什么意思?以下是“IARAssembler”中对此的解释:NOROOT,ROOTNOROOTmeansthatthesegmentpartmaybediscardedbythelinkerifnosymbolsinthissegmentpartarereferredtoNormallyallsegmentpartsexceptstartupcodeandinterruptvectorsshouldsetthisflagThedefaultmodeisROOTwhichindicatesthatthesegmentpartmustnotbediscarded简单翻译下:NOROOT表示如果此部分代码从来没有被调用到那么这部分代码会被linker抛弃。一般来讲除了startup和中断的代码都应该设为NOROOT。默认的模式为ROOT即linker不会抛弃。到底学习zigbee应该从哪开始?  走马观花地看过一本入门书本以为买了开发板调试一下里面的通信程序就能快速入门了。昨天看了一天的程序才发现这种想法太急功近利了有句古话怎么讲来着--“欲速则不达”古人的话还是有道理的于是决定调整思路放平心态。但是到底从哪开始呢?国内Zigbee方面的书寥寥无几大多数又总感觉有种功利色彩。罢了读英文的吧(借机感谢下我大学良师albert亏着他当时的提点现在读英文书还不算吃力)。近期准备从两个地方下手一个是TI的Zstack手册另外一个是国外的朋友推荐的一本叫NewnesZigBeeWirelessNetworksandTransceivers的电子书不想读电子版的只是在深圳的书店还没找到。这是一本多页的大部头个人比较欣赏国外这种风格的书往往深入浅出让一个没太有基础的人也容易读得懂不用搞一大堆书去看同一个东西。国内的大部头也不少但很多感觉像我小时候写作文的风格--扯远了抓紧时间吧~~~cc后面的的DB,BB,EB代表什么意思?BB:BatteryBoard电池板DB:DevelopmentBoard开发板EB:EvaluationBoard评估板分别对应TI公司开发的三种板型其功能按上顺序依次变强。可以参看"ZStackUser'sGuideforCC"的图片以获得直观认识(具体位置在:开始==》程序==》TexasInstruments==》ZStack)Coordinator,Router与EndDevice有什么区别?好本与烂书的区别在于好书在开头的时候就知道你在想什么而烂书呢到读到最后你也不知道他在想什么。。。这个问题的答案在那本英文“大部头”的前面章节:DeviceTypesTherearetwotypesofdevicesinanIEEEwirelessnetwork:fullfunctiondevices(FFDs)andreducedfunctiondevices(RFDs)AnFFDiscapableofperformingallthedutiesdescribedintheIEEEstandardandcanacceptanyroleinthenetworkAnRFD,ontheotherhand,haslimitedcapabilitiesForexample,anFFDcancommunicatewithanyotherdeviceinanetwork,butanRFDcantalkonlywithanFFDdeviceRFDdevicesareintendedforverysimpleapplicationssuchasturningonoroffaswitchTheprocessingpowerandmemorysizeofRFDdevicesarenormallylessthanthoseofFFDdevices有两种类型的设备在IEEE无线网络:全功能设备(FFDs)和精简功能设备(RFDS)。一个FFD是能够履行所有职责描述在IEEE标准的可以接受网络中的任何的作用。一个RFD的另一方面能力有限。例如一个FFD可以与网络中的任何其他设备进行通信但只与一个FFD设备RFD可以谈。RFD设备的目的是非常简单的应用程序如打开一个开关打开或关闭。RFD设备的处理能力和内存的大小通常比FFD设备。DeviceRolesInanIEEEnetwork,anFFDdevicecantakethreedifferentroles:coordinator,PANcoordinator,anddeviceAcoordinatorisanFFDdevicethatiscapableofrelayingmessagesIfthecoordinatorisalsotheprincipalcontrollerofapersonalareanetwork(PAN),itiscalledaPANcoordinatorIfadeviceisnotactingasacoordinator,itissimplycalledadevice设备角色在IEEE网络一个FFD设备可以采取三种不同的角色:协调员PAN协调器和设备。协调员是一个FFD设备能够传递消息。如果协调的个人区域网络(PAN)的主要控制器它被称为PAN协调。如果设备不作为协调员那简直就是所谓的设备。TheZigBeestandardusesslightlydifferentterminology(seeFigure)AZigBeecoordinatorisanIEEEPANcoordinatorAZigBeerouterisadevicethatcanactasanIEEEcoordinatorFinally,aZigBeeenddeviceisadevicethatisneitheracoordinatornorarouterAZigBeeenddevicehastheleastmemorysizeandfewestprocessingcapabilitiesandfeaturesAnenddeviceisnormallytheleastexpensivedeviceinthenetworkZigBee标准的使用略有不同的术语(见图)。一个ZigBee协调器是一个IEEEPAN协调。一个ZigBee路由器是一种装置可以作为一个IEEE协调员。最后ZigBee终端设备是一个设备既不是一个协调员也不是路由器。ZigBee终端设备的内存大小和最少的处理能力和功能。终端设备通常是最便宜的网络设备。HYPERLINK"http:wwwfeibitcombbsattachmentphpaid=MTYfGQzNGRlOTRhfDEyOTYxODczMzhMDBhMJqOTlMcmdMSXBlNTZqbVPUTdNNrQTcENIUDhEeGQ"t"blank"INCLUDEPICTURE"http:wwwfeibitcombbsattachmentsmonthfeecfejpg"*MERGEFORMATINETdevicetypeJPG设备类型IEEE无线网络协议中定义了两种设备:全功能设备(FFDs)和半功能设备(RFDs)。FFD可以执行IEEE标准中的所有功能并且可以在网络中扮演任何角色那反过来讲RFD就有功能限制啦。比如FFD能与网络中的任何设备“说话”而RFD就只能和FFD“私聊”啦。RFD设备的用途是为了做一些简单功能的应用比如做个开关之类的。而其功耗与内存大小都比FFD要小很多。设备角色IEEE网络中一个FFD可以扮演三个角色-协调器(Coordinator)、PAN协调器(PANcoordinator)和设备(device)其中协调器是一个全功能设备(FFD)它可以在网络中传递信息(做传话筒)。如果一个协调器在一个PAN(personalareanetwork个人区域网络)网络中做主控制器(老大的位置呃)那我们把它叫做PAN协调器。除此之外就不用多说啦就叫设备(你我一样的平头百姓)Zigbee协议中的定义与IEEE的定义大同小异Zigbee中的“Coordinator”是IEEE中的“PANCoordinator"Zigbee中的“router”就是IEEE中的“Coordinator”而“enddevice”就是指上面的平头百姓“device”啦。。。enddevice的内存、处理能力及功能都是最小的当然也是网络中最便宜的了--这不是说我吗~~~byoutmanfromfeibitcom  网络拓扑结构这算是个问题吗?星形、网形、树形。。。很多人是不是能脱口而出?对于俺们这些非网络专家又对这个有点了解的人来说脑子里好像总有那么点印象又有点模糊。“学问来不得半点虚假”这是谁说的来?我们可是要做网络专家的人哪来一起把它弄清楚吧。。。上“葵花宝典”第一式第节(“大部头”有新名字了这本书写得真不错免费打个广告~~)再扯一句这个世界本来没有规则规则都是上级定的~Enddevice==>Router==>Coordinator==>人==>言归正传:网络结构是由zigbee网络层来管理的它必须是IEEE中规定的两种(知道谁是上级了~)--星形和点对点形(这个名字怎么没太听过。。。)图所示的星形结构中每个节点都只能和PANCoordinator(以后这种名字都不叫中文了作为一个程序员见得多的其实是英文)通讯。一个典型的星形网络构建过程是这样的:一个被注入PANcoordinator程序(软件)的FFD(硬件)开始工作后开始着手构建网络他要做的第一件事就是要在他无线电波所覆盖到的空间区域内先选择一个唯一的PAN网络标识号--他也有上级啊不能乱搞~~这个标识号一定要是附近其他网络没用到的。在图所示的“点对点”形的拓扑结构中任意两个节点只要靠得足够近都可以建立连接并通讯。在点对点形的网络结构中任何FFD都可以扮演PANcoordinator的角色大家都是老大?那到底谁是真正的老大呢?那就看谁是这个网络的创史人了--谁第一个建的这个网络谁就是老大!在点对点网络中所有担任“传话筒”的设备都是FFD因为RFD没有这个功能(被阉割了嘛~)但RFD也可以作为网络的一员他只能和指定设备(coordinator或者router)通讯。一个“点对点”的网络可以通过限制设备的一些功能实现不同“形状”的网络。如果完全没有限制那就是一个“网状”拓扑另外一种是图所示的“树状”拓扑在这种结构中Zigbeecoordinator搭建了原始网络router形成了树枝进行信息传递(传话筒)enddevice就是最后的树叶了不能往下级传递信息了(它本来就是最下级嘛)。而router可以扩展coordinator所搭建的网络。图也展示了router是如何扩展网络甚至如何绕过障碍物的。比如A想和B说话但是中间有墙挡的信号强度又穿透不了这个时候树形的网络结构就可以通过其它router传递信息并最终到达B。我们有时把这种方式叫“多次反射”(multihopping)因为信息从一个节点反射到另外一个节点最终到达目的地。这样就扩大了整个网络的信息覆盖面。在一个IEEE网络中无论是哪种拓扑结构网络总是由PANcoordinator来创建PANcoordinator控制整个网络并至少完成以下任务:●给本网络中每个设备指定一个位或者位的地址●通过网络发起、结束和传递信息●为本网络选定唯一的PAN网络标识号这个标识号允许本网络内的设备使用位的短地址方式并且可以与其他的独立网络进行通讯在整个网络中只有一个PANcoordinator所以PANcoordinator往往需要长时间在工作状态所以它常需要连接稳压电源而不是电池。但其他设备往往都是用电池来供电的一个最小的网络包括两个设备一个PANcoordinator与一个devicebyoutmanfromfeibitcom附英文原文:ZigBeeNetworkingTopologiesThenetworkformationismanagedbytheZigBeenetworkinglayerThenetworkmustbeinoneoftwonetworkingtopologiesspecifiedinIEEE:starandpeertopeerInthestartopology,showninFigure,everydeviceinthenetworkcancommunicateonlywiththePANcoordinatorAtypicalscenarioinastarnetworkformationisthatanFFD,programmedtobeaPANcoordinator,isactivatedandstartsestablishingitsnetworkThefirstthingthisPANcoordinatordoesisselectauniquePANidentifierthatisnotusedbyanyothernetworkinitsradiosphereofinfluencetheregionaroundthedeviceinwhichitsradiocansuccessfullycommunicatewithotherradiosInotherwords,itensuresthatthePANidentifierisnotusedbyanyothernearbynetworkInapeertopeertopology(seeFigure),eachdevicecancommunicatedirectlywithanyotherdeviceifthedevicesareplacedcloseenoughtogethertoestablishasuccessfulcommunicationlinkAnyFFDinapeertopeernetworkcanplaytheroleofthePANcoordinatorOnewaytodecidewhichdevicewillbethePANcoordinatoristopickthefirstFFDdevicethatstartscommunicatingasthePANcoordinatorInapeertopeernetwork,allthedevicesthatparticipateinrelayingthemessagesareFFDsbecauseRFDsarenotcapableofrelayingthemessagesHowever,anRFDcanbepartofthenetworkandcommunicateonlywithoneparticulardevice(acoordinatororarouter)inthenetworkHYPERLINK"http:wwwfeibitcombbsattachmentphpaid=MTcxfDQYYYzNifDEyOTYxODczMzhMDBhMJqOTlMcmdMSXBlNTZqbVPUTdNNrQTcENIUDhEeGQ"t"blank"INCLUDEPICTURE"http:wwwfeibitcombbsattachmentsmonthdfceebaejpg"*MERGEFORMATINETstarmeshJPGApeertopeernetworkcantakedifferentshapesbydefiningrestrictionsonthedevicesthatcancommunicatewitheachotherIfthereisnorestriction,thepeertopeernetworkisknownasameshtopologyAnotherformofpeertopeernetworkZigBeesupportsisatreetopology(seeFigure)Inthiscase,aZigBeecoordinator(PANcoordinator)establishestheinitialnetworkZigBeeroutersformthebranchesandrelaythemessagesZigBeeenddevicesactasleavesofthetreeanddonotparticipateinmessageroutingZigBeerouterscangrowthenetworkbeyondtheinitialnetworkestablishedbytheZigBeecoordinatorFigurealsoshowsanexampleofhowrelayingamessagecanhelpextendtherangeofthenetworkandevengoaroundbarriersForexample,deviceAneedstosendamessagetodeviceB,butthereisabarrierbetweenthemthatishardforthesignaltopenetrateThetreetopologyhelpsbyrelayingthemessagearoundthebarrierandreachdeviceBThisissometimesreferredtoasmultihoppingbecauseamessagehopsfromonenodetoanotheruntilitreachesitsdestinationThishighercoveragecomesattheexpenseofpotentialhighmessagelatencyAnIEEEnetwork,regardlessofitstopology,isalwayscreatedbyaPANcoordinatorThePANcoordinatorcontrolsthenetworkandperformsthefollowingminimumduties:●Allocateauniqueaddress(bitorbit)toeachdeviceinthenetwork●Initiate,terminate,androutethemessagesthroughoutthenetwork●SelectauniquePANidentifierforthenetworkThisPANidentifierallowsthedeviceswithinanetworktousethebitshortaddressingmethodandstillbeabletocommunicatewithotherdevicesacrossindependentnetworksThereisonlyonePANcoordinatorintheentirenetworkAPANcoordinatormayneedtohavelongactiveperiodstherefore,itisusuallyconnectedtoamainsupplyratherthanabatteryAllotherdevicesarenormallybatterypoweredThesmallestpossiblenetworkincludestwodevices:aPANcoordinatorandadeviceHYPERLINK"http:wwwfeibitcombbsattachmentphpaid=MTcyfGIYTAOWQfDEyOTYxODczMzhMDBhMJqOTlMcmdMSXBlNTZqbVPUTdNNrQTcENIUDhEeGQ"t"blank"INCLUDEPICTURE"http:wwwfeibitcombbsattachmentsmonthabedebceadfjpg"*MERGEFORMATINETtreeJPGTI协议栈所用系统框架探讨。的系统往往不是太大但是几十K的程序也足以让一个初学者望而却步。我们首先忽略C语言本身的难度光是系统框架也让生手读起来很吃力再加上这种到处是API跟"define"的程序还没有正式学习协议部分就已经让人在丛林中“迷路”了。在接下来的一段时间内我会以TI所用的系统框架为主线进行学习希望大家共同探讨。。。在层层迷雾中摸索了两天终于拨云见日那个心情啊怎一个“爽”字了得~~~可是怎么能把这么复杂的一个问题讲得清楚呢?嗯。。。还是先上图吧HYPERLINK"http:wwwfeibitcombbsattachmentphpaid=MTcfDBmMGIYMwfDEyOTYxODcNjdODMwMZyZElBSlNuZlDNBTcDZMngxRmejJJRVNPbnppTSw"t"blank"INCLUDEPICTURE"http:wwwfeibitcombbsattachmentsmonthdfeejpg"*MERGEFORMATINET主循环函数处理机制JPG注:为了便于直观以下涉及到数据地址的地方都是由上而下地址由高变低第节、各个任务是如何被调用到的?我们还是先从main()函数开始看看各个任务之间是如何协调工作的。插播一句广告:在一切都看不清的时候忽略次要看主要因素--byoutmanfrom我们直接进入主循环的核心部分看一下系统中的几个主要的任务是如何被调用并开始自己的使命的?看一段程序的时候往往要从它的数据结构入手。我们先看一下主循环中的两个关键数组*tasksEvents与*tasksArr从图一中我们可以看出来tasksEvents这个数组存放的是从序号为到tasksCnt每个任务在本次循环中是否要被运行需要运行的任务其值非(用橙色表示)否则为。而tasksArr数组则存放了对应每个任务的入口地址只有在tasksEvents中记录的需要运行的任务在本次循环中才会被调用到。-又有同学举手?什么?还没明白?恩。。。好像是不能讲这么短的。。。那好吧把main函数贴过来我们一点一点看初始化过程“先不管”我们先看主循环(deadloop)for()  ForeverLoop{  uintidx=  HalProcessPoll()  先不管  do{    if(tasksEventsidx)  寻找最高优先级的任务来运行    {      break    }  }while(idx<tasksCnt)  if(idx<tasksCnt)如果有任务需要运行  {    uintevents    halIntStatetintState    HALENTERCRITICALSECTION(intState)进入临界区    events=tasksEventsidx获取任务号    tasksEventsidx=  本任务运行完了要对其清空为后面要运行的任务让路    HALEXITCRITICALSECTION(intState)退出临界区    events=(tasksArridx)(idx,events)最关键的一句话如图一中运行对应的任务    HALENTERCRITICALSECTION(intState)    tasksEventsidx|=events  本任务可能没完全完成如果是这样再次设置标志位在下一次循环中继续执行进入任务队列等待    HALEXITCRITICALSECTION(intState)    }  }第节、系统时间我们知道每个操作系统(虽然我不认为OSAL是一个标准的操作系统但我们先这么叫着吧)都有一个“节拍”-tick就像每一个“活人”都有心跳一样。那么OSAL的心跳有多快呢?--ms。当然这个速度是可以设置的在osaltimeractivate函数中开启了系统节拍用TICKTIME来定义其速度#defineTICKTIME    Timerpertickinmicrosec注意:这个是microsec(微秒)而不是milli-sec(毫秒)!我刚开始的时候就是误以为是ms而耽误了不少时间。那这个心脏是怎么跳动起来的呢?这得从“定时器”说起由于本文的重点不是讲单片机基础的如果对这个名字还陌生的同学那还是回去先看看基础再来看这个吧。有个定时计数器其中timer用来做系统计时。如果认为是timer的同学请看一下halTimerRemap这个函数。在上述osaltimeractivate函数中开启了系统计时并将timer的初始设为TICKTIME()这样timer就开始了从开始的减计数减到以后呢?寄存器TIMIF会产生一个溢出标志那么它会立即产生中断并进入中断服务程序吗?不会的。我们看一下第节主函数里的“HalProcessPoll()  先不管”(不管的东西早晚要管的只是时间的问题而已)  这个函数里调用了HalTimerTick这个函数就是专门来检查是否有硬件定时器溢出的如果有的话会调用halTimerSendCallBack这个函数对溢出事件做处理。回过头来说系统节拍那timer在计数满(即ms)后做了些什么事呢那我们看一下halTimerSendCallBack这个函数voidhalTimerSendCallBack(uinttimerId,uintchannel,uintchannelMode){  uinthwtimerid  hwtimerid=halTimerRemap(timerId)  if(halTimerRecordhwtimeridcallBackFunc)  (halTimerRecordhwtimeridcallBackFunc)(timerId,channel,channelMode)}这里面调用了“callBackFunc”函数也就是说每个定时器溢出后都有一个callBackFunc函数它在哪里呢我们再看一下HalTimerConfig这个函数它可以对每个定时器进行定义。那什么时候定义的呢?--InitBoard即板子上电初始化的时候就做了这个定义的。我说什么来?“先不管”的东西“后要管”的。。。我们看到timer的callBackFunc函数是OnboardTimerCallBack最终指向osalTimerUpdate这个函数厉害了~从上面的分析中我们知道它是每ms被调用一次的这样它就为应用程序提供了一个ms计时器应用程序所用的定时往往以ms为单位足够了这样的话就不用另外再占用硬件计时器了毕竟只有个嘛。。。同时这个函数还提供了一个系统时钟-osalsystemClock看看它能计时多久吧它是“uint”型的也就是^ms=天怎么样?你不会让这个系统时钟overflow吧:)第节、系统的消息处理机制结合第、节中的内容让我们一起进入到系统最核心的部分-消息处理中来吧(这个句型怎么这么耳熟~~~)第节中我们说了tasksEvents数组存放了一个任务是否该被运行的序列但是这个序列是如何产生的呢?如果了解了这个问题那也就知道了OSAL系统的运作方式。再插句广告:在浩如烟海的程序中搜索最重要的东西就像大浪淘沙其实也是蛮享受的一件事情--byoutmanfromfeibitcomsourceinsight"ctr"整个项目搜索我们发现了一个“osalsetevent”的函数是专门来设置tasksEvents的但是似乎并不能帮到我们。继续搜!有两个很重要的地方引起了我们的注意:osalTimerUpdate和osalmsgsend这两个函数osalTimerUpdate这个称得上“厉害”的函数还记得吧?它会去设置tasksEvents?那不就是说它可以让任务在主循环中被运行到?答对了这就是它“厉害”的地方。。。那看看它运行任务的条件吧?    Whentimeout,executethetask当计数器溢出执行任务时间片    if(srchTimer>timeout==)    {      osalsetevent(srchTimer>taskid,srchTimer>eventflag)也就是说计时器溢出--恩。。。不多说了我们埋个伏笔先介绍另一个朋友-osalstarttimerEx先看下它的自我介绍**********************************************************************fn    osalstarttimerEx**brief**  ThisfunctioniscalledtostartatimertoexpireinnmSecs*  Whenthetimerexpires(到期期满),thecallingtaskwillgetthespecifiedevent**param  bytetaskIDtaskidtosettimerfor*param  UINTeventideventtobenotifiedwith*param  UNINTtimeoutvalueinmilliseconds**return  ZSUCCESS,orNOTIMERAVAIL*byteosalstarttimerEx(bytetaskID,UINTeventid,UINTtimeoutvalue)也就是说它会开始一个timeoutvalue(ms)的计时器当这个计时器溢出时则会对taskID这个task设置一个eventid让这个任务在后面的主循环中运行到但是是怎么实现的呢?还是要请osalTimerUpdate来帮忙。。。那位同学说啥?复杂了听不懂?唉还是上图吧图二、软件定时器数据链表JPG还是先从数据结构说起吧不知道啥是“数据链表”的同学把谭老师的书拿过来再读几遍。。。这个表就是osalTimerUpdate函数的“任务表”上面不是说过这个函数给应用程序提供了“软计时”了吗?就是体现在这里osalstarttimerEx通过osalAddTimer向链表里添加了“定时任务”由osalTimerUpdate来以ms为单位对这些“软定时器”减计数溢出时即调用osalsetevent实现主循环里对任务的调用。好了到此讲了上面提到的"setevent"函数中的一个osalstarttimerEx还有一个更厉害的还在外面呢osalmsgsend这就渐入佳境进入最重要的消息处理机制了。。。为了更好地说明这个问题还是拿一个具体的例子来讲比较直观。不过在这个笔记中我尽量不涉及具体开发板而讲一些通用的知识因为这样会让更多的人受益。在TI官方zstack中有个例子其中一个叫GenericApp最基本的通信的例程如果没有安装zstack的同学可以到“本站专用下载贴”中下载。当然由于讲的是些比较通用的东西所以手头有开发板的同学可以用自己的开发板来试验效果更好。。。在这样的通信例程中一般会有一个按键触发然后会和相邻的模块进行通信当然由于这部分是讲OSAL的系统框架的我们先不涉及通信的内容只是看一下按键是如何产生的及如何调用相应的接口程序。按OSAL的模块定义按键可能在哪层来?硬件服务相关的恩。。。是不是在HAL层呢?到HalProcessEvent看看?有个HalKeyPoll函数不是?恩这就是检测按键的地方~~不过我可不是像上面这样这么容易猜出来的这几句话足足用了我大半个钟头呢。。。过程我不细说了有兴趣的话我可以再补充一下。在HalKeyPoll函数中无论按键是ADC方式或者是扫描IO口的方式最后都会生成一个键值keys,然后通过下面的语句来调用按键服务程序  *InvokeCallbackifnewkeysweredepressed*  if(keys(pHalKeyProcessFunction))  {  (pHalKeyProcessFunction)(keys,HALKEYSTATENORMAL)  }这里调用的服务程序在InitBoard中被初始化为OnBoardKeyCallback这个函数又通过OnBoardSendKeys运行下面语句  {  Sendtheaddresstothetask  msgPtr=(keyChanget*)osalmsgallocate(sizeof(keyChanget))  if(msgPtr)  {    msgPtr>hdrevent=KEYCHANGE    msgPtr>state=state    msgPtr>keys=keys    osalmsgsend(registeredKeysTaskID,(uint*)msgPtr)//将按键消息加入消息链表  }  return(ZSuccess)  }下面我们就看下osalmsgsend是如何向上级应用程序发送消息的。终于要讲消息量的数据结构了好像绕得有点远。。。。还是先上图HYPERLINK"http:wwwfeibitcombbsattachmentphpaid=MTcfDZhMjRkYzQfDEyOTYxODcNjdODMwMZyZElBSlNuZlDNBTcDZMngxRmejJJRVNPbnppTSw"t"blank"INCLUDEPICTURE"http:wwwfeibitcombbsattachmentsmonthefaffdjpg"*MERGEFORMATINET图三、消息数据链表JPG在理解了消息量的数据链表后再来理解osalmsgsend里的语句就不难了  OSALMSGID(msgptr)=destinationtask设置消息数据对应是属于哪个任务的  将要发送的消息数据链接到以osalqHead开头的数据链表中  osalmsgenqueue(osalqHead,msgptr)  通知主循环有任务等待处理  osalsetevent(destinationtask,SYSEVENTMSG)这样用户任务GenericAppProcessEvent就收到一个按键的处理任务并通过GenericAppHandleKeys来执行相应的操作。好了现在应该对OSAL的消息处理机制有个了解了吧?我们再来复习一下这个按键的处理过程:任务驱动层HalProcessEvent负责对按键进行持续扫描发现有按键事件后OnBoardKeyCallback函数向应用层GenericAppProcessEvent发送一个有按键需要处理的消息最终由GenericAppHandleKeys来负责执行具体的操作。让我们再回到最初的问题任务处理表tasksEvents是怎么被改动的呢?初始化程序、其他任务或者本任务主要通过下面几种方式对其操作:、设置计时器当其溢出时触发事件处理、直接通过任务间的消息传递机制触发、(等我想到了再补充)原创奥特曼Zigbee读书日记(三)设备“对话”专题()前两篇的笔记基本上都在“补课”对zigbee协议的学习做了铺垫了解了OSAL系统的基本原理相信仔细读过前面笔记的同学现在看起程序来不会那么吃力了吧?--如果真的能达到这个效果那这两天“挑灯苦读”也算没白费了。先赞自己一个也趁机感谢下一直关心、支持我的老婆大人~(背景音:切这个人真臭P~~~)  接下来才回到第一篇笔记里的第1个问题--数据传输是如何实现的?到现在为止我们还没搞清楚各个设备之间到底是怎么建立连接怎么“说上话”的--还是个“门外汉”对于在座的这么喜欢钻研的同学们被人这样讲肯定是要丢面子的。。。那就让我们一起进入无线电波的美妙世界吧。。。(怎么又是这个句型?~)"老王吃了没?"--中国人老是喜欢用这样的开场白跟别人打招呼(建立连接)那zigbee设备之间呢?他们是怎么建立连接怎么交谈的呢?(欲知后事如何且听下回分解。。。)最近杂事太多一直也没时间更新笔记。多怀念上学时的时光有那么多时间可以做自己想做的事情。实在对不住还在关心我笔记的网友评书过了天可能也没人听了不过我还得硬着头皮写下去要不然连自己也对不住了。。。当决定要做一件事情后无论多难我都会坚持下去因为我相信“坚持就是一种力量”--byoutman"老王吃了没?"多简单的一句话。之所以我们认为简单那是因为第一我们都是人第二我们都说汉语。但对机器来说这个情况这有点复杂了因为我们要创造它的认知系统创造它的语言。所以。。。呃。。。对不住大家了这个问题没那么容易说清楚要分几部分让我们一点点地共同学习也许这个问题要分N个子问题了。。。Zigbee及是一个比较复杂的系统TI的IC对我们来说也同样陌生。那么面对这样一个“大胖子”我们的目的是什么?--吃掉它!但是一口能行吗?不行不但不行还不能那么急着下口要先认识它了解它把它分解成一块块的然后再吃掉--怎么听起来这么血腥。。。我的想法是这样的由应用开始先做几个简单的程序然后一步步深入对协议的应用基本掌握后就进入协议底层。我的性格让我不得不把这几十K的程序彻底弄明白。。。第一个简单的应用程序打算从TI提供的最简单例程为基础做一个点对点的传输的例子模拟一个人与人打招呼的过程场景是这样的:老张(enddevice)遇到了(建立连接)老王(coordinator)对老王说(按下一个按键发送数据):“老王吃了没?”(发送字符串“laowang,chilemei?”)老王听到这话(确认字符串是否包含“chilemei”)想了想(在这里利用的IC温度检测功能如果温度高于度则回答“吃了”否则回答“还没有”)回答道:“吃了”(回复字符数据:"chile")。老张听到后点了点头(接收到数据后输出到串口同时如果“吃了”LED闪烁一次否则闪烁两次)。本实验目的是了解Zigbee设备的基本通信原理、Zstack的常用API及串口的基本应用可以在任意至少有一个按键及LED的“最小化”实验板中运行。。时间过得太快了这一个多周的业余时间基本都花在“老王吃了没”一句话上了连个理发的时间都没挤出来~~让这个笨机器说话还真不是件容易的事~~~不过如果手头有开发板而且也成功做过“点对点”数据传输例程的同学可以不用那么痛苦直接改下面这两个地方把一个字节的数据传输改成传输字符串就OK了子问题、我已经实现了点对点的单字符传输如何在两个zigbee设备中传输字符串数据?发送端发送点对点数据的函数(具体在哪就不用我教了吧?)  charsayhello="laowang,chilemei"  if(AFDataRequest(SampleAppPeriodicDstAddr,SampleAppepDesc,                SAMPLEAPPPTOPCLUSTERID,                ,                (uint*)SampleAppPeriodicCounter,                (byte)osalstrlen(sayhello),                (byte*)sayhello,                SampleAppTransID,                AFDISCVROUTE,                AFDEFAULTRADIUS)==afStatusSUCCESS)看到其中改掉的两行了吧?其中数据长度“”改为“sayhello”的数组长度而数据内容改为"laowang,chilemei"接收端的“APP任务”的AFINCOMINGMSGCMD事件(XXXMessageMSGCB)中在对应的“CLUSTERID”下面增加:recmsg=pkt>cmdDataUARTSendString(recmsg,pkt>cmdDataLength)这样就从接收到的数据包“pkt”中提取了从发送端送出的字符串的内容和长度UARTSendString是串口数据的发送函数感兴趣的同学我会在后面详细介绍。********************************************************先休息一下下面是广告时间~~英语里有个短语叫“reinventingthewheel”大多数人用这句话告诉别人轮子别人已经发明好了不用再重新发明了。不过我要说的是对于学习最有效和最深入的方式就是“reinventingthewheel”!byoutmanfromfeibitcom和TI的和Zstack这几个大轮子我们是暂时没有机会去“reinventing”了真希望中国有点良知的教授们抽出点赚钱的时间去做点这样的事情虽然是个“re”但是至少不至于让俺们这些小工程师天天围着别人的轮子转。。。跑题了~~~不过除了底盘那几个大轮子变速箱里的小齿轮我们还是可以玩一玩滴~~既然不能从零那我们就从壹(TI提供的“库”)开始完成上面“吃饭了

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

评分:

/53

VIP

意见
反馈

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利