Other Parts Discussed in Thread: Z-STACK
使用方法简介:一般情况下用户只需要额外添加三个文件就可以完成一个项目。一个是主文件,存放具体的任务事件处理函数;一个是这个主文件的头文件;另外一个是以Osal开头的操作系统接口文件,是专门存放任务处理函数数组tasksArr[]的文件。这样就实现了Z-Stack代码的公用,用户只需要添加这几个文件,编写自己的任务处理函数就可以了。
-----学习ZigBee操作系统抽象层应用程序编程接口。
-----剖析一个简单的例程学习使用Z-Stack。
下面工作一一弄明白:
(1)头文件----参考例程添加头文件。
(2)系统初始化和使用----函数Init和ProcessEvent。
(3)任务建立,调用,切换
(4)中断配置----熟悉编程接口即可。
(5)定时器使用----熟悉编程接口即可。
(6)驱动文件编写和调用
(7)网络建立和加入--> 组网
(8)电源管理----节能配置----熟悉编程接口即可。
(9)编写程序----使用五向按键控制四个LED灯(先看懂Simple例程)。
有选择的读代码:
需要读的代码:APP(全部代码);HAL和Zmain的全部或部分代码。
其他:熟悉编程接口和使用方法。
一、Z-Stack 操作系统抽象层应用程序编程接口:
1、信息管理API:
信息管理 API 为任务和处理单元之间的信息交换提供了一种具有不同处理环境的机制(例如,在一个控制循环中调用中断服务常规程序或函数)。这个 API 中的函数可以使任务分配或回收信息缓冲区,给其它任务发送命令信息以及接收回复信息。API包括四个函数:
(1) osal_msg_allocate ():分配一个信息缓冲;
(2) osal_msg_deallocate():回收一个信息缓冲区;
(3) osal_msg_send():发送命令或数据信息;
(4) osal_msg_receive():检索/接收一条已收到的命令信息;
1、任务同步API:
这个 API 使得任务等待事件发生,并在等待期间返回控制。这个 API 中的函数可以用来为一个任务设置事件,并无论设置了什么事件都通知任务。仅有一个函数osal_set_event():用来为一个任务设置事件标志。
2、定时器管理API:
这个API使得内部的(Z-Stack)任务和外部的(应用层)任务都可以使用定时器。API提供了启动和停止一个定时器的功能,这定时器可设定递增的一毫秒。
(1)osal_start_timer():启动一个定时器;
(2)osal_start_timerEx():增加了taskID参数。它允许访问者调用程序为另一个任务设置定时器;
(3)osal_stop_timer():调用函数用来停止一个已启动的定时器;
(4)osal_stop_timerEx():用来停止一个已启动的定时器;
(5)osal_GetSystemClock():读取系统时钟。
4、中断管理 API:
此API使得一个任务可以与外部中断相互交流。API 中的函数允许和每个中断去联络一个具体的服务例程。中断可以启用或禁用。在服务例程内部,可以为其它任务设置事件。
(1)osal_int_enable():启用一个中断;
(2)osal_int_disable():禁用一个中断。
5、任务管理 API:
在OSAL系统中,API常用于添加和管理任务。每个任务由初始化函数和事件处理函数组成。OSAL调用osalInitTasks()(应用程序提供)去初始化这任务且 OSAL 运用一个任务列表(const pTaskEventHandlerFntasksArr[])去为每个任务(也是应用程序提供)调用事件处理程序。
(1)osal_init_system():初始化OSAL系统,在使用任何其它OSAL函数之前必须先调用此函数启动OSAL系统。
(2)osal_start_system():任务系统中的主循环函数。它将检查所有的任务事件且为含有该事件的任务调用任务事件处理函数。假如有特定任务的事件,这个函数将为该任务调用事件处理例程来处理事件。相应任务的事件处理例程一次处理一个事件。一个事件被服务后,剩余的事件将等待下一次循环。如果这没有事件(服务与所有任务),这个函数使处理器程序处于睡眠模式。
6、内存管理 API:
该API 代表一个简单的内存分配系统。这些函数允许动态存储内存分配。
(1) osal_mem_alloc():一个简单的内存分配函数,如果分配成功则返回一个指向缓冲区的指针;
(2) osal_mem_free():释放存储空间便于再次运用。
7、电源管理 API:
当它安全关闭接收器和外部硬件时,这个系统为应用程序或任务提供了一种告知OSAL的方法。接着使处理器转入睡眠。
(1)osal_pwrmgr_device():当升高电源或需要改变电源时(例如电池支持的协调器)这个函数应由中心控制实体(比如ZDO)调用。
(2)osal_pwrmgr_task_state():无论这个任务是否想要保护电源,每个任务都将调用此函数。任务将调用此函数来表决是否需要OSAL保护电源或推迟电源保护。默认情况下,当一个任务被创建时,它自己的电源状态设置为保护模式。如果该任务一直想要保护电源,就根本不必调用此函数。
8、非易失性存储器(NV)的 API:
描述了OSAL非易失性存储器系统。该系统为应用程序提供了一种把信息永久保存到设备内存的方法。它还能用于ZigBee规范要求的把某些项目永久保存到协议栈。NV函数的职能是读写任意数据类型的用户自定义项目,比如结构体和数组。用户能通过设置适当的偏移和长度来读和写一个整体的项目或元素。API独立于NV存储介质,并且能用于实现闪存或EEPROM。
每个易失性的项目都仅有一个ID,当一些ID值由栈或平台保留或运用时,应用程序中有特定一系列的ID值。假如应用程序创建自己的易失性项目,它必须从应用范围的值内选择一个标识符。参考下面的列表:
(1)osal_nv_item_init():初始化NV项目,这个函数检查存在NV的项目,假如不存在,它将通过这个函数去创建或初始化。
(2)osal_nv_read():从NV中读出数据。这个函数能用来从NV 中带有偏移的索引指向的项目读出整个项目或一个元素。读出的数据复制到*buf中。
(3)osal_nv_write():写入数据到NV,这个函数用来通过带有偏移的索引指向项目的偏移量来写入整个NV项目。
(4)osal_offsetof():计算一个结构体内元素的内存偏移量,以字节为单位。