ZigBee协议栈OSAL介绍
ZIGBEE协议栈OSAL运行机理及任务添加

授课内容
OSAL的调度机制
OSAL任务添加
OSAL的简介
•
OSAL是一种支持多任务运行的系统资源分配机 制。 OSAL与标准的操作系统有一定的区别,它实现 了类似操作系统的功能,如:任务切换、提供了 内存管理功能等,但OSAL并不是真正意义的操 作系统。
OSAL添加新任务
将事件处理函数的地址加入tasksArr[]数组中:
void osalInitTasks(void) { Uint8 taskID=0; taskEvent=(uint16*)osal_mem_alloc(sizeof(uint16)*task aCnt); Osal_memset(tasksEvents,0,(sizof(uint16)*tasksCnt)) macTaskInit(taskID++); nwk_init(taskID++) ; Hal_Init(taskID++); #if defined(MT_TASK)
}
OSAL添加新任务
GenericApp_ProcessEvent函数添加到了数组的 末尾,GenericApp_Init函数在osalInitTasks中被 调用
taskArr[]数组各事件处理函数的排列顺序与 osalInitTasks函数调用各任务初始化函数的顺序 保持一致; 为了保存osalInitTasks函数所分配的任务ID,给 每个任务定义一个全局变量。
APS_event_loop;
#if defined (ZIGBEE_FRAGMENTATION)
OSAL添加新任务
事件处理函数的地址加入tasksArr[]数组, 代码:
zigbee 协议栈

zigbee 协议栈Zigbee 协议栈。
Zigbee 是一种无线通信协议,它被设计用于低数据速率、低功耗的应用场景,如智能家居、工业自动化、传感器网络等。
Zigbee 协议栈是指在 Zigbee 网络中的协议层,它定义了 Zigbee 网络中各个节点之间的通信规则和协议。
Zigbee 协议栈主要包括物理层、MAC 层、网络层和应用层。
物理层定义了无线通信的调制解调方式、频率和功率控制等;MAC 层负责数据的传输和接收,以及网络中节点的管理;网络层则负责路由和数据包转发;应用层则定义了具体的应用协议和数据格式。
在 Zigbee 协议栈中,物理层使用了 IEEE 802.15.4 标准,它定义了无线通信的物理层和 MAC 层规范,包括频率、调制方式、数据帧格式等。
MAC 层定义了数据的传输方式,包括信道访问方式、数据帧格式、数据重传机制等。
网络层则定义了路由协议和数据包转发规则,以实现多跳网络的数据传输。
应用层则定义了具体的应用协议,如 Zigbee Home Automation(ZHA)、Zigbee Light Link(ZLL)等。
Zigbee 协议栈的设计遵循了低功耗、低成本、可靠性和安全性的原则。
它采用了分层的设计,使得各个层之间的功能清晰明了,易于实现和维护。
同时,Zigbee 协议栈还支持多种网络拓扑结构,包括星型、网状和混合型网络,以满足不同应用场景的需求。
在实际的应用中,开发人员可以使用 Zigbee 协议栈来快速构建 Zigbee 网络应用。
通过使用 Zigbee 协议栈,开发人员可以方便地实现节点之间的数据通信、网络管理和安全保护,从而加速产品的开发周期和降低开发成本。
总的来说,Zigbee 协议栈是 Zigbee 网络中的核心部分,它定义了 Zigbee 网络中节点之间的通信规则和协议。
通过使用 Zigbee 协议栈,开发人员可以快速构建低功耗、低成本、可靠性和安全性的Zigbee 网络应用,满足不同应用场景的需求。
zigbee

我们用的是TI的CC2530F256,结合的是黄金单元协议栈(Z-Stack™),而所谓协议栈呢,就是网络中各层协议的总和,由上层协议到底层协议,再由底层协议到上层协议。
CC2530芯片40pins,GND4个,AVDD6个,DVDD2个,DPIO有21个,分别是P0,P1,和P2.0~P2.4,其中P1.0和P1.1的输出驱动电流是20mA,其余IO是4mA;6-mm ×6-mm 的QFN40 封装,焊接有点难度。
VDD的范围是2v~3.6v,最高不超过3.9v。
CC2530 有8KBSRAM ,映射到DATA和XDATA;256KB闪存,映射到CODE和XDATA。
内部集成了一个增强型8051,每个指令周期是1个时钟(一般mcu-51是12个时钟)。
(1)MCU的存储器:CODE 用于存储程序的64KB只读存储器,DATA,可读可写的256byte 的数据存储器,XDATA,与CODE共享64KB的存储空间,可读可写的数据存储器;SFR,128Byte 可读可写寄存器存储空间;2(2)中断:有18个中断源,然后分为6个中断优先组,通过设置IP0_IPGX(X为0到5)和IP1_IPGX来设定优先级;(3)电源和时钟:有五种电源模式,主动模式、空闲模式、PM1,PM2和PM3。
空闲模式是CPU停止工作,主动模式是完全工作模式,PM1,PM2和PM3是部分休眠模式,32M 和16M晶振不开启,32k晶振运行,等待复位或者外部中断、定时器中断到了,便自动跳转到主动模式;(4)闪存有256kb,以页为单位,每页2048byte,共128页;一页是最小可擦除单元,地址是器FADDRH:FADDRL,16位地址;一字(32位)是最小可写单元,地址是通过寄存器FADDRH[7:1寻址;这个需要注意的;(5)IO:21个IO,每个都可独立使用,通过设置寄存器PXSEL来选择是IO口还是第二功能,然后PXDIR设置输入还是输出,0入1出;每当复位之后,所有21个引脚都是通用输入IO,然后每个IO都可以在设置为输入后用作中断,PXEN是中断使能,PXIFG是中断标志,(其中X是0,1,2);这些同MSP430是相似的设置。
ZIGBEE技术规范与协议栈分析

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协议栈系统说明

当有一个事件发生的时候,OSAL负责将此事件分配给能够处理此事件的任务,然后此任务判断事件的类型,调用相应的事件处理程序进行处理。
{ GenericApp_TaskID = task_id; } 这条语句将分配给GenericApp的任务ID保存了下来。 到此,我们就给应用程序中完整的添加了一个任务。
我们回到OSAL如何将事件分配给任务这个问题上来
在OSAL_GenericApp.c这个文件中,在定义TaskArr这个数组之后,又定义了两个全局变量。
下图是ZigBee协议的结构图:
从这幅图中,我们可以很清楚地从宏观上了解ZigBee协议的结构。可是,经过粗略的浏览,我们并没有发现任何OSAL的踪迹。当然,我们都知道,Z-Stack与ZigBee之间并不能完全划等号。Z-Stack是ZigBee的具体实现,所以存在于Z-Stack中的OSAL并不一定出现在ZigBee中。但是,我们可以在ZigBee中找到些许OSAL的踪影。
C:\Texas Instruments\ZStack-1.4.3-1.2.1\Projects\zstack\Samples\GenericApp。
首先我们去繁就简,先来了解应用程序的运行方式。
在右侧工作空间窗口打开App文件夹,我们可以看到三个文件,分别是“GenericApp.c”、“GenericApp.h”、“OSAL_GenericApp.c”。我们整个程序所实现的功能都在这三个文件当中。 首先打开GenericApp.c这个文件。我们首先看到的是比较重要的两个函数:GenericApp_Init和GenericApp_ProcessEvent。从函数名称上我们很容易得到的信息便是,GenericApp_Init是任务的初始化函数,而GenericApp_ProcessEvent则负责处理传递给此任务的事件。
OSAL(操作系统抽象层简介)

OSAL(操作系统抽象层简介) (2010-11-19 20:00)分类:ZigBee 技术学习Z-Stack1.4.3及以后的版本中引入了一个OSAL(Operating System Abstraction Layer 操作系统抽象层),但在我们整个的ZigBee协议栈的结构图中,我并没有能够发现这个层在哪个位置。
但是整个的协议栈都要在OS的基础上才能运行。
OSAL和我们通常所说的RTOS,pc上的操作系统还是有很大的不同,ZigBee2006中只是利用了操作系统的概念和思想,利用OS把Z-Stack软件组件从特殊的处理过程相分离,并将软件成分保护了起来。
它提供了如下的管理功能:◆任务的注册、初始化、开始◆ 任务间的消息交换◆任务同步◆ 中断处理◆时间管理◆ 内存分配在ZigBee协议中,协议本身已经定义了大部分内容。
在基于ZigBee协议的应用开发中,用户只需要实现应用程序框架即可。
从ZigBee的协议架构图中我们也可以看到,其中的应用程序框架中包含了最多的240个应用程序对象,如果我们把一个应用程序对象看做为一个任务的话,那么应用程序框架将包含一个支持多任务的资源分配机制。
于是OSAL便有了存在的必要性,它正是Z-Stack为了实现这样一个机制而存在的。
OSAL主要是这样一种机制,一种任务分配资源的机制,从而形成了一个简单多任务的操作系统。
首先,osal初始化系统,包括软件系统初始化和资源初始化.其中软件系统初始化就是初始化一些变量,比如osal重要的组成部分任务表,任务结构体和序列号.资源初始化主要包括内存,中断,NV等各种设备模块资源.这就和我们嵌入式系统中的RTOS操作系统μC/OS-II有了很大的相似处。
μC/OS-II中也是通过建立任务把一个问题进行分解,任务之间可以通过消息队列的方式进行通信。
接着,osal通过osal_add_task添加任务到任务表中,形成一个任务链表.这个任务链表是以任务的优先级先后排序的.优先级高的排在前,低者排于后.最后,开始运行系统,系统是以一个死循环的形式工作的.在循环体当中不断地检测各个任务,看是否要运行等.这就相当于我们平时用的linux和window等多任务系统,把CPU分成N个时间片(有多少任务就分成多少时间片),只要处理频率高,就相当于多任务同时运行了总之,OSAL实现了类似操作系统的某些功能,但我认为并不能称之为真正意义上的操作系统。
zIgbee协议栈浅析
#ifndef NONWK // Since the AF isn't a task, call it's initialization routine afInit(); #endif
// Initialize the operating system 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_SUPPORTED zmain_lcd_init(); #endif
简介: ZigBee是一种低速短距离传输的无线网络协 议。 ZigBee协议从下到上分别为物理层(PHY)、媒体 访问控制层(MAC)、传输层(TL)、网络层(NWK)、 应用层(APL)等。其中物理层和媒体访问控制层遵 循IEEE 802.15.4标准的规定
优点: ZigBee网络主要特点是低功耗、低成本、低 速率、支持大量节点、支持多种网络拓扑、低 复杂度、快速、可靠、安全。 ZigBee网络中的设备可分为协调器 (Coordinator)、汇聚节点(Router)、传感器节 点(EndDevice)等三种角色
zIgbee典型的组网方式:
Z-Stack协议栈的开发 一、开发环境的搭建: 见 详细的操作方法可以打开
二、Z-Stack协议栈工程文件的介绍 下的
Source文件里存放的是我们自己编写的程序文件 和协议栈自带的OSAL_SampleApp.c、 SampleApp.c、SampleApp.h、 SampleAppHw.h 文件。这里的SampleApp.c是我们最常用的文件, 在这文件中我们可以在协议栈中加入并执行我们 自己的功能程序。
ZigBee的OSAL机制
一、OSAL概述首先OSAL是以实现多任务为核心的系统资源管理机制,它和标准的操作系统还是有很大区别的。
简单而言,OSAL实现了类似操作系统的“某些”功能,但并不能称之为真正意义上的操作系统。
Chipcon公司为自己设计的ZStack协议栈中提供了一个名为操作系统抽象层OSAL的协议栈调度程序。
二、OSAL任务运行方式ZigBee协议栈的每一层都设计了一个事件处理函数,用来处理每一层相对应的各种事件,这些处理函数我们可以理解成是与各层相对应的任务函数,它们由OSAL来进行管理。
因为整个程序只有一个main函数,我们就从这个函数入手(在此我以sample这个例程为例来说明):在ZMain.c中有:ZSEG int main( void ){osal_int_disable( INTS_ALL ); // Turn off interrupts 关中断HAL_BOARD_INIT(); // Initialize HAL 初始化硬件抽象层zmain_vdd_check(); // Make sure supply voltage ishigh enough to run检测电源电压保证正常运行zmain_ram_init(); // Initialize stack memory 初始化内存InitBoard( OB_COLD ); // Initialize board I/O 初始化板子上的IO口HalDriverInit(); // Initialze HAL drivers 初始化硬件抽象层驱动osal_nv_init( NULL ); // Initialize NV System 初始化非易失存储系统zmain_ext_addr(); // Determine the extended address 确定扩展地址也就是64位的IEEE地址zgInit(); // Initialize basic NV items 初始化基本的NV条目ZMacInit(); // Initialize the MAC 初始化MAC层#ifndef NONWKafInit(); // Since the AF isn't a task, call it'sinitialization routine#endifosal_init_system(); // Initialize the operating system 初始化操作系统osal_int_enable( INTS_ALL ); // Allow interrupts 打开中断InitBoard( OB_READY ); // Final board initialization 最终板子的初始化zmain_dev_info();// Display information about this device 显示关于设备的信息#ifdef LCD_SUPPORTED /* Display the device info on the LCD */显示设备信息在LCD上zmain_lcd_init();#endifosal_start_system(); // No Return from here 启动操作系统没有返回值} // main()我们可以看出里面都是一些初始化函数,但main是按照一定的顺序对系统进行初始化的。
zigbee协议栈深入详解
zigbee协议栈2010-03-10 15:11zigbee协议栈结构由一些层构成,每个层都有一套特定的服务方法和上一层连接。
数据实体(data entity)提供数据的传输服务,而管理实体(managenmententity)提供所有的服务类型。
每个层的服务实体通过服务接入点(Service AccessPoint.SAP)和上一层相接,每个SAP提供大量服务方法来完成相应的操作。
ZigBee协议栈基于标准的OSI七层模型,但只是在相关的范围来定义一些相应层来完成特定的任务。
IEEE 802.15.4—2003标准定义了下面的两个层:物理层(PHY层)和媒介层(MAC层)。
ZigBee联盟在此基础上建立了网络层(NWK 层)以及应用层(APL层)的框架(framework)。
APL层又包括应用支持子层(Application Support Sub—layer,APS)、ZigBee的设备对象(ZigBee Device 0bjects。
ZD0)以及制造商定义的应用对象。
1物理层(PHY)IEEE802.15.4协议的物理层是协议的最底层,承担着和外界直接作用的任务。
它采用扩频通信的调制方式,控制RF收发器工作,信号传输距离约为50m(室内)或150m(室外)。
IEEE802.15.4.2003有两个PHY层,提供两个独立的频率段:868/915MHz 和2.4GHz。
868/915MHz频段包括欧洲使用的868MHz频段以及美国和澳大利亚使用的915MHz频段,2.4GHz频段世界通用。
2媒体访问控制层(MAC)MAC层遵循IEEE802.15.4协议,负责设备间无线数据链路的建立、维护和结束,确认模式的数据传送和接收,可选时隙,实现低延迟传输,支持各种网络拓扑结构,网络中每个设备为16位地址寻址。
它可完成对无线物理信道的接入过程管理,包括以下几方面:网络协调器(coordinator)产生网络信标、网络中设备与网络信标同步、完成PAN的入网和脱离网络过程、网络安全控制、利用CSMA—CA机制进行信道接入控制、处理和维持GTS(Guaranteed Time Slot)机制、在两个对等的MAC实体间提供可靠的链路连接。
ZigBee协议栈OSAL介绍
讨论ZigBee协议栈的构成以及内部OSAL的工作机理。
ZigBee协议栈OSAL介绍操作系统抽象层OSAL常用术语:1.资源(Resource):任何任务所占用的实体都叫资源,如变量、数组、结构体2.共享资源(Shared Resource):两个或两个以上任务使用的资源,为防止破坏资源,任务在操作共享资源时是独占状态。
3.任务(Task):即线程,简单的程序的执行过程。
任务设计时将问题尽可能分成多个任务,每个任务独立完成某项功能,同时赋予优先级、CPU寄存器和堆栈空间。
一般一个任务设计为一个无限循环。
4.多任务运行(Muti-task Running):其实同一时刻只有一个任务运行。
5.内核(Kernel):内核负责管理各个任务。
包括:分配CPU时间;任务调度;任务间的通信。
6.互斥(Mutual Exclusion):多任务通信最常用方法是共享数据结构。
保护共享资源常用的方法:关中断;使用测试并置位指令(T&S指令);禁止任务切换;使用信号量;7.消息队列(Message Queue):用于任务间传递消息。
OSAL提供如下功能:任务注册、初始化和启动;任务间的同步、互斥;中断处理;储存器分配和管理;OSAL运行机理:OSAL就是一种支持多任务运行的系统资源分配机制。
OSAL是一种基于事件驱动的轮询式操作系统。
、void osal_start_system(void)是ZigBee协议栈的灵魂,不断的查看事件列表,如果有事件发生就调用相应的事件处理函数。
SYS_EVENT_MSG是一个事件集合,是由协议栈定义的事件,即系统强制事件(Mandatory Events),它的定义为:#define SYS_EVENT_MSG 0x8000;它包含如下事件:AF_INCOMING_MSG_CMD 收到一个新的无线数据ZDO_STATE_CHANGE 网络状态发生变化事件,利用它判断终端加入网络后何时向协调器发送数据包。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
讨论ZigBee协议栈的构成以及内部OSAL的工作机理。
ZigBee协议栈OSAL介绍
操作系统抽象层
OSAL常用术语:
1.资源(Resource):任何任务所占用的实体都叫资源,如变量、数组、结构体
2.共享资源(Shared Resource):两个或两个以上任务使用的资源,为防止破坏资源,任务在操作共享资源时是独占状态。
3.任务(Task):即线程,简单的程序的执行过程。
任务设计时将问题尽可能分成多个任务,每个任务独立完成某项功能,同时赋予优先级、CPU寄存器和堆栈空间。
一般一个任务设计为一个无限循环。
4.多任务运行(Muti-task Running):其实同一时刻只有一个任务运行。
5.内核(Kernel):内核负责管理各个任务。
包括:分配CPU时间;任务调度;任务间的通信。
6.互斥(Mutual Exclusion):多任务通信最常用方法是共享数据结构。
保护共享资源常用的方法:
关中断;
使用测试并置位指令(T&S指令);
禁止任务切换;
使用信号量;
7.消息队列(Message Queue):用于任务间传递消息。
OSAL提供如下功能:
任务注册、初始化和启动;
任务间的同步、互斥;
中断处理;
储存器分配和管理;
OSAL运行机理:
OSAL就是一种支持多任务运行的系统资源分配机制。
OSAL是一种基于事件驱动的轮询式操作系统。
、
void osal_start_system(void)是ZigBee协议栈的灵魂,不断的查看事件列表,如果有事件发生就调用相应的事件处理函数。
SYS_EVENT_MSG是一个事件集合,是由协议栈定义的事件,即系统强制事件(Mandatory Events),它的定义为:
#define SYS_EVENT_MSG 0x8000;
它包含如下事件:
AF_INCOMING_MSG_CMD 收到一个新的无线数据
ZDO_STATE_CHANGE 网络状态发生变化事件,利用它判断终端加入网络后何时向协调器发送数据包。
ZDO_CB_MSG 指示所有注册的ZDO响应消息。
AF_DATA_CONFIRM_CMD 调用AF_DataRequest()发送数据时,需要确认信息。
OSAL消息队列
消息与事件的区别:
消息:事件和数据的封装
事件:驱动任务去执行某些操作的条件
OSAL维护一个消息队列,即消息链表
OSAL添加新任务
要添加新任务要编写两个函数:
1.新任务的初始化函数
2.新任务的事件处理函数
OSAL应用编程接口
API(Application Programming Interface)有8个
消息管理
任务同步
时间管理
中断管理
任务管理
内存管理
电源管理
非易失性闪存管理
消息管理API:主要用于处理任务间消息交换,包括任务分配消息缓存、释放消息缓存、接收消息、发送消息
osal_msg_allocate() 分配缓存空间
osal_msg_deallocate() 释放消息缓存空间
osal_msg_send() 一个任务发送消息到消息队列
osal_msg_receive() 一个任务从消息队列接收属于自己的消息
任务同步API:用于任务间的同步,允许一个任务等待某个任务发生。
osal_set_event() 运行一个任务设置某一事件
时间管理API:用于开启关闭定时器
osal_start_timerEx() 设置一个定时时间,时间到后,相应事件被设置。
osal_stop_timerEx() 停止已启动的定时器
中断管理API:用于控制中断的开启和关闭。
很少用
任务管理API:用于对OSAL进行初始化和启动
osal_init_system() 初始化OSAL,该函数是第一个被调用的OSAL函数
osal_start_system() 之前重点讲的函数
内存管理API:用于在堆上分配缓存区,以下的两个API函数要成对使用,防止内存泄露。
osal_mem_alloc() 在堆上分配指定大小的还存区
osal_mem_free() 释放之前函数分配的缓存区
电源管理API:主要用于电池供电的ZigBee网络节点
非易失性闪存管理API:Non-Volatile Memory,NV一般指Flash或EEPROM,每个NV分配唯一的ID号。
osal_nv_item_init() 初始化NV条目,如果NV条目不存在,创建并初始化该条目,如果存在,每次调用osal_nv_read()和osal_nv_write()之前必须调用该函数。
osal_nv_read() 从NV条目中读取数据,可读取整条也可读取部分。
osal_nv_write() 写数据到NV条目
ZigBee协议栈中串口应用详解
使用串口的基本步骤:
1.初始化串口,设置波特率、中断等。
2.向发送缓冲区发送数据或者从缓冲区读取数据。
ZigBee协议栈中提供的与串口相关的函数:
HalUARTOpen()
HalUARTRead()
HalUARTWrite()
回调函数是通过函数指针(函数地址)调用的函数,如果把函数指针作为参数传递给另一个函数,当通过指针调用它所指向的函数时,称为函数的回调。
回调函数不是由该函数的实现方直接调用的,而是在特定的事件或条件发生时,由另一方调用的,用于对该事件或条件进行响应。
回调函数机制提供了系统对异步事件的处理能力。
首先将异步事件发生时需要执行的代码编写成一个函数,并将该函数注册成为回调函数,这样当该异步事件发生时,系统会自动调用事件注册好的回调函数,回调函数的注册实际上就是将回调函数的信息填写到一个用于注册回调函数的结构体变量中。
程序中调用回调函数的步骤:
1.定义回调函数
2.初始化时,提供函数实现的一方将回调函数的函数指针传递给调用者
3.当特定的事件或条件发生时,调用者使用函数指针调用回调函数对事件进行处理。
使用条件编译是因为单片机的存储器资源有限。