- 1、本文档共1665页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
程序下载完成之后,按照以下步骤进行操作: (1) 首先启动协调器,等待协调器建立起网络,协调器建立网络完成的现象为LED1和LED2同时点亮。 (2) 其次启动路由器,等待路由器加入网络,路由器加入网络的现象为LED1和LED2同时点亮。 (3) 按下协调器设备的按键SW1,此时会看到路由器设备的LED1闪烁。 多任务运行:“多任务运行”其实是一种“假象”,实际上只有一个任务在运行,CPU可以使用任务调度策略将多个任务进行调度,每个任务执行特定的时间,时间到了以后,就进行任务的切换。由于每个任务执行的时间很短,任务之间的切换很频繁,造成了多任务同时运行的“假象”。 资源:任何一个任务所占用的实体都可以称为资源,如一个变量、数组和结构体等。 共享资源:至少被两个任务使用的资源称为共享资源,为了防止共享资源被破环,每个任务在操作共享资源时,必须保证是独占该资源。 内核:在多任务系统中,内核负责管理各个任务,主要包括为每个任务分配CPU时间、任务调度和负责任务间的通信。内核提供的基本服务是任务切换,使用内核可以大大简化应用系统的程序设计方法,借助内核提供的任务切换功能,可以将应用程序分为不同的任务来实现。 互斥:在多任务系统中,多个任务在访问数据时具有排它性,即称为互斥。互斥的主要功能是多个任务进行数据访问时,保证每个任务数据访问的唯一性。解决互斥最常用的方法是关中断、使用测试并置位指令、禁止任务切换和使用信号量。其中,在Zigbee协议栈内嵌的操作系统中最常用的方法是关中断。 消息队列:消息队列用于任务间传递消息,通常包含任务间同步的信息。通过内核提供的服务, 任务或者中断服务程序将一条消息放入消息队列,然后其他任务可以使用内核提供的服务从消息队列中获取属于自己的消息。为了降低消息的开支,通常传递指向消息的指针。 6.10.3 Zstack数据传输 OSAL是Zstack协议栈的核心。在开发过程中,必须要创建OSAL任务来运行应用程序。OSAL的应用程序一般都在APP层,本节将详细讲解在APP层通过按键触发Zstack的数据的传输。 下述内容用于实现任务描述6.D.1,使用Zstack协议栈进行数据传输。此数据传输实验将实现以下两个功能: 协调器负责建立网络,路由器加入网络。 通过协调器按键控制路由器LED的状态,具体实现为SW1控制路由器的LED1闪烁,SW2控制路由器的LED2闪烁。 打开TI官方的SampleApp工程,在SampleApp.c文件中做如下修改完成按键控制LED闪烁。 修改SampleApp_ProcessEvemt()函数,实现协调器网络建立后点亮LED1、LED2。 修改SampleApp_HandleKeys()函数,实现协调器SW1和SW2按键按下之后,向网络中其他设备发送数据。 修改SampleApp_MessageMSGCB()函数实现网络中的路由器或其他设备在收到协调器广播的数据后,实现LED闪烁命令。 具体操作步骤如下: 1. ?修改SampleApp_ProcessEvent()函数 SampleApp_ProcessEvent()函数的讲解详见6.9.3节,为了实现建立网络后,点亮LED1和LED2,需要修改SampleApp_ProcessEvent()函数下的网络状态改变事件代码部分,如图6-13所示。 图6-13 SampleApp_ProcessEvent()需修改部分 修改之后的代码如下: 【描述6.D.1】 SampleApp.c UINT16 SampleApp_ProcessEvent(byte task_id,UINT16 events) { … … … … … … … … … … … … switch ( MSGpkt-hdr.event ) { // 网络状态改变事件 case ZDO_STATE_CHANGE: // 提取网络状态的设备类型 SampleApp_NwkState=(devStates_t)MSGpkt-hdr.status; // 判断是否为协调器 if ( (SampleApp_NwkState == DEV_ZB_COORD) ||(SampleApp_NwkState == DEV_ROUTER)
文档评论(0)