zigbee笔记:十、ZStack(2.3.0-1.4.0)的OSAL使用分析

news2024/9/24 9:23:52

        zigbee笔记:九中,我们已经学会了利用模板,定制自己的个性开发工程,本文为协议栈(ZStack-CC2530-2.3.0-1.4.0)代码使用分析笔记,来进一步掌握协议栈的使用。

一、协议栈使用知识点

        1、协调器、路由器、终端代码下载

        通过选项卡选择不同的节点类型工程(分别是协调器、路由节点和终端节点工程),就会导致参与编译的配置文件不同,配置不同就会导致部分宏定义不同,宏定义不同就会导致工程里某些宏的值不同。这些宏值的不同会影响程序执行的流程,就会导致出现不同的功能,,如下图所示。

        在选项卡里每一种版本模块都貌似有2个分为不带Pro和带Pro。zigbee协议在发展过程中经历了3个版本,其中zigbee在7出的是最新的规范这个规范有2个版本 zigbee2007和 zigbeePro他们之间的区别是,功能基本相同,Pro版本功能稍微强大咱们一般都选 Pro 。

        2、信道选择与网络PANID设置

        在工程配置文件f8wConfig.cfg中, 参数-DDEFAULT_CHANLIST和-DZDAPP_CONFIG_PAN_ID。

        (1)-DDEFAULT_CHANLIST 参数

        信道编码采用64位独热码,当需要多信道通信时,可以采用或运算,如编码为0x00001800表示采用11和12信道,把结果作为 DEFAULT CHANLIST值。

        路由器和终端:可以在参与或操作的这些信道上选择一个相对于我来说最佳的网络,加入进去。

        协调器: 可以在参与或操作的这些信道上选择一个最佳的信道并在这个信道上创建自己的Zigbee网络()。

        (2)-DZDAPP_CONFIG_PAN_ID 参数

 -DZDAPP_CONFIG_PAN_ID值非0xFFFF时:

         路由器和终端:必须要加入到PANID为参数值这样一个Zigbee无线局域网。

        协调器:我要创建一个网络,并且把这个参数值作为这个网络的PANID。

-DZDAPP_CONFIG_PAN_ID值为0xFFFF时:

        路由器和终端:在加入网络的时候没有PANID的限制。

        协调器:可以随机生成一个值,把这个随机值作为这个网络的PANID。

(3)补充:

        问1:   当2个模块下载相同的协调器代码,并且指走的PANID参数值为非0xFFFF,后果会怎样?

       答: 先上电的模块可以创建0xFFFB这样-个zigbee网络,后上电的模块创建一个在DXFFF8基础上加1的网络。

        问2:网络创建成功后,协调器的网络短地址固定为0x0000

        3、引脚初始化准备

        启动osal之前main函数中还初始化调用了TI的一些硬件实验,其中很多引脚的功能已经被初始化为片上外设了,所以我们使用时要自己修改,不能漏步骤。如果添加自己的一些外设初始化要放在osal_start_system函数前面,WatchDogEnable之后,如初始化LED,如果缺少配置为普通IO模式这一步骤,可能会导致LED无法使用。

        4、OSAL操作系统

        OSAL(Operating System Abstraction Layer),能够实现任务调度的微操作系统,在OSAL操作系统中非常重要的两个概念是任务和事件,还有消息也比较重要

(1)OSAL的启动流程

        如下图所示,系统启动后,先完成一系列的初始化,然后进入如无轮询主循环。

        在zstack协议栈工程目录ZMAIN下的ZMain.c包含了主程序的入口地址

        (2) 两个重要的函数

        main函数中完成了一系列的初始,其中对开发者比较重要有两个函数

        1)OSAL初始化函数 osal_init_system()

       函数osal_init_system() 其中包含的任务初始化函数osalInitTasks(),完成系统任务和用户自定义任务

         函数osalInitTasks()包含的任务初始化函数完成系统任务和用户自定义任务

        2)系统启动函数 osal_start_system(),其功能是不断查询任务事件数组,如果有事件产生,则根据事件在taskArr数组中查询任务事件处理函数进行处理。从tasksEvents数组中tasksEvent[0](0号任务事件变量)去读一直读到tasksEvent[8],如果发现哪一个任务事件变量值为非0,就会跳出循环,此时的idx值就是它的任务ID。跳出上面的循环后,此时就会将idx中存的任务ID和event中存的任务事件变量值,通过函数指针的方法调用相应的任务事件处理函数。

        (3) OSAL(操作系统抽象层)原理

        1)应用层是一个任务,它有一个系统分配给它的数值唯一的编号叫做任务ID。

        2)任务可以处理事件,处理事件的这些代码都在一个函数里,这个函数叫做应用层任务事件处理函数。应用层任务还有一个2个字节的变量,这个变量叫做任务事件变量,如果事件变量和某个事件的宏值&操作为1,那么表示应用层任务将要处理这个事件。

        3)系统在运行的时候,会不断地读取应用层任务事件变量,如果应用层任务事件变量为非0,就会认为应用层任务有事件需要处理,此时就会调用应用层任务事件处理函数StarryApp_ProcessEvent,并将任务事件变量的值传给events,在处理函数中会将events分别与应用层定义的所有任务事件宏值进行与操作,如果值为1,就会去执行这个事件处理的相应代码;当发现任务事件变量为0的时候,就会认为应用层任务没有事件需要处理。

       4) 函数 uint8 osal_set_event( uint8 task_id, uint16 event_flag ) 为事件产生函数,调用执行某个任务中的某个事件, para1是任务ID,para2是任务中的某个事件宏。

        本质是,把taskID(应用层任务)的任务事件变量中对应于宏event_flag值为1的那个位变为1,这样的话首先这个任务事件变量就变成了非0,系统在检测到任务事件变量为非0,就会去调用任务事件处理函数***App_ProcessEvent。在这个函数里,任务事件变量肯定和任务宏的值与操作为1,所以必定会执行这个事件相关的代码。

        5)在ZStack里按照代码功能来划分,分成不同的层,比如,硬件操作相关硬件层,网络相关的代码叫网络层,自己写应用程序部分叫应用层。几乎每一个层都是一个任务,系统为每一个任务分配一个字节的唯一数值编号, 我们把这个数值编号叫做任务ID(task_id)。每一个任务都能处理一些他们能够处理的事物,叫做事件(event_flag)。TI在设计的时候把任务事件处理函数和任务事件变量都封装成了数组:

        函数数组={任务事件处理函数A,任务事件处理函数B,任务事件处理函数C...}

        变量数组={任务事件变量A,任务事件变量B,任务事件变量C...}

        6)任务ID,系统不是随便分配的,我们可以通过这个值立即找到这个任务自己的任务事件处理函数和任务事件变量。任务ID就是数组的下标,通过下标就可以找到相应的任务事件处理函数和任务事件变量。由函数osalInitTasks()包含的任务初始化函数完成系统任务和用户自定义任务,详见 4(2)。

        7)事件是系统需要处理的事情,必须有对应的任务进行处理,事件采用16位独热码,即每种任务可以有16种事件(event_flag)。例如,在应用层,系统事件已被定义,占用编码为0x8000,还有15种用户可定义的事件。

        8)所有Zstack协议栈在稳定工作时,它的行为是在for(;;){}死循环里不断去读所有任务的任务事件变量。如果发现所有任务的任务事件变量都为0,没问题,说明所有任务都没有事件将要去处理;不断重复这个过程,直到发现,某个任务事件变量不为0,就会通过不为0的这个任务ID找到这个任务事件处理函数,去处理相应的事件。

        9) 当事件数量较多,编码无法表示时,可采用消息,系统事件就是采用消息进行事件传递的。 OSAL任务与事件的关系 ,如下图所示。

        10) 消息*******************************************

        4、事件处理函数的编写

        以应用层任务的事件为例, 事件处理函数要在xxApp.c里的xx应用事件处理函数中编写(xxApp_ProcessEvent),如下图所示。

        5、函数总结:

        (1)uint8 osal_set_event( uint8 task_id, uint16 event_flag );

        事件产生函数,调用执行某个任务中的某个事件, para1是任务ID,para2是任务中的事件

        (2)uint8 osal_start_timerEx( uint8 task_id, uint16 event_flag,unit16 timeout_value );

        事件定时器触发函数,等待一定时间执行某个任务中的某个事件,para1是任务编号,para2是参数是要处理的事务,para3是是时间(毫秒)。

        (3)uint8 osal_msg_send( uint8 destination_taskID, uint8 *msg_ptr );

发送消息的函数,para1是要接收此Message的目标任务ID,para2是所要发送的消息Message指针。

        (4)MSGpkt =(afIncomingMSGPacket t *)osal_msg_receive( SampleApp TasklD );

        接收消息的函数,para1是任务ID的参数,用于指定从哪个任务的消息队列中接收消息。osal_msg_receive函数从任务的消息队列中取出一个消息,该消息是一个指向afIncomingMSGPacket_t 类型的指针,然后将其强制类型转换为 afIncomingMSGPacket_t 类型(osal_msg_receive()函数返回的是一个指向 void 类型的指针),最后将其赋值给 MSGpkt 变量,这个操作通常在一个任务中用于接收其他任务发送的消息,以便进行进一步的处理。

    

二、常见注意和错误解决

        1、编译时Error[Pa045]: **** has no prototype ,prototypes取消勾选

        在协议栈中添加使用自己写程序的时候,编译时要把设置中的prototypes取消勾选。

        2、编译基于协议栈代码生成hex文件

        (1)首先设置选项,如下图所示

        (2)取消f8w2530.xcl文件内的部分代码,如下图所示

        3、 Warning[w2]: Symbol ?PBANK is redefined in command-line

        (1) IAR  编译zigbee工程时 报的警告如下:

         (2)可以在配置文件中修改,Tools文件夹下的f8w2530.xcl中屏蔽掉-D?PBANK=93这一行。

        (3)重新全部编译

        4、Warning[Pe223]: function **** declared implicitly 

        这个告警是提示我,我调用的这个 **** 函数没有进行函数声明,一般出现这种情况就是没有调用该函数声明的头文件,或者是没有对其进行外部声明。 解决办法

        1、将使用的函数的头文件包含进去。

        2、对其使用关键字"extern"声明

extern void ****(void);

        3、还有一种就是如果只在一个文件中调用函数,就将这个函数定义移到最前面也可以解决。

参考链接

(1)lesson7上协议栈的使用_1_哔哩哔哩_bilibili

(2)ZigBee协议栈 -- Zstack协议栈(Zstack2.5.1a)-CSDN博客

(3)zigbee之Zstack协议栈使用_z-stack协议栈-CSDN博客

(4)lesson7-3 OSAL操作系统抽象层原理_osal运行机制-CSDN博客

(5)lesson7-2 Zigbee协议栈的使用_zigbee协议栈如何创建一个新任务-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2033765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python从入门到精通:基础语法讲解

1、字面量 字面量:在代码中,被写下来的固定的值,称之为字面量。 python中常用的几种数据类型: 类型描述说明数字(Number) 整数(int) 浮点数(float) 复数&a…

Graph-Cot:图上迭代推理

Graph-Cot:图上迭代推理 提出背景GRAPH-COT 对比 MindMapGRAPH-COT 和 MindMap 多链推理方法结合案例一:复杂症状的诊断案例二:罕见病的诊断案例三:治疗方案的制定 解法拆解目的问题解法 GRAPH-COT 医学问诊 论文:http…

(BO)Bayes-CNN多变量时序预测 基于贝叶斯算法-卷积神经网络多变量时序预测(多输入单输出)Matlab代码

Bayes-CNN多变量时序预测 基于贝叶斯算法-卷积神经网络多变量时序预测(多输入单输出)Matlab代码 程序已经调试好,无需更改代码替换数据集即可运行!!!数据格式为excel!(如下) 需要其他的都可以…

CSS3下拉菜单实现

导航菜单&#xff1a; <nav class"multi_drop_menu"><!-- 一级开始 --><ul><li><a href"#">Power</a></li><li><a href"#">Money</a></li><li><a href"#"…

【数模修炼之旅】02 多目标规划 深度解析(教程+代码)

【数模修炼之旅】02 多目标规划 深度解析&#xff08;教程代码&#xff09; 接下来 C君将会用至少30个小节来为大家深度解析数模领域常用的算法&#xff0c;大家可以关注这个专栏&#xff0c;持续学习哦&#xff0c;对于大家的能力提高会有极大的帮助。 1 多目标规划介绍及应…

百度智能云发布3款轻量级+2款场景大模型

文心大模型ERNIE 3.5是目前百度智能云千帆大模型平台上最受欢迎的基础大模型之一。针对用户的常见通用的对话场景&#xff0c;ERNIE 3.5 在指令遵循、上下文学习和逻辑推理能力三方面分别进行了能力增强。 ERNIE Speed作为三款轻量级大模型中的“大个子”&#xff0c;推理场景…

解决连接不上Linux和服务器中的Nacos(Windows中能连接但是Linux中却不行)

报错 com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNKNOWN: Uncaught exception in the SynchronizationContext. Re-thrown. at com.alibaba.nacos.shaded.io.grpc.Status.asRuntimeException(Status.jav 2024-08-13T10:21:52.93708:00 ERROR 27764 --- …

ArduPilot开源代码之FMU+IOMCU设计

ArduPilot开源代码之FMUIOMCU设计 1. 源由2. 设计概念3. FMU & IOMCU特点3.1 FMU&#xff08;Flight Management Unit&#xff09;的主要功能3.2 IOMCU&#xff08;Input/Output Microcontroller Unit&#xff09;的主要功能3.3 主要差异 4. 主/辅助(MAIN/AUX) PWM输出5. 软…

【北京仁爱堂】痉挛性斜颈的早期症状,你了解吗?

在日常生活中&#xff0c;您可能很少听到“痉挛性斜颈”这个名词&#xff0c;但它却是一种不容忽视的疾病。今天&#xff0c;就让我们一起来了解一下痉挛性斜颈的早期症状&#xff0c;以便能够及时发现并采取相应的措施。 痉挛性斜颈是一种局限性肌张力障碍疾病&#xff0c;主要…

Gitlab搭建服务器好做吗 Gitlab搭建服务器操作指南

GitLab是一个强大的开源代码托管和CI/CD工具&#xff0c;广泛用于软件开发的版本控制和自动化构建。对于许多公司和开发团队来说&#xff0c;自行搭建GitLab服务器是一个既具挑战性又有很多好处的选择。本文将详细讨论搭建GitLab服务器的难易程度&#xff0c;提供一份详尽的操作…

死信队列.

“死信”是指在RabbitMQ中那些因为某些原因无法被正常处理的消息。

OpenCV图像滤波(11)中值滤波medianBlur函数的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 功能描述 该函数使用中值滤波器对图像进行模糊处理。 该函数采用 ksizeksize 的窗口尺寸对图像进行平滑处理。对于多通道图像&#xff0c;每个通道将被独…

Linux发行版深度对比:Ubuntu、CentOS与Fedora

在Linux的广阔世界中&#xff0c;Ubuntu、CentOS和Fedora作为三大主流发行版&#xff0c;各自拥有独特的生态系统、用户基础和开发理念。它们不仅在技术架构上有着显著的差异&#xff0c;更在用户体验、社区支持、软件更新策略以及安全性能等方面展现出各自的特色。本文将对这三…

红黑树R-B Tree

文章目录 概述红黑树的特性红黑树的原理应用为什么设计红黑树红黑树左旋与右旋的区别 概述 红黑树&#xff08;Red Black Tree&#xff09;是一种自平衡的二叉查找树&#xff0c;在计算机科学中广泛使用&#xff0c;其典型的用途是实现关联数组。R-B Tree&#xff0c;全称是 R…

[C++][opencv]基于opencv实现photoshop算法亮度和对比度调整

【测试环境】 vs2019 opencv4.8.0 【效果演示】 【核心实现代码】 #include <iostream> #include "opencv2/core.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/highgui.hpp"using namespace std; using namespace cv;#defi…

【区块链+食品安全】食药产业全流程可追溯平台 | FISCO BCOS应用案例

为响应国家强化食品安全追溯监管的号召&#xff0c;吉科软信息技术有限公司基于 FISCO BCOS 联盟链开源技术&#xff0c;推出了 食药产业全流程可追溯平台&#xff0c;并应用于吉林省白山市。该平台建立了从食药产品种养殖、生产加工、冷链运输、 流通到消费的全链条可追溯体系…

掌握Python eval()函数:解析动态代码执行的神奇之处

eval() 是 Python 提供的一个内置函数&#xff0c;用于动态执行字符串形式的表达式。 虽然它功能强大&#xff0c;但同时也伴随着一定的风险和局限性。在本文中&#xff0c;我们将详细介绍 eval() 的用法、注意事项以及一些常见的应用场景。 一、eval() 函数的基本用法 基本语…

SpringIOC和SpringAOC

lombok插件 XML<!-- 加载资源文件 --><context:property-placeholder location"classpath:jdbc.properties"></context:property-placeholder><!-- 注入数据源 --><bean id"dataSource" class"com.mchange.v2.c3p0.ComboP…

Supervision 计算机视觉工具

简介 Supervision库是Python计算机视觉低代码工具&#xff0c;旨在为用户提供便捷高效的接口&#xff0c;以便处理数据集并直观地展示检测结果。绘制检测结果&#xff0c;统计指定区域内检测目标数量Supervision都提供了相应的接口 安装库 要求Python版本>3.8 1.安装无图像…

【机器学习】反向传播算法的直观解释、微积分原理以及反向传播中的链式法则

引言 正如有句话说的好&#xff0c;neurons-that-fire-together-wire-together&#xff08;一同激活的神经元关联在一起&#xff09; 文章目录 引言一、反向传播算法的直观解释1.1 前向传播1.2 计算误差1.3 反向传播误差1.4 更新权重 二、微积分原理2.1 损失函数 L L L2.2 链式…