Zigbee协议栈OSAL层API函数【转载】

OSAL层提供了很多的API来对整个的协议栈进行管理。主要有下面的几类:信息管理、任务同步、时间管理、中断管理、任务管理、内存管理、电源管理以及非易失存储管理。看到这些管理是不是感觉越来越像一个操作系统了。

1.     信息管理API

信息管理为任务间的信息交换或者外部处理事件(例如:中断服务程序或一个控制循环内的函数调用)提供一种管理机制。包括允许任务分配或不分配信息缓存、发送命令信息到其他任务、接受应答信息等API函数。

(1)osal_msg_allocate ( )

功能描述:

为信息分配缓存空间、任务调用或函数被调用的时候,该空间被信息填充或调用发送信息函数osal_msg_send()发送缓存空间的信息到其他任务。

原型:

byte *osal_msg_allocate( uint16 len )

参数:

len :消息的长度

返回值:

指向消息缓冲区的指针,当分配失败时返回NULL

注意:不能与函数osal_mem_alloc()混淆,osal_mem_alloc()函数被用于为在任务间发送信息分配缓冲区,用该函数也可以分配一个存储区。

(2)osal_msg_deallocate( )

功能描述:

用于收回缓冲区

原型:
         byte osal_msg_deallocate( byte *msg_ptr )

参数:

Msg_ptr : 指向将要收回的缓冲区的指针

返回值:

ZSUCCESS                                           回收成功

INVALID_MSG_POINTER              错误的指针

MSG_BUFFER_NOT_AVAIL          缓冲区在队列中

(3) 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 : 指向消息缓冲区的指针,必须是osal_msg_allocate ( )函数分配的有效的数据缓存

返回值:

返回一个字节,指示操作的结果.

ZSUCCESS                                           消息发送成功

INVALID_MSG_POINTER              无效指针

INVALID_TASK                                 目标任务无效

(4) osal_msg_receive( )

功能描述:

任务调用这个函数来接收消息。消息处理完毕后,发送消息的任务必须调用osal_msg_deallocate()收回缓冲区。一个任务接收一个命令信息是,调用该函数

原型:

byte *osal_msg_receive( byte task_id )

参数:

task_id :消息发送者的任务标识

返回值:

指向消息所存放的缓冲区指针,如果没有收到消息将返回NULL。

 2 同步任务API

这个API使能一个任务等待一个事件的发生和返回控制而不是一直等待。在这个API中的函数可以用来为任务设置事件,立刻通知任务有事件被设置。

osal_set_event( )

功能描述:

函数用来设置一个任务的事件标志

原型:

byte osal_set_event( byte task_id, UINT16 event_flag )

参数:

task_id :任务标识

event_flag :是2个字节的位图,每个位特指一个事件。只有一个系统事件(SYS_EVENT_MSG),其他事件在接收任务中定义。

返回值:

ZSUCCESS                                  成功设置

INVALID_TASK                       无效任务

3.. 时间管理API

这个API允许内部任务(Z-Stack)以及应用层任务使用定时器。函数提供了启动和停止定时器的功能,定时器最小增量为1MS。

(1)  osal_start_timer( )

功能描述:

启动一个定时器,当定时器终止时,指定的事件标志位被设置。通过在任务中调用osal_start_timer函数设置时间标志位。如果指明任务ID,则可以用osal_start_timerEx()函数替代osal_start_timer().

原型:

byte osal_start_timer(UINT16 event_id, UINT16 timeout_value);

参数:

event_id : 用户定义的事件标志位event bit. 当定时器到点时,事件将通知任务。

timeout_value :定时值(ms)

返回值:

ZSUCCESS Timer                      成功开启

NO_TIMER_AVAILABLE      无法开启

(2)  osal_start_timerEx( )

功能描述:

功能与osal_start_timer()相近,只不过参数多了一个任务ID,这个函数允许调用者为另一个任务启动定时器

原型:
    byte osal_start_timerEx( byte taskID, UINT16 event_id, UINT16

timeout_value);

参数:

参数1:taskID 当定时器终止时,得到该事件的任务ID

参数2:event_id,是用户定义的事件位,当定时器终止时,正在调用的任务将被通报

参数3:定时器事件被设置之前时间的计数

返回值:

ZSUCCESS Timer                      成功开启

NO_TIMER_AVAILABLE      无法开启

(3)osal_stop_timer( )

功能描述:

停止正在运行的定时器,停止外部事件调用osal_stop_timerEx(),可以停止不同任务的定时器。

原型:

byte osal_stop_timer( UINT16 event_id );

参数:

event_id :将要结束的目标事件(该事件是启动定时器的事件)定时器的标识符

返回值:

ZSUCCESS Timer                               成功停止

INVALID_EVENT_ID                       无效事件

(4)osal_stop_timerEx( )

功能描述:

结束外部事件的定时器,指明了任务的ID

原型:

byte osal_stop_timerEx( byte task_id, UINT16 event_id );

参数:

参数1:停止定时器所在的任务ID

参数2:被停止定时器的标识符

返回值

ZSUCCESS Timer                               成功停止

INVALID_EVENT_ID                       无效事件

(5)osal_GetSystemClock( )

功能描述:

读取系统时间

原型:

uint32 osal_GetSystemClock( void );

参数:

返回值:

系统时间(ms)

4 中断管理API

这些API实现任务与外部中断的接口,函数允许一个任务关联每一个具体的中断程序程序,可以开关中断。在中断服务程序内,其他任务可以设置事件。

(1) osal_int_enable( )

功能描述:

函数用于使能中断。一旦允许中断发生将引起中断分配的服务程序运行。

原型:

byte osal_int_enable( byte interrupt_id )

参数:

interrupt_id :被允许的中断的标识符。

返回值:

ZSUCCESS Interrupt                          成功使能

INVALID_INTERRUPT_ID             无效中断

(2)osal_int_disable( )

功能描述:

关闭中断

原型:

byte osal_int_disable( byte interrupt_id )

参数:
    被禁止中断的标识符

返回值:
    ZSUCCESS Interrupt                          成功关闭

INVALID_INTERRUPT_ID             无效中断

5 任务管理API

该API用在添加和管理OSAL中的任务。每一个任务由任务初始化函数和时间处理函数组成。

(1)osal_init_system()

功能描述:

该函数初始化OSAL系统。该函数必须在启动任何一个OSAL函数之前被调用

原型:

byte osal_init_system( void )

参数:

返回值:

ZSUCCESS                        成功

(2)osal_start_system()

功能描述:

这个函数是系统任务的主循环函数,在循环里面将遍历所有的任务事件,为触发事件的任务调用任务事件处理函数。如果一个特定任务有事件发送,那么该函数就将调用该任务的事件处理函数。当事件处理完之后,将返回主循环。继续查找其他的任务事件。如果没有事件,函数将把处理器转到睡眠模式。

原型:

void osal_start_system( void )

参数:

返回值:

(3)osal_self( )

功能描述:

这个函数  返回正在被调用任务的任务标识符。如果在一个中断服务子程序中调用该函数将返回一个错误结果。

函数原型

byte osal_self( void )

参数描述

返回值:

返回值为当前活动的任务的任务标识符

(4)osalTaskAdd( )

功能描述:

这个函数添加一个任务到任务系统中,一个任务由两个函数组成 –  初始化与信息处理。信息处

理函数在事件时发生,而后处理其中之一,并返回其余到主循环中。

函数原型

//任务初始化函数原型

typedef void(*pTaskInitFn) (unsigned char task_id);

//事件句柄函数原型

typedef unsigned short (*pTaskEventHandlerFn)(unsigned char task_id,unsigned short event);

//添加任务函数原型

void osalTaskAdd(const pTaskInitFn pfnInit,const pTaskEventHandlerFn,pfnEventProcessor,

const byte taskPriority);

参数描述

pfnInit –  指向任务初始化函数的指针

pfnEventProcessor –  指向任务事件处理器函数的指针

taskPriority –  任务的优先级。值为 0 ~ 255 之间

优先级                             值

OSAL_TASK_PRIORITY_LOW         50

OSAL_TASK_PRIORITY_MED          130

OSAL_TASK_PRIORITY_HIGH          230

6 内存管理API

该 API 呈现一个简单的内存分配系统。这些函数允许动态内存分配。

(1)osal_mem_alloc( )

功能描述:

这个函数是一个简单内存分配函数,如果成功则返回一个缓冲区的指针。

函数原型

oid *osal_mem_alloc(uint16 size);

参数描述

ize –  缓冲区的大小

返回值

一个 void 指针指向新分配的缓冲区,如果没有足够的内存来分配,则返回一个 NULL 指针。

(3)  osal_mem_free

功能描述:

这个函数释放已分配的内存来重新使用。只有当内存已使用 osal_mem_alloc( )分配过才可以工作。

函数原型

oid osal_mem_free(void *ptr);

参数描述

ptr -   指向将被释放的缓冲区的指针,这个缓冲区之前必须被 osal_mem_alloc( )分配过使用。

返回值

无。

7. 电源管理 API

这里的函数描述了OSAL的电源管理系统,当OSAL安全的关闭接收器宇外部硬件并使处理器进入休眠模式时,该系统提供想应用/任务通报该事件的方法

(1)      osal_pwrmgr_task_state( )

功能描述:

该函数被每个任务调用,声明该任务是否需要节能,任务被创建时,默认是节能模式。如果任务总是需要节能,那么就不需要调用该函数。

函数原型

byte osal_pwrmgr_task_state(byte task_id,pwrmgr_state_t state);

参数描述

state –  改变一任务电源状态。

类型  描述

PWRMGR_CONSERVE  打开节能模式,所有任务都须一致,为任务初始化的缺省模式。

PWRMGR_HOLD  关闭节能模式

返回值

返回值显示操作的结果。

返回值  描述

ZSUCCESS  成功

INVALID_TASK  无效任务

(2)  osal_pwrmgr_device()

功能描述:

该函数在上电或电源需求变更时调用(例如电源支持协调器)。这一函数设置了大体的设备电源管理的开/关状态。该函数应当从中央控制实体(如ZDO)被调用。

原型:

void osal_pwrmgr_state( byte pwrmgr_device );

参数:

pwrmgr_device :更改或设置节电模式

PWRMGR_ALWAYS_ON                                   无节电

PWRMGR_BATTERY                                         开节电

返回值:

8.非易失性(NV)存储管理

这部分讲述 OSAL NV非易失性(NV)存储系统。系统提供了一种方式来为应用永久存放信息到设备内存中。

他也可以用于某些堆栈条目的固定存储,这些 NV函数被设计用来读取/写入用户定义的由任何数据类型组成的(如结构与数组)项目。用户可以通过设定一适当的偏移量与长度读取或写入一个完整的项目或项目中的一个单元。 该API为NV存储介质独有,与存储体本身没有关系。可以被flash或eeprom使用。

每个 NV 项目都有一个惟一的标识符,每个应用都有特定的 ID值范围(其余 ID值为保留,或为栈、平台所用)。如果你的应用创建了自己的 NV项目,则必须从应用值范围内选一个 ID。如下

0x0000 Reserved

0x0001 – 0x0020 OSAL

0x0021 – 0x0040 NWK

0x0041 – 0x0060 APS

0x0061 – 0x0080 Security

0x0081 – 0x00A0 ZDO

0x00A1 – 0x0200 Reserved

0x0201 – 0x0FFF Application

0x1000 -0xFFFF Reserved

在使用API时有一些重要的注意点:

1)这些是模块化函数调用,一个操作需要花费几毫秒来完成,特别是 NV写操作。另外,中断

需求禁止几毫秒。最好是在与其他时间性操作上没有冲突的时刻来执行这些函数。例如,一

个较佳的写 NV 项目时刻是接收器关闭的时候。

2)  不要经常性写 NV,它需要花费时间与能源,并且大多数的闪存都有一个最大擦除次数限制。

3)  如果一个或多个 NV 项目变更,特别是 Z-stack的版本升级,它必须擦除且重新初始化 NV

内存。否则,读与写已变更的 NV项目操作将失败或产生错误的结果。

(1)   osal_nv_item_init( )

功能描述:

初始化 NV中的一条项目。这个函数检测 NV项目的存在,如果不存在,则它用

数据创建与初始化一个 NV 项目,如果有的话。 在调用 osal_nv_read( )或osal_nv_write( )前,每一个项目必须先调用该函数。

函数原型

yte osal_nv_item_init(uint16 id,uint16 len,void *buf);

参数描述

id –  用户定义项目标识符

len –  项目长度(字节)

buf – 项目初始化数据指针,如果没有初始化数据,则设为 NULL.

返回值

返回值显示操作的结果。

返回值  描述

ZSUCCESS  成功

NV_ITEM_UNINIT  成功但项目不存在

(2)   osal_nv_read( )

功能描述:

读取 NV数据,这个函数被用来读取整个 NV项目或一个项目中项目,读取的数据被复制到*buf 中。

函数原型

yte osal_nv_read( uint16 id, uint16 offset, uint16 len, void *buf);

参数描述

d –  用户定义项目标识符

ffset –  项目的内存偏移量(字节)

en –  项目长度(字节)

buf – 数据读取到该缓冲区

返回值

返回值显示操作的结果。

返回值  描述

ZSUCCESS  成功

NV_ITEM_UNINIT  项目没有初始化

NV_OPER_FAILED  操作失败

(2)      nv_osal_write( )

功能描述:

写入数据到 NV中,这个函数被用来写入整个 NV项目或一个项目中的单元(通过一个偏移量来索

引该项目)。

函数原型

byte osal_nv_write( uint16 id,uint16 offset,uint16 len,void *buf);

参数描述

id –  用户定义项目标识符

offset –  项目的内存偏移量(字节)

len –  项目长度(字节)

*buf – 要写入的数据

返回值

返回值显示操作的结果。

返回值  描述

ZSUCCESS  成功

NV_ITEM_UNINIT  项目没有初始化

NV_OPER_FAILED  操作失败

(3)      osal_offsetof( )

功能描述:

该宏在一个结构中按字节计算一个单元的内存偏移量,它被 NV API 函数用来计算偏移量。

函数原型

sal_offsetof(type,member)

参数描述

ype –  结构类型

member –  结构成员

时间: 2024-10-16 08:01:24

Zigbee协议栈OSAL层API函数【转载】的相关文章

[ZigBee] 15、Zigbee协议栈应用(一)——Zigbee协议栈介绍及简单例子(长文,OSAL及Zigbee入门知识)

1.Zigbee协议栈简介 协议是一系列的通信标准,通信双方需要按照这一标准进行正常的数据发射和接收.协议栈是协议的具体实现形式,通俗讲协议栈就是协议和用户之间的一个接口,开发人员通过使用协议栈来使用这个协议,进而实现无线数据收发. 如图1所示:Zigbee协议分为两部分,IEEE 802.15.4定义了PHY(物理层)和MAC(介质访问层)技术规范:Zigbee联盟定义了NWK(网络层).APS(应用程序支持层).APL(应用层)技术规范.Zigbee协议栈就是将各个层定义的协议都集合在一起,

[ZigBee] 16、Zigbee协议栈应用(二)——基于OSAL的无线控制LED闪烁分析(下)

说在前面:上一篇介绍了无线LED闪烁实现的OSAL部分,本篇介绍如何实现无线数据收发及数据处理: 上一篇是用SI跟着流程查看源码,我个人认为以架构的思维去了解代码能让人更清晰 ::ZMain.c程序入口文件 这里chipcon_cstartup.s51是汇编的启动文件,ZMain.c相当于main文件,里面有main函数: 1 int main( void ) 2 { 3 osal_int_disable( INTS_ALL );// Turn off interrupts 关中断 4 HAL_

(zigbee学习总结一)zigbee协议栈中OSAL运行机理

在基于zigbee协议栈的应用程序开发过程中,用户只需要实现应用层的开发即可,zigbee应用程序框架中包含了最多240个应用程序对象,每个应用程序对象运行在不同的端口上,因此端口的最作用是区分不同的应用程序对象,可以把一个应用程序对象看成为一个任务.因此,需要一个机制来实现任务的切换.同步和互斥,这就是OSAL产生的根源. OSAL用一句话来说就是指支持多任务运行的系统资源分配机制.OSAL中有三个参数非常重要,即:tasksCnt.tasksEvent[]和tasksArr[]. (1)ta

[转载]使用API函数GetProcAddress的注意事项

Windows API 函数 GetProcAddress 被广泛用于取得函数指针地址. 例如: typedef BOOL (WINAPI *pfnGetProductInfo)(DWORD, DWORD, DWORD, DWORD, PDWORD); pGPI = (pfnGetProductInfo) GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "GetProductInfo"); 注意函数定义typede

Detours简介 (拦截x86机器上的任意的win32 API函数)

Detours 当然是用detours,微软明显高腾讯一筹,同上,至今没失败过.写这种HOOK一定要再写个测试程序,不要直接HOOK你的目的程序,例如QQ,因为这样不方面更灵活的测试.说明一下:Detours是微软开发的一个函数库(源代码可在http://research.microsoft.com/sn/detours 免费获得)用于修改运行中的程序在内存中的影像,从而即使没有源代码也能改变程序的行为.具体用途是:拦截WIN32 API调用,将其引导到自己的子程序,从而实现WIN32 API的

zigbee协议栈应用与组网(二):串口基础实验

资料里的实验都是已经做好了的,所以我下载了一个全新的ZStack-2.5.1a来做实验,按照步骤做,发现了很多问题. 第一步,配置串口. MT_UART.c中的MT_UartInit(); baudRate设置为115200(默认是38400),flowControl设置为FALSE. 第二步,预定义宏. MT_UartInit()后还有一小部分 1.2行根据预先定义的 ZTOOL或者ZAPP选择不同的数据处理函数. 后面的P1和P2则是串 口0和串口1.我们用ZTOOL,串口0.我们可以在op

Zigbee协议栈内核分析 - 按键分析

Zigbee协议栈内核分析 - 按键分析(轮询) Jesse 协议栈按键代码分析 - 思维导图(放大可看) 一.综述 上图从协议栈的 main() 函数开始分析,罗列出了 main()  函数里调用的函数.接下来我们将会对函数一个一个的分析,有关于 key 的函数我将会用黄色方框表示. 二.协议栈代码分析(按照上图逐步分析) 1.osal_int_disable( INTS_ALL );           //关闭总中断 2.HalDriverInit(); 调用 HalKeyInit(); 

第1章 ZigBee协议栈初始化网络启动流程

作者:宋老师,华清远见嵌入式学院讲师. ZigBee的基本流程:由协调器的组网(创建PAN ID),终端设备和路由设备发现网络以及加入网络. 基本流程:main()->osal_init_system()->osalInitTasks()->ZDApp_Init(),进协议栈初始化函数ZDApp_Init(). 1.1 进入程序入口main(). ZMain.c中 C++ Code int main( void )         {                 // Turn of

ABP展现层——Javascript函数库

ABP展现层——Javascript函数库 点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之21.ABP展现层——Javascript函数库 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https://github.com/aspnetboilerplate ASP.NET Boil