网站建设可以使用模板么,现在给别人做网站还赚钱吗,哪一个网站有做实验的过程,王也图片帅气壁纸zigbee笔记#xff1a;九中#xff0c;我们已经学会了利用模板#xff0c;定制自己的个性开发工程#xff0c;本文为协议栈#xff08;ZStack-CC2530-2.3.0-1.4.0#xff09;代码使用分析笔记#xff0c;来进一步掌握协议栈的使用。
一、协议栈使用知识点 1、协调器、路… 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操作系统 OSALOperating System Abstraction Layer能够实现任务调度的微操作系统在OSAL操作系统中非常重要的两个概念是任务和事件还有消息也比较重要
1OSAL的启动流程 如下图所示系统启动后先完成一系列的初始化然后进入如无轮询主循环。 在zstack协议栈工程目录ZMAIN下的ZMain.c包含了主程序的入口地址 2 两个重要的函数 main函数中完成了一系列的初始其中对开发者比较重要有两个函数 1OSAL初始化函数 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是任务IDpara2是任务中的某个事件宏。 本质是把taskID应用层任务的任务事件变量中对应于宏event_flag值为1的那个位变为1这样的话首先这个任务事件变量就变成了非0系统在检测到任务事件变量为非0就会去调用任务事件处理函数***App_ProcessEvent。在这个函数里任务事件变量肯定和任务宏的值与操作为1所以必定会执行这个事件相关的代码。 5在ZStack里按照代码功能来划分分成不同的层比如硬件操作相关硬件层网络相关的代码叫网络层自己写应用程序部分叫应用层。几乎每一个层都是一个任务系统为每一个任务分配一个字节的唯一数值编号 我们把这个数值编号叫做任务IDtask_id。每一个任务都能处理一些他们能够处理的事物叫做事件event_flag。TI在设计的时候把任务事件处理函数和任务事件变量都封装成了数组 函数数组{任务事件处理函数A任务事件处理函数B任务事件处理函数C...} 变量数组{任务事件变量A任务事件变量B任务事件变量C...} 6任务ID系统不是随便分配的我们可以通过这个值立即找到这个任务自己的任务事件处理函数和任务事件变量。任务ID就是数组的下标通过下标就可以找到相应的任务事件处理函数和任务事件变量。由函数osalInitTasks()包含的任务初始化函数完成系统任务和用户自定义任务详见 42。 7事件是系统需要处理的事情必须有对应的任务进行处理事件采用16位独热码即每种任务可以有16种事件event_flag。例如在应用层系统事件已被定义占用编码为0x8000还有15种用户可定义的事件。 8所有Zstack协议栈在稳定工作时它的行为是在for(;;){}死循环里不断去读所有任务的任务事件变量。如果发现所有任务的任务事件变量都为0没问题说明所有任务都没有事件将要去处理不断重复这个过程直到发现某个任务事件变量不为0就会通过不为0的这个任务ID找到这个任务事件处理函数去处理相应的事件。 9 当事件数量较多编码无法表示时可采用消息系统事件就是采用消息进行事件传递的。 OSAL任务与事件的关系 如下图所示。 10 消息******************************************* 4、事件处理函数的编写 以应用层任务的事件为例 事件处理函数要在xxApp.c里的xx应用事件处理函数中编写xxApp_ProcessEvent如下图所示。 5、函数总结 1uint8 osal_set_event( uint8 task_id, uint16 event_flag ); 事件产生函数调用执行某个任务中的某个事件 para1是任务IDpara2是任务中的事件 2uint8 osal_start_timerEx( uint8 task_id, uint16 event_flag,unit16 timeout_value ); 事件定时器触发函数等待一定时间执行某个任务中的某个事件para1是任务编号para2是参数是要处理的事务para3是是时间毫秒。 3uint8 osal_msg_send( uint8 destination_taskID, uint8 *msg_ptr );
发送消息的函数para1是要接收此Message的目标任务IDpara2是所要发送的消息Message指针。 4MSGpkt (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?PBANK93这一行。 3重新全部编译 4、Warning[Pe223]: function **** declared implicitly 这个告警是提示我我调用的这个 **** 函数没有进行函数声明一般出现这种情况就是没有调用该函数声明的头文件或者是没有对其进行外部声明。 解决办法 1、将使用的函数的头文件包含进去。 2、对其使用关键字extern声明
extern void ****(void); 3、还有一种就是如果只在一个文件中调用函数就将这个函数定义移到最前面也可以解决。 参考链接
1lesson7上协议栈的使用_1_哔哩哔哩_bilibili
2ZigBee协议栈 -- Zstack协议栈(Zstack2.5.1a)-CSDN博客
3zigbee之Zstack协议栈使用_z-stack协议栈-CSDN博客
4lesson7-3 OSAL操作系统抽象层原理_osal运行机制-CSDN博客
5lesson7-2 Zigbee协议栈的使用_zigbee协议栈如何创建一个新任务-CSDN博客