ZigBee学习之31——osal_init_system

合集下载

如何实现ZigBee休眠与唤醒 (1)

如何实现ZigBee休眠与唤醒 (1)

加红部分是一个宏定义,在OnBoard.h里面定义的。
#define OSAL_SET_CPU_INTO_SLEEP(timeout) halSleep(timeout);
halSleep(timeout)是在hal_sleep.c中定义的。
这里面涉及的就是关于CC2530的电源管理寄存器的一些操 作。具体可以看代码。
涉及文件
OSAL_PwrMgr.h
OSAL_PwrMgr.C hal_sleep.c
OSAL电源管理的API头文件
OSAL电源管理的API C文件 底层的电源管理文件
电源管理结构体
typedef struct { uint16 pwrmgr_task_state; uint16 pwrmgr_next_timeout; //任务状态 //下一次超时
void osal_start_system( void ) {
#if !defined ( ZBIT ) && !defined ( UBIT )
for(;;) // Forever Loop #endif {…… } #if defined( POWER_SAVING ) else // Complete pass through all task events with no activity { osal_pwrmgr_powerconserve(); // Put the pro cessor/system into sleep } #endif }
2.获取下一次MAC定时器到期时间
3. halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLE EP_TIMER; //为PM2,PM3模式。 没有任务要执行就进入PM3深度睡眠,否则进入P M2睡眠,可以定时器唤醒。 4.唤醒

Zigbee复习模拟题-(1)

Zigbee复习模拟题-(1)

Zigbee复习模拟题-(1)Zigbee开发技术及实践--模拟试题⼀、选择题(每题3分,共30分)1. 下⾯属于CC2530物理存储器的是:()A. SRAMB. CODEC. DATAD. XDATA2. 中国使⽤的Zigbee⼯作的频段是:()A. 915MHzB. 2.4GHzC. 868MHzD. 433MHz3. 下⾯属于信息管理API函数的是:()A. osal_start_timer( )B. osal_set_event( )C. osal_msg_allocate( )D. osal_init_system( )4. 在Zigbee结构中哪⼀层与建⽴⽹络息息相关:()A. 物理层B. MAC层C. ⽹络层D. 应⽤层5. CC2530数据帧的基本结构由三部分构成:()A. 帧引导序列和帧开始界定符B. 同步头、需要传输的数据以及帧尾C. 帧长度、MAC帧头D. MAC负载和帧尾6. 在Zigbee⽹络中协调器需要⽹络中的每个设备都收到数据使⽤下述哪种地址模式:()A. ⼴播寻址B. 组寻址C. 单点寻址D. 间接寻址7. 如果将CC2530的P1端⼝设置为外设I/O功能,需要设置哪个寄存器:()A. P0SELB. P1SELC. P0DIRD. P1DIR8. 在Zigbee⽹络中具有路由转发功能的节点是()A. ⽹关节点B. 传感器节点C. 路由器节点D. 终端节点9. IEEE802.15.4在2.4G频段上定义了⼏个信道()A. 16B. 10C. 27D. 110. 下⾯属于MAC层与⽹络层管理服务接⼝的是:()A. NLME-SAPB. MCPS-SAPC. MLME-SAPD. NLDE-SAP⼆、填空题(每空1分,共20分)11. IEEE802.15.4的数字⾼频调制使⽤_____技术。

【1.0分】2.4G直接序列扩频12. Zigbee是⼀种____ 、____ 、____ 、____双向⽆线通讯技术。

ZigBee编程基础入门

ZigBee编程基础入门

zigbee基本概念及协议术语1. 逻辑设备类型协调器(coordinator),路由器(router),终端设备(end-device)•ZigBee 协调者—coord为协调者节点*–每各ZigBee网络必须有一个.–初始化网络信息.协调器是一种特殊的路由器(待确认)•ZigBee 路由器—router为路由节点*–路由信息•ZigBee 终端节点—rfd为终端节点*–没有路由功能–低价格2 . 2.4GHz射频信道分为16个独立信道。

3. 绑定应用设备之间信息流的控制机制。

有直接绑定(OTA)、间接绑定、直接绑定(通过串口)4. 配置文件profile 应用程序框架5. 端点endpoint 每个ZigBee设备支持多达240个端点6. NWK寻址地址类型:ZigBee设备有一个64位IEEE长地址(MAC地址)通常用一个16位短地址表识网络地址分配由协调器完成相关参数:5 max_depth 网络的最大深度6 Max_children 路由器或协调器节点连接子节点最大个数20 Max_router 路由器或协调器处理的具有路由能力的子节点最大个数它是max_children的子集数据包传送单点unicast 多点multicast 广播broadcast路由:经过路由器的每个数据帧寻找一条最佳传输路径,并将该数据有效地传送到目的节点。

F8wconfig.cfg配置路由看了下面就不用纠结了。

配置文件(profile):Zigbee协议的配置文件是对逻辑组件及其相关接口的描述,是面向某个应用类别的公约、准则.通常没有程序代码与配置文件相关联.属性(attribute):设备之间通信的每一种数据像开关的状态或温度计值等皆可称为属性.每个属性可得到唯一的ID值.簇(cluster):多个属性的汇集形成了簇,每个簇也拥有一个唯一的ID.虽然个体之间传输的通常是属性信息,但所谓的逻辑组件的接口指的却是簇一级的操作,而非属性一级.终端(endpoint):每个支持一个或多个簇的代码功能块称为终端.不同的设备通过它们的终端及所支持的簇来进行通信.Cluster: is a container for one or more attributes. (一个或更多属性的集合)Attribute: a data entity which represents a physical quantity or state.(反映物理特性或状态的一个数据实体)Cluster是逻辑设备之间的事务关系Cluster定性Attribute则是某种事务关系的具体特例Attribute定量Endpoint是一个逻辑设备(个人理解为入口地址)。

OSAL你想知道的都在这里

OSAL你想知道的都在这里

OSAL你想知道的都在这里近日,21ic论坛TI无线连接论坛板块分享了一张OSAL调度机制的图,图片如下OSAL调度机制是何方神圣?OSAL为Operating System Abstraction Layer,即操作系统抽象层,支持多任务运行,它并不是一个传统意义上的操作系统,但是实现了部分类似操作系统的功能。

OSAL概念是由TI公司在ZIGBEE协议栈引入,他的意思是”模拟操作系统”,此OS,并非一个真正的OS,而是模拟OS的一些方法为广大编程者提供一种写MCU程序的方法.当有一个事件发生的时候,OSAL负责将此事件分配给能够处理此事件的任务,然后此任务判断事件的类型,调用相应的事件处理程序进行处理。

现有的嵌入式操作系统可以分为两类,即通用的多任务操作系统(General—purpose Multi-tasking OS)和事件驱动的操作系统(Event-driven OS)。

前者能够很好地支持多任务或者多线程,但是会随着内部任务切换频率的增加而产生很大的开销,这类操作系统有:uC /OS-II、嵌入式Linux、WinCE等。

后者支持数据流的高效并发,并且考虑了系统的低功耗要求,在功耗、运行开销等方面具有优势。

典型的代表如TinyOSl291。

目前TinyOS操作系统支持的平台有ATMEL公司的A VR系列、TI公司的MSP430系列。

由于TinyOS操作系统还没有对Chipcon公司(才知道TI把它收购了)提供CC2430开发平台提供支持,因此,要在CC2430开发平台上使用TinyOS系统来开发Zigbee协议栈软件,就必须首先对TinyOS进行移植。

因此Chipcon公司为自己设计的ZStack协议栈中提供了一个名为操作系统抽象层OSAL 的协议栈调度程序。

Osal主要提供如下功能:任务注册、任务间同步互斥、中断处理存储器分配和管理、提供定时器功能。

zigbee学习自我总结!!!!!

zigbee学习自我总结!!!!!

1. Zigbee网络节点类型Zigbee网络有三类节点类型:即协调器Coordinator、路由器Router和终端设备EndDevice,其中协调器和路由器均为全功能设备,而终端设备选用精简功能设备。

2. Zigbee协议栈各层主要功能模块3. Zigbee网络节点地址Zigbee网络协议的每一个节点皆有两个地址:64位的IEEEMAC地址及16位网络地址.EUI-64(64-bit extended unique identifier)1)64-bit地址,又称为MAC地址或IEEE地址。

每个ZigBee节点都应该有全球唯一的64位IEEE地址。

这个地址需要向IEEE 组织申请才能使用。

通信时,将待发送的数据包的目的地址设为此64位IEEE 地址,从而实现数据包的正确投递。

2)16-bit地址,即网络地址,或称为短地址。

当一个ZigBee网络形成后,ZigBee 网络内的每个节点,都会分配到一个16位的网络地址。

通信时,将待发送的数据包的目的地址设为此16位网络地址。

4.Zigbee协议术语配置文件(profile):Zigbee协议的配置文件是对逻辑组件及其相关接口的描述,是面向某个应用类别的公约、准则.通常没有程序代码与配置文件相关联.属性(attribute):设备之间通信的每一种数据像开关的状态或温度计值等皆可称为属性.每个属性可得到唯一的ID值.簇(cluster):多个属性的汇集形成了簇,每个簇也拥有一个唯一的ID。

虽然个体之间传输的通常是属性信息,但所谓的逻辑组件的接口指的却是簇一级的操作,而非属性一级.终端(endpoint):每个支持一个或多个簇的代码功能块称为终端。

不同的设备通过它们的终端及所支持的簇来进行通信。

PAN IDs:PAN IDs是用来在逻辑上分离在同一领域内的多个节点组。

这样不同组之间节点通信就不会干扰,且可以在同一通道channel上(zigbee2007不行,因为它通信时可以改变频率的)Pan id是16位,范围是0x0000~03fff。

zigbee入门指导

zigbee入门指导

Zigbee入门指导(二)——运行Zigbee例程在Zigbee入门指导(一)中讲解了基于CC2430的Zigbee 开发环境的搭建,安装完Ti的协议栈后,里面有多个例程,帮助用户入门及作为自己工程的基本框架。

在Zigbee入门指导(二)中,我们将通过演示执行相关的例程,了解Zigbee应用的启动流程(不是Zigbee网络的启动流程),了解运行一个自定义Zigbee工程所要作的软件方面的改动和工程选项的配置。

所用的开发套件为无线龙的套件。

一、修改HALHAL及所谓的Hardware Abstration Layer,通俗的了解即为开发板的硬件驱动,由于所用的是无线龙的开发板,与Ti的原装开发板有差异,需要对协议栈自带的HAL进行修改。

HAL文件存放在目录<Components/hal>中,里面有<common>、<include>、<target>三个目录,<common>中定义的与外设无关的硬件操作,<include>存放的是头文件,而<target>存放的是目标文件,里面根据目标板的不同分为<CC2430BB>、<CC2430DB>、<CC2430EB>。

所用的无线龙的开发板和CC2430EB最为相似,故修改<CC2430EB>中的内容。

按键操作几乎在每个例程中都会用到,故此处以按键驱动的修改为例,演示HAL的修改。

先了解下Ti和无线龙扩展板的不同之处。

Ti的CC2430EB 原理图在Ti文档SWRU133.pdf(位于SWRU133.zip中)。

Page29是按键电路的原理图,如图1图1(左上角是元件图)CC2430EB的按键其实是摇杆,上下左右四个方向和电阻网络相连,通过放大电路送到CC2430的P0.6脚,经AD采样后判断摇杆摆向哪个方向,按键编号为SW1~SW4摇杆也可像普通按键一样按下,产生一个直流电平变化,接到P0.5脚,按键编号为SW5。

zigbee中OSAL事件传递机制和消息传递机制

zigbee中OSAL事件传递机制和消息传递机制

zigbee中OSAL事件传递机制和消息传递机制⼀、概述OSAL (Operating System Abstraction Layer),翻译为“操作系统抽象层”。

OSAL 就是⼀种⽀持多任务运⾏的系统资源分配机制。

OSAL与标准的操作系统还是有很⼤的区别的。

简单⽽⾔, OSAL 实现了类似操作系统的某些功能,但并不能称之为真正意义上的操作系统。

⼆、OSAL任务运⾏⽅式我们以TI1.2.1的 BLE 协议栈中的SimpleBLEPeripheral为例,分析⼀下 OSAL 。

其中有⼀个simpleBLEPeripheral.c⽂件,⾥⾯有2个⽐较重要的函数:SimpleBLEPeripheral_Init和SimpleBLEPeripheral_ProcessEvent。

SimpleBLEPeripheral_Init是任务的初始化函数,⽽SimpleBLEPeripheral_ProcessEvent则负责处理传递给此任务的事件。

⼤概浏览⼀下SimpleBLEPeripheral_ProcessEvent这个函数,我们可以发现,此函数的主要功能是判断由参数传递的事件类型,然后执⾏相应的事件处理函数。

由此,可以推断出 BLE 协议栈应⽤程序的运⾏机制如下图所⽰:当有⼀个事件发⽣的时候, OSAL 负责将此事件分配给能够处理此事件的任务,然后此任务判断事件的类型,调⽤相应的事件处理程序进⾏处理。

明⽩了这个问题,新的问题⼜摆在了我们的⾯前: OSAL 是如何传递事件给任务的。

三、OSAL的事件传递机制在试图弄清楚这个问题之前,我们需要弄清楚另外⼀个⼗分基础⽽重要的问题。

那就是如何向我们的应⽤程序中添加⼀个任务。

我们先来看看simpleBLEPeripheral.c是如何添加任务的。

我们打开OSAL_SimpleBLEPeripheral.c⽂件。

这⾥我们可以找到⼀个很重要的数组tasksArr和⼀个同样很重要的函数osalInitTasks。

ZigBee源码程序及解释

ZigBee源码程序及解释

协议栈无线透传编程原理:第一个功能:协调器的组网,终端设备和路由设备发现网络以及加入网络//第一步:Z-Stack 由 main()函数开始执行,main()函数共做了 2 件事:一是系统初始化,另外一件是开始执行轮转查询式操作系统int main( void ) { .......// Initialize the operating systemosal_init_system(); //第二步,操作系统初始化......osal_start_system(); //初始化完系统任务事件后,正式开始执行操作系统......}//第二步,进入 osal_init_system()函数,执行操作系统初始化uint8 osal_init_system( void ) //初始化操作系统,其中最重要的是,初始化操作系统的任务{// Initialize the Memory Allocation Systemosal_mem_init();// Initialize the message queueosal_qHead = NULL;// Initialize the timersosalTimerInit();// Initialize the Power Management Systemosal_pwrmgr_init();// Initialize the system tasks.osalInitTasks(); //第三步,执行操作系统任务初始化函数// Setup efficient search for the first free block of heap.osal_mem_kick();return ( SUCCESS );}//第三步,进入osalInitTasks()函数,执行操作系统任务初始化void osalInitTasks( void ) //第三步,初始化操作系统任务{uint8 taskID = 0;tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));//任务优先级由高向低依次排列,高优先级对应 taskID 的值反而小macTaskInit( taskID++ ); //不需要用户考虑nwk_init( taskID++ ); //不需要用户考虑Hal_Init( taskID++ ); //硬件抽象层初始化,需要我们考虑#if defined( MT_TASK )MT_TaskInit( taskID++ );#endifAPS_Init( taskID++ ); //不需要用户考虑#if defined ( ZIGBEE_FRAGMENTATION )APSF_Init( taskID++ );#endifZDApp_Init( taskID++ ); //第四步,ZDApp层,初始化,执行ZDApp_init函数后,如果是协调器将建立网络,如果是终端设备将加入网络。

2、自己理解zigbee有关的数据的发送和接收

2、自己理解zigbee有关的数据的发送和接收

哎呀研究这个数据的发送和收发研究了2天了。

今天终于把困扰我很久的一个问题给解决了。

问题:终端节点启动会为什么会自动的发送数据呢?解决过程:这个过程可是异常的艰辛。

要解决这个问题。

咱们先聊聊这个整个zigbee协议栈的工作流程。

程序肯定都是从main函数开始的,这个肯定也不例外。

大家查看一下main函数主要就是关闭中断,检查电源电压是否够高,还有就是初始化了,什么物理层,mac层等等。

而我们在这里关注2个函数就好了。

第一个是:osal_init_system();第二个:osal_start_system();第一个osal_init_system()函数就是初始化与系统运行相关的一些东西如:初始化内存分配系统,初始化消息队列,初始化定时器,初始化电源管理系统,初始化第一块堆,最后一个就是我们要讲的一个非常重要的函数:osalInitTasks();初始化任务函数void osalInitTasks( void )//系统任务初始化函数{uint8 taskID = 0;//这个指针指向了所有任务空间的首地址tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);//这个tasksEvents指针总共有多少个数据空间,其实总共有多少任务就有多少个空间。

osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));macTaskInit( taskID++ ); //mac层的任务是0nwk_init( taskID++ ); //网络层的任务是1Hal_Init( taskID++ ); //物理层的任务号是2#if defined( MT_TASK )MT_TaskInit( taskID++ );//串口的任务#endifAPS_Init( taskID++ );#if defined ( ZIGBEE_FRAGMENTATION )APSF_Init( taskID++ );#endifZDApp_Init( taskID++ );#if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )ZDNwkMgr_Init( taskID++ );#endifGenericApp_Init( taskID );//应用程序的初始化。

(完整版)《Zigbee协议合同书原理与应用》习题

(完整版)《Zigbee协议合同书原理与应用》习题

精心整理《Zigbee协议原理与应用》习题一、选择题1、下列哪个不是Zigbee的特点。

()A、近距离B、高功耗C、低复杂度D、低数据速率2、当超过有效载荷消息(Payload)长度的限制时,可以使用分割组装,这只在()特征集中出现。

3、作为Zigbee4、Zigbee分别为()。

A、255,65533B、258,65534 C5、()函数便开始运行A、osal_int_disable()C、D、osal_start_system()6A B、为帧运用安全功能;C D、发送信标或检测、跟踪信标。

7、Zigbee所涉及的无线通信技术有()。

A、CCAB、DSSSC、CSMA/CAD、以上都是。

8、以下不是Zigbee应用层的是()。

A、APS;B、应用程序框架(AF);C、ZDO和制造商定义的应用对象;D、PD-SAP。

9、分布式网络地址分配机制中的16位地址由下面()决定。

A、网络的最大深度(Lm)B、每个父设备拥有的子设备数(Cm);C、子设备中有几个是路由器(Rm)D、以上都是10、所有Zigbee设备必须提供的功能中,错误的是()。

A、加入一个网络;B、离开一个网络;C、重新加入一个网络;D、维护一个相邻设备的列表。

11、以下不是路由选择流程的是()。

A、路由搜索的初始化;BC、接收路由应答命令帧;D12、NIB由()维护。

A、MACB、PHYC、13、ZigbeeA、连接密钥B D、对称密钥14、对于ZigbeeA、BC、若无预告装载,则设备信任中心默认是Zigbee的协调器或协调器指定的设备;D、网络密钥归Zigbee的所有层使用。

15、当目的地址DstAddr参数设置为0xFFFFH时,进行的是()。

A、广播B、单播C、多播D、信标传输16、Zigbee使用的是()频段,共有()信道。

A、ISM,24B、ISM,27C、K,26D、K,2717、ZDO职责不包括()。

A、定义网络中设备的角色;B、发起和/或响应绑定请求;C、在网络设备之间建立一个安全的关系;D、在绑定设备之间传输信息。

ZigBee源码程序及解释

ZigBee源码程序及解释

协议栈无线透传编程原理:第一个功能:协调器的组网,终端设备和路由设备发现网络以及加入网络//第一步:Z-Stack 由 main()函数开始执行,main()函数共做了 2 件事:一是系统初始化,另外一件是开始执行轮转查询式操作系统int main( void ) { .......// Initialize the operating systemosal_init_system(); //第二步,操作系统初始化......osal_start_system(); //初始化完系统任务事件后,正式开始执行操作系统......}//第二步,进入 osal_init_system()函数,执行操作系统初始化uint8 osal_init_system( void ) //初始化操作系统,其中最重要的是,初始化操作系统的任务{// Initialize the Memory Allocation Systemosal_mem_init();// Initialize the message queueosal_qHead = NULL;// Initialize the timersosalTimerInit();// Initialize the Power Management Systemosal_pwrmgr_init();// Initialize the system tasks.osalInitTasks(); //第三步,执行操作系统任务初始化函数// Setup efficient search for the first free block of heap.osal_mem_kick();return ( SUCCESS );}//第三步,进入osalInitTasks()函数,执行操作系统任务初始化void osalInitTasks( void ) //第三步,初始化操作系统任务{uint8 taskID = 0;tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));//任务优先级由高向低依次排列,高优先级对应 taskID 的值反而小macTaskInit( taskID++ ); //不需要用户考虑nwk_init( taskID++ ); //不需要用户考虑Hal_Init( taskID++ ); //硬件抽象层初始化,需要我们考虑#if defined( MT_TASK )MT_TaskInit( taskID++ );#endifAPS_Init( taskID++ ); //不需要用户考虑#if defined ( ZIGBEE_FRAGMENTATION )APSF_Init( taskID++ );#endifZDApp_Init( taskID++ ); //第四步,ZDApp层,初始化,执行ZDApp_init函数后,如果是协调器将建立网络,如果是终端设备将加入网络。

zigbee学习笔记

zigbee学习笔记

要试验的:1串口查看数据2用自己的温度传感器看3串口通信,该代码,发送自己想发的数据。

如果修改数据长度看路由代码。

修改路由代码弄串口这边原理。

两头拼。

要解决的问题:1温度采集代码2zigbee传输代码3串口传输数据代码4endpoint与任务的关系。

与按键串口服务关系。

已经解决的问题:1开发的流程2如何添加新任务3osal工作原理,任务调度机制。

难点:几个关键回调函数的理解关键点(总体规划):1、数据采集,这部分的关键是I-WIRE协议的理解。

传感器与51的通信问题。

自己必须先把这部分搞定,现在要解决这个问题,即在TI提供的协议栈的基础上开发自己的应用。

要弄懂温度,湿度,PH值传感器的工作原理,一般采用I-WIRE总线的协议。

2、将数据传输到协调器(控制节点),这部分关键是zigbee通信协议,要充分利用TI的Z-STACK 协议栈来进行二次开发。

主要关注数据的收发模块,数据的格式、特点。

3、数据从协调器传到PC,这部分关键是串口通信协议。

正确的将数据传到上位机。

4、PC控制显示界面,这部分关键是找到关键的API,然后取出自己想要的数据显示。

如果需要存储数据,要操纵数据库,选择数据库。

解决这几个问题这个项目就算完成了。

现在猜想:一、开发一个新的应用应该做什么呢?1获取模板标识符,簇标识符,设备标识符的相关信息,我要进一步了解这两个关键的概念。

2在1基础上我要能注册application,taskID,endpoint,以建立自己应用与操作系统交互。

这是一个关键的点。

二、必须弄懂传感器采集的原理,代码。

三、必须弄懂串口的原理,代码。

关键的概念1、PAN标识符,PAN ID2、模板标识符,profileID3、簇标识符,clusterID 8bit4、节点,ieee地址(扩展地址)网络地址(短地址)64bit/16bit5、端点,endpoint 8bit6、设备标识符,Device Description 16bit7、应用任务ID,taskID8、属性Attribute 16bit9、Taskevents envents 16bit申请到模板标识符后,可以为模板定义设备描述符、簇标识符、服务类型(KVP或MSG)属性(Attribute)。

Zigbee主函数中的一些函数

Zigbee主函数中的一些函数

下面把主函数复制过来简单看下:ZSEG int main( void ){// Turn off interrupts------------关闭中断osal_int_disable( INTS_ALL );// Initialize HAL-----------初始化HAL,关于HAL是什么我想后面会有介绍的。

HAL_BOARD_INIT();// Make sure supply voltage is high enough to run----电压检测,最好是能保证芯片能正常工作的电压zmain_vdd_check();// Initialize stack memory-------------初始化stack存储区zmain_ram_init();// Initialize board I/O------------初始化板载IOInitBoard( OB_COLD );// Initialze HAL drivers-------------初始化HAL驱动HalDriverInit();// Initialize NV System--------------初始化NV系统,NV是什么后面我想也会有介绍的osal_nv_init( NULL );// Determine the extended address------------确定扩展地址(64位IEEE/物理地址)zmain_ext_addr();// Initialize basic NV items----------------初始化基本NV条目zgInit();// Initialize the MAC----------------初始化MACZMacInit();#ifndef NONWK// Since the AF isn't a task, call it's initialization routineafInit();#endif// Initialize the operating system----------初始化操作系统,看样子这里面还有OS,麻烦了……..!osal_init_system();// Allow interrupts-------------允许中断osal_int_enable( INTS_ALL );// Final board initialization------------------最后的版在初始化InitBoard( OB_READY );// Display information about this device---------------显示设备信息zmain_dev_info();/* Display the device info on the LCD */------------液晶支持显示#ifdef LCD_SUPPORTEDzmain_lcd_init();#endifosal_start_system(); // No Return from here-------------------这里没有返回,大概是进入OS了。

osal操作系统函数使用

osal操作系统函数使用

Zigbee协议栈OSAL层API函数(译)收藏3.信息管理API3.1 概述这部分API提供了任务或处理单元与不同的处理环境之间的数据交换。

这部分API函数能够为任务分配和收回消息缓冲区,发送命令消息给以外一个任务并且接收应答。

3.2 osal_msg_allocate ( )概述:当一个任务调用这个函数时,将为消息分配缓冲区,函数会将消息加入缓冲区,并调用osal_msg_send()将消息发送到另一个任务。

原型:byte *osal_msg_allocate( uint16 len )参数:len :消息的长度返回值:指向消息缓冲区的指针,当分配失败时返回NULL3.3 osal_msg_deallocate( )概述:用于收回缓冲区原型:byte osal_msg_deallocate( byte *msg_ptr )参数:Msg_ptr : 指向将要收回的缓冲区的指针返回值:RETURN V ALUE DESCRIPTIONZSUCCESS 回收成功INV ALID_MSG_POINTER 错误的指针MSG_BUFFER_NOT_A V AIL 缓冲区在队列中3.4 osal_msg_send( )概述:任务调用这个函数以实现发送指令或数据给另一个任务或处理单元。

目标任务的标识必须是一个有效的系统任务,当调用osal_create_task ( )启动一个任务时,将会分配任务标识。

osal_msg_send()也将在目标任务的事件列表中设置SYS_EVENT_MSG原型:byte osal_msg_send( byte destination_task, byte *msg_ptr )参数:destination_task :目标任务的标识msg_ptr :指向消息缓冲区的指针返回值:ZSUCCESS 消息发送成功INV ALID_MSG_POINTER 无效指针INV ALID_TASK 目标任务无效3.5 osal_msg_receive( )概述:任务调用这个函数来接收消息。

ZigBee知识无线龙

ZigBee知识无线龙

1.协议栈工作流程和无线收发控制LED实验内容:1. ZigBee 协议栈简介2. 如何使用ZigBee 协议栈3. ZigBee 协议栈的安装、编译与下载4. 协议栈无线收发控制LED5. 协议栈工作流程实现现象:协调器、终端上电,组网成功后D1 灯闪烁1. ZigBee 协议栈简介什么是ZigBee 协议栈呢?它和ZigBee 协议有什么关系呢?协议是一系列的通信标准,通信双方需要共同按照这一标准进行正常的数据发射和接收。

协议栈是协议的具体实现形式,通俗点来理解就是协议栈是协议和用户之间的一个接口,开发人员通过使用协议栈来使用这个协议的,进而实现无线数据收发。

图1 展示了ZigBee 无线网络协议层的架构图。

ZigBee 的协议分为两部分,IEEE 802.15.4 定义了PHY(物理层)和MAC(介质访问层)技术规范;ZigBee联盟定义了NWK(网络层)、APS(应用程序支持子层)、APL(应用层)技术规范。

ZigBee协议栈就是将各个层定义的协议都集合在一直,以函数的形式实现,并给用户提供API(应用层),用户可以直接调用。

图1 ZigBee 无线网络协议层2. 如何使用ZigBee 协议栈协议栈是协议的实现,可以理解为代码,函数库,供上层应用调用,协议较底下的层与应用是相互独立的。

商业化的协议栈就是给你写好了底层的代码,符合协议标准,提供给你一个功能模块给你调用。

你需要关心的就是你的应用逻辑,数据从哪里到哪里,怎么存储,处理;还有系统里的设备之间的通信顺序什么的,当你的应用需要数据通信时,调用组网函数给你组建你想要的网络;当你想从一个设备发数据到另一个设备时,调用无线数据发送函数;当然,接收端就调用接收函数;当你的设备没事干的时候,你就调用睡眠函数;要干活的时候就调用唤醒函数。

所以当你做具体应用时,不需要关心协议栈是怎么写的,里面的每条代码是什么意思。

除非你要做协议研究。

每个厂商的协议栈有区别,也就是函数名称和参数可能有区别,这个要看具体的例子、说明文档。

基于ZigBee的矿井安全监测系统设计

基于ZigBee的矿井安全监测系统设计

2 ZigBee 技术
2.1 Zigbee 技术简述 .................................................. 10 2.2 ZigBee 协议 ...................................................... 11 2.3 ZigBee 协议的网络层 .............................................. 13 2.3.1 网络设备类型 ............................................... 13 2.3.2 拓扑结构 ................................................... 15 2.3.3 建立和维护网络 ............................................. 16 2.3.4 编址 ....................................................... 20 2.3.5 网络层的数据通信 ........................................... 21 2.4 ZigBee 协议的应用层 .............................................. 22 2.4.1 设备和服务发现 ............................................. 22 2.4.2 绑定管理 ................................................... 23 2.4.3 网络管理 ................................................... 23 2.4.4 OSAL 操作系统 ............................................... 24

osal_start_system 的函数

osal_start_system 的函数

osal_start_system 的函数osal_start_system函数是采用操作系统抽象层(OSAL)实现的,它实际上是一个任务启动程序,用于在系统运行时启动所有已定义的任务,从而实现系统的初始化和运行。

在使用操作系统抽象层(OSAL)的系统中,我们可以使用该函数来启动系统。

该函数的作用是按先后顺序启动任务,并将其加入到任务队列中,实现多任务同时运行的能力。

在函数的实现中,它会首先注册和初始化所有任务,并将其加入到任务列表中,然后启动任务调度器,开始调度所有任务的执行。

具体来说,该函数的主要作用如下:1.注册和初始化任务在调用osal_start_system函数之前,我们需要先定义好系统所需要的任务,包括任务的名称、处理函数、优先级、栈大小等相关参数。

然后,在osal_start_system函数中,我们需要对这些任务进行注册和初始化,将它们加入到任务列表中,并为其分配所需的资源,比如栈空间、任务句柄等。

2.启动任务调度器在完成所有任务的初始化之后,osal_start_system函数会启动任务调度器,开始按照任务的优先级依次执行所有任务。

任务调度器是一个非常重要的组件,它负责根据任务的优先级和状态,动态地调度任务之间的执行顺序,以实现多任务同时运行的能力。

在启动任务调度器之后,系统会将所有任务按照优先级顺序加入到任务队列中,并不断轮询任务队列,按照优先级依次执行每个任务的处理函数。

3.进入系统循环一旦任务调度器启动,系统就会进入一个无限循环中,不断处理任务队列中的任务,直到系统关闭。

在循环中,系统会不断轮询任务队列,并调用任务的处理函数来执行具体的任务操作。

同时,系统监控所有任务的状态,及时响应任务的事件和错误,确保系统正常运行。

OSAL的工作原理

OSAL的工作原理

OSAL的工作原理ZigBee 协议栈依据IEEE 802.15.4 标准和ZigBee 协议规范。

ZigBee 网络中的各种操作需要,利用协议栈各层所提供的原语操作来共同完成。

原语操作的实现过程往往需要向下一层发起一个原语操作并且通过下层返回的操作结果来判断出下一条要执行的原语操作。

IEEE 802 .15 .4 标准和ZigBee 协议规范中定义的各层原语操作多达数十条,原语的操作过程也比较复杂,它已经不是一个简单的单任务软件。

对于这样一个复杂的嵌入式通信软件来说,其实现通常需要依靠嵌入式操作系统来完成。

挪威半导体公司Chipcon( 目前已经被TI 公司收购)作为业界领先的ZigBee 一站式方案供应商,在推出其CC2530 开发平台时,也向用户提供了自己的ZigBee 协议栈软件-Z-Stack 。

这是一款业界领先的商业级协议栈,使用CC2530 射频芯片,可以使用户很容易的开发出具体的应用程序来。

Z-Stack 使用瑞典公司IAR 开发的IAR Embedded Workbench for MCS .51 作为它的集成开发环境。

Chipcon 公司为自己设计的Z-Stack 协议栈中提供了一个名为操作系统抽象层OSAL 的协议栈调度程序。

对于用户来说,除了能够看到这个调度程序外,其它任何协议栈操作的具体实现细节都被封装在库代码中。

用户在进行具体的应用开发时只能够通过调用API 接口来进行,而无权知道Zig,Bee 协议栈实现的具体细节。

Z-Stack1.4.3及以后的版本中引入了一个OSAL(Operating System Abstraction Layer 操作系统抽象层),但在我们整个的ZigBee协议栈的结构图中,我并没有能够发现这个层在哪个位置。

但是整个的协议栈都要在OS的基础上才能运行。

OSAL和我们通常所说的RTOS,pc上的操作系统还是有很大的不同,ZigBee2006中只是利用了操作系统的概念和思想,利用OS把Z-Stack软件组件从特殊的处理过程相分离,并将软件成分保护了起来。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
—— osal_init_system ZigBee 学习之 31 31—— ——osal_init_system
// 初始化操作系统,主要是堆栈,时钟,电源模式,任务号分配 osal_init_system();
//通过创建定义在任务表【OSAL_Tasks.h】中的任务来初始化任务系统【OSAL. c】 byte osal_init_system( void ) { //初始化内存分配系统【OSAL_Memory.c】 osal_mem_init(); //初始化消息队列,其实就是一个指针 osal_qHead = NULL; // osal_msg_q_t osal_qHead; // typedef void * osal_msg_q_t; #if defined( OSAL_TO TAL_MEM ) //如果定义了 OSAL_TO TAL_MEM 就会跟踪系统的堆栈使用情况并通过 LCD 显示 出来 osal_msg_cnt = 0; #endif //初始化系统定时器【OSAL_Timers.c 】 osalTimerInit(); void osalTimerInit( void ) { // Initialize the rollover modulo tmr_count = TICK_TIME; //【OnBoard.h】 // #define TICK_TIME 1000 //每次时钟滴答的时间(毫秒) tmr_decr_time = TIMER_DECR_TIME; // #define TIMER_DECR_TIME 1 osal_timer_activate( false ); //初始化系统定时器,实际上是停止了时钟定时器【OSAL_Tim ers.c 】 void osal_timer_activate( byte turn_on ) { osal_timer_hw_setup( turn_on ); //设置时钟硬件【OSAL_Timers.c 】 void osal_timer_hw_setup( byte turn_on ) { if (turn_on) {
HalTimerStart (OSAL_TIMER, tmr_count ); //启动时钟 } else { HalTimerStop (OSAL_TIMER); } } tictive = false; osal_systemClock = 0; } //初始化电源管理系统 osal_pwrmgr_init(); //配置器件使用的电源模式【OSAL_PwrMgr.c】 void osal_pwrmgr_init( void ) { pwrmgr_attribute.pwrmgr_device = PWRMGR_ALW AYS_ON; // 默认不打开节能模式 //【OSAL_PwrMgr.h】 // #define PWRMGR_ALWAY S_ON 0 //不使用节能模式 //#define PWRMGR_BATTERY 1 //使用电池供电, 允许进入休眠模式 // pwrmgr_attribute_t pwrmgr_attribute; typedef struct { uint16 pwrmgr_task_state; uint16 pwrmgr_next_timeout; uint16 accumulated_sleep_time; uint8 pwrmgr_device; } pwrmgr_attribute_t; pwrmgr_attribute.pwrmgr_task_state = 0; // Cleared. All set to c onserve } //初始化系统任务,为每个任务调用初始化函数 osalInitTasks(); //【sapi.c 】 void osalInitTasks( void ) { uint8 taskID = 0;
tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasks Cnt); osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt)); // uint16 *tasksEvents; // const uint8 tasksCnt = sizeof( tasksArr ) / sizeof( tasksArr[0] ); //任务队列中其实是一个个的事件处理函数, 这里分配了任务要用的内存 空间。然后为每个任务分配一个不同的任务 ID ,ID 递增,按照初始化的 顺序排列在 tasksArr 队列中 macTaskInit( taskID++ ); nwk_init( taskID++ ); Hal_Init( taskID++ ); #if defined( MT_TASK ) MT_TaskInit( taskID++ ); #endif APS_Init( taskID++ ); ZDApp_Init( taskID++ ); SAPI_Init( taskID ); } // Setup efficient search for the first free block of heap. //跳过第一个块 osal_mem_kick(); return ( ZSUCCESS ); }
作者:Free 原文来源:61IC 中国电子在线
相关文档
最新文档