关于M0+芯片的IAP应用导致延时不准确解释

        前言:在给项目中使用的M0芯片做IAP功能时一切一切都是那么的自然水到渠成,但是笔者在实现完IAP功能后,却发现APP端挂载的单总线功能崩溃了,最开始没有怀疑是bootload导致的。因为笔者在使用同一篇代码的时候单总线挂载的设备不同,延时也不同。最开始想着是不是硬件问题。两块板子,一块是校准过的光板,另外一个是装机的整版,笔者也分不清到底为啥光板时序就正确,能跑通,而整机就有问题,所以在对整机进行长达两三天的修理,后发现也还是一样一无所获。后思考是否是软件问题,最开始又怀疑是否是时钟导致的,后重新整理代码,发现M0的时钟他所使用的是内部高速时钟,我根本就没有配置,所以时钟也不对。再尝试对引脚抓波发现其超时时间固定,再尝试单独使用app程序后发现外挂的设备又能够正常使用。所以笔者就感觉可能是bootload问题,后对bootload检查参考官方给的sdk历程进行对比,经过两天的查找终于给我放弃了,找不到原因。最终只好求助官方技术支持。将现象给其介绍后,终于是找到原因了。

        M0芯片本身没有办法进行重定向中断向量表,所以APP的中断向量是会到BOOT的中断向量表,boot中的中断服务函数会再跳转到APP的中断向量表,有boot的话APP的中断会多进一次中断服务函数,时间会长一点。

        给的分析图如下:

      相对于其他芯片,可以直接重定向中断,延时就不会受到影响。笔者使用的是systick中断,做us级别延时,每次进需要进中断时候就会先进入IAP程序代码,后再跳转到APP中,每次延时越小,受到影响越大。使用单总线延时,us级别的,一下子就超时了。

总的来就是这么在做IAP分区的时候记得M0的芯片没有重定向功能,所有中断需要先返回bootload中触发后再跳转到APP中运行

         针对M0芯片,不同的M0 类型的芯片可以实现不同的中断方式,小编使用的是手动跳转,直接在bootload中转到APP应用中。

/*!* @file        apm32f00x_int.c** @brief       Main Interrupt Service Routines** @version     V1.0.1** @date        2022-04-11** @attention**  Copyright (C) 2018-2022 Geehy Semiconductor**  You may not use this file except in compliance with the*  GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE).**  The program is only for reference, which is distributed in the hope*  that it will be usefull and instructional for customers to develop*  their software. Unless required by applicable law or agreed to in*  writing, the program is distributed on an "AS IS" BASIS, WITHOUT*  ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied.*  See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions*  and limitations under the License.*/#include "config.h"
typedef void  (*INTERRUPT_FUNCTION)(void);#if defined (__CC_ARM)/* Indicates that the current interrupt vector */
uint32_t FLASH_interrupt_vector __attribute__((at(0x20000004))) = IAP_INTERRUPT_VECTOR;/* application interrupt vector address */
INTERRUPT_FUNCTION APP_interrupt_vector_addr __attribute__((at(0x20000000))) = (INTERRUPT_FUNCTION)0;#elif defined (__ICCARM__)
#pragma location = 0x20000000
__root INTERRUPT_FUNCTION APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)0;;
#pragma location = 0x20000004
__root uint32_t FLASH_interrupt_vector = IAP_INTERRUPT_VECTOR;#else
/* application interrupt vector address */
INTERRUPT_FUNCTION APP_interrupt_vector_addr __attribute__((section(".my_data"))) = (INTERRUPT_FUNCTION)0;/* Indicates that the current interrupt vector */
uint32_t FLASH_interrupt_vector __attribute__((section(".my_data"))) = IAP_INTERRUPT_VECTOR;#endif/*!* @brief       This function handles NMI exception** @param       None** @retval      None** @note*/void NMI_Handler(void){if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){}else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_NonMaskableInt_IRQn_APP_ADDR;APP_interrupt_vector_addr();}}/*!* @brief       This function handles Hard Fault exception** @param       None** @retval      None** @note*/
void HardFault_Handler(void)
{if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){}else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_HardFault_IRQn_APP_ADDR;APP_interrupt_vector_addr();}
}/*!* @brief       This function handles SVCall exception** @param       None** @retval      None** @note*/
void SVC_Handler(void)
{if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){}else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_SVC_IRQn_APP_ADDR;APP_interrupt_vector_addr();}
}/*!* @brief       This function handles PendSV_Handler exception** @param       None** @retval      None** @note
// */
void PendSV_Handler(void)
{if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){}else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_PendSV_IRQn_APP_ADDR;APP_interrupt_vector_addr();}
}/*!* @brief       This function handles SysTick exception** @param       None** @retval      None** @note*/
void SysTick_Handler(void)
{if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){APM_DelayIsr();}else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_SysTick_IRQn_APP_ADDR;APP_interrupt_vector_addr();}}
/*!* @brief       This function handles WUPT exception** @param       None** @retval      None*/
void WUPT_IRQHandler(void)
{if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){}else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_WUPT_IRQn_APP_ADDR;APP_interrupt_vector_addr();}
}
/*!* @brief       This function handles TMR4 exception** @param       None** @retval      None** @note*/
void TMR4_IRQHandler(void)
{if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){}else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_TMR4_IRQn_APP_ADDR;APP_interrupt_vector_addr();} }
/*!* @brief       This function handles RCM exception** @param       None** @retval      None*/
void RCM_IRQHandler(void)
{if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){}else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_RCM_IRQn_APP_ADDR;APP_interrupt_vector_addr();}
}
/*!* @brief       This function handles EINTA exception** @param       None** @retval      None*/
void EINTA_IRQHandler(void)
{if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){}else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_EINTA_IRQn_APP_ADDR;APP_interrupt_vector_addr();}
}/*!* @brief       This function handles EINTB exception** @param       None** @retval      None*/
void EINTB_IRQHandler(void)
{if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){}else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_EINTB_IRQn_APP_ADDR;APP_interrupt_vector_addr();}}/*!* @brief       This function handles EINTC exception** @param       None** @retval      None*/
void EINTC_IRQHandler(void)
{if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){}else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_EINTC_IRQn_APP_ADDR;APP_interrupt_vector_addr();}
}/*!* @brief       This function handles EINTD exception** @param       None** @retval      None*/
void EINTD_IRQHandler(void)
{if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){}else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_EINTD_IRQn_APP_ADDR;APP_interrupt_vector_addr();}
}/*!* @brief       This function handles SPI exception** @param       None** @retval      None*/
void SPI_IRQHandler(void)
{if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){}else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_SPI_IRQn_APP_ADDR;APP_interrupt_vector_addr();}
}
/*!* @brief       This function handles USART1 receiver exception** @param       None** @retval      None** @note*/
void USART1_RX_IRQHandler(void)
{if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){Uart1RxIsr();}else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_USART1_RX_IRQn_APP_ADDR;APP_interrupt_vector_addr();}
}/*!* @brief       This function handles USART1 transmitter exception** @param       None** @retval      None** @note*/void USART1_TX_IRQHandler(void)
{if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){}else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_USART1_TX_IRQn_APP_ADDR;APP_interrupt_vector_addr();}
}
/*!* @brief       This function handles ADC exception** @param       None** @retval      None** @note*/
/*****************************************************************************函 数 名  : ADC_IRQHandler功能描述  : adc 中断函数输入参数  : void返 回 值  : void作  者    : Bright创建日期 : 20250620
*****************************************************************************/
void ADC_IRQHandler(void)
{if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){}else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_ADC_IRQn_APP_ADDR;APP_interrupt_vector_addr();}
}
/*****************************************************************************函 数 名  : TMR2_CC_IRQHandler功能描述  : TIMER2定时中断输入参数  : void返 回 值  : void作  者    : Bright创建日期 : 20250620
*****************************************************************************/
void TMR2_CC_IRQHandler(void)//定时器溢出异常
{if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){}else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_TMR2_CC_IRQn_APP_ADDR;APP_interrupt_vector_addr();}
}void TMR2_UO_IRQHandler(void)
{if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){}else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_TMR2_UO_IRQn_APP_ADDR;APP_interrupt_vector_addr();}
}
void IIC_IRQHandler(void)
{if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){I2C_Isr(); }else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_IIC_IRQn_APP_ADDR;APP_interrupt_vector_addr();}
}
/*!* @brief       This function handles TIMER1 update/overflow/underflow/trigger/break exception** @param       None** @retval      None*/
void TMR1_UT_IRQHandler(void)
{if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){}else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_TMR1_UT_IRQn_APP_ADDR;APP_interrupt_vector_addr();}
}/*!* @brief       This function handles TIMER1 capture/compare exception** @param       None** @retval      None*/
void TMR1_CC_IRQHandler(void)
{if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){}else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_TMR1_CC_IRQn_APP_ADDR;APP_interrupt_vector_addr();}
}
void TMR1A_UT_IRQHandler(void)
{if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){}else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_TMR1A_UT_IRQn_APP_ADDR;APP_interrupt_vector_addr();}
}
void TMR1A_CC_IRQHandler(void)
{if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){}else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_TMR1A_CC_IRQn_APP_ADDR;APP_interrupt_vector_addr();}
}
void FLASH_IRQHandler(void)
{if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){}else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_FLASH_IRQn_APP_ADDR;APP_interrupt_vector_addr();}
}
/*!* @brief       This function handles USART2 TX exception** @param       None** @retval      None*/
void USART2_TX_IRQHandler(void)
{if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){}else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_USART2_TX_IRQn_APP_ADDR;APP_interrupt_vector_addr();}
}/*!* @brief       This function handles USART2 RX exception** @param       None** @retval      None*/
void USART2_RX_IRQHandler(void)
{if (FLASH_interrupt_vector == IAP_INTERRUPT_VECTOR){}else if (FLASH_interrupt_vector == APP1_INTERRUPT_VECTOR){APP_interrupt_vector_addr = (INTERRUPT_FUNCTION)*(uint32_t*)APP1_USART2_RX_IRQn_APP_ADDR;APP_interrupt_vector_addr();}}

其实也不同的M0芯片也可以有不同的做法,解决这个问题,有的芯片可以直接采用物理方式,直接将App的中断向量表从Flash复制到SRAM起始地址。直接解决重复中断问题。不同的M0芯片支持不同的方式。

      至于之前挂载外设可以,换个整机不行,与同事探讨给出的解释是外设可能存在输入影响导致,个人感觉不太像,不太接受这个解释,暂时先放在这里,如果有遇到类似问题的朋友,可以留个言,小编也想知道为啥。

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

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

相关文章

安卓登录学习笔记

1. 背景与目标 (Background and Goal) 背景: 我们要创建一个用户登录界面。用户输入用户名和密码,点击“登录”按钮。应用会显示一个加载中的“圈圈”(ProgressBar),然后模拟一个耗时2秒的网络请求。根据请求结果,界面…

Git(三):分支管理

文章目录 Git(三):分支管理理解分支创建分支切换分支合并分支删除分支合并冲突分支管理策略分支策略Bug分支删除临时分支 Git(三):分支管理 理解分支 本章介绍Git的杀手级功能之一:分支 分支就 是科幻电影里面的平行宇宙,当你正…

电子电气架构 --- 电气架构基础(汽车电子)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

RestClient 功能介绍、完整使用示例演示, 和RestTemplate、WebClient 对比

RestClient功能介绍 RestClient是Spring Framework 6.1版本引入的同步HTTP客户端,旨在替代老旧的RestTemplate,提供更现代、流畅的API设计。其核心特点包括: 流畅API(Fluent API): 支持链式调用&#xff0…

VM经常遇见的运行慢几种情况、以及设置方法

大家好,我是东哥说-MES 启动虚拟机是提示如下内容 “无法打开内核设备“\.\VMCIDev\VMX”: 操作成功完成。是否在安装 VMware Workstation 后重新引导? 模块“DevicePowerOn”启动失败。 未能启动虚拟机。” 2.用记事本打开安装目录下TIA Portal STEP7 Prof Safety WinCC …

【C++语法】类和对象(4)——日期类和const成员函数

6.类和对象&#xff08;4&#xff09; 文章目录 6.类和对象&#xff08;4&#xff09;回顾简单日期类的实现代码补充&#xff1a;前置与后置的重载区别补充&#xff1a;关于流插入运算符&#xff08;<<&#xff09;的解释拓展&#xff1a;仿照流插入操作符(<<)的作…

当凌晨的键盘声,遇见黎明的星光​

地铁玻璃映出你困倦的脸&#xff0c;耳机里的音乐循环到第 17 遍&#xff0c;早高峰的人群像沙丁鱼罐头般挤压着你。这是你每天雷打不动的三小时通勤路&#xff0c;从城市边缘到写字楼林立的 CBD&#xff0c;窗外的风景换了四季&#xff0c;而你始终困在摇晃的车厢里&#xff0…

Web Worker技术详解与应用场景

我们来详细探讨一下 Web Worker。它是现代 Web 开发中解决 JavaScript 单线程限制、提升应用性能和响应能力的关键技术。 核心问题&#xff1a;JavaScript 的单线程模型 浏览器 UI 线程&#xff08;主线程&#xff09;&#xff1a;JavaScript 在浏览器中默认运行在单个线程&a…

React Next快速搭建前后端全栈项目并部署至Vercel

很好&#xff0c;你是想搞清楚Next.js 的后端结构和传统 Node Express 的区别对比&#xff0c;我来整理一套结构化、精准、对面试有说服力的解答&#xff0c;并附示意结构图。 01Next vs Express 、## ⚡️1️⃣ Next.js 后端是怎么构建的 Next.js 在默认情况下本身就集成后…

【T宝客户项目解决过程】01-模型训练

1 项目需求描述 博主自己开了一家T宝店&#xff0c;有一个客户有这个需求&#xff1a;有一大堆图像&#xff0c;大概有10多万张图&#xff0c;都是比较小尺寸的图。各种类型都有&#xff0c;我们想要通过将不同类型发图像进行分开&#xff0c;如何实现呢&#xff1f; 2 思路 …

如何在中将网络改为桥接模式并配置固定IP地址

在使用服务器搭建虚拟机的过程中&#xff0c;我们发现有许多场景需要将虚拟机的网络配置为桥接模式&#xff0c;并为其设置固定的IP地址。为了帮助大家更高效地进行网络配置&#xff0c;提升虚拟机的连接稳定性和管理便捷性&#xff0c;我们总结了这篇指南&#xff0c;介绍如何…

强化学习 - 基于策略的Reinforce算法

&#x1f3af; REINFORCE 策略梯度算法推导&#xff08;完整&#xff09; 1. 目标函数定义 我们希望最大化策略的期望回报&#xff1a; J ( θ ) E τ ∼ π θ [ R ( τ ) ] J(\theta) \mathbb{E}_{\tau \sim \pi_\theta} \left[ R(\tau) \right] J(θ)Eτ∼πθ​​[R(τ…

Windows Sever Core安装及常用命令

一、Windows Sever Core 在安装 Windows Server 的过程中&#xff0c;可以选择“Server Core”&#xff08;核心安装&#xff09;这种没有图形用户界面&#xff08;GUI&#xff09;的安装方式。这种模式下&#xff0c;Windows Server 主要通过命令行或远程管理进行配置和维护&…

Java 单元测试实战:以“两数之和”为例,讲透测试思维

&#x1f31f;Java 单元测试实战&#xff1a;以“两数之和”为例&#xff0c;讲透测试思维 在 Java 开发中&#xff0c;单元测试不仅是验证功能正确的手段&#xff0c;更是衡量开发者是否具备“测试思维”的标志。今天我们通过一个最简单的功能——“两数之和”来系统讲解如何…

Bootstrap 5学习教程,从入门到精通,Bootstrap 5 提示框(Tooltips) 语法知识点及案例(21)

Bootstrap 5 提示框(Tooltips) 语法知识点及案例 一、提示框语法知识点 1. 基本概念 提示框(Tooltips)是当用户悬停在元素上时显示的小浮动标签&#xff0c;用于提供额外信息。 2. 核心属性 data-bs-toggle"tooltip" - 标识元素为提示框触发器title - 提示框显示…

设计模式实战指南:从源码解析到Java后端架构的艺术

&#x1f3af; 设计模式实战指南&#xff1a;从源码解析到Java后端架构的艺术 概述 本文档基于设计模式分类&#xff0c;详细介绍Java后端开发中各种设计模式的实际应用场景&#xff0c;结合Spring、MyBatis、Redis等主流框架的源码分析&#xff0c;帮助开发者深入理解设计模…

Python Arrow 库详解:更智能的日期时间处理

1. 安装与基本用法 安装 Arrow pip install arrow基本使用示例 import arrow# 获取当前时间 now arrow.now() print(now) # 输出: 2023-07-15T14:30:45.12345608:00# 创建特定时间 dt arrow.get(2023-07-15 14:30:00, YYYY-MM-DD HH:mm:ss) print(dt) # 输出: 2023-07-15T…

大家电破渠道困局,小家电攻用户体验,云徙有何解法?

中国家电行业正经历深刻转型。 自2018年市场规模触及8400亿顶峰后&#xff0c;行业从增量竞争转向存量博弈。与此同时&#xff0c;线上渠道在2023年首次以58%的占比超越线下&#xff0c;其中扫地机器人等小家电品类线上渗透率突破90%。消费需求也在同步重构——从家庭场景向个…

DMDPC多副本数据分布测试

需求&#xff1a;测试建表和插入数据是否会根据分布列进行自动分发。 验证方法&#xff1a;1&#xff09;准备基础环境&#xff1a;创建用户和表空间。2&#xff09;创建数据分布测试表&#xff0c;并插入数据。3&#xff09;查询指定分区数据&#xff0c;验证数据分布情况。 …

Qt/C++开发监控GB28181系统/rtp解包/jrtplib库的使用/同时支持udp和tcp被动和主动三种方式解包

一、前言说明 通过sip协议仅仅是交互&#xff0c;音视频数据的收发最终并不是通过sip传输的&#xff0c;而是通过将数据打包成rtp的格式再通过udp或者tcp通信的&#xff0c;sip协议仅仅是告知对方待会要往哪里发数据&#xff0c;是udp还是tcp。由于数据都是rtp包格式&#xff…