【CC2530 教程 十】CC2530 Z-Stack 协议栈
一、Z-Stack 协议栈目录结构:
Z-Stack 协议栈可以从 TI 官网免费下载,下载安装完成以后,会默认在 C 盘的根目录下创建 Texas Instruments 目录,该目录下的子目录就是安装的 Z-Stack 文件,并且在该子目录下创建Accessories、 Components、Documents、Projects 和 Tools 等 5个文件夹。
(1)Accessories目录:
存放了各种辅助工具,如下图所示:
其中:
- OtaServer:存放了OTA(Over The Air,空中升级)测试工具
- SerialBootTool:存放了串口升级测试工具。
(2)Components目录:
存放了Z-Stack核心源代码和链接库,打开Components目录,如下图所示:
文件名称 | 描述 |
---|---|
bsp | 板级支持包,用于适配 TI 官方开发板的硬件资源。 |
driverlib | 驱动程序链接库,存放 TI 官方未开源驱动程序的链接库。 |
hal | 硬件抽象层,存放各种驱动程序。 |
mac | 媒体介质访问控制,实现物理层通信及 IEEE 802.15.4 协议。 |
mt | 监视层,为监视协议栈各层的运行状态提供支持。 |
osal | 操作系统抽象层,是 Z-Stack 3.0.2的操作系统。 |
services | 提供一些公共的、常用的功能。 |
stack | ZigBee 协议的实现。 |
usblib | USB 链接库,芯片支持 USB(比如 CC2538)时需要用到的功能。 |
zmac | 属于 mac 层的内容。 |
(3)Documents目录:
存放了Z-Stack开发辅助的相关文档,打开Documents目录,如下图所示:
文件名称 | 描述 |
---|---|
API | 存放 Z-Stack 3.0 相关 API 的说明文档。 |
CC2530 | 存放适用于 CC2530 型号 MCU 的相关文档。 |
CC2538 | 存放适用于 CC2538 型号 MCU 的相关文档。 |
Z-Stack 3.0 Developer's Guide.pdf | Z-Stack 3.0 开发指导。 |
Z-Stack 3.0 Sample Application User's Guide.pdf | Z-Stack 3.0 应用例程指导。 |
Z-Stack OTA Upgrade User's Guide.pdf | OTA(Over The Air)空中升级说明指导。 |
(4)Projects目录:
存放了ZigBee应用例程的工程文件和源码文件,打开Projects目录,如下图所示:
其中:
- tools:存放与ZigBee例程应用相关的工具。
- zstack:存放ZigBee相关例程。
打开zstack文件夹,如下图所示:
文件夹名称 | 描述 |
---|---|
HomeAutomation | 面向家庭自动化领域的相关例程。 |
Libraries | 存放链接库文件,TI 不开放的源代码会被编译为链接库的形式提供给开发者使用。 |
OTA | OTA(Over The Air)空中升级例程。 |
Tools | 存放工程配置相关的文件。 |
Utilities | 公共文件夹。 |
ZMain | 存放主函数所在的源代码文件及系统硬件启动相关的源代码文件。 |
ZNP | ZNP(ZigBee And Processor)例程。 |
(5)其他目录:
文件名或文件夹名 | 描述 |
---|---|
Tools | 存放开发调试相关的工具。 |
EULA.pdf | 版权声明文件。 |
Getting Started Guide - CC2530.pdf | 针对 CC2530 型号 MCU 的开始向导文件。 |
Getting Started Guide - CC2538.pdf | 针对 CC2538 型号 MCU 的开始向导文件。 |
Z-Stack 3.0 Release Notes.txt | Z-Stack 3.0 发布描述文件。 |
Z-Stack 3.0 Software Development Kit Resource Guide.html | Z-Stack 3.0 开发资源向导链接文件。 |
Z-Stack Core Release Notes.txt | Z-Stack Core 发布描述文件。 |
Z-Stack_3.0.1_Manifest.html | Z-Stack 3.0 关键信息描述清单。 |
.iss | 此文件夹为隐藏文件夹,存放用于卸载 Z-Stack 3.0 的相关文件。 |
二、Z-Stack 3.0.2 工程框架:
在 Projects\Zstack\HomeAutomation 目录下,包含:进入其中一个文件夹,选择相应的 Demo 工程文件并双击,即可打开一个 Demo 工程。
(1)工程组织结构:
打开 GenericApp 演示项目工程后,IAR 软件左边出现如下图所示的 Z-Stack 协议栈目录结构:
其中:
组名称 | 说明 |
---|---|
App | 存放应用程序相关源代码文件。 |
BDB | 实现 ZigBee BDB(Base Device Behavior,设备基础行为)功能。 |
GP | 实现 ZigBee GP(Green Power,绿色能源)功能。 |
HAL | 硬件抽象层,存放各种驱动程序。 |
MAC | 媒体介质访问控制,实现物理层通信及 IEEE 802.15.4 协议。 |
MT | 监视层,为监视协议栈各层的运行状态提供支持。 |
NWK | ZigBee 网络层。 |
OSAL | 操作系统抽象层。 |
Profile | 存放 ZigBee 标准化定义及相关功能实现的源代码文件。 |
Security | 实现安全相关服务。 |
Services | 提供一些公共的、常用的功能。 |
Tools | 存放工程配置相关的文件。 |
ZDO | 存放 ZDO(ZigBee Device Object,ZigBee 设备对象)相关源代码文件。 |
ZMac | 属于 mac 层的内容。 |
ZMain | 存放主函数所在的源代码文件及系统硬件启动相关的源代码文件。 |
Output | 存放工程编译/链接时输出的文件。 |
在工程中可以选择不同的ZigBee网络设备类型。单击选项卡→选择网络设备类型,如下图所示:
之前有介绍到,ZigBee网络设备类型有3种,分别是Coordinator(协调器),Router(路由器)和EndDevice(终端设备)。
选项 | 含义 |
---|---|
CoordinatorEB | ZigBee 协调器。 |
RouterEB | ZigBee 路由器。 |
EndDeviceEB | ZigBee 终端设备。 |
EndDeviceEB-OTAClient | 支持 OTA(Over The Air)空中升级的 ZigBee 终端设备。 |
RouterEB-OTAClient | 支持 OTA(Over The Air)空中升级的 ZigBee 路由器。 |
(2)工程编译及链接:
选择Coordinator(协调器),点击重建所有:
编译及链接过程没有错误和警告。
三、Z-Stack OSAL调度原理:
(1)OSAL简介:
OSAL(Operating System Abstraction Layer,系统抽象层),可以通俗地理解为一个简化版的操作系统,为Z-Stack的正确运行提供了内存管理、中断管理和任务调度等基本功能。
(2)OSAL任务调度原理:
OSAL的任务调度其实是初始化任务池以及轮询任务池。
以SampleSwitch为例:
打开ZMain.c文件:
main函数如下:
/********************************************************************** @fn main* @brief 启动后调用的第一个函数。* @return 无关心*/
int main(void)
{// 禁用中断,防止在初始化过程中被打断osal_int_disable(INTS_ALL);// 初始化与板子相关的功能,如LED等HAL_BOARD_INIT();// 确保供电电压足够高以运行zmain_vdd_check();// 初始化板子的I/OInitBoard(OB_COLD);// 初始化HAL驱动程序HalDriverInit();// 初始化NV(非易失性)系统osal_nv_init(NULL);// 初始化MAC层ZMacInit();// 确定扩展地址zmain_ext_addr();#if defined ZCL_KEY_ESTABLISH// 初始化Certicom证书信息,用于密钥建立zmain_cert_init();
#endif// 初始化基本的NV项zgInit();#ifndef NONWK// 由于AF不是一个任务,调用其初始化例程afInit();
#endif// 初始化操作系统osal_init_system();// 允许中断osal_int_enable(INTS_ALL);// 最终的板子初始化InitBoard(OB_READY);// 显示有关此设备的信息zmain_dev_info();/* 在LCD上显示设备信息 */
#ifdef LCD_SUPPORTEDzmain_lcd_init();
#endif#ifdef WDT_IN_PM1/* 如果使用WDT(看门狗定时器),这是启用它的好地方 */WatchDogEnable(WDTIMX);
#endifosal_start_system(); // 从此处开始运行操作系统,不会返回return 0; // 不应该到达这里。
} // main()
其中有两个关键的函数调用:
// 初始化操作系统任务池
osal_init_system();// 轮询任务池
osal_start_system();
osal_init_system()定义如下:
/********************************************************************** @fn osal_init_system** @brief** This function initializes the "task" system by creating the* tasks defined in the task table (OSAL_Tasks.h).** @param void** @return SUCCESS*/
uint8 osal_init_system(void)
{
#if !defined USE_ICALL && !defined OSAL_PORT2TIRTOS// Initialize the Memory Allocation System// 初始化内存分配系统,用于管理动态内存的分配和释放osal_mem_init();
#endif /* !defined USE_ICALL && !defined OSAL_PORT2TIRTOS */// Initialize the message queue// 初始化消息队列,用于任务间的消息传递和处理osal_qHead = NULL;// Initialize the timers// 初始化定时器系统,用于处理系统中的定时任务和时间管理osalTimerInit();// Initialize the Power Management System// 初始化电源管理系统,用于管理设备的功耗和电源状态osal_pwrmgr_init();#ifdef USE_ICALL/* Prepare memory space for service enrollment */// 为服务注册准备内存空间,用于ICall服务的内存管理osal_prepare_svc_enroll();
#endif /* USE_ICALL */// Initialize the system tasks.// 初始化系统任务,创建任务表中定义的任务并设置任务环境osalInitTasks();#if !defined USE_ICALL && !defined OSAL_PORT2TIRTOS// Setup efficient search for the first free block of heap.// 设置高效的堆内存搜索,优化内存分配的性能osal_mem_kick();
#endif /* !defined USE_ICALL && !defined OSAL_PORT2TIRTOS */#ifdef USE_ICALL// Initialize variables used to track timing and provide OSAL timer service// 初始化用于跟踪时间和提供OSAL定时器服务的变量osal_last_timestamp = (uint_least32_t)ICall_getTicks();osal_tickperiod = (uint_least32_t)ICall_getTickPeriod();osal_max_msecs = (uint_least32_t)ICall_getMaxMSecs();/* Reduce ceiling considering potential latency */// 考虑到可能的延迟,减少最大毫秒数的上限osal_max_msecs -= 2;
#endif /* USE_ICALL */return (SUCCESS);
}
在该函数中可以看到一个任务池初始化函数osalInitTasks(),它的作用是初始化任务池。
osal_start_system()定义如下:
/********************************************************************** @fn osal_start_system** @brief** This function is the main loop function of the task system (if* ZBIT and UBIT are not defined). This Function doesn't return.** @param void** @return none*/
void osal_start_system(void)
{
#ifdef USE_ICALL/* Kick off timer service in order to allocate resources upfront.* The first timeout is required to schedule next OSAL timer event* as well. */// 启动定时器服务,提前分配资源。第一次超时用于安排下一个OSAL定时器事件。ICall_Errno errno = ICall_setTimer(1, osal_msec_timer_cback,(void *)osal_msec_timer_seq,&osal_timerid_msec_timer);if (errno != ICALL_ERRNO_SUCCESS){// 如果设置定时器失败,调用ICall_abort()进行错误处理ICall_abort();}
#endif /* USE_ICALL */#if !defined(ZBIT) && !defined(UBIT)for (;;) // 永远循环,作为任务系统的主循环
#endif{// 运行系统任务,处理任务调度和执行osal_run_system();#ifdef USE_ICALL// 等待ICall事件,ICALL_TIMEOUT_FOREVER表示无限期等待ICall_wait(ICALL_TIMEOUT_FOREVER);
#endif /* USE_ICALL */}
}
在osal_start_system()函数的主循环中,循环调用了 osal_run_system()函数,该函数主要作用是轮询任务池。
osal_run_system()函数 中这个do-while循环:
它的主要作用是轮询整个任务池,检查是否有需要处理的任务。循环中只有一个条件判断,如果条件成立,就结束循环。
其中,tasksEvents 是一个 uint16 类型的数组,每个元素表示一种类型的任务也就是任务池。tasksCnt 是这个任务池的大小。
循环的运行逻辑是这样的:
- 首先,idx 的初始值为 0。
- 当 tasksEvents[idx] 的值为 0 时,表示该任务没有事情要处理,这时候条件判断不成立,进入下一次循环。
- 每执行一次循环前,idx 加 1,然后判断是否小于 tasksCnt。
- 当 tasksEvents[idx] 的值不等于 0 时,表示该任务中有事情要处理,这时候条件判断成立,于是通过 break 结束循环。
- 当循环结束后,如果整个任务池中都没有任务要处理,那么 idx 必定会 >= tasksCnt。因此,如果 idx < tasksCnt,表示现在任务池中有任务需要处理,并且 tasksEvents[idx] 就是当前需要处理的任务。因此在循环结束后,Z-Stack会 用 if (idx < tasksCnt) 语句来判断有没有任务需要处理。
(3)任务与事件:
每个任务中可能包含一系列待处理的事情,这些待处理的事情可以通俗地称为“事件”,例如一个任务中可以包含打开 LED 灯、读取温湿度和查看设备状态3 个事件(待处理的事情)。
tasksEvents 中的每个元素都是一个 uint16 类型的变量,每一个元素都表示了一个任务,并且储存了这个任务中包含的一系列事件。
相关文章:
【CC2530 教程 十】CC2530 Z-Stack 协议栈
一、Z-Stack 协议栈目录结构: Z-Stack 协议栈可以从 TI 官网免费下载,下载安装完成以后,会默认在 C 盘的根目录下创建 Texas Instruments 目录,该目录下的子目录就是安装的 Z-Stack 文件,并且在该子目录下创建Accessor…...
区间端点(java)(贪心问题————区间问题)
deepseek给了一种超级简单的做法 我是真的想不到 贪心的思路是 局部最优——>全局最优 这种我是真的没有想到,这样的好处就是后面便利的时候可以通过foreach循环直接便利qu的子元素也就是对应的某一个区间, 将一个二维数组变成一维数组,每一个一维…...
定长内存池原理及实现
目录 一、池化技术 二、内存池 三、内存池主要解决的问题 四、定长内存池的实现 1.定长内存池的原理 2.框架 3.Delete实现 4.New实现 5.性能测试 五、源码 FixedMemoryPool.h test.cc 一、池化技术 所谓“池化技术”,就是程序先向系统申请过量的资源&…...
通过php连接redis数据库
如上图所示,这是去搭建一个lamp平台, 阿帕奇和php安装好之后,php直接就被安装成阿帕奇的一个功能模块。 如上图所示,这就是php作为阿帕奇的功能模块。 如上图所示,我们去正常启动redis数据库。 如上图所示,…...
3D点云的深度学习网络分类(按照作用分类)
1. 3D目标检测(Object Detection) 用于在点云中识别和定位目标,输出3D边界框(Bounding Box)。 🔹 方法类别: 单阶段(Single-stage):直接预测3D目标位置&am…...
论文解读:《Word embedding factor based multi-head attention》——基于词嵌入因子的多头注意力
原文链接:Word embedding factor based multi-head attention | Artificial Intelligence Review 多头注意力机制线性地将查询、键和值投影到不同的子空间中,允许模型从不同的角度理解输入序列,并利用输入句子序列中有关令牌之间关系的信息。…...
单片机和微控制器知识汇总——《器件手册--单片机、数字信号处理器和可编程逻辑器件》
目录 四、单片机和微控制器 4.1 单片机(MCU/MPU/SOC) 一、定义 二、主要特点 三、工作原理 四、主要类型 五、应用领域 六、选型与设计注意事项 七、发展趋势 4.2 数字信号处理器(DSP/DSC) 编辑编辑 一、定义 二、工作原理 三、结构特点 四、应用领域 五、选型与设计注…...
LeetCode hot 100 每日一题(15)——48.旋转图像
这是一道难度为中等的题目,让我们来看看题目描述: 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 提示…...
Java多线程精讲:线程操作与状态转换全解析
前言 本章内容为作者结合学习与实践的总结整理,虽力求准确,但疏漏之处在所难免。若有任何疑问或建议,恳请读者朋友们不吝指正,共同完善知识体系,感激不尽! 一、认识多线程(Thread&#…...
HashMap的位操作是什么?HashSet 的 contains 方法复杂度是多少?红黑树简单讲一下?
一、HashMap 的位操作设计 HashMap 使用位运算优化哈希计算与索引定位,核心场景如下: 哈希扰动函数 计算键的哈希值时,将高16位与低16位异或: static final int hash(Object key) {int h;return (key null) ? 0 : (h key.hash…...
GitHub开源的容器管理面板-Dpanel
dpanel Docker安装部署二进制部署 GitHub官网 一块轻量化docker可视化管理面板,由国人开发,个人觉得是比较好用的,功能都很齐全,并且可以通过修改源码,自定义前端样式等。 Docker安装部署 官网 部署环境࿱…...
vue-将组件内容导出为Word文档-docx
1. 安装依赖 首先,我们需要安装docx库,以便在前端生成Word文档。可以通过以下命令进行安装: npm install docx 2. 实现导出功能 2.1 初始化文档 使用docx库创建一个新的文档实例,并定义文档的结构和内容。我们使用Document、…...
IMX6ULL学习篇——系统学习设备树
IMX6ULL学习篇——系统学习设备树 这篇博客的目的是系统的整理一下设备树当中的一些非常基本的概念。基于之前的学习,我们已经至少掌握了字符设备的基本的框架,编写一个最简单的字符设备简单的流程。 但是我们知道,一个外设很有可能是…...
使用vector构造杨辉三角形
力扣118题: 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1…...
亮数据爬取API爬取亚马逊电商平台实战教程
前言 在当今数据驱动的商业环境中,企业需要快速、精准地获取互联网上的公开数据以支持市场分析、竞品调研和用户行为研究。然而,传统的手动网页爬取方式面临着诸多挑战:IP封锁、验证码干扰、网站结构频繁变更,以及高昂的运维成本…...
AI+金融 应用 使用DeepSeek、Qwen等大模型输入自然语言,得到通达信等行情软件公式代码,导入后使用
AI金融 应用 使用DeepSeek、Qwen等大模型输入自然语言,得到通达信等行情软件公式代码,导入后使用。不会编程,也能行情软件中实现个性化条件选股,个性化技术指标。 AIbxm低估值趋势选股策略,参考提示词: 编…...
SmolVLM2: 让视频理解能力触手可及
一句话总结: SmolVLM 现已具备更强的视觉理解能力📺 SmolVLM2 标志着视频理解技术的根本性转变——从依赖海量计算资源的巨型模型,转向可在任何设备运行的轻量级模型。我们的目标很简单: 让视频理解技术从手机到服务器都能轻松部署。 我们同步发布三种规…...
去中心化金融
什么是去中心化金融 去中心化金融(Decentralized Finance,简称 DeFi)是一种基于区块链技术构建的金融系统,旨在通过去除传统金融机构(如银行、证券公司等)作为中介,提供各种金融服务。这些服务…...
Mysql并发事务带来哪些问题?
大家好,我是锋哥。今天分享关于【Mysql并发事务带来哪些问题?】面试题。希望对大家有帮助; Mysql并发事务带来哪些问题? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 MySQL 中,事务并发执行时会引发一系列问题,…...
PCL 点云多平面探测
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 Open3D为我们提供了一种点云多平面探测的算法,该算法使用基于鲁棒统计的方法进行平面补丁检测。该算法具体过程:首先将点云细分为更小的块(使用二分法),然后尝试为每个点云块匹配一个平面。如果平面通过了鲁棒平…...
OpenBMC:BmcWeb添加路由5 设置handler函数
对路由对象完成了权限和method的设置后,最重要的就是设置路由的处理函数: //http\routing\taggedrule.hpptemplate <typename... Args> class TaggedRule :public BaseRule,public RuleParameterTraits<TaggedRule<Args...>> {...template <typename F…...
攻破tensorflow,勇创最佳agent(2)---损失(loss) 准确率(accuracy)问题
实战播: 怎么判定一个模型好不好,你设置的值对不对? 需要再看几个值: 例如: model Sequential()for units in model_structure:model.add(Dense(units, activationrelu))model.add(Dropout(train_config.get(dropout_rate, 0.3)))model.add(Dense(1, activationsigmoid)) 他…...
括号合法题
一、括号合法题 2116. 判断一个括号字符串是否有效 //采用从左往右和从右往左遍历的贪心算法,分别保证前缀合法,后缀合法。public boolean canBeValid(String s, String locked) {int ns.length();if (n%21) return false;int num0;// 从左到右扫描&…...
C++11之深度理解lambda表达式
前言 在现代C中,Lambda表达式提供了一种简洁而强大的方式来定义匿名函数,使代码更具可读性和灵活性。自C11引入Lambda以来,它已经成为STL算法、并发编程和回调机制中的重要工具。随着C14、C17和C20的不断演进,Lambda的功能也在不断…...
字符串常量,数组和指针的不同形式
在 C 语言中,字符串 "hello" 存储在内存中是一个字符数组,它的内存布局通常如下: 1. 字符串常量区: 字符串常量(如 "hello")是存储在程序的数据段(通常称为 .data 或 .ro…...
全面讲解python的uiautomation包
在常规的模拟鼠标和键盘操作,我们一般使用pyautogui,uiautomation模块不仅能直接支持这些操作,还能通过控件定位方式直接定位到目标控件的位置,而不需要自己去获取对应坐标位置。uiautomation模块不仅支持任意坐标位置截图&#x…...
性能测试笔记
8、JMeter扩展开发 扩展组件开发的意义 输入参数协议复杂调用逻辑功能等等 开发前的工具准备 下载jdk并安装,配置环境变量下载maven,配置环境变量修改settings.xml本地仓库,远程仓库的地址Eclipse新建Maven项目编辑 pom.xml Maven常用命令…...
相对位置2d矩阵和kron运算的思考
文章目录 1. 相对位置矩阵2d2. kron运算 1. 相对位置矩阵2d 在swin-transformer中,我们会计算每个patch之间的相对位置,那么我们看到有一连串的拉伸和相减,直接贴代码: import torch import torch.nn as nntorch.set_printoptio…...
从C语言开始的C++编程生活(2)
前言 本系列文章承接C语言的学习,需要有C语言的基础才能学会哦~ 第2篇主要讲的是有关于C的缺省参数和函数重载。 C才起步,都很简单呢! 目录 前言 缺省参数 基本语法 缺省参数的作用 函数重载 基本语法 重载的作用 缺省参数 缺省参数…...
【设计模式】深入解析装饰器模式(Decorator Pattern)
深入解析装饰器模式(Decorator Pattern) 一、装饰器模式的核心概念 装饰器模式是一种结构型设计模式,用于动态地给对象添加新功能,而不改变其原始代码。 1. 为什么需要装饰器? 避免继承带来的类爆炸问题࿱…...
K8S集群新增和删除Node节点(K8s Cluster Adds and Removes Node Nodes)
实战:在已有K8S集群如何新增和删除Node节点 在Kubernetes (K8S) 集群中,Node节点是集群中的工作节点,它们运行着容器的实际实例。管理K8S集群中的Node节点,包括新增和删除节点,是一个常见且重要的操作,可以…...
2503C++,C++标准的执行
最优雅的应该是c26刚刚引入的std::execution,通过sender/receiver模型和常用的异步算法来简化调用异步逻辑,还可随时改成协程. #include <stdexec/execution.hpp> #include <exec/static_thread_pool.hpp> int main() {exec::static_thread_pool pool(3);auto sch…...
nodejs中实现一个自定义的require方法
1.前言 大家对nodejs中的require方法应该不会陌生,这个方法可以用来导入nodejs的内置模块,自定义模块,第三方模块等,使用频率非常高,那么这个方法内部是如何实现的呢?本篇文章就是从头到尾拆分实现流程,最终实现一个自定义的require方法的 2.前置操作 导入所需的nodejs内置…...
vscode/cursor中python运行路径设置 模块导入问题
vscode/cursor中python运行路径设置 ## 文件路径设置 问题描述 pycharm的项目用cursor运行,出现目录找不到 后来利用 os.getcwd(),经过打印调试发现是IDE的本身配置问题 pycharm中,os.getcwd()默认打开当前脚本所在目录 vscode/cursor中…...
Spring学习笔记05——Spring Boot的文件结构2(POJO类)
在Spring Boot项目中,将Entity、DTO、VO放在POJO子模块中是一种常见的分层设计,它们各自承担不同的职责,通过一个通俗的例子来解释它们的作用: POJO(Plain Old Java Object)是指普通的、简单的Java对象&am…...
html和css 实现元素顺时针旋转效果(椭圆形旋转轨迹)
一 实现效果 二 实现代码 我自己是用react写的。 1. react 代码如下: import React from "react"; import styles from "./index.less";export default () > {return <div className{styles.containers}><div className{styles.c…...
C# 的Lambda表达式常见用法和示例
C# 的 Lambda 表达式是一种强大的语法糖,能够极大简化代码并增强灵活性。以下是它的主要功能和应用场景,结合具体示例说明: 1. 简化委托实例化 Lambda 可以快速定义委托(如 Func、Action),无需显式…...
2024年数维杯数学建模C题天然气水合物资源量评价解题全过程论文及程序
2024年数维杯数学建模 C题 天然气水合物资源量评价 原题再现: 天然气水合物(Natural Gas Hydrate/Gas Hydrate)即可燃冰,是天然气与水在高压低温条件下形成的类冰状结晶物质,因其外观像冰,遇火即燃&#…...
Qt中10倍提升动态截屏及渲染60帧/秒
Qt中10倍提升动态截屏及渲染60帧/秒 理解模态窗口和非模态窗口 在C中,窗口的**模态(Modal)和非模态(Modeless)**显示是两种不同的对话框或窗口行为模式,主要区别体现在用户交互和程序流程控制上。以下是它…...
OpenCV 基础全方位剖析:夯实计算机视觉开发根基
在计算机视觉的广袤领域中,OpenCV 是一座极为关键的里程碑。无论是在前沿的学术研究,还是在蓬勃发展的工业界,OpenCV 凭借其强大的功能与高效的性能,为开发者提供了丰富的图像处理和计算机视觉算法,助力无数项目落地。…...
Java试题
试题: 解析 1-5: 5: 6: 7: 8: 9: 10: 11: 12: 13:...
基于 arco 的 React 和 Vue 设计系统
arco 是字节跳动出品的企业级设计系统,支持React 和 Vue。 安装模板工具 npm i -g arco-cli创建项目目录 cd someDir arco init hello-arco-pro? 请选择你希望使用的技术栈React❯ Vue? 请选择一个分类业务组件组件库Lerna Menorepo 项目❯ Arco Pro 项目看到以…...
解密细胞衰老与溶解:AbMole助力胰腺癌研究新突破
近日,一项由德国罗斯托克大学医学中心的研究团队完成的研究,在探索胰腺癌细胞衰老与溶解的复杂机制上取得了重要进展。这项研究不仅深化了我们对胰腺癌生物学特性的理解,更为未来的研究开辟了新的方向。而在这场科学探索中,AbMole…...
罗德与施瓦茨FSU8,频谱分析仪
罗德与施瓦茨FSU8频谱分析仪 R&S FSU系列频谱仪是动态范围、相位噪声、电平精度和分辨率带宽等频谱仪指标,所有这些指标也是用户设计、测量和生产下一代无线通讯元件的重要保障。出色的表现能力 频率范围:从20Hz开始,分别到3.6 GHz, 8…...
【零基础JavaScript入门 | Day7】三大交互案例深度解析|从DOM操作到组件化开发
【零基础JavaScript入门 | Day7】三大交互案例深度解析|从DOM操作到组件化开发 🌟今日知识图谱: ✅ 事件驱动编程 → 按钮交互与定时器控制 ✅ 组件化思维 → 可复用UI模块开发 ✅ 用户体验优化 → 动画与状态反馈设计 ✅ 工程化实践 → 代码…...
[BalticOI 2009] Radio Transmission 无线传输
题目来自洛谷网站: KMP思路: 结论:n - ne[n] 模拟样例,如下图所示: 代码: #include<bits/stdc.h> #define int long long using namespace std; const int N 1e620;int n; char s[N]; int ne[N];…...
SvelteKit 最新中文文档教程(10)—— 部署 Cloudflare Pages 和 Cloudflare Workers
前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1: Svelte …...
32位汇编:MASM32环境搭建与汇编窗口程序
引言 “汇编语言”是计算机底层的编程语言,直接操作硬件资源。32位汇编相比16位汇编在寄存器宽度、内存寻址和指令集等方面有了显著提升。本文将带你从零开始搭建32位汇编开发环境,并编写第一个窗口程序。 1. 环境搭建 1.1 下载MASM32 MASM32是一个专门…...
如何在 `php-fpm` 启动后自动运行自定义命令
如何在 php-fpm 启动后自动运行自定义命令 在使用 php-fpm 时,有时需要在 php-fpm 启动后自动运行一些自定义命令,例如启动一个 Web 应用程序。本文将详细介绍如何通过 systemd 的 ExecStartPost 指令实现这一功能,并记录解决过程中遇到的问…...
26考研——图_图的代码实操(6)
408答疑 文章目录 五、图的代码实操图的存储邻接矩阵结构定义初始化插入顶点获取顶点位置在顶点 v1 和 v2 之间插入边获取第一个邻接顶点获取下一个邻接顶点显示图 邻接表结构定义初始化图插入顶点获取顶点位置在顶点 v1 和 v2 之间插入边获取第一个邻接顶点获取下一个邻接顶点…...